// https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
if (!Object.assign) {
  Object.defineProperty(Object, 'assign', {
    enumerable: false,
    configurable: true,
    writable: true,
    value: function(target, firstSource) {
      'use strict';
      if (target === undefined || target === null) {
        throw new TypeError('Cannot convert first argument to object');
      }

      var to = Object(target);
      for (var i = 1; i < arguments.length; i++) {
        var nextSource = arguments[i];
        if (nextSource === undefined || nextSource === null) {
          continue;
        }

        var keysArray = Object.keys(Object(nextSource));
        for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
          var nextKey = keysArray[nextIndex];
          var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
          if (desc !== undefined && desc.enumerable) {
            to[nextKey] = nextSource[nextKey];
          }
        }
      }
      return to;
    }
  });
}

// https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

/**
 * This polyfill is for the CustomEvent()
 * constructor functionality in Internet Explorer 9 and higher
 * */
(function () {

  if ( typeof window.CustomEvent === "function" ) return false;

  function CustomEvent ( event, params ) {
    params = params || { bubbles: false, cancelable: false, detail: undefined };
    var evt = document.createEvent( 'CustomEvent' );
    evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
    return evt;
  }

  CustomEvent.prototype = window.Event.prototype;

  window.CustomEvent = CustomEvent;
})();

/**
 * Polyfill for Array.prototype.find
 * */
(function(){
  if (!Array.prototype.find) {
    Array.prototype.find = function(predicate) {
      if (this == null) {
        throw new TypeError('Array.prototype.find called on null or undefined');
      }
      if (typeof predicate !== 'function') {
        throw new TypeError('predicate must be a function');
      }
      var list = Object(this);
      var length = list.length >>> 0;
      var thisArg = arguments[1];
      var value;

      for (var i = 0; i < length; i++) {
        value = list[i];
        if (predicate.call(thisArg, value, i, list)) {
          return value;
        }
      }
      return undefined;
    };
  }
})();

/**
 * Polyfill for Object.keys
 */
(function() {
  // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
  if (!Object.keys) {
    Object.keys = (function() {
      'use strict';
      var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
        dontEnums = [
          'toString',
          'toLocaleString',
          'valueOf',
          'hasOwnProperty',
          'isPrototypeOf',
          'propertyIsEnumerable',
          'constructor'
        ],
        dontEnumsLength = dontEnums.length;

      return function(obj) {
        if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
          throw new TypeError('Object.keys called on non-object');
        }

        var result = [], prop, i;

        for (prop in obj) {
          if (hasOwnProperty.call(obj, prop)) {
            result.push(prop);
          }
        }

        if (hasDontEnumBug) {
          for (i = 0; i < dontEnumsLength; i++) {
            if (hasOwnProperty.call(obj, dontEnums[i])) {
              result.push(dontEnums[i]);
            }
          }
        }
        return result;
      };
    }());
  }
})();

/**
 * Polyfill for Array.prototype.reduce
 */
(function() {
  // Algorithm steps ECMA-262, 5th edition, 15.4.4.21
  // http://es5.github.io/#x15.4.4.21
  if (!Array.prototype.reduce) {
    Array.prototype.reduce = function(callback/*, initialValue*/) {
      'use strict';
      if (this == null) {
        throw new TypeError('Array.prototype.reduce called on null or undefined');
      }
      if (typeof callback !== 'function') {
        throw new TypeError(callback + ' is not a function');
      }
      var t = Object(this), len = t.length >>> 0, k = 0, value;
      if (arguments.length >= 2) {
        value = arguments[1];
      } else {
        while (k < len && ! (k in t)) {
          k++;
        }
        if (k >= len) {
          throw new TypeError('Reduce of empty array with no initial value');
        }
        value = t[k++];
      }
      for (; k < len; k++) {
        if (k in t) {
          value = callback(value, t[k], k, t);
        }
      }
      return value;
    };
  }
})();

/**
 * Polyfill for Array.prototype.fill
 */
if (!Array.prototype.fill) {
  Array.prototype.fill = function(value) {

    if (this == null) {
      throw new TypeError('this is null or not defined');
    }

    var O = Object(this);

    var len = O.length >>> 0;

    var start = arguments[1];
    var relativeStart = start >> 0;

    var k = relativeStart < 0 ?
      Math.max(len + relativeStart, 0) :
      Math.min(relativeStart, len);

    var end = arguments[2];
    var relativeEnd = end === undefined ?
      len : end >> 0;

    var final = relativeEnd < 0 ?
      Math.max(len + relativeEnd, 0) :
      Math.min(relativeEnd, len);

    while (k < final) {
      O[k] = value;
      k++;
    }

    return O;
  };
}

// https://github.com/es-shims/es5-shim/blob/master/es5-sham.js
if (!Object.freeze) {
  Object.freeze = function freeze(object) {
    if (Object(object) !== object) {
      throw new TypeError('Object.freeze can only be called on Objects.');
    }
    // this is misleading and breaks feature-detection, but
    // allows "securable" code to "gracefully" degrade to working
    // but insecure code.
    return object;
  };
}

/**
 * Polyfill for Object.values
 */
(function() {
  if (!Object.values) {
    Object.values = function (obj) {
      return Object
        .keys(obj)
        .map(function (key) {
          if (obj.hasOwnProperty(key)) {
            return obj[key];
          }
        });
    }
  }
})();

/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({
padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});

//----------

/*! jQuery Migrate v1.4.1 | (c) jQuery Foundation and other contributors | jquery.org/license */
"undefined"==typeof jQuery.migrateMute&&(jQuery.migrateMute=!0),function(a,b,c){function d(c){var d=b.console;f[c]||(f[c]=!0,a.migrateWarnings.push(c),d&&d.warn&&!a.migrateMute&&(d.warn("JQMIGRATE: "+c),a.migrateTrace&&d.trace&&d.trace()))}function e(b,c,e,f){if(Object.defineProperty)try{return void Object.defineProperty(b,c,{configurable:!0,enumerable:!0,get:function(){return d(f),e},set:function(a){d(f),e=a}})}catch(g){}a._definePropertyBroken=!0,b[c]=e}a.migrateVersion="1.4.1";var f={};a.migrateWarnings=[],a.migrateTrace===c&&(a.migrateTrace=!0),a.migrateReset=function(){f={},a.migrateWarnings.length=0},"BackCompat"===document.compatMode&&d("jQuery is not compatible with Quirks Mode");var g=a("<input/>",{size:1}).attr("size")&&a.attrFn,h=a.attr,i=a.attrHooks.value&&a.attrHooks.value.get||function(){return null},j=a.attrHooks.value&&a.attrHooks.value.set||function(){return c},k=/^(?:input|button)$/i,l=/^[238]$/,m=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,n=/^(?:checked|selected)$/i;e(a,"attrFn",g||{},"jQuery.attrFn is deprecated"),a.attr=function(b,e,f,i){var j=e.toLowerCase(),o=b&&b.nodeType;return i&&(h.length<4&&d("jQuery.fn.attr( props, pass ) is deprecated"),b&&!l.test(o)&&(g?e in g:a.isFunction(a.fn[e])))?a(b)[e](f):("type"===e&&f!==c&&k.test(b.nodeName)&&b.parentNode&&d("Can't change the 'type' of an input or button in IE 6/7/8"),!a.attrHooks[j]&&m.test(j)&&(a.attrHooks[j]={get:function(b,d){var e,f=a.prop(b,d);return f===!0||"boolean"!=typeof f&&(e=b.getAttributeNode(d))&&e.nodeValue!==!1?d.toLowerCase():c},set:function(b,c,d){var e;return c===!1?a.removeAttr(b,d):(e=a.propFix[d]||d,e in b&&(b[e]=!0),b.setAttribute(d,d.toLowerCase())),d}},n.test(j)&&d("jQuery.fn.attr('"+j+"') might use property instead of attribute")),h.call(a,b,e,f))},a.attrHooks.value={get:function(a,b){var c=(a.nodeName||"").toLowerCase();return"button"===c?i.apply(this,arguments):("input"!==c&&"option"!==c&&d("jQuery.fn.attr('value') no longer gets properties"),b in a?a.value:null)},set:function(a,b){var c=(a.nodeName||"").toLowerCase();return"button"===c?j.apply(this,arguments):("input"!==c&&"option"!==c&&d("jQuery.fn.attr('value', val) no longer sets properties"),void(a.value=b))}};var o,p,q=a.fn.init,r=a.find,s=a.parseJSON,t=/^\s*</,u=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,v=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,w=/^([^<]*)(<[\w\W]+>)([^>]*)$/;a.fn.init=function(b,e,f){var g,h;return b&&"string"==typeof b&&!a.isPlainObject(e)&&(g=w.exec(a.trim(b)))&&g[0]&&(t.test(b)||d("$(html) HTML strings must start with '<' character"),g[3]&&d("$(html) HTML text after last tag is ignored"),"#"===g[0].charAt(0)&&(d("HTML string cannot start with a '#' character"),a.error("JQMIGRATE: Invalid selector string (XSS)")),e&&e.context&&e.context.nodeType&&(e=e.context),a.parseHTML)?q.call(this,a.parseHTML(g[2],e&&e.ownerDocument||e||document,!0),e,f):(h=q.apply(this,arguments),b&&b.selector!==c?(h.selector=b.selector,h.context=b.context):(h.selector="string"==typeof b?b:"",b&&(h.context=b.nodeType?b:e||document)),h)},a.fn.init.prototype=a.fn,a.find=function(a){var b=Array.prototype.slice.call(arguments);if("string"==typeof a&&u.test(a))try{document.querySelector(a)}catch(c){a=a.replace(v,function(a,b,c,d){return"["+b+c+'"'+d+'"]'});try{document.querySelector(a),d("Attribute selector with '#' must be quoted: "+b[0]),b[0]=a}catch(e){d("Attribute selector with '#' was not fixed: "+b[0])}}return r.apply(this,b)};var x;for(x in r)Object.prototype.hasOwnProperty.call(r,x)&&(a.find[x]=r[x]);a.parseJSON=function(a){return a?s.apply(this,arguments):(d("jQuery.parseJSON requires a valid JSON string"),null)},a.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a.browser||(o=a.uaMatch(navigator.userAgent),p={},o.browser&&(p[o.browser]=!0,p.version=o.version),p.chrome?p.webkit=!0:p.webkit&&(p.safari=!0),a.browser=p),e(a,"browser",a.browser,"jQuery.browser is deprecated"),a.boxModel=a.support.boxModel="CSS1Compat"===document.compatMode,e(a,"boxModel",a.boxModel,"jQuery.boxModel is deprecated"),e(a.support,"boxModel",a.support.boxModel,"jQuery.support.boxModel is deprecated"),a.sub=function(){function b(a,c){return new b.fn.init(a,c)}a.extend(!0,b,this),b.superclass=this,b.fn=b.prototype=this(),b.fn.constructor=b,b.sub=this.sub,b.fn.init=function(d,e){var f=a.fn.init.call(this,d,e,c);return f instanceof b?f:b(f)},b.fn.init.prototype=b.fn;var c=b(document);return d("jQuery.sub() is deprecated"),b},a.fn.size=function(){return d("jQuery.fn.size() is deprecated; use the .length property"),this.length};var y=!1;a.swap&&a.each(["height","width","reliableMarginRight"],function(b,c){var d=a.cssHooks[c]&&a.cssHooks[c].get;d&&(a.cssHooks[c].get=function(){var a;return y=!0,a=d.apply(this,arguments),y=!1,a})}),a.swap=function(a,b,c,e){var f,g,h={};y||d("jQuery.swap() is undocumented and deprecated");for(g in b)h[g]=a.style[g],a.style[g]=b[g];f=c.apply(a,e||[]);for(g in b)a.style[g]=h[g];return f},a.ajaxSetup({converters:{"text json":a.parseJSON}});var z=a.fn.data;a.fn.data=function(b){var e,f,g=this[0];return!g||"events"!==b||1!==arguments.length||(e=a.data(g,b),f=a._data(g,b),e!==c&&e!==f||f===c)?z.apply(this,arguments):(d("Use of jQuery.fn.data('events') is deprecated"),f)};var A=/\/(java|ecma)script/i;a.clean||(a.clean=function(b,c,e,f){c=c||document,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,d("jQuery.clean() is deprecated");var g,h,i,j,k=[];if(a.merge(k,a.buildFragment(b,c).childNodes),e)for(i=function(a){return!a.type||A.test(a.type)?f?f.push(a.parentNode?a.parentNode.removeChild(a):a):e.appendChild(a):void 0},g=0;null!=(h=k[g]);g++)a.nodeName(h,"script")&&i(h)||(e.appendChild(h),"undefined"!=typeof h.getElementsByTagName&&(j=a.grep(a.merge([],h.getElementsByTagName("script")),i),k.splice.apply(k,[g+1,0].concat(j)),g+=j.length));return k});var B=a.event.add,C=a.event.remove,D=a.event.trigger,E=a.fn.toggle,F=a.fn.live,G=a.fn.die,H=a.fn.load,I="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",J=new RegExp("\\b(?:"+I+")\\b"),K=/(?:^|\s)hover(\.\S+|)\b/,L=function(b){return"string"!=typeof b||a.event.special.hover?b:(K.test(b)&&d("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),b&&b.replace(K,"mouseenter$1 mouseleave$1"))};a.event.props&&"attrChange"!==a.event.props[0]&&a.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),a.event.dispatch&&e(a.event,"handle",a.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),a.event.add=function(a,b,c,e,f){a!==document&&J.test(b)&&d("AJAX events should be attached to document: "+b),B.call(this,a,L(b||""),c,e,f)},a.event.remove=function(a,b,c,d,e){C.call(this,a,L(b)||"",c,d,e)},a.each(["load","unload","error"],function(b,c){a.fn[c]=function(){var a=Array.prototype.slice.call(arguments,0);return"load"===c&&"string"==typeof a[0]?H.apply(this,a):(d("jQuery.fn."+c+"() is deprecated"),a.splice(0,0,c),arguments.length?this.bind.apply(this,a):(this.triggerHandler.apply(this,a),this))}}),a.fn.toggle=function(b,c){if(!a.isFunction(b)||!a.isFunction(c))return E.apply(this,arguments);d("jQuery.fn.toggle(handler, handler...) is deprecated");var e=arguments,f=b.guid||a.guid++,g=0,h=function(c){var d=(a._data(this,"lastToggle"+b.guid)||0)%g;return a._data(this,"lastToggle"+b.guid,d+1),c.preventDefault(),e[d].apply(this,arguments)||!1};for(h.guid=f;g<e.length;)e[g++].guid=f;return this.click(h)},a.fn.live=function(b,c,e){return d("jQuery.fn.live() is deprecated"),F?F.apply(this,arguments):(a(this.context).on(b,this.selector,c,e),this)},a.fn.die=function(b,c){return d("jQuery.fn.die() is deprecated"),G?G.apply(this,arguments):(a(this.context).off(b,this.selector||"**",c),this)},a.event.trigger=function(a,b,c,e){return c||J.test(a)||d("Global events are undocumented and deprecated"),D.call(this,a,b,c||document,e)},a.each(I.split("|"),function(b,c){a.event.special[c]={setup:function(){var b=this;return b!==document&&(a.event.add(document,c+"."+a.guid,function(){a.event.trigger(c,Array.prototype.slice.call(arguments,1),b,!0)}),a._data(this,c,a.guid++)),!1},teardown:function(){return this!==document&&a.event.remove(document,c+"."+a._data(this,c)),!1}}}),a.event.special.ready={setup:function(){this===document&&d("'ready' event is deprecated")}};var M=a.fn.andSelf||a.fn.addBack,N=a.fn.find;if(a.fn.andSelf=function(){return d("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),M.apply(this,arguments)},a.fn.find=function(a){var b=N.apply(this,arguments);return b.context=this.context,b.selector=this.selector?this.selector+" "+a:a,b},a.Callbacks){var O=a.Deferred,P=[["resolve","done",a.Callbacks("once memory"),a.Callbacks("once memory"),"resolved"],["reject","fail",a.Callbacks("once memory"),a.Callbacks("once memory"),"rejected"],["notify","progress",a.Callbacks("memory"),a.Callbacks("memory")]];a.Deferred=function(b){var c=O(),e=c.promise();return c.pipe=e.pipe=function(){var b=arguments;return d("deferred.pipe() is deprecated"),a.Deferred(function(d){a.each(P,function(f,g){var h=a.isFunction(b[f])&&b[f];c[g[1]](function(){var b=h&&h.apply(this,arguments);b&&a.isFunction(b.promise)?b.promise().done(d.resolve).fail(d.reject).progress(d.notify):d[g[0]+"With"](this===e?d.promise():this,h?[b]:arguments)})}),b=null}).promise()},c.isResolved=function(){return d("deferred.isResolved is deprecated"),"resolved"===c.state()},c.isRejected=function(){return d("deferred.isRejected is deprecated"),"rejected"===c.state()},b&&b.call(c,c),c}}}(jQuery,window);

(function($){var g,d,j=1,a,b=this,f=!1,h="postMessage",e="addEventListener",c,i=b[h];$[h]=function(k,l,m){if(!l){return}k=typeof k==="string"?k:$.param(k);m=m||parent;if(i){m[h](k,l.replace(/([^:]+:\/\/[^\/]+).*/,"$1"))}else{if(l){m.location=l.replace(/#.*$/,"")+"#"+(+new Date)+(j++)+"&"+k}}};$.receiveMessage=c=function(l,m,k){if(i){if(l){a&&c();a=function(n){if((typeof m==="string"&&n.origin!==m)||($.isFunction(m)&&m(n.origin)===f)){return f}l(n)}}if(b[e]){b[l?e:"removeEventListener"]("message",a,f)}else{b[l?"attachEvent":"detachEvent"]("onmessage",a)}}else{g&&clearInterval(g);g=null;if(l){k=typeof m==="number"?m:typeof k==="number"?k:100;g=setInterval(function(){var o=document.location.hash,n=/^#?\d+&/;if(o!==d&&n.test(o)){d=o;l({data:o.replace(n,"")})}},k)}}}})(jQuery);

/*
 AngularJS v1.2.22
 (c) 2010-2014 Google, Inc. http://angularjs.org
 License: MIT
*/
(function(P,X,s){'use strict';function w(b){return function(){var a=arguments[0],c,a="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.2.22/"+(b?b+"/":"")+a;for(c=1;c<arguments.length;c++)a=a+(1==c?"?":"&")+"p"+(c-1)+"="+encodeURIComponent("function"==typeof arguments[c]?arguments[c].toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof arguments[c]?"undefined":"string"!=typeof arguments[c]?JSON.stringify(arguments[c]):arguments[c]);return Error(a)}}function fb(b){if(null==b||Fa(b))return!1;
var a=b.length;return 1===b.nodeType&&a?!0:C(b)||L(b)||0===a||"number"===typeof a&&0<a&&a-1 in b}function r(b,a,c){var d;if(b)if(J(b))for(d in b)"prototype"==d||("length"==d||"name"==d||b.hasOwnProperty&&!b.hasOwnProperty(d))||a.call(c,b[d],d);else if(L(b)||fb(b))for(d=0;d<b.length;d++)a.call(c,b[d],d);else if(b.forEach&&b.forEach!==r)b.forEach(a,c);else for(d in b)b.hasOwnProperty(d)&&a.call(c,b[d],d);return b}function Zb(b){var a=[],c;for(c in b)b.hasOwnProperty(c)&&a.push(c);return a.sort()}function Tc(b,
a,c){for(var d=Zb(b),e=0;e<d.length;e++)a.call(c,b[d[e]],d[e]);return d}function $b(b){return function(a,c){b(c,a)}}function gb(){for(var b=la.length,a;b;){b--;a=la[b].charCodeAt(0);if(57==a)return la[b]="A",la.join("");if(90==a)la[b]="0";else return la[b]=String.fromCharCode(a+1),la.join("")}la.unshift("0");return la.join("")}function ac(b,a){a?b.$$hashKey=a:delete b.$$hashKey}function E(b){var a=b.$$hashKey;r(arguments,function(a){a!==b&&r(a,function(a,c){b[c]=a})});ac(b,a);return b}function Z(b){return parseInt(b,
10)}function bc(b,a){return E(new (E(function(){},{prototype:b})),a)}function z(){}function Ga(b){return b}function $(b){return function(){return b}}function F(b){return"undefined"===typeof b}function D(b){return"undefined"!==typeof b}function T(b){return null!=b&&"object"===typeof b}function C(b){return"string"===typeof b}function Ab(b){return"number"===typeof b}function sa(b){return"[object Date]"===ya.call(b)}function J(b){return"function"===typeof b}function hb(b){return"[object RegExp]"===ya.call(b)}
function Fa(b){return b&&b.document&&b.location&&b.alert&&b.setInterval}function Uc(b){return!(!b||!(b.nodeName||b.prop&&b.attr&&b.find))}function Vc(b,a,c){var d=[];r(b,function(b,f,g){d.push(a.call(c,b,f,g))});return d}function Qa(b,a){if(b.indexOf)return b.indexOf(a);for(var c=0;c<b.length;c++)if(a===b[c])return c;return-1}function Ra(b,a){var c=Qa(b,a);0<=c&&b.splice(c,1);return a}function Ha(b,a,c,d){if(Fa(b)||b&&b.$evalAsync&&b.$watch)throw Sa("cpws");if(a){if(b===a)throw Sa("cpi");c=c||[];
d=d||[];if(T(b)){var e=Qa(c,b);if(-1!==e)return d[e];c.push(b);d.push(a)}if(L(b))for(var f=a.length=0;f<b.length;f++)e=Ha(b[f],null,c,d),T(b[f])&&(c.push(b[f]),d.push(e)),a.push(e);else{var g=a.$$hashKey;r(a,function(b,c){delete a[c]});for(f in b)e=Ha(b[f],null,c,d),T(b[f])&&(c.push(b[f]),d.push(e)),a[f]=e;ac(a,g)}}else if(a=b)L(b)?a=Ha(b,[],c,d):sa(b)?a=new Date(b.getTime()):hb(b)?(a=RegExp(b.source,b.toString().match(/[^\/]*$/)[0]),a.lastIndex=b.lastIndex):T(b)&&(a=Ha(b,{},c,d));return a}function ga(b,
a){if(L(b)){a=a||[];for(var c=0;c<b.length;c++)a[c]=b[c]}else if(T(b))for(c in a=a||{},b)!ib.call(b,c)||"$"===c.charAt(0)&&"$"===c.charAt(1)||(a[c]=b[c]);return a||b}function za(b,a){if(b===a)return!0;if(null===b||null===a)return!1;if(b!==b&&a!==a)return!0;var c=typeof b,d;if(c==typeof a&&"object"==c)if(L(b)){if(!L(a))return!1;if((c=b.length)==a.length){for(d=0;d<c;d++)if(!za(b[d],a[d]))return!1;return!0}}else{if(sa(b))return sa(a)&&b.getTime()==a.getTime();if(hb(b)&&hb(a))return b.toString()==a.toString();
if(b&&b.$evalAsync&&b.$watch||a&&a.$evalAsync&&a.$watch||Fa(b)||Fa(a)||L(a))return!1;c={};for(d in b)if("$"!==d.charAt(0)&&!J(b[d])){if(!za(b[d],a[d]))return!1;c[d]=!0}for(d in a)if(!c.hasOwnProperty(d)&&"$"!==d.charAt(0)&&a[d]!==s&&!J(a[d]))return!1;return!0}return!1}function Bb(b,a){var c=2<arguments.length?Aa.call(arguments,2):[];return!J(a)||a instanceof RegExp?a:c.length?function(){return arguments.length?a.apply(b,c.concat(Aa.call(arguments,0))):a.apply(b,c)}:function(){return arguments.length?
a.apply(b,arguments):a.call(b)}}function Wc(b,a){var c=a;"string"===typeof b&&"$"===b.charAt(0)?c=s:Fa(a)?c="$WINDOW":a&&X===a?c="$DOCUMENT":a&&(a.$evalAsync&&a.$watch)&&(c="$SCOPE");return c}function ta(b,a){return"undefined"===typeof b?s:JSON.stringify(b,Wc,a?"  ":null)}function cc(b){return C(b)?JSON.parse(b):b}function Ta(b){"function"===typeof b?b=!0:b&&0!==b.length?(b=M(""+b),b=!("f"==b||"0"==b||"false"==b||"no"==b||"n"==b||"[]"==b)):b=!1;return b}function ha(b){b=y(b).clone();try{b.empty()}catch(a){}var c=
y("<div>").append(b).html();try{return 3===b[0].nodeType?M(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+M(b)})}catch(d){return M(c)}}function dc(b){try{return decodeURIComponent(b)}catch(a){}}function ec(b){var a={},c,d;r((b||"").split("&"),function(b){b&&(c=b.replace(/\+/g,"%20").split("="),d=dc(c[0]),D(d)&&(b=D(c[1])?dc(c[1]):!0,ib.call(a,d)?L(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Cb(b){var a=[];r(b,function(b,d){L(b)?r(b,function(b){a.push(Ba(d,
!0)+(!0===b?"":"="+Ba(b,!0)))}):a.push(Ba(d,!0)+(!0===b?"":"="+Ba(b,!0)))});return a.length?a.join("&"):""}function jb(b){return Ba(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Ba(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function Xc(b,a){function c(a){a&&d.push(a)}var d=[b],e,f,g=["ng:app","ng-app","x-ng-app","data-ng-app"],k=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;
r(g,function(a){g[a]=!0;c(X.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(r(b.querySelectorAll("."+a),c),r(b.querySelectorAll("."+a+"\\:"),c),r(b.querySelectorAll("["+a+"]"),c))});r(d,function(a){if(!e){var b=k.exec(" "+a.className+" ");b?(e=a,f=(b[2]||"").replace(/\s+/g,",")):r(a.attributes,function(b){!e&&g[b.name]&&(e=a,f=b.value)})}});e&&a(e,f?[f]:[])}function fc(b,a){var c=function(){b=y(b);if(b.injector()){var c=b[0]===X?"document":ha(b);throw Sa("btstrpd",c);}a=a||[];a.unshift(["$provide",
function(a){a.value("$rootElement",b)}]);a.unshift("ng");c=gc(a);c.invoke(["$rootScope","$rootElement","$compile","$injector","$animate",function(a,b,c,d,e){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},d=/^NG_DEFER_BOOTSTRAP!/;if(P&&!d.test(P.name))return c();P.name=P.name.replace(d,"");Ua.resumeBootstrap=function(b){r(b,function(b){a.push(b)});c()}}function kb(b,a){a=a||"_";return b.replace(Yc,function(b,d){return(d?a:"")+b.toLowerCase()})}function Db(b,a,c){if(!b)throw Sa("areq",
a||"?",c||"required");return b}function Va(b,a,c){c&&L(b)&&(b=b[b.length-1]);Db(J(b),a,"not a function, got "+(b&&"object"===typeof b?b.constructor.name||"Object":typeof b));return b}function Ca(b,a){if("hasOwnProperty"===b)throw Sa("badname",a);}function hc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;g<f;g++)d=a[g],b&&(b=(e=b)[d]);return!c&&J(b)?Bb(e,b):b}function Eb(b){var a=b[0];b=b[b.length-1];if(a===b)return y(a);var c=[a];do{a=a.nextSibling;if(!a)break;c.push(a)}while(a!==
b);return y(c)}function Zc(b){var a=w("$injector"),c=w("ng");b=b.angular||(b.angular={});b.$$minErr=b.$$minErr||w;return b.module||(b.module=function(){var b={};return function(e,f,g){if("hasOwnProperty"===e)throw c("badname","module");f&&b.hasOwnProperty(e)&&(b[e]=null);return b[e]||(b[e]=function(){function b(a,d,e){return function(){c[e||"push"]([a,d,arguments]);return n}}if(!f)throw a("nomod",e);var c=[],d=[],l=b("$injector","invoke"),n={_invokeQueue:c,_runBlocks:d,requires:f,name:e,provider:b("$provide",
"provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:b("$provide","value"),constant:b("$provide","constant","unshift"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),config:l,run:function(a){d.push(a);return this}};g&&l(g);return n}())}}())}function $c(b){E(b,{bootstrap:fc,copy:Ha,extend:E,equals:za,element:y,forEach:r,injector:gc,noop:z,bind:Bb,
toJson:ta,fromJson:cc,identity:Ga,isUndefined:F,isDefined:D,isString:C,isFunction:J,isObject:T,isNumber:Ab,isElement:Uc,isArray:L,version:ad,isDate:sa,lowercase:M,uppercase:Ia,callbacks:{counter:0},$$minErr:w,$$csp:Wa});Xa=Zc(P);try{Xa("ngLocale")}catch(a){Xa("ngLocale",[]).provider("$locale",bd)}Xa("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:cd});a.provider("$compile",ic).directive({a:dd,input:jc,textarea:jc,form:ed,script:fd,select:gd,style:hd,option:id,ngBind:jd,ngBindHtml:kd,
ngBindTemplate:ld,ngClass:md,ngClassEven:nd,ngClassOdd:od,ngCloak:pd,ngController:qd,ngForm:rd,ngHide:sd,ngIf:td,ngInclude:ud,ngInit:vd,ngNonBindable:wd,ngPluralize:xd,ngRepeat:yd,ngShow:zd,ngStyle:Ad,ngSwitch:Bd,ngSwitchWhen:Cd,ngSwitchDefault:Dd,ngOptions:Ed,ngTransclude:Fd,ngModel:Gd,ngList:Hd,ngChange:Id,required:kc,ngRequired:kc,ngValue:Jd}).directive({ngInclude:Kd}).directive(Fb).directive(lc);a.provider({$anchorScroll:Ld,$animate:Md,$browser:Nd,$cacheFactory:Od,$controller:Pd,$document:Qd,
$exceptionHandler:Rd,$filter:mc,$interpolate:Sd,$interval:Td,$http:Ud,$httpBackend:Vd,$location:Wd,$log:Xd,$parse:Yd,$rootScope:Zd,$q:$d,$sce:ae,$sceDelegate:be,$sniffer:ce,$templateCache:de,$timeout:ee,$window:fe,$$rAF:ge,$$asyncCallback:he})}])}function Ya(b){return b.replace(ie,function(a,b,d,e){return e?d.toUpperCase():d}).replace(je,"Moz$1")}function Gb(b,a,c,d){function e(b){var e=c&&b?[this.filter(b)]:[this],m=a,h,l,n,p,q,t;if(!d||null!=b)for(;e.length;)for(h=e.shift(),l=0,n=h.length;l<n;l++)for(p=
y(h[l]),m?p.triggerHandler("$destroy"):m=!m,q=0,p=(t=p.children()).length;q<p;q++)e.push(Da(t[q]));return f.apply(this,arguments)}var f=Da.fn[b],f=f.$original||f;e.$original=f;Da.fn[b]=e}function S(b){if(b instanceof S)return b;C(b)&&(b=aa(b));if(!(this instanceof S)){if(C(b)&&"<"!=b.charAt(0))throw Hb("nosel");return new S(b)}if(C(b)){var a=b;b=X;var c;if(c=ke.exec(a))b=[b.createElement(c[1])];else{var d=b,e;b=d.createDocumentFragment();c=[];if(Ib.test(a)){d=b.appendChild(d.createElement("div"));
e=(le.exec(a)||["",""])[1].toLowerCase();e=ba[e]||ba._default;d.innerHTML="<div>&#160;</div>"+e[1]+a.replace(me,"<$1></$2>")+e[2];d.removeChild(d.firstChild);for(a=e[0];a--;)d=d.lastChild;a=0;for(e=d.childNodes.length;a<e;++a)c.push(d.childNodes[a]);d=b.firstChild;d.textContent=""}else c.push(d.createTextNode(a));b.textContent="";b.innerHTML="";b=c}Jb(this,b);y(X.createDocumentFragment()).append(this)}else Jb(this,b)}function Kb(b){return b.cloneNode(!0)}function Ja(b){Lb(b);var a=0;for(b=b.childNodes||
[];a<b.length;a++)Ja(b[a])}function nc(b,a,c,d){if(D(d))throw Hb("offargs");var e=ma(b,"events");ma(b,"handle")&&(F(a)?r(e,function(a,c){Za(b,c,a);delete e[c]}):r(a.split(" "),function(a){F(c)?(Za(b,a,e[a]),delete e[a]):Ra(e[a]||[],c)}))}function Lb(b,a){var c=b.ng339,d=$a[c];d&&(a?delete $a[c].data[a]:(d.handle&&(d.events.$destroy&&d.handle({},"$destroy"),nc(b)),delete $a[c],b.ng339=s))}function ma(b,a,c){var d=b.ng339,d=$a[d||-1];if(D(c))d||(b.ng339=d=++ne,d=$a[d]={}),d[a]=c;else return d&&d[a]}
function Mb(b,a,c){var d=ma(b,"data"),e=D(c),f=!e&&D(a),g=f&&!T(a);d||g||ma(b,"data",d={});if(e)d[a]=c;else if(f){if(g)return d&&d[a];E(d,a)}else return d}function Nb(b,a){return b.getAttribute?-1<(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+a+" "):!1}function lb(b,a){a&&b.setAttribute&&r(a.split(" "),function(a){b.setAttribute("class",aa((" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+aa(a)+" "," ")))})}function mb(b,a){if(a&&b.setAttribute){var c=
(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");r(a.split(" "),function(a){a=aa(a);-1===c.indexOf(" "+a+" ")&&(c+=a+" ")});b.setAttribute("class",aa(c))}}function Jb(b,a){if(a){a=a.nodeName||!D(a.length)||Fa(a)?[a]:a;for(var c=0;c<a.length;c++)b.push(a[c])}}function oc(b,a){return nb(b,"$"+(a||"ngController")+"Controller")}function nb(b,a,c){9==b.nodeType&&(b=b.documentElement);for(a=L(a)?a:[a];b;){for(var d=0,e=a.length;d<e;d++)if((c=y.data(b,a[d]))!==s)return c;b=b.parentNode||11===
b.nodeType&&b.host}}function pc(b){for(var a=0,c=b.childNodes;a<c.length;a++)Ja(c[a]);for(;b.firstChild;)b.removeChild(b.firstChild)}function qc(b,a){var c=ob[a.toLowerCase()];return c&&rc[b.nodeName]&&c}function oe(b,a){var c=function(c,e){c.preventDefault||(c.preventDefault=function(){c.returnValue=!1});c.stopPropagation||(c.stopPropagation=function(){c.cancelBubble=!0});c.target||(c.target=c.srcElement||X);if(F(c.defaultPrevented)){var f=c.preventDefault;c.preventDefault=function(){c.defaultPrevented=
!0;f.call(c)};c.defaultPrevented=!1}c.isDefaultPrevented=function(){return c.defaultPrevented||!1===c.returnValue};var g=ga(a[e||c.type]||[]);r(g,function(a){a.call(b,c)});8>=Q?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};c.elem=b;return c}function Ka(b,a){var c=typeof b,d;"function"==c||"object"==c&&null!==b?"function"==typeof(d=b.$$hashKey)?d=b.$$hashKey():d===s&&(d=b.$$hashKey=(a||gb)()):
d=b;return c+":"+d}function ab(b,a){if(a){var c=0;this.nextUid=function(){return++c}}r(b,this.put,this)}function sc(b){var a,c;"function"===typeof b?(a=b.$inject)||(a=[],b.length&&(c=b.toString().replace(pe,""),c=c.match(qe),r(c[1].split(re),function(b){b.replace(se,function(b,c,d){a.push(d)})})),b.$inject=a):L(b)?(c=b.length-1,Va(b[c],"fn"),a=b.slice(0,c)):Va(b,"fn",!0);return a}function gc(b){function a(a){return function(b,c){if(T(b))r(b,$b(a));else return a(b,c)}}function c(a,b){Ca(a,"service");
if(J(b)||L(b))b=n.instantiate(b);if(!b.$get)throw bb("pget",a);return l[a+k]=b}function d(a,b){return c(a,{$get:b})}function e(a){var b=[],c,d,f,k;r(a,function(a){if(!h.get(a)){h.put(a,!0);try{if(C(a))for(c=Xa(a),b=b.concat(e(c.requires)).concat(c._runBlocks),d=c._invokeQueue,f=0,k=d.length;f<k;f++){var g=d[f],m=n.get(g[0]);m[g[1]].apply(m,g[2])}else J(a)?b.push(n.invoke(a)):L(a)?b.push(n.invoke(a)):Va(a,"module")}catch(l){throw L(a)&&(a=a[a.length-1]),l.message&&(l.stack&&-1==l.stack.indexOf(l.message))&&
(l=l.message+"\n"+l.stack),bb("modulerr",a,l.stack||l.message||l);}}});return b}function f(a,b){function c(d){if(a.hasOwnProperty(d)){if(a[d]===g)throw bb("cdep",d+" <- "+m.join(" <- "));return a[d]}try{return m.unshift(d),a[d]=g,a[d]=b(d)}catch(e){throw a[d]===g&&delete a[d],e;}finally{m.shift()}}function d(a,b,e){var f=[],k=sc(a),g,m,h;m=0;for(g=k.length;m<g;m++){h=k[m];if("string"!==typeof h)throw bb("itkn",h);f.push(e&&e.hasOwnProperty(h)?e[h]:c(h))}L(a)&&(a=a[g]);return a.apply(b,f)}return{invoke:d,
instantiate:function(a,b){var c=function(){},e;c.prototype=(L(a)?a[a.length-1]:a).prototype;c=new c;e=d(a,c,b);return T(e)||J(e)?e:c},get:c,annotate:sc,has:function(b){return l.hasOwnProperty(b+k)||a.hasOwnProperty(b)}}}var g={},k="Provider",m=[],h=new ab([],!0),l={$provide:{provider:a(c),factory:a(d),service:a(function(a,b){return d(a,["$injector",function(a){return a.instantiate(b)}])}),value:a(function(a,b){return d(a,$(b))}),constant:a(function(a,b){Ca(a,"constant");l[a]=b;p[a]=b}),decorator:function(a,
b){var c=n.get(a+k),d=c.$get;c.$get=function(){var a=q.invoke(d,c);return q.invoke(b,null,{$delegate:a})}}}},n=l.$injector=f(l,function(){throw bb("unpr",m.join(" <- "));}),p={},q=p.$injector=f(p,function(a){a=n.get(a+k);return q.invoke(a.$get,a)});r(e(b),function(a){q.invoke(a||z)});return q}function Ld(){var b=!0;this.disableAutoScrolling=function(){b=!1};this.$get=["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;r(a,function(a){b||"a"!==M(a.nodeName)||(b=a)});return b}
function f(){var b=c.hash(),d;b?(d=g.getElementById(b))?d.scrollIntoView():(d=e(g.getElementsByName(b)))?d.scrollIntoView():"top"===b&&a.scrollTo(0,0):a.scrollTo(0,0)}var g=a.document;b&&d.$watch(function(){return c.hash()},function(){d.$evalAsync(f)});return f}]}function he(){this.$get=["$$rAF","$timeout",function(b,a){return b.supported?function(a){return b(a)}:function(b){return a(b,0,!1)}}]}function te(b,a,c,d){function e(a){try{a.apply(null,Aa.call(arguments,1))}finally{if(t--,0===t)for(;K.length;)try{K.pop()()}catch(b){c.error(b)}}}
function f(a,b){(function ca(){r(x,function(a){a()});v=b(ca,a)})()}function g(){u=null;A!=k.url()&&(A=k.url(),r(da,function(a){a(k.url())}))}var k=this,m=a[0],h=b.location,l=b.history,n=b.setTimeout,p=b.clearTimeout,q={};k.isMock=!1;var t=0,K=[];k.$$completeOutstandingRequest=e;k.$$incOutstandingRequestCount=function(){t++};k.notifyWhenNoOutstandingRequests=function(a){r(x,function(a){a()});0===t?a():K.push(a)};var x=[],v;k.addPollFn=function(a){F(v)&&f(100,n);x.push(a);return a};var A=h.href,R=a.find("base"),
u=null;k.url=function(a,c){h!==b.location&&(h=b.location);l!==b.history&&(l=b.history);if(a){if(A!=a)return A=a,d.history?c?l.replaceState(null,"",a):(l.pushState(null,"",a),R.attr("href",R.attr("href"))):(u=a,c?h.replace(a):h.href=a),k}else return u||h.href.replace(/%27/g,"'")};var da=[],I=!1;k.onUrlChange=function(a){if(!I){if(d.history)y(b).on("popstate",g);if(d.hashchange)y(b).on("hashchange",g);else k.addPollFn(g);I=!0}da.push(a);return a};k.baseHref=function(){var a=R.attr("href");return a?
a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};var W={},ea="",N=k.baseHref();k.cookies=function(a,b){var d,e,f,k;if(a)b===s?m.cookie=escape(a)+"=;path="+N+";expires=Thu, 01 Jan 1970 00:00:00 GMT":C(b)&&(d=(m.cookie=escape(a)+"="+escape(b)+";path="+N).length+1,4096<d&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!"));else{if(m.cookie!==ea)for(ea=m.cookie,d=ea.split("; "),W={},f=0;f<d.length;f++)e=d[f],k=e.indexOf("="),0<k&&(a=unescape(e.substring(0,
k)),W[a]===s&&(W[a]=unescape(e.substring(k+1))));return W}};k.defer=function(a,b){var c;t++;c=n(function(){delete q[c];e(a)},b||0);q[c]=!0;return c};k.defer.cancel=function(a){return q[a]?(delete q[a],p(a),e(z),!0):!1}}function Nd(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new te(b,d,a,c)}]}function Od(){this.$get=function(){function b(b,d){function e(a){a!=n&&(p?p==a&&(p=a.n):p=a,f(a.n,a.p),f(a,n),n=a,n.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(b in
a)throw w("$cacheFactory")("iid",b);var g=0,k=E({},d,{id:b}),m={},h=d&&d.capacity||Number.MAX_VALUE,l={},n=null,p=null;return a[b]={put:function(a,b){if(h<Number.MAX_VALUE){var c=l[a]||(l[a]={key:a});e(c)}if(!F(b))return a in m||g++,m[a]=b,g>h&&this.remove(p.key),b},get:function(a){if(h<Number.MAX_VALUE){var b=l[a];if(!b)return;e(b)}return m[a]},remove:function(a){if(h<Number.MAX_VALUE){var b=l[a];if(!b)return;b==n&&(n=b.p);b==p&&(p=b.n);f(b.n,b.p);delete l[a]}delete m[a];g--},removeAll:function(){m=
{};g=0;l={};n=p=null},destroy:function(){l=k=m=null;delete a[b]},info:function(){return E({},k,{size:g})}}}var a={};b.info=function(){var b={};r(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function de(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function ic(b,a){var c={},d="Directive",e=/^\s*directive\:\s*([\d\w_\-]+)\s+(.*)$/,f=/(([\d\w_\-]+)(?:\:([^;]+))?;?)/,g=/^(on[a-z]+|formaction)$/;this.directive=function m(a,e){Ca(a,"directive");C(a)?
(Db(e,"directiveFactory"),c.hasOwnProperty(a)||(c[a]=[],b.factory(a+d,["$injector","$exceptionHandler",function(b,d){var e=[];r(c[a],function(c,f){try{var g=b.invoke(c);J(g)?g={compile:$(g)}:!g.compile&&g.link&&(g.compile=$(g.link));g.priority=g.priority||0;g.index=f;g.name=g.name||a;g.require=g.require||g.controller&&g.name;g.restrict=g.restrict||"A";e.push(g)}catch(m){d(m)}});return e}])),c[a].push(e)):r(a,$b(m));return this};this.aHrefSanitizationWhitelist=function(b){return D(b)?(a.aHrefSanitizationWhitelist(b),
this):a.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(b){return D(b)?(a.imgSrcSanitizationWhitelist(b),this):a.imgSrcSanitizationWhitelist()};this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",function(a,b,l,n,p,q,t,K,x,v,A,R){function u(a,b,c,d,e){a instanceof y||(a=y(a));r(a,function(b,c){3==b.nodeType&&b.nodeValue.match(/\S+/)&&(a[c]=y(b).wrap("<span></span>").parent()[0])});
var f=I(a,b,a,c,d,e);da(a,"ng-scope");return function(b,c,d,e){Db(b,"scope");var g=c?La.clone.call(a):a;r(d,function(a,b){g.data("$"+b+"Controller",a)});d=0;for(var m=g.length;d<m;d++){var h=g[d].nodeType;1!==h&&9!==h||g.eq(d).data("$scope",b)}c&&c(g,b);f&&f(b,g,g,e);return g}}function da(a,b){try{a.addClass(b)}catch(c){}}function I(a,b,c,d,e,f){function g(a,c,d,e){var f,h,l,q,n,p,t;f=c.length;var x=Array(f);for(q=0;q<f;q++)x[q]=c[q];p=q=0;for(n=m.length;q<n;p++)h=x[p],c=m[q++],f=m[q++],c?(c.scope?
(l=a.$new(),y.data(h,"$scope",l)):l=a,t=c.transcludeOnThisElement?W(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?W(a,b):null,c(f,l,h,d,t)):f&&f(a,h.childNodes,s,e)}for(var m=[],h,l,q,n,p=0;p<a.length;p++)h=new Ob,l=ea(a[p],[],h,0===p?d:s,e),(f=l.length?G(l,a[p],h,b,c,null,[],[],f):null)&&f.scope&&da(h.$$element,"ng-scope"),h=f&&f.terminal||!(q=a[p].childNodes)||!q.length?null:I(q,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b),m.push(f,h),n=n||f||h,f=null;return n?
g:null}function W(a,b,c){return function(d,e,f){var g=!1;d||(d=a.$new(),g=d.$$transcluded=!0);e=b(d,e,f,c);if(g)e.on("$destroy",function(){d.$destroy()});return e}}function ea(a,b,c,d,g){var h=c.$attr,m;switch(a.nodeType){case 1:ca(b,na(Ma(a).toLowerCase()),"E",d,g);for(var l,q,n,p=a.attributes,t=0,x=p&&p.length;t<x;t++){var K=!1,v=!1;l=p[t];if(!Q||8<=Q||l.specified){m=l.name;q=aa(l.value);l=na(m);if(n=V.test(l))m=kb(l.substr(6),"-");var A=l.replace(/(Start|End)$/,"");l===A+"Start"&&(K=m,v=m.substr(0,
m.length-5)+"end",m=m.substr(0,m.length-6));l=na(m.toLowerCase());h[l]=m;if(n||!c.hasOwnProperty(l))c[l]=q,qc(a,l)&&(c[l]=!0);P(a,b,q,l);ca(b,l,"A",d,g,K,v)}}a=a.className;if(C(a)&&""!==a)for(;m=f.exec(a);)l=na(m[2]),ca(b,l,"C",d,g)&&(c[l]=aa(m[3])),a=a.substr(m.index+m[0].length);break;case 3:w(b,a.nodeValue);break;case 8:try{if(m=e.exec(a.nodeValue))l=na(m[1]),ca(b,l,"M",d,g)&&(c[l]=aa(m[2]))}catch(u){}}b.sort(F);return b}function N(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ia("uterdir",
b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return y(d)}function B(a,b,c){return function(d,e,f,g,m){e=N(e[0],b,c);return a(d,e,f,g,m)}}function G(a,c,d,e,f,g,m,n,p){function x(a,b,c,d){if(a){c&&(a=B(a,c,d));a.require=H.require;a.directiveName=oa;if(I===H||H.$$isolateScope)a=tc(a,{isolateScope:!0});m.push(a)}if(b){c&&(b=B(b,c,d));b.require=H.require;b.directiveName=oa;if(I===H||H.$$isolateScope)b=tc(b,{isolateScope:!0});n.push(b)}}
function K(a,b,c,d){var e,f="data",g=!1;if(C(b)){for(;"^"==(e=b.charAt(0))||"?"==e;)b=b.substr(1),"^"==e&&(f="inheritedData"),g=g||"?"==e;e=null;d&&"data"===f&&(e=d[b]);e=e||c[f]("$"+b+"Controller");if(!e&&!g)throw ia("ctreq",b,a);}else L(b)&&(e=[],r(b,function(b){e.push(K(a,b,c,d))}));return e}function v(a,e,f,g,p){function x(a,b){var c;2>arguments.length&&(b=a,a=s);Ea&&(c=ea);return p(a,b,c)}var A,O,u,R,B,N,ea={},qb;A=c===f?d:ga(d,new Ob(y(f),d.$attr));O=A.$$element;if(I){var Na=/^\s*([@=&])(\??)\s*(\w*)\s*$/;
N=e.$new(!0);!G||G!==I&&G!==I.$$originalDirective?O.data("$isolateScopeNoTemplate",N):O.data("$isolateScope",N);da(O,"ng-isolate-scope");r(I.scope,function(a,c){var d=a.match(Na)||[],f=d[3]||c,g="?"==d[2],d=d[1],m,l,n,p;N.$$isolateBindings[c]=d+f;switch(d){case "@":A.$observe(f,function(a){N[c]=a});A.$$observers[f].$$scope=e;A[f]&&(N[c]=b(A[f])(e));break;case "=":if(g&&!A[f])break;l=q(A[f]);p=l.literal?za:function(a,b){return a===b||a!==a&&b!==b};n=l.assign||function(){m=N[c]=l(e);throw ia("nonassign",
A[f],I.name);};m=N[c]=l(e);N.$watch(function(){var a=l(e);p(a,N[c])||(p(a,m)?n(e,a=N[c]):N[c]=a);return m=a},null,l.literal);break;case "&":l=q(A[f]);N[c]=function(a){return l(e,a)};break;default:throw ia("iscp",I.name,c,a);}})}qb=p&&x;W&&r(W,function(a){var b={$scope:a===I||a.$$isolateScope?N:e,$element:O,$attrs:A,$transclude:qb},c;B=a.controller;"@"==B&&(B=A[a.name]);c=t(B,b);ea[a.name]=c;Ea||O.data("$"+a.name+"Controller",c);a.controllerAs&&(b.$scope[a.controllerAs]=c)});g=0;for(u=m.length;g<u;g++)try{R=
m[g],R(R.isolateScope?N:e,O,A,R.require&&K(R.directiveName,R.require,O,ea),qb)}catch(ca){l(ca,ha(O))}g=e;I&&(I.template||null===I.templateUrl)&&(g=N);a&&a(g,f.childNodes,s,p);for(g=n.length-1;0<=g;g--)try{R=n[g],R(R.isolateScope?N:e,O,A,R.require&&K(R.directiveName,R.require,O,ea),qb)}catch(pb){l(pb,ha(O))}}p=p||{};for(var A=-Number.MAX_VALUE,R,W=p.controllerDirectives,I=p.newIsolateScopeDirective,G=p.templateDirective,ca=p.nonTlbTranscludeDirective,F=!1,E=!1,Ea=p.hasElementTranscludeDirective,w=
d.$$element=y(c),H,oa,U,S=e,Q,P=0,pa=a.length;P<pa;P++){H=a[P];var V=H.$$start,Y=H.$$end;V&&(w=N(c,V,Y));U=s;if(A>H.priority)break;if(U=H.scope)R=R||H,H.templateUrl||(M("new/isolated scope",I,H,w),T(U)&&(I=H));oa=H.name;!H.templateUrl&&H.controller&&(U=H.controller,W=W||{},M("'"+oa+"' controller",W[oa],H,w),W[oa]=H);if(U=H.transclude)F=!0,H.$$tlb||(M("transclusion",ca,H,w),ca=H),"element"==U?(Ea=!0,A=H.priority,U=w,w=d.$$element=y(X.createComment(" "+oa+": "+d[oa]+" ")),c=w[0],Na(f,Aa.call(U,0),c),
S=u(U,e,A,g&&g.name,{nonTlbTranscludeDirective:ca})):(U=y(Kb(c)).contents(),w.empty(),S=u(U,e));if(H.template)if(E=!0,M("template",G,H,w),G=H,U=J(H.template)?H.template(w,d):H.template,U=Z(U),H.replace){g=H;U=Ib.test(U)?y(aa(U)):[];c=U[0];if(1!=U.length||1!==c.nodeType)throw ia("tplrt",oa,"");Na(f,w,c);pa={$attr:{}};U=ea(c,[],pa);var $=a.splice(P+1,a.length-(P+1));I&&pb(U);a=a.concat(U).concat($);D(d,pa);pa=a.length}else w.html(U);if(H.templateUrl)E=!0,M("template",G,H,w),G=H,H.replace&&(g=H),v=z(a.splice(P,
a.length-P),w,d,f,F&&S,m,n,{controllerDirectives:W,newIsolateScopeDirective:I,templateDirective:G,nonTlbTranscludeDirective:ca}),pa=a.length;else if(H.compile)try{Q=H.compile(w,d,S),J(Q)?x(null,Q,V,Y):Q&&x(Q.pre,Q.post,V,Y)}catch(ba){l(ba,ha(w))}H.terminal&&(v.terminal=!0,A=Math.max(A,H.priority))}v.scope=R&&!0===R.scope;v.transcludeOnThisElement=F;v.templateOnThisElement=E;v.transclude=S;p.hasElementTranscludeDirective=Ea;return v}function pb(a){for(var b=0,c=a.length;b<c;b++)a[b]=bc(a[b],{$$isolateScope:!0})}
function ca(b,e,f,g,h,q,n){if(e===h)return null;h=null;if(c.hasOwnProperty(e)){var p;e=a.get(e+d);for(var t=0,x=e.length;t<x;t++)try{p=e[t],(g===s||g>p.priority)&&-1!=p.restrict.indexOf(f)&&(q&&(p=bc(p,{$$start:q,$$end:n})),b.push(p),h=p)}catch(K){l(K)}}return h}function D(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;r(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});r(b,function(b,f){"class"==f?(da(e,b),a["class"]=(a["class"]?a["class"]+" ":
"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function z(a,b,c,d,e,f,g,m){var h=[],l,q,t=b[0],x=a.shift(),K=E({},x,{templateUrl:null,transclude:null,replace:null,$$originalDirective:x}),A=J(x.templateUrl)?x.templateUrl(b,c):x.templateUrl;b.empty();n.get(v.getTrustedResourceUrl(A),{cache:p}).success(function(n){var p,v;n=Z(n);if(x.replace){n=Ib.test(n)?y(aa(n)):[];p=n[0];if(1!=n.length||1!==p.nodeType)throw ia("tplrt",
x.name,A);n={$attr:{}};Na(d,b,p);var u=ea(p,[],n);T(x.scope)&&pb(u);a=u.concat(a);D(c,n)}else p=t,b.html(n);a.unshift(K);l=G(a,p,c,e,b,x,f,g,m);r(d,function(a,c){a==p&&(d[c]=b[0])});for(q=I(b[0].childNodes,e);h.length;){n=h.shift();v=h.shift();var R=h.shift(),B=h.shift(),u=b[0];if(v!==t){var N=v.className;m.hasElementTranscludeDirective&&x.replace||(u=Kb(p));Na(R,y(v),u);da(y(u),N)}v=l.transcludeOnThisElement?W(n,l.transclude,B):B;l(q,n,u,d,v)}h=null}).error(function(a,b,c,d){throw ia("tpload",d.url);
});return function(a,b,c,d,e){a=e;h?(h.push(b),h.push(c),h.push(d),h.push(a)):(l.transcludeOnThisElement&&(a=W(b,l.transclude,e)),l(q,b,c,d,a))}}function F(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function M(a,b,c,d){if(b)throw ia("multidir",b.name,c.name,a,ha(d));}function w(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){var b=a.parent().length;b&&da(a.parent(),"ng-binding");return function(a,c){var e=c.parent(),f=e.data("$binding")||
[];f.push(d);e.data("$binding",f);b||da(e,"ng-binding");a.$watch(d,function(a){c[0].nodeValue=a})}}})}function S(a,b){if("srcdoc"==b)return v.HTML;var c=Ma(a);if("xlinkHref"==b||"FORM"==c&&"action"==b||"IMG"!=c&&("src"==b||"ngSrc"==b))return v.RESOURCE_URL}function P(a,c,d,e){var f=b(d,!0);if(f){if("multiple"===e&&"SELECT"===Ma(a))throw ia("selmulti",ha(a));c.push({priority:100,compile:function(){return{pre:function(c,d,m){d=m.$$observers||(m.$$observers={});if(g.test(e))throw ia("nodomevents");if(f=
b(m[e],!0,S(a,e)))m[e]=f(c),(d[e]||(d[e]=[])).$$inter=!0,(m.$$observers&&m.$$observers[e].$$scope||c).$watch(f,function(a,b){"class"===e&&a!=b?m.$updateClass(a,b):m.$set(e,a)})}}}})}}function Na(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,m;if(a)for(g=0,m=a.length;g<m;g++)if(a[g]==d){a[g++]=c;m=g+e-1;for(var h=a.length;g<h;g++,m++)m<h?a[g]=a[m]:delete a[g];a.length-=e-1;break}f&&f.replaceChild(c,d);a=X.createDocumentFragment();a.appendChild(d);c[y.expando]=d[y.expando];d=1;for(e=b.length;d<e;d++)f=
b[d],y(f).remove(),a.appendChild(f),delete b[d];b[0]=c;b.length=1}function tc(a,b){return E(function(){return a.apply(null,arguments)},a,b)}var Ob=function(a,b){this.$$element=a;this.$attr=b||{}};Ob.prototype={$normalize:na,$addClass:function(a){a&&0<a.length&&A.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&A.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=uc(a,b),d=uc(b,a);0===c.length?A.removeClass(this.$$element,d):0===d.length?A.addClass(this.$$element,c):
A.setClass(this.$$element,c,d)},$set:function(a,b,c,d){var e=qc(this.$$element[0],a);e&&(this.$$element.prop(a,b),d=e);this[a]=b;d?this.$attr[a]=d:(d=this.$attr[a])||(this.$attr[a]=d=kb(a,"-"));e=Ma(this.$$element);if("A"===e&&"href"===a||"IMG"===e&&"src"===a)this[a]=b=R(b,"src"===a);!1!==c&&(null===b||b===s?this.$$element.removeAttr(d):this.$$element.attr(d,b));(c=this.$$observers)&&r(c[a],function(a){try{a(b)}catch(c){l(c)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers={}),
e=d[a]||(d[a]=[]);e.push(b);K.$evalAsync(function(){e.$$inter||b(c[a])});return b}};var pa=b.startSymbol(),Ea=b.endSymbol(),Z="{{"==pa||"}}"==Ea?Ga:function(a){return a.replace(/\{\{/g,pa).replace(/}}/g,Ea)},V=/^ngAttr[A-Z]/;return u}]}function na(b){return Ya(b.replace(ue,""))}function uc(b,a){var c="",d=b.split(/\s+/),e=a.split(/\s+/),f=0;a:for(;f<d.length;f++){for(var g=d[f],k=0;k<e.length;k++)if(g==e[k])continue a;c+=(0<c.length?" ":"")+g}return c}function Pd(){var b={},a=/^(\S+)(\s+as\s+(\w+))?$/;
this.register=function(a,d){Ca(a,"controller");T(a)?E(b,a):b[a]=d};this.$get=["$injector","$window",function(c,d){return function(e,f){var g,k,m;C(e)&&(g=e.match(a),k=g[1],m=g[3],e=b.hasOwnProperty(k)?b[k]:hc(f.$scope,k,!0)||hc(d,k,!0),Va(e,k,!0));g=c.instantiate(e,f);if(m){if(!f||"object"!==typeof f.$scope)throw w("$controller")("noscp",k||e.name,m);f.$scope[m]=g}return g}}]}function Qd(){this.$get=["$window",function(b){return y(b.document)}]}function Rd(){this.$get=["$log",function(b){return function(a,
c){b.error.apply(b,arguments)}}]}function vc(b){var a={},c,d,e;if(!b)return a;r(b.split("\n"),function(b){e=b.indexOf(":");c=M(aa(b.substr(0,e)));d=aa(b.substr(e+1));c&&(a[c]=a[c]?a[c]+", "+d:d)});return a}function wc(b){var a=T(b)?b:s;return function(c){a||(a=vc(b));return c?a[M(c)]||null:a}}function xc(b,a,c){if(J(c))return c(b,a);r(c,function(c){b=c(b,a)});return b}function Ud(){var b=/^\s*(\[|\{[^\{])/,a=/[\}\]]\s*$/,c=/^\)\]\}',?\n/,d={"Content-Type":"application/json;charset=utf-8"},e=this.defaults=
{transformResponse:[function(d){C(d)&&(d=d.replace(c,""),b.test(d)&&a.test(d)&&(d=cc(d)));return d}],transformRequest:[function(a){return T(a)&&"[object File]"!==ya.call(a)&&"[object Blob]"!==ya.call(a)?ta(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ga(d),put:ga(d),patch:ga(d)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},f=this.interceptors=[],g=this.responseInterceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",
function(a,b,c,d,n,p){function q(a){function b(a){var d=E({},a,{data:xc(a.data,a.headers,c.transformResponse)});return 200<=a.status&&300>a.status?d:n.reject(d)}var c={method:"get",transformRequest:e.transformRequest,transformResponse:e.transformResponse},d=function(a){var b=e.headers,c=E({},a.headers),d,f,b=E({},b.common,b[M(a.method)]);a:for(d in b){a=M(d);for(f in c)if(M(f)===a)continue a;c[d]=b[d]}(function(a){var b;r(a,function(c,d){J(c)&&(b=c(),null!=b?a[d]=b:delete a[d])})})(c);return c}(a);
E(c,a);c.headers=d;c.method=Ia(c.method);var f=[function(a){d=a.headers;var c=xc(a.data,wc(d),a.transformRequest);F(c)&&r(d,function(a,b){"content-type"===M(b)&&delete d[b]});F(a.withCredentials)&&!F(e.withCredentials)&&(a.withCredentials=e.withCredentials);return t(a,c,d).then(b,b)},s],g=n.when(c);for(r(v,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var m=f.shift(),g=g.then(a,
m)}g.success=function(a){g.then(function(b){a(b.data,b.status,b.headers,c)});return g};g.error=function(a){g.then(null,function(b){a(b.data,b.status,b.headers,c)});return g};return g}function t(c,f,g){function h(a,b,c,e){B&&(200<=a&&300>a?B.put(y,[a,b,vc(c),e]):B.remove(y));p(b,a,c,e);d.$$phase||d.$apply()}function p(a,b,d,e){b=Math.max(b,0);(200<=b&&300>b?v.resolve:v.reject)({data:a,status:b,headers:wc(d),config:c,statusText:e})}function t(){var a=Qa(q.pendingRequests,c);-1!==a&&q.pendingRequests.splice(a,
1)}var v=n.defer(),r=v.promise,B,G,y=K(c.url,c.params);q.pendingRequests.push(c);r.then(t,t);!c.cache&&!e.cache||(!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method)||(B=T(c.cache)?c.cache:T(e.cache)?e.cache:x);if(B)if(G=B.get(y),D(G)){if(G&&J(G.then))return G.then(t,t),G;L(G)?p(G[1],G[0],ga(G[2]),G[3]):p(G,200,{},"OK")}else B.put(y,r);F(G)&&((G=Pb(c.url)?b.cookies()[c.xsrfCookieName||e.xsrfCookieName]:s)&&(g[c.xsrfHeaderName||e.xsrfHeaderName]=G),a(c.method,y,f,h,g,c.timeout,c.withCredentials,c.responseType));
return r}function K(a,b){if(!b)return a;var c=[];Tc(b,function(a,b){null===a||F(a)||(L(a)||(a=[a]),r(a,function(a){T(a)&&(sa(a)?a=a.toISOString():T(a)&&(a=ta(a)));c.push(Ba(b)+"="+Ba(a))}))});0<c.length&&(a+=(-1==a.indexOf("?")?"?":"&")+c.join("&"));return a}var x=c("$http"),v=[];r(f,function(a){v.unshift(C(a)?p.get(a):p.invoke(a))});r(g,function(a,b){var c=C(a)?p.get(a):p.invoke(a);v.splice(b,0,{response:function(a){return c(n.when(a))},responseError:function(a){return c(n.reject(a))}})});q.pendingRequests=
[];(function(a){r(arguments,function(a){q[a]=function(b,c){return q(E(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){r(arguments,function(a){q[a]=function(b,c,d){return q(E(d||{},{method:a,url:b,data:c}))}})})("post","put");q.defaults=e;return q}]}function ve(b){if(8>=Q&&(!b.match(/^(get|post|head|put|delete|options)$/i)||!P.XMLHttpRequest))return new P.ActiveXObject("Microsoft.XMLHTTP");if(P.XMLHttpRequest)return new P.XMLHttpRequest;throw w("$httpBackend")("noxhr");}function Vd(){this.$get=
["$browser","$window","$document",function(b,a,c){return we(b,ve,b.defer,a.angular.callbacks,c[0])}]}function we(b,a,c,d,e){function f(a,b,c){var f=e.createElement("script"),g=null;f.type="text/javascript";f.src=a;f.async=!0;g=function(a){Za(f,"load",g);Za(f,"error",g);e.body.removeChild(f);f=null;var k=-1,t="unknown";a&&("load"!==a.type||d[b].called||(a={type:"error"}),t=a.type,k="error"===a.type?404:200);c&&c(k,t)};rb(f,"load",g);rb(f,"error",g);8>=Q&&(f.onreadystatechange=function(){C(f.readyState)&&
/loaded|complete/.test(f.readyState)&&(f.onreadystatechange=null,g({type:"load"}))});e.body.appendChild(f);return g}var g=-1;return function(e,m,h,l,n,p,q,t){function K(){v=g;R&&R();u&&u.abort()}function x(a,d,e,f,g){I&&c.cancel(I);R=u=null;0===d&&(d=e?200:"file"==ua(m).protocol?404:0);a(1223===d?204:d,e,f,g||"");b.$$completeOutstandingRequest(z)}var v;b.$$incOutstandingRequestCount();m=m||b.url();if("jsonp"==M(e)){var A="_"+(d.counter++).toString(36);d[A]=function(a){d[A].data=a;d[A].called=!0};
var R=f(m.replace("JSON_CALLBACK","angular.callbacks."+A),A,function(a,b){x(l,a,d[A].data,"",b);d[A]=z})}else{var u=a(e);u.open(e,m,!0);r(n,function(a,b){D(a)&&u.setRequestHeader(b,a)});u.onreadystatechange=function(){if(u&&4==u.readyState){var a=null,b=null,c="";v!==g&&(a=u.getAllResponseHeaders(),b="response"in u?u.response:u.responseText);v===g&&10>Q||(c=u.statusText);x(l,v||u.status,b,a,c)}};q&&(u.withCredentials=!0);if(t)try{u.responseType=t}catch(da){if("json"!==t)throw da;}u.send(h||null)}if(0<
p)var I=c(K,p);else p&&J(p.then)&&p.then(K)}}function Sd(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b};this.endSymbol=function(b){return b?(a=b,this):a};this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function f(f,h,l){for(var n,p,q=0,t=[],K=f.length,x=!1,v=[];q<K;)-1!=(n=f.indexOf(b,q))&&-1!=(p=f.indexOf(a,n+g))?(q!=n&&t.push(f.substring(q,n)),t.push(q=c(x=f.substring(n+g,p))),q.exp=x,q=p+k,x=!0):(q!=K&&t.push(f.substring(q)),q=K);(K=t.length)||(t.push(""),
K=1);if(l&&1<t.length)throw yc("noconcat",f);if(!h||x)return v.length=K,q=function(a){try{for(var b=0,c=K,g;b<c;b++){if("function"==typeof(g=t[b]))if(g=g(a),g=l?e.getTrusted(l,g):e.valueOf(g),null==g)g="";else switch(typeof g){case "string":break;case "number":g=""+g;break;default:g=ta(g)}v[b]=g}return v.join("")}catch(k){a=yc("interr",f,k.toString()),d(a)}},q.exp=f,q.parts=t,q}var g=b.length,k=a.length;f.startSymbol=function(){return b};f.endSymbol=function(){return a};return f}]}function Td(){this.$get=
["$rootScope","$window","$q",function(b,a,c){function d(d,g,k,m){var h=a.setInterval,l=a.clearInterval,n=c.defer(),p=n.promise,q=0,t=D(m)&&!m;k=D(k)?k:0;p.then(null,null,d);p.$$intervalId=h(function(){n.notify(q++);0<k&&q>=k&&(n.resolve(q),l(p.$$intervalId),delete e[p.$$intervalId]);t||b.$apply()},g);e[p.$$intervalId]=n;return p}var e={};d.cancel=function(b){return b&&b.$$intervalId in e?(e[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete e[b.$$intervalId],!0):!1};return d}]}
function bd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),
DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function Qb(b){b=b.split("/");for(var a=b.length;a--;)b[a]=jb(b[a]);return b.join("/")}function zc(b,a,c){b=ua(b,c);a.$$protocol=
b.protocol;a.$$host=b.hostname;a.$$port=Z(b.port)||xe[b.protocol]||null}function Ac(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b);b=ua(b,c);a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):b.pathname);a.$$search=ec(b.search);a.$$hash=decodeURIComponent(b.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function qa(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function cb(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Rb(b){return b.substr(0,
cb(b).lastIndexOf("/")+1)}function Bc(b,a){this.$$html5=!0;a=a||"";var c=Rb(b);zc(b,this,b);this.$$parse=function(a){var e=qa(c,a);if(!C(e))throw Sb("ipthprfx",a,c);Ac(e,this,b);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Cb(this.$$search),b=this.$$hash?"#"+jb(this.$$hash):"";this.$$url=Qb(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$rewrite=function(d){var e;if((e=qa(b,d))!==s)return d=e,(e=qa(a,e))!==s?c+(qa("/",e)||e):b+d;if((e=qa(c,
d))!==s)return c+e;if(c==d+"/")return c}}function Tb(b,a){var c=Rb(b);zc(b,this,b);this.$$parse=function(d){var e=qa(b,d)||qa(c,d),e="#"==e.charAt(0)?qa(a,e):this.$$html5?e:"";if(!C(e))throw Sb("ihshprfx",d,a);Ac(e,this,b);d=this.$$path;var f=/^\/[A-Z]:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,""));f.exec(e)||(d=(e=f.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Cb(this.$$search),e=this.$$hash?"#"+jb(this.$$hash):"";this.$$url=Qb(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=
b+(this.$$url?a+this.$$url:"")};this.$$rewrite=function(a){if(cb(b)==cb(a))return a}}function Ub(b,a){this.$$html5=!0;Tb.apply(this,arguments);var c=Rb(b);this.$$rewrite=function(d){var e;if(b==cb(d))return d;if(e=qa(c,d))return b+a+e;if(c===d+"/")return c};this.$$compose=function(){var c=Cb(this.$$search),e=this.$$hash?"#"+jb(this.$$hash):"";this.$$url=Qb(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+a+this.$$url}}function sb(b){return function(){return this[b]}}function Cc(b,a){return function(c){if(F(c))return this[b];
this[b]=a(c);this.$$compose();return this}}function Wd(){var b="",a=!1;this.hashPrefix=function(a){return D(a)?(b=a,this):b};this.html5Mode=function(b){return D(b)?(a=b,this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,f){function g(a){c.$broadcast("$locationChangeSuccess",k.absUrl(),a)}var k,m,h=d.baseHref(),l=d.url(),n;a?(n=l.substring(0,l.indexOf("/",l.indexOf("//")+2))+(h||"/"),m=e.history?Bc:Ub):(n=cb(l),m=Tb);k=new m(n,"#"+b);k.$$parse(k.$$rewrite(l));var p=
/^\s*(javascript|mailto):/i;f.on("click",function(a){if(!a.ctrlKey&&!a.metaKey&&2!=a.which){for(var e=y(a.target);"a"!==M(e[0].nodeName);)if(e[0]===f[0]||!(e=e.parent())[0])return;var g=e.prop("href");T(g)&&"[object SVGAnimatedString]"===g.toString()&&(g=ua(g.animVal).href);if(!p.test(g)){if(m===Ub){var h=e.attr("href")||e.attr("xlink:href");if(0>h.indexOf("://"))if(g="#"+b,"/"==h[0])g=n+g+h;else if("#"==h[0])g=n+g+(k.path()||"/")+h;else{for(var l=k.path().split("/"),h=h.split("/"),q=0;q<h.length;q++)"."!=
h[q]&&(".."==h[q]?l.pop():h[q].length&&l.push(h[q]));g=n+g+l.join("/")}}l=k.$$rewrite(g);g&&(!e.attr("target")&&l&&!a.isDefaultPrevented())&&(a.preventDefault(),l!=d.url()&&(k.$$parse(l),c.$apply(),P.angular["ff-684208-preventDefault"]=!0))}}});k.absUrl()!=l&&d.url(k.absUrl(),!0);d.onUrlChange(function(a){k.absUrl()!=a&&(c.$evalAsync(function(){var b=k.absUrl();k.$$parse(a);c.$broadcast("$locationChangeStart",a,b).defaultPrevented?(k.$$parse(b),d.url(b)):g(b)}),c.$$phase||c.$digest())});var q=0;c.$watch(function(){var a=
d.url(),b=k.$$replace;q&&a==k.absUrl()||(q++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",k.absUrl(),a).defaultPrevented?k.$$parse(a):(d.url(k.absUrl(),b),g(a))}));k.$$replace=!1;return q});return k}]}function Xd(){var b=!0,a=this;this.debugEnabled=function(a){return D(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+
":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||z;a=!1;try{a=!!e.apply}catch(m){}return a?function(){var a=[];r(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function ja(b,a){if("__defineGetter__"===b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===
b)throw ka("isecfld",a);return b}function Oa(b,a){if(b){if(b.constructor===b)throw ka("isecfn",a);if(b.document&&b.location&&b.alert&&b.setInterval)throw ka("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw ka("isecdom",a);if(b===Object)throw ka("isecobj",a);}return b}function tb(b,a,c,d,e){e=e||{};a=a.split(".");for(var f,g=0;1<a.length;g++){f=ja(a.shift(),d);var k=b[f];k||(k={},b[f]=k);b=k;b.then&&e.unwrapPromises&&(va(d),"$$v"in b||function(a){a.then(function(b){a.$$v=b})}(b),
b.$$v===s&&(b.$$v={}),b=b.$$v)}f=ja(a.shift(),d);Oa(b,d);Oa(b[f],d);return b[f]=c}function Dc(b,a,c,d,e,f,g){ja(b,f);ja(a,f);ja(c,f);ja(d,f);ja(e,f);return g.unwrapPromises?function(g,m){var h=m&&m.hasOwnProperty(b)?m:g,l;if(null==h)return h;(h=h[b])&&h.then&&(va(f),"$$v"in h||(l=h,l.$$v=s,l.then(function(a){l.$$v=a})),h=h.$$v);if(!a)return h;if(null==h)return s;(h=h[a])&&h.then&&(va(f),"$$v"in h||(l=h,l.$$v=s,l.then(function(a){l.$$v=a})),h=h.$$v);if(!c)return h;if(null==h)return s;(h=h[c])&&h.then&&
(va(f),"$$v"in h||(l=h,l.$$v=s,l.then(function(a){l.$$v=a})),h=h.$$v);if(!d)return h;if(null==h)return s;(h=h[d])&&h.then&&(va(f),"$$v"in h||(l=h,l.$$v=s,l.then(function(a){l.$$v=a})),h=h.$$v);if(!e)return h;if(null==h)return s;(h=h[e])&&h.then&&(va(f),"$$v"in h||(l=h,l.$$v=s,l.then(function(a){l.$$v=a})),h=h.$$v);return h}:function(f,g){var h=g&&g.hasOwnProperty(b)?g:f;if(null==h)return h;h=h[b];if(!a)return h;if(null==h)return s;h=h[a];if(!c)return h;if(null==h)return s;h=h[c];if(!d)return h;if(null==
h)return s;h=h[d];return e?null==h?s:h=h[e]:h}}function Ec(b,a,c){if(Vb.hasOwnProperty(b))return Vb[b];var d=b.split("."),e=d.length,f;if(a.csp)f=6>e?Dc(d[0],d[1],d[2],d[3],d[4],c,a):function(b,f){var g=0,k;do k=Dc(d[g++],d[g++],d[g++],d[g++],d[g++],c,a)(b,f),f=s,b=k;while(g<e);return k};else{var g="var p;\n";r(d,function(b,d){ja(b,c);g+="if(s == null) return undefined;\ns="+(d?"s":'((k&&k.hasOwnProperty("'+b+'"))?k:s)')+'["'+b+'"];\n'+(a.unwrapPromises?'if (s && s.then) {\n pw("'+c.replace(/(["\r\n])/g,
"\\$1")+'");\n if (!("$$v" in s)) {\n p=s;\n p.$$v = undefined;\n p.then(function(v) {p.$$v=v;});\n}\n s=s.$$v\n}\n':"")});var g=g+"return s;",k=new Function("s","k","pw",g);k.toString=$(g);f=a.unwrapPromises?function(a,b){return k(a,b,va)}:k}"hasOwnProperty"!==b&&(Vb[b]=f);return f}function Yd(){var b={},a={csp:!1,unwrapPromises:!1,logPromiseWarnings:!0};this.unwrapPromises=function(b){return D(b)?(a.unwrapPromises=!!b,this):a.unwrapPromises};this.logPromiseWarnings=function(b){return D(b)?(a.logPromiseWarnings=
b,this):a.logPromiseWarnings};this.$get=["$filter","$sniffer","$log",function(c,d,e){a.csp=d.csp;va=function(b){a.logPromiseWarnings&&!Fc.hasOwnProperty(b)&&(Fc[b]=!0,e.warn("[$parse] Promise found in the expression `"+b+"`. Automatic unwrapping of promises in Angular expressions is deprecated."))};return function(d){var e;switch(typeof d){case "string":if(b.hasOwnProperty(d))return b[d];e=new Wb(a);e=(new db(e,c,a)).parse(d);"hasOwnProperty"!==d&&(b[d]=e);return e;case "function":return d;default:return z}}}]}
function $d(){this.$get=["$rootScope","$exceptionHandler",function(b,a){return ye(function(a){b.$evalAsync(a)},a)}]}function ye(b,a){function c(a){return a}function d(a){return g(a)}var e=function(){var g=[],h,l;return l={resolve:function(a){if(g){var c=g;g=s;h=f(a);c.length&&b(function(){for(var a,b=0,d=c.length;b<d;b++)a=c[b],h.then(a[0],a[1],a[2])})}},reject:function(a){l.resolve(k(a))},notify:function(a){if(g){var c=g;g.length&&b(function(){for(var b,d=0,e=c.length;d<e;d++)b=c[d],b[2](a)})}},
promise:{then:function(b,f,k){var l=e(),K=function(d){try{l.resolve((J(b)?b:c)(d))}catch(e){l.reject(e),a(e)}},x=function(b){try{l.resolve((J(f)?f:d)(b))}catch(c){l.reject(c),a(c)}},v=function(b){try{l.notify((J(k)?k:c)(b))}catch(d){a(d)}};g?g.push([K,x,v]):h.then(K,x,v);return l.promise},"catch":function(a){return this.then(null,a)},"finally":function(a){function b(a,c){var d=e();c?d.resolve(a):d.reject(a);return d.promise}function d(e,f){var g=null;try{g=(a||c)()}catch(k){return b(k,!1)}return g&&
J(g.then)?g.then(function(){return b(e,f)},function(a){return b(a,!1)}):b(e,f)}return this.then(function(a){return d(a,!0)},function(a){return d(a,!1)})}}}},f=function(a){return a&&J(a.then)?a:{then:function(c){var d=e();b(function(){d.resolve(c(a))});return d.promise}}},g=function(a){var b=e();b.reject(a);return b.promise},k=function(c){return{then:function(f,g){var k=e();b(function(){try{k.resolve((J(g)?g:d)(c))}catch(b){k.reject(b),a(b)}});return k.promise}}};return{defer:e,reject:g,when:function(k,
h,l,n){var p=e(),q,t=function(b){try{return(J(h)?h:c)(b)}catch(d){return a(d),g(d)}},K=function(b){try{return(J(l)?l:d)(b)}catch(c){return a(c),g(c)}},x=function(b){try{return(J(n)?n:c)(b)}catch(d){a(d)}};b(function(){f(k).then(function(a){q||(q=!0,p.resolve(f(a).then(t,K,x)))},function(a){q||(q=!0,p.resolve(K(a)))},function(a){q||p.notify(x(a))})});return p.promise},all:function(a){var b=e(),c=0,d=L(a)?[]:{};r(a,function(a,e){c++;f(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},
function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise}}}function ge(){this.$get=["$window","$timeout",function(b,a){var c=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame,d=b.cancelAnimationFrame||b.webkitCancelAnimationFrame||b.mozCancelAnimationFrame||b.webkitCancelRequestAnimationFrame,e=!!c,f=e?function(a){var b=c(a);return function(){d(b)}}:function(b){var c=a(b,16.66,!1);return function(){a.cancel(c)}};f.supported=e;return f}]}
function Zd(){var b=10,a=w("$rootScope"),c=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$injector","$exceptionHandler","$parse","$browser",function(d,e,f,g){function k(){this.$id=gb();this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this["this"]=this.$root=this;this.$$destroyed=!1;this.$$asyncQueue=[];this.$$postDigestQueue=[];this.$$listeners={};this.$$listenerCount={};this.$$isolateBindings={}}
function m(b){if(p.$$phase)throw a("inprog",p.$$phase);p.$$phase=b}function h(a,b){var c=f(a);Va(c,b);return c}function l(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function n(){}k.prototype={constructor:k,$new:function(a){a?(a=new k,a.$root=this.$root,a.$$asyncQueue=this.$$asyncQueue,a.$$postDigestQueue=this.$$postDigestQueue):(this.$$childScopeClass||(this.$$childScopeClass=function(){this.$$watchers=this.$$nextSibling=this.$$childHead=
this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$id=gb();this.$$childScopeClass=null},this.$$childScopeClass.prototype=this),a=new this.$$childScopeClass);a["this"]=a;a.$parent=this;a.$$prevSibling=this.$$childTail;this.$$childHead?this.$$childTail=this.$$childTail.$$nextSibling=a:this.$$childHead=this.$$childTail=a;return a},$watch:function(a,b,d){var e=h(a,"watch"),f=this.$$watchers,g={fn:b,last:n,get:e,exp:a,eq:!!d};c=null;if(!J(b)){var k=h(b||z,"listener");g.fn=function(a,
b,c){k(c)}}if("string"==typeof a&&e.constant){var m=g.fn;g.fn=function(a,b,c){m.call(this,a,b,c);Ra(f,g)}}f||(f=this.$$watchers=[]);f.unshift(g);return function(){Ra(f,g);c=null}},$watchCollection:function(a,b){var c=this,d,e,g,k=1<b.length,h=0,m=f(a),l=[],p={},n=!0,r=0;return this.$watch(function(){d=m(c);var a,b,f;if(T(d))if(fb(d))for(e!==l&&(e=l,r=e.length=0,h++),a=d.length,r!==a&&(h++,e.length=r=a),b=0;b<a;b++)f=e[b]!==e[b]&&d[b]!==d[b],f||e[b]===d[b]||(h++,e[b]=d[b]);else{e!==p&&(e=p={},r=0,
h++);a=0;for(b in d)d.hasOwnProperty(b)&&(a++,e.hasOwnProperty(b)?(f=e[b]!==e[b]&&d[b]!==d[b],f||e[b]===d[b]||(h++,e[b]=d[b])):(r++,e[b]=d[b],h++));if(r>a)for(b in h++,e)e.hasOwnProperty(b)&&!d.hasOwnProperty(b)&&(r--,delete e[b])}else e!==d&&(e=d,h++);return h},function(){n?(n=!1,b(d,d,c)):b(d,g,c);if(k)if(T(d))if(fb(d)){g=Array(d.length);for(var a=0;a<d.length;a++)g[a]=d[a]}else for(a in g={},d)ib.call(d,a)&&(g[a]=d[a]);else g=d})},$digest:function(){var d,f,g,k,h=this.$$asyncQueue,l=this.$$postDigestQueue,
r,u,s=b,I,W=[],y,N,B;m("$digest");c=null;do{u=!1;for(I=this;h.length;){try{B=h.shift(),B.scope.$eval(B.expression)}catch(G){p.$$phase=null,e(G)}c=null}a:do{if(k=I.$$watchers)for(r=k.length;r--;)try{if(d=k[r])if((f=d.get(I))!==(g=d.last)&&!(d.eq?za(f,g):"number"===typeof f&&"number"===typeof g&&isNaN(f)&&isNaN(g)))u=!0,c=d,d.last=d.eq?Ha(f,null):f,d.fn(f,g===n?f:g,I),5>s&&(y=4-s,W[y]||(W[y]=[]),N=J(d.exp)?"fn: "+(d.exp.name||d.exp.toString()):d.exp,N+="; newVal: "+ta(f)+"; oldVal: "+ta(g),W[y].push(N));
else if(d===c){u=!1;break a}}catch(D){p.$$phase=null,e(D)}if(!(k=I.$$childHead||I!==this&&I.$$nextSibling))for(;I!==this&&!(k=I.$$nextSibling);)I=I.$parent}while(I=k);if((u||h.length)&&!s--)throw p.$$phase=null,a("infdig",b,ta(W));}while(u||h.length);for(p.$$phase=null;l.length;)try{l.shift()()}catch(w){e(w)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this!==p&&(r(this.$$listenerCount,Bb(null,l,this)),a.$$childHead==this&&(a.$$childHead=
this.$$nextSibling),a.$$childTail==this&&(a.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=null,this.$$listeners={},this.$$watchers=this.$$asyncQueue=this.$$postDigestQueue=[],this.$destroy=this.$digest=this.$apply=z,this.$on=this.$watch=function(){return z})}},$eval:function(a,
b){return f(a)(this,b)},$evalAsync:function(a){p.$$phase||p.$$asyncQueue.length||g.defer(function(){p.$$asyncQueue.length&&p.$digest()});this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)},$apply:function(a){try{return m("$apply"),this.$eval(a)}catch(b){e(b)}finally{p.$$phase=null;try{p.$digest()}catch(c){throw e(c),c;}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=
0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){c[Qa(c,b)]=null;l(e,1,a)}},$emit:function(a,b){var c=[],d,f=this,g=!1,k={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){k.defaultPrevented=!0},defaultPrevented:!1},h=[k].concat(Aa.call(arguments,1)),m,l;do{d=f.$$listeners[a]||c;k.currentScope=f;m=0;for(l=d.length;m<l;m++)if(d[m])try{d[m].apply(null,h)}catch(p){e(p)}else d.splice(m,1),m--,l--;if(g)break;f=f.$parent}while(f);return k},$broadcast:function(a,
b){for(var c=this,d=this,f={name:a,targetScope:this,preventDefault:function(){f.defaultPrevented=!0},defaultPrevented:!1},g=[f].concat(Aa.call(arguments,1)),k,h;c=d;){f.currentScope=c;d=c.$$listeners[a]||[];k=0;for(h=d.length;k<h;k++)if(d[k])try{d[k].apply(null,g)}catch(m){e(m)}else d.splice(k,1),k--,h--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}return f}};var p=new k;return p}]}function cd(){var b=/^\s*(https?|ftp|mailto|tel|file):/,
a=/^\s*(https?|ftp|file):|data:image\//;this.aHrefSanitizationWhitelist=function(a){return D(a)?(b=a,this):b};this.imgSrcSanitizationWhitelist=function(b){return D(b)?(a=b,this):a};this.$get=function(){return function(c,d){var e=d?a:b,f;if(!Q||8<=Q)if(f=ua(c).href,""!==f&&!f.match(e))return"unsafe:"+f;return c}}}function ze(b){if("self"===b)return b;if(C(b)){if(-1<b.indexOf("***"))throw wa("iwcard",b);b=b.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08").replace("\\*\\*",".*").replace("\\*",
"[^:/.?&;]*");return RegExp("^"+b+"$")}if(hb(b))return RegExp("^"+b.source+"$");throw wa("imatcher");}function Gc(b){var a=[];D(b)&&r(b,function(b){a.push(ze(b))});return a}function be(){this.SCE_CONTEXTS=fa;var b=["self"],a=[];this.resourceUrlWhitelist=function(a){arguments.length&&(b=Gc(a));return b};this.resourceUrlBlacklist=function(b){arguments.length&&(a=Gc(b));return a};this.$get=["$injector",function(c){function d(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=
new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var e=function(a){throw wa("unsafe");};c.has("$sanitize")&&(e=c.get("$sanitize"));var f=d(),g={};g[fa.HTML]=d(f);g[fa.CSS]=d(f);g[fa.URL]=d(f);g[fa.JS]=d(f);g[fa.RESOURCE_URL]=d(g[fa.URL]);return{trustAs:function(a,b){var c=g.hasOwnProperty(a)?g[a]:null;if(!c)throw wa("icontext",a,b);if(null===b||b===s||""===b)return b;if("string"!==typeof b)throw wa("itype",
a);return new c(b)},getTrusted:function(c,d){if(null===d||d===s||""===d)return d;var f=g.hasOwnProperty(c)?g[c]:null;if(f&&d instanceof f)return d.$$unwrapTrustedValue();if(c===fa.RESOURCE_URL){var f=ua(d.toString()),l,n,p=!1;l=0;for(n=b.length;l<n;l++)if("self"===b[l]?Pb(f):b[l].exec(f.href)){p=!0;break}if(p)for(l=0,n=a.length;l<n;l++)if("self"===a[l]?Pb(f):a[l].exec(f.href)){p=!1;break}if(p)return d;throw wa("insecurl",d.toString());}if(c===fa.HTML)return e(d);throw wa("unsafe");},valueOf:function(a){return a instanceof
f?a.$$unwrapTrustedValue():a}}}]}function ae(){var b=!0;this.enabled=function(a){arguments.length&&(b=!!a);return b};this.$get=["$parse","$sniffer","$sceDelegate",function(a,c,d){if(b&&c.msie&&8>c.msieDocumentMode)throw wa("iequirks");var e=ga(fa);e.isEnabled=function(){return b};e.trustAs=d.trustAs;e.getTrusted=d.getTrusted;e.valueOf=d.valueOf;b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=Ga);e.parseAs=function(b,c){var d=a(c);return d.literal&&d.constant?d:function(a,c){return e.getTrusted(b,
d(a,c))}};var f=e.parseAs,g=e.getTrusted,k=e.trustAs;r(fa,function(a,b){var c=M(b);e[Ya("parse_as_"+c)]=function(b){return f(a,b)};e[Ya("get_trusted_"+c)]=function(b){return g(a,b)};e[Ya("trust_as_"+c)]=function(b){return k(a,b)}});return e}]}function ce(){this.$get=["$window","$document",function(b,a){var c={},d=Z((/android (\d+)/.exec(M((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g=f.documentMode,k,m=/^(Moz|webkit|O|ms)(?=[A-Z])/,h=f.body&&f.body.style,
l=!1,n=!1;if(h){for(var p in h)if(l=m.exec(p)){k=l[0];k=k.substr(0,1).toUpperCase()+k.substr(1);break}k||(k="WebkitOpacity"in h&&"webkit");l=!!("transition"in h||k+"Transition"in h);n=!!("animation"in h||k+"Animation"in h);!d||l&&n||(l=C(f.body.style.webkitTransition),n=C(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hashchange:"onhashchange"in b&&(!g||7<g),hasEvent:function(a){if("input"==a&&9==Q)return!1;if(F(c[a])){var b=f.createElement("div");c[a]="on"+
a in b}return c[a]},csp:Wa(),vendorPrefix:k,transitions:l,animations:n,android:d,msie:Q,msieDocumentMode:g}}]}function ee(){this.$get=["$rootScope","$browser","$q","$exceptionHandler",function(b,a,c,d){function e(e,k,m){var h=c.defer(),l=h.promise,n=D(m)&&!m;k=a.defer(function(){try{h.resolve(e())}catch(a){h.reject(a),d(a)}finally{delete f[l.$$timeoutId]}n||b.$apply()},k);l.$$timeoutId=k;f[k]=h;return l}var f={};e.cancel=function(b){return b&&b.$$timeoutId in f?(f[b.$$timeoutId].reject("canceled"),
delete f[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1};return e}]}function ua(b,a){var c=b;Q&&(V.setAttribute("href",c),c=V.href);V.setAttribute("href",c);return{href:V.href,protocol:V.protocol?V.protocol.replace(/:$/,""):"",host:V.host,search:V.search?V.search.replace(/^\?/,""):"",hash:V.hash?V.hash.replace(/^#/,""):"",hostname:V.hostname,port:V.port,pathname:"/"===V.pathname.charAt(0)?V.pathname:"/"+V.pathname}}function Pb(b){b=C(b)?ua(b):b;return b.protocol===Hc.protocol&&b.host===Hc.host}
function fe(){this.$get=$(P)}function mc(b){function a(d,e){if(T(d)){var f={};r(d,function(b,c){f[c]=a(c,b)});return f}return b.factory(d+c,e)}var c="Filter";this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}];a("currency",Ic);a("date",Jc);a("filter",Ae);a("json",Be);a("limitTo",Ce);a("lowercase",De);a("number",Kc);a("orderBy",Lc);a("uppercase",Ee)}function Ae(){return function(b,a,c){if(!L(b))return b;var d=typeof c,e=[];e.check=function(a){for(var b=0;b<e.length;b++)if(!e[b](a))return!1;
return!0};"function"!==d&&(c="boolean"===d&&c?function(a,b){return Ua.equals(a,b)}:function(a,b){if(a&&b&&"object"===typeof a&&"object"===typeof b){for(var d in a)if("$"!==d.charAt(0)&&ib.call(a,d)&&c(a[d],b[d]))return!0;return!1}b=(""+b).toLowerCase();return-1<(""+a).toLowerCase().indexOf(b)});var f=function(a,b){if("string"==typeof b&&"!"===b.charAt(0))return!f(a,b.substr(1));switch(typeof a){case "boolean":case "number":case "string":return c(a,b);case "object":switch(typeof b){case "object":return c(a,
b);default:for(var d in a)if("$"!==d.charAt(0)&&f(a[d],b))return!0}return!1;case "array":for(d=0;d<a.length;d++)if(f(a[d],b))return!0;return!1;default:return!1}};switch(typeof a){case "boolean":case "number":case "string":a={$:a};case "object":for(var g in a)(function(b){"undefined"!==typeof a[b]&&e.push(function(c){return f("$"==b?c:c&&c[b],a[b])})})(g);break;case "function":e.push(a);break;default:return b}d=[];for(g=0;g<b.length;g++){var k=b[g];e.check(k)&&d.push(k)}return d}}function Ic(b){var a=
b.NUMBER_FORMATS;return function(b,d){F(d)&&(d=a.CURRENCY_SYM);return Mc(b,a.PATTERNS[1],a.GROUP_SEP,a.DECIMAL_SEP,2).replace(/\u00A4/g,d)}}function Kc(b){var a=b.NUMBER_FORMATS;return function(b,d){return Mc(b,a.PATTERNS[0],a.GROUP_SEP,a.DECIMAL_SEP,d)}}function Mc(b,a,c,d,e){if(null==b||!isFinite(b)||T(b))return"";var f=0>b;b=Math.abs(b);var g=b+"",k="",m=[],h=!1;if(-1!==g.indexOf("e")){var l=g.match(/([\d\.]+)e(-?)(\d+)/);l&&"-"==l[2]&&l[3]>e+1?(g="0",b=0):(k=g,h=!0)}if(h)0<e&&(-1<b&&1>b)&&(k=
b.toFixed(e));else{g=(g.split(Nc)[1]||"").length;F(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e);b=(""+b).split(Nc);g=b[0];b=b[1]||"";var l=0,n=a.lgSize,p=a.gSize;if(g.length>=n+p)for(l=g.length-n,h=0;h<l;h++)0===(l-h)%p&&0!==h&&(k+=c),k+=g.charAt(h);for(h=l;h<g.length;h++)0===(g.length-h)%n&&0!==h&&(k+=c),k+=g.charAt(h);for(;b.length<e;)b+="0";e&&"0"!==e&&(k+=d+b.substr(0,e))}m.push(f?a.negPre:a.posPre);m.push(k);m.push(f?a.negSuf:a.posSuf);
return m.join("")}function Xb(b,a,c){var d="";0>b&&(d="-",b=-b);for(b=""+b;b.length<a;)b="0"+b;c&&(b=b.substr(b.length-a));return d+b}function Y(b,a,c,d){c=c||0;return function(e){e=e["get"+b]();if(0<c||e>-c)e+=c;0===e&&-12==c&&(e=12);return Xb(e,a,d)}}function ub(b,a){return function(c,d){var e=c["get"+b](),f=Ia(a?"SHORT"+b:b);return d[f][e]}}function Jc(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,k=b[8]?a.setUTCFullYear:a.setFullYear,m=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=
Z(b[9]+b[10]),g=Z(b[9]+b[11]));k.call(a,Z(b[1]),Z(b[2])-1,Z(b[3]));f=Z(b[4]||0)-f;g=Z(b[5]||0)-g;k=Z(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));m.call(a,f,g,k,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var f="",g=[],k,m;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;C(c)&&(c=Fe.test(c)?Z(c):a(c));Ab(c)&&(c=new Date(c));if(!sa(c))return c;for(;e;)(m=Ge.exec(e))?(g=g.concat(Aa.call(m,1)),e=g.pop()):
(g.push(e),e=null);r(g,function(a){k=He[a];f+=k?k(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return f}}function Be(){return function(b){return ta(b,!0)}}function Ce(){return function(b,a){if(!L(b)&&!C(b))return b;a=Infinity===Math.abs(Number(a))?Number(a):Z(a);if(C(b))return a?0<=a?b.slice(0,a):b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);0<a?(d=0,e=a):(d=b.length+a,e=b.length);for(;d<e;d++)c.push(b[d]);return c}}function Lc(b){return function(a,
c,d){function e(a,b){return Ta(b)?function(b,c){return a(c,b)}:a}function f(a,b){var c=typeof a,d=typeof b;return c==d?(sa(a)&&sa(b)&&(a=a.valueOf(),b=b.valueOf()),"string"==c&&(a=a.toLowerCase(),b=b.toLowerCase()),a===b?0:a<b?-1:1):c<d?-1:1}if(!L(a)||!c)return a;c=L(c)?c:[c];c=Vc(c,function(a){var c=!1,d=a||Ga;if(C(a)){if("+"==a.charAt(0)||"-"==a.charAt(0))c="-"==a.charAt(0),a=a.substring(1);d=b(a);if(d.constant){var g=d();return e(function(a,b){return f(a[g],b[g])},c)}}return e(function(a,b){return f(d(a),
d(b))},c)});for(var g=[],k=0;k<a.length;k++)g.push(a[k]);return g.sort(e(function(a,b){for(var d=0;d<c.length;d++){var e=c[d](a,b);if(0!==e)return e}return 0},d))}}function xa(b){J(b)&&(b={link:b});b.restrict=b.restrict||"AC";return $(b)}function Oc(b,a,c,d){function e(a,c){c=c?"-"+kb(c,"-"):"";d.removeClass(b,(a?vb:wb)+c);d.addClass(b,(a?wb:vb)+c)}var f=this,g=b.parent().controller("form")||xb,k=0,m=f.$error={},h=[];f.$name=a.name||a.ngForm;f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;g.$addControl(f);
b.addClass(Pa);e(!0);f.$addControl=function(a){Ca(a.$name,"input");h.push(a);a.$name&&(f[a.$name]=a)};f.$removeControl=function(a){a.$name&&f[a.$name]===a&&delete f[a.$name];r(m,function(b,c){f.$setValidity(c,!0,a)});Ra(h,a)};f.$setValidity=function(a,b,c){var d=m[a];if(b)d&&(Ra(d,c),d.length||(k--,k||(e(b),f.$valid=!0,f.$invalid=!1),m[a]=!1,e(!0,a),g.$setValidity(a,!0,f)));else{k||e(b);if(d){if(-1!=Qa(d,c))return}else m[a]=d=[],k++,e(!1,a),g.$setValidity(a,!1,f);d.push(c);f.$valid=!1;f.$invalid=
!0}};f.$setDirty=function(){d.removeClass(b,Pa);d.addClass(b,yb);f.$dirty=!0;f.$pristine=!1;g.$setDirty()};f.$setPristine=function(){d.removeClass(b,yb);d.addClass(b,Pa);f.$dirty=!1;f.$pristine=!0;r(h,function(a){a.$setPristine()})}}function ra(b,a,c,d){b.$setValidity(a,c);return c?d:s}function Pc(b,a){var c,d;if(a)for(c=0;c<a.length;++c)if(d=a[c],b[d])return!0;return!1}function Ie(b,a,c,d,e){T(e)&&(b.$$hasNativeValidators=!0,b.$parsers.push(function(f){if(b.$error[a]||Pc(e,d)||!Pc(e,c))return f;
b.$setValidity(a,!1)}))}function zb(b,a,c,d,e,f){var g=a.prop(Je),k=a[0].placeholder,m={};d.$$validityState=g;if(!e.android){var h=!1;a.on("compositionstart",function(a){h=!0});a.on("compositionend",function(){h=!1;l()})}var l=function(e){if(!h){var f=a.val();if(Q&&"input"===(e||m).type&&a[0].placeholder!==k)k=a[0].placeholder;else if(Ta(c.ngTrim||"T")&&(f=aa(f)),e=g&&d.$$hasNativeValidators,d.$viewValue!==f||""===f&&e)b.$$phase?d.$setViewValue(f):b.$apply(function(){d.$setViewValue(f)})}};if(e.hasEvent("input"))a.on("input",
l);else{var n,p=function(){n||(n=f.defer(function(){l();n=null}))};a.on("keydown",function(a){a=a.keyCode;91===a||(15<a&&19>a||37<=a&&40>=a)||p()});if(e.hasEvent("paste"))a.on("paste cut",p)}a.on("change",l);d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)};var q=c.ngPattern;q&&((e=q.match(/^\/(.*)\/([gim]*)$/))?(q=RegExp(e[1],e[2]),e=function(a){return ra(d,"pattern",d.$isEmpty(a)||q.test(a),a)}):e=function(c){var e=b.$eval(q);if(!e||!e.test)throw w("ngPattern")("noregexp",q,
e,ha(a));return ra(d,"pattern",d.$isEmpty(c)||e.test(c),c)},d.$formatters.push(e),d.$parsers.push(e));if(c.ngMinlength){var t=Z(c.ngMinlength);e=function(a){return ra(d,"minlength",d.$isEmpty(a)||a.length>=t,a)};d.$parsers.push(e);d.$formatters.push(e)}if(c.ngMaxlength){var r=Z(c.ngMaxlength);e=function(a){return ra(d,"maxlength",d.$isEmpty(a)||a.length<=r,a)};d.$parsers.push(e);d.$formatters.push(e)}}function Yb(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d<
a.length;d++){for(var e=a[d],l=0;l<b.length;l++)if(e==b[l])continue a;c.push(e)}return c}function e(a){if(!L(a)){if(C(a))return a.split(" ");if(T(a)){var b=[];r(a,function(a,c){a&&(b=b.concat(c.split(" ")))});return b}}return a}return{restrict:"AC",link:function(f,g,k){function m(a,b){var c=g.data("$classCounts")||{},d=[];r(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data("$classCounts",c);return d.join(" ")}function h(b){if(!0===a||f.$index%2===a){var h=e(b||[]);if(!l){var q=
m(h,1);k.$addClass(q)}else if(!za(b,l)){var r=e(l),q=d(h,r),h=d(r,h),h=m(h,-1),q=m(q,1);0===q.length?c.removeClass(g,h):0===h.length?c.addClass(g,q):c.setClass(g,q,h)}}l=ga(b)}var l;f.$watch(k[b],h,!0);k.$observe("class",function(a){h(f.$eval(k[b]))});"ngClass"!==b&&f.$watch("$index",function(c,d){var g=c&1;if(g!==(d&1)){var h=e(f.$eval(k[b]));g===a?(g=m(h,1),k.$addClass(g)):(g=m(h,-1),k.$removeClass(g))}})}}}]}var Je="validity",M=function(b){return C(b)?b.toLowerCase():b},ib=Object.prototype.hasOwnProperty,
Ia=function(b){return C(b)?b.toUpperCase():b},Q,y,Da,Aa=[].slice,Ke=[].push,ya=Object.prototype.toString,Sa=w("ng"),Ua=P.angular||(P.angular={}),Xa,Ma,la=["0","0","0"];Q=Z((/msie (\d+)/.exec(M(navigator.userAgent))||[])[1]);isNaN(Q)&&(Q=Z((/trident\/.*; rv:(\d+)/.exec(M(navigator.userAgent))||[])[1]));z.$inject=[];Ga.$inject=[];var L=function(){return J(Array.isArray)?Array.isArray:function(b){return"[object Array]"===ya.call(b)}}(),aa=function(){return String.prototype.trim?function(b){return C(b)?
b.trim():b}:function(b){return C(b)?b.replace(/^\s\s*/,"").replace(/\s\s*$/,""):b}}();Ma=9>Q?function(b){b=b.nodeName?b:b[0];return b.scopeName&&"HTML"!=b.scopeName?Ia(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var Wa=function(){if(D(Wa.isActive_))return Wa.isActive_;var b=!(!X.querySelector("[ng-csp]")&&!X.querySelector("[data-ng-csp]"));if(!b)try{new Function("")}catch(a){b=!0}return Wa.isActive_=b},Yc=/[A-Z]/g,ad={full:"1.2.22",major:1,minor:2,
dot:22,codeName:"finicky-pleasure"};S.expando="ng339";var $a=S.cache={},ne=1,rb=P.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},Za=P.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)};S._data=function(b){return this.cache[b[this.expando]]||{}};var ie=/([\:\-\_]+(.))/g,je=/^moz([A-Z])/,Hb=w("jqLite"),ke=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Ib=/<|&#?\w+;/,le=/<([\w:]+)/,me=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
ba={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ba.optgroup=ba.option;ba.tbody=ba.tfoot=ba.colgroup=ba.caption=ba.thead;ba.th=ba.td;var La=S.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===X.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),S(P).on("load",a))},
toString:function(){var b=[];r(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?y(this[b]):y(this[this.length+b])},length:0,push:Ke,sort:[].sort,splice:[].splice},ob={};r("multiple selected checked disabled readOnly required open".split(" "),function(b){ob[M(b)]=b});var rc={};r("input select option textarea button form details".split(" "),function(b){rc[Ia(b)]=!0});r({data:Mb,removeData:Lb},function(b,a){S[a]=b});r({data:Mb,inheritedData:nb,scope:function(b){return y.data(b,
"$scope")||nb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return y.data(b,"$isolateScope")||y.data(b,"$isolateScopeNoTemplate")},controller:oc,injector:function(b){return nb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Nb,css:function(b,a,c){a=Ya(a);if(D(c))b.style[a]=c;else{var d;8>=Q&&(d=b.currentStyle&&b.currentStyle[a],""===d&&(d="auto"));d=d||b.style[a];8>=Q&&(d=""===d?s:d);return d}},attr:function(b,a,c){var d=M(a);if(ob[d])if(D(c))c?(b[a]=
!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||z).specified?d:s;else if(D(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?s:b},prop:function(b,a,c){if(D(c))b[a]=c;else return b[a]},text:function(){function b(b,d){var e=a[b.nodeType];if(F(d))return e?b[e]:"";b[e]=d}var a=[];9>Q?(a[1]="innerText",a[3]="nodeValue"):a[1]=a[3]="textContent";b.$dv="";return b}(),val:function(b,a){if(F(a)){if("SELECT"===Ma(b)&&b.multiple){var c=
[];r(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(F(a))return b.innerHTML;for(var c=0,d=b.childNodes;c<d.length;c++)Ja(d[c]);b.innerHTML=a},empty:pc},function(b,a){S.prototype[a]=function(a,d){var e,f,g=this.length;if(b!==pc&&(2==b.length&&b!==Nb&&b!==oc?a:d)===s){if(T(a)){for(e=0;e<g;e++)if(b===Mb)b(this[e],a);else for(f in a)b(this[e],f,a[f]);return this}e=b.$dv;g=e===s?Math.min(g,1):g;for(f=0;f<g;f++){var k=
b(this[f],a,d);e=e?e+k:k}return e}for(e=0;e<g;e++)b(this[e],a,d);return this}});r({removeData:Lb,dealoc:Ja,on:function a(c,d,e,f){if(D(f))throw Hb("onargs");var g=ma(c,"events"),k=ma(c,"handle");g||ma(c,"events",g={});k||ma(c,"handle",k=oe(c,g));r(d.split(" "),function(d){var f=g[d];if(!f){if("mouseenter"==d||"mouseleave"==d){var l=X.body.contains||X.body.compareDocumentPosition?function(a,c){var d=9===a.nodeType?a.documentElement:a,e=c&&c.parentNode;return a===e||!!(e&&1===e.nodeType&&(d.contains?
d.contains(e):a.compareDocumentPosition&&a.compareDocumentPosition(e)&16))}:function(a,c){if(c)for(;c=c.parentNode;)if(c===a)return!0;return!1};g[d]=[];a(c,{mouseleave:"mouseout",mouseenter:"mouseover"}[d],function(a){var c=a.relatedTarget;c&&(c===this||l(this,c))||k(a,d)})}else rb(c,d,k),g[d]=[];f=g[d]}f.push(e)})},off:nc,one:function(a,c,d){a=y(a);a.on(c,function f(){a.off(c,d);a.off(c,f)});a.on(c,d)},replaceWith:function(a,c){var d,e=a.parentNode;Ja(a);r(new S(c),function(c){d?e.insertBefore(c,
d.nextSibling):e.replaceChild(c,a);d=c})},children:function(a){var c=[];r(a.childNodes,function(a){1===a.nodeType&&c.push(a)});return c},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,c){r(new S(c),function(c){1!==a.nodeType&&11!==a.nodeType||a.appendChild(c)})},prepend:function(a,c){if(1===a.nodeType){var d=a.firstChild;r(new S(c),function(c){a.insertBefore(c,d)})}},wrap:function(a,c){c=y(c)[0];var d=a.parentNode;d&&d.replaceChild(c,a);c.appendChild(a)},remove:function(a){Ja(a);
var c=a.parentNode;c&&c.removeChild(a)},after:function(a,c){var d=a,e=a.parentNode;r(new S(c),function(a){e.insertBefore(a,d.nextSibling);d=a})},addClass:mb,removeClass:lb,toggleClass:function(a,c,d){c&&r(c.split(" "),function(c){var f=d;F(f)&&(f=!Nb(a,c));(f?mb:lb)(a,c)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){if(a.nextElementSibling)return a.nextElementSibling;for(a=a.nextSibling;null!=a&&1!==a.nodeType;)a=a.nextSibling;return a},find:function(a,c){return a.getElementsByTagName?
a.getElementsByTagName(c):[]},clone:Kb,triggerHandler:function(a,c,d){var e,f;e=c.type||c;var g=(ma(a,"events")||{})[e];g&&(e={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopPropagation:z,type:e,target:a},c.type&&(e=E(e,c)),c=ga(g),f=d?[e].concat(d):[e],r(c,function(c){c.apply(a,f)}))}},function(a,c){S.prototype[c]=function(c,e,f){for(var g,k=0;k<this.length;k++)F(g)?(g=a(this[k],c,e,f),D(g)&&(g=y(g))):Jb(g,a(this[k],c,e,f));
return D(g)?g:this};S.prototype.bind=S.prototype.on;S.prototype.unbind=S.prototype.off});ab.prototype={put:function(a,c){this[Ka(a,this.nextUid)]=c},get:function(a){return this[Ka(a,this.nextUid)]},remove:function(a){var c=this[a=Ka(a,this.nextUid)];delete this[a];return c}};var qe=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,re=/,/,se=/^\s*(_?)(\S+?)\1\s*$/,pe=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,bb=w("$injector"),Le=w("$animate"),Md=["$provide",function(a){this.$$selectors={};this.register=function(c,d){var e=
c+"-animation";if(c&&"."!=c.charAt(0))throw Le("notcsel",c);this.$$selectors[c.substr(1)]=e;a.factory(e,d)};this.classNameFilter=function(a){1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null);return this.$$classNameFilter};this.$get=["$timeout","$$asyncCallback",function(a,d){return{enter:function(a,c,g,k){g?g.after(a):(c&&c[0]||(c=g.parent()),c.append(a));k&&d(k)},leave:function(a,c){a.remove();c&&d(c)},move:function(a,c,d,k){this.enter(a,c,d,k)},addClass:function(a,c,g){c=
C(c)?c:L(c)?c.join(" "):"";r(a,function(a){mb(a,c)});g&&d(g)},removeClass:function(a,c,g){c=C(c)?c:L(c)?c.join(" "):"";r(a,function(a){lb(a,c)});g&&d(g)},setClass:function(a,c,g,k){r(a,function(a){mb(a,c);lb(a,g)});k&&d(k)},enabled:z}}]}],ia=w("$compile");ic.$inject=["$provide","$$sanitizeUriProvider"];var ue=/^(x[\:\-_]|data[\:\-_])/i,yc=w("$interpolate"),Me=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,xe={http:80,https:443,ftp:21},Sb=w("$location");Ub.prototype=Tb.prototype=Bc.prototype={$$html5:!1,$$replace:!1,
absUrl:sb("$$absUrl"),url:function(a,c){if(F(a))return this.$$url;var d=Me.exec(a);d[1]&&this.path(decodeURIComponent(d[1]));(d[2]||d[1])&&this.search(d[3]||"");this.hash(d[5]||"",c);return this},protocol:sb("$$protocol"),host:sb("$$host"),port:sb("$$port"),path:Cc("$$path",function(a){return"/"==a.charAt(0)?a:"/"+a}),search:function(a,c){switch(arguments.length){case 0:return this.$$search;case 1:if(C(a))this.$$search=ec(a);else if(T(a))r(a,function(c,e){null==c&&delete a[e]}),this.$$search=a;else throw Sb("isrcharg");
break;default:F(c)||null===c?delete this.$$search[a]:this.$$search[a]=c}this.$$compose();return this},hash:Cc("$$hash",Ga),replace:function(){this.$$replace=!0;return this}};var ka=w("$parse"),Fc={},va,Ne=Function.prototype.call,Oe=Function.prototype.apply,Qc=Function.prototype.bind,eb={"null":function(){return null},"true":function(){return!0},"false":function(){return!1},undefined:z,"+":function(a,c,d,e){d=d(a,c);e=e(a,c);return D(d)?D(e)?d+e:d:D(e)?e:s},"-":function(a,c,d,e){d=d(a,c);e=e(a,c);
return(D(d)?d:0)-(D(e)?e:0)},"*":function(a,c,d,e){return d(a,c)*e(a,c)},"/":function(a,c,d,e){return d(a,c)/e(a,c)},"%":function(a,c,d,e){return d(a,c)%e(a,c)},"^":function(a,c,d,e){return d(a,c)^e(a,c)},"=":z,"===":function(a,c,d,e){return d(a,c)===e(a,c)},"!==":function(a,c,d,e){return d(a,c)!==e(a,c)},"==":function(a,c,d,e){return d(a,c)==e(a,c)},"!=":function(a,c,d,e){return d(a,c)!=e(a,c)},"<":function(a,c,d,e){return d(a,c)<e(a,c)},">":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,
c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Pe={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Wb=function(a){this.options=a};Wb.prototype={constructor:Wb,lex:function(a){this.text=a;this.index=0;this.ch=s;this.lastCh=":";for(this.tokens=[];this.index<
this.text.length;){this.ch=this.text.charAt(this.index);if(this.is("\"'"))this.readString(this.ch);else if(this.isNumber(this.ch)||this.is(".")&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdent(this.ch))this.readIdent();else if(this.is("(){}[].,;:?"))this.tokens.push({index:this.index,text:this.ch}),this.index++;else if(this.isWhitespace(this.ch)){this.index++;continue}else{a=this.ch+this.peek();var c=a+this.peek(2),d=eb[this.ch],e=eb[a],f=eb[c];f?(this.tokens.push({index:this.index,
text:c,fn:f}),this.index+=3):e?(this.tokens.push({index:this.index,text:a,fn:e}),this.index+=2):d?(this.tokens.push({index:this.index,text:this.ch,fn:d}),this.index+=1):this.throwError("Unexpected next character ",this.index,this.index+1)}this.lastCh=this.ch}return this.tokens},is:function(a){return-1!==a.indexOf(this.ch)},was:function(a){return-1!==a.indexOf(this.lastCh)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=
a&&"9">=a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=D(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw ka("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index<this.text.length;){var d=M(this.text.charAt(this.index));
if("."==d||this.isNumber(d))a+=d;else{var e=this.peek();if("e"==d&&this.isExpOperator(e))a+=d;else if(this.isExpOperator(d)&&e&&this.isNumber(e)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||e&&this.isNumber(e)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}a*=1;this.tokens.push({index:c,text:a,literal:!0,constant:!0,fn:function(){return a}})},readIdent:function(){for(var a=this,c="",d=this.index,e,f,g,k;this.index<this.text.length;){k=this.text.charAt(this.index);
if("."===k||this.isIdent(k)||this.isNumber(k))"."===k&&(e=this.index),c+=k;else break;this.index++}if(e)for(f=this.index;f<this.text.length;){k=this.text.charAt(f);if("("===k){g=c.substr(e-d+1);c=c.substr(0,e-d);this.index=f;break}if(this.isWhitespace(k))f++;else break}d={index:d,text:c};if(eb.hasOwnProperty(c))d.fn=eb[c],d.literal=!0,d.constant=!0;else{var m=Ec(c,this.options,this.text);d.fn=E(function(a,c){return m(a,c)},{assign:function(d,e){return tb(d,c,e,a.text,a.options)}})}this.tokens.push(d);
g&&(this.tokens.push({index:e,text:"."}),this.tokens.push({index:e+1,text:g}))},readString:function(a){var c=this.index;this.index++;for(var d="",e=a,f=!1;this.index<this.text.length;){var g=this.text.charAt(this.index),e=e+g;if(f)"u"===g?(f=this.text.substring(this.index+1,this.index+5),f.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+f+"]"),this.index+=4,d+=String.fromCharCode(parseInt(f,16))):d+=Pe[g]||g,f=!1;else if("\\"===g)f=!0;else{if(g===a){this.index++;this.tokens.push({index:c,
text:e,string:d,literal:!0,constant:!0,fn:function(){return d}});return}d+=g}this.index++}this.throwError("Unterminated quote",c)}};var db=function(a,c,d){this.lexer=a;this.$filter=c;this.options=d};db.ZERO=E(function(){return 0},{constant:!0});db.prototype={constructor:db,parse:function(a){this.text=a;this.tokens=this.lexer.lex(a);a=this.statements();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);a.literal=!!a.literal;a.constant=!!a.constant;return a},primary:function(){var a;
if(this.expect("("))a=this.filterChain(),this.consume(")");else if(this.expect("["))a=this.arrayDeclaration();else if(this.expect("{"))a=this.object();else{var c=this.expect();(a=c.fn)||this.throwError("not a primary expression",c);a.literal=!!c.literal;a.constant=!!c.constant}for(var d;c=this.expect("(","[",".");)"("===c.text?(a=this.functionCall(a,d),d=null):"["===c.text?(d=a,a=this.objectIndex(a)):"."===c.text?(d=a,a=this.fieldAccess(a)):this.throwError("IMPOSSIBLE");return a},throwError:function(a,
c){throw ka("syntax",c.text,a,c.index+1,this.text,this.text.substring(c.index));},peekToken:function(){if(0===this.tokens.length)throw ka("ueoe",this.text);return this.tokens[0]},peek:function(a,c,d,e){if(0<this.tokens.length){var f=this.tokens[0],g=f.text;if(g===a||g===c||g===d||g===e||!(a||c||d||e))return f}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},consume:function(a){this.expect(a)||this.throwError("is unexpected, expecting ["+a+"]",this.peek())},
unaryFn:function(a,c){return E(function(d,e){return a(d,e,c)},{constant:c.constant})},ternaryFn:function(a,c,d){return E(function(e,f){return a(e,f)?c(e,f):d(e,f)},{constant:a.constant&&c.constant&&d.constant})},binaryFn:function(a,c,d){return E(function(e,f){return c(e,f,a,d)},{constant:a.constant&&d.constant})},statements:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.filterChain()),!this.expect(";"))return 1===a.length?a[0]:function(c,d){for(var e,f=
0;f<a.length;f++){var g=a[f];g&&(e=g(c,d))}return e}},filterChain:function(){for(var a=this.expression(),c;;)if(c=this.expect("|"))a=this.binaryFn(a,c.fn,this.filter());else return a},filter:function(){for(var a=this.expect(),c=this.$filter(a.text),d=[];;)if(a=this.expect(":"))d.push(this.expression());else{var e=function(a,e,k){k=[k];for(var m=0;m<d.length;m++)k.push(d[m](a,e));return c.apply(a,k)};return function(){return e}}},expression:function(){return this.assignment()},assignment:function(){var a=
this.ternary(),c,d;return(d=this.expect("="))?(a.assign||this.throwError("implies assignment but ["+this.text.substring(0,d.index)+"] can not be assigned to",d),c=this.ternary(),function(d,f){return a.assign(d,c(d,f),f)}):a},ternary:function(){var a=this.logicalOR(),c,d;if(this.expect("?")){c=this.assignment();if(d=this.expect(":"))return this.ternaryFn(a,c,this.assignment());this.throwError("expected :",d)}else return a},logicalOR:function(){for(var a=this.logicalAND(),c;;)if(c=this.expect("||"))a=
this.binaryFn(a,c.fn,this.logicalAND());else return a},logicalAND:function(){var a=this.equality(),c;if(c=this.expect("&&"))a=this.binaryFn(a,c.fn,this.logicalAND());return a},equality:function(){var a=this.relational(),c;if(c=this.expect("==","!=","===","!=="))a=this.binaryFn(a,c.fn,this.equality());return a},relational:function(){var a=this.additive(),c;if(c=this.expect("<",">","<=",">="))a=this.binaryFn(a,c.fn,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=
this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(db.ZERO,a.fn,this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this,d=this.expect().text,e=Ec(d,this.options,this.text);return E(function(c,
d,k){return e(k||a(c,d))},{assign:function(e,g,k){(k=a(e,k))||a.assign(e,k={});return tb(k,d,g,c.text,c.options)}})},objectIndex:function(a){var c=this,d=this.expression();this.consume("]");return E(function(e,f){var g=a(e,f),k=d(e,f),m;ja(k,c.text);if(!g)return s;(g=Oa(g[k],c.text))&&(g.then&&c.options.unwrapPromises)&&(m=g,"$$v"in g||(m.$$v=s,m.then(function(a){m.$$v=a})),g=g.$$v);return g},{assign:function(e,f,g){var k=ja(d(e,g),c.text);(g=Oa(a(e,g),c.text))||a.assign(e,g={});return g[k]=f}})},
functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this;return function(f,g){for(var k=[],m=c?c(f,g):f,h=0;h<d.length;h++)k.push(d[h](f,g));h=a(f,g,m)||z;Oa(m,e.text);var l=e.text;if(h){if(h.constructor===h)throw ka("isecfn",l);if(h===Ne||h===Oe||Qc&&h===Qc)throw ka("isecff",l);}k=h.apply?h.apply(m,k):h(k[0],k[1],k[2],k[3],k[4]);return Oa(k,e.text)}},arrayDeclaration:function(){var a=[],c=!0;if("]"!==this.peekToken().text){do{if(this.peek("]"))break;
var d=this.expression();a.push(d);d.constant||(c=!1)}while(this.expect(","))}this.consume("]");return E(function(c,d){for(var g=[],k=0;k<a.length;k++)g.push(a[k](c,d));return g},{literal:!0,constant:c})},object:function(){var a=[],c=!0;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;var d=this.expect(),d=d.string||d.text;this.consume(":");var e=this.expression();a.push({key:d,value:e});e.constant||(c=!1)}while(this.expect(","))}this.consume("}");return E(function(c,d){for(var e={},m=0;m<
a.length;m++){var h=a[m];e[h.key]=h.value(c,d)}return e},{literal:!0,constant:c})}};var Vb={},wa=w("$sce"),fa={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},V=X.createElement("a"),Hc=ua(P.location.href,!0);mc.$inject=["$provide"];Ic.$inject=["$locale"];Kc.$inject=["$locale"];var Nc=".",He={yyyy:Y("FullYear",4),yy:Y("FullYear",2,0,!0),y:Y("FullYear",1),MMMM:ub("Month"),MMM:ub("Month",!0),MM:Y("Month",2,1),M:Y("Month",1,1),dd:Y("Date",2),d:Y("Date",1),HH:Y("Hours",2),H:Y("Hours",
1),hh:Y("Hours",2,-12),h:Y("Hours",1,-12),mm:Y("Minutes",2),m:Y("Minutes",1),ss:Y("Seconds",2),s:Y("Seconds",1),sss:Y("Milliseconds",3),EEEE:ub("Day"),EEE:ub("Day",!0),a:function(a,c){return 12>a.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Xb(Math[0<a?"floor":"ceil"](a/60),2)+Xb(Math.abs(a%60),2))}},Ge=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,Fe=/^\-?\d+$/;Jc.$inject=["$locale"];var De=$(M),Ee=$(Ia);Lc.$inject=
["$parse"];var dd=$({restrict:"E",compile:function(a,c){8>=Q&&(c.href||c.name||c.$set("href",""),a.append(X.createComment("IE fix")));if(!c.href&&!c.xlinkHref&&!c.name)return function(a,c){var f="[object SVGAnimatedString]"===ya.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)||a.preventDefault()})}}}),Fb={};r(ob,function(a,c){if("multiple"!=a){var d=na("ng-"+c);Fb[d]=function(){return{priority:100,link:function(a,f,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}});r(["src",
"srcset","href"],function(a){var c=na("ng-"+a);Fb[c]=function(){return{priority:99,link:function(d,e,f){var g=a,k=a;"href"===a&&"[object SVGAnimatedString]"===ya.call(e.prop("href"))&&(k="xlinkHref",f.$attr[k]="xlink:href",g=null);f.$observe(c,function(a){a&&(f.$set(k,a),Q&&g&&e.prop(g,f[k]))})}}}});var xb={$addControl:z,$removeControl:z,$setValidity:z,$setDirty:z,$setPristine:z};Oc.$inject=["$element","$attrs","$scope","$animate"];var Rc=function(a){return["$timeout",function(c){return{name:"form",
restrict:a?"EAC":"E",controller:Oc,compile:function(){return{pre:function(a,e,f,g){if(!f.action){var k=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};rb(e[0],"submit",k);e.on("$destroy",function(){c(function(){Za(e[0],"submit",k)},0,!1)})}var m=e.parent().controller("form"),h=f.name||f.ngForm;h&&tb(a,h,g,h);if(m)e.on("$destroy",function(){m.$removeControl(g);h&&tb(a,h,s,h);E(g,xb)})}}}}}]},ed=Rc(),rd=Rc(!0),Qe=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,
Re=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,Se=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,Sc={text:zb,number:function(a,c,d,e,f,g){zb(a,c,d,e,f,g);e.$parsers.push(function(a){var c=e.$isEmpty(a);if(c||Se.test(a))return e.$setValidity("number",!0),""===a?null:c?a:parseFloat(a);e.$setValidity("number",!1);return s});Ie(e,"number",Te,null,e.$$validityState);e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a});d.min&&(a=function(a){var c=parseFloat(d.min);
return ra(e,"min",e.$isEmpty(a)||a>=c,a)},e.$parsers.push(a),e.$formatters.push(a));d.max&&(a=function(a){var c=parseFloat(d.max);return ra(e,"max",e.$isEmpty(a)||a<=c,a)},e.$parsers.push(a),e.$formatters.push(a));e.$formatters.push(function(a){return ra(e,"number",e.$isEmpty(a)||Ab(a),a)})},url:function(a,c,d,e,f,g){zb(a,c,d,e,f,g);a=function(a){return ra(e,"url",e.$isEmpty(a)||Qe.test(a),a)};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,c,d,e,f,g){zb(a,c,d,e,f,g);a=function(a){return ra(e,
"email",e.$isEmpty(a)||Re.test(a),a)};e.$formatters.push(a);e.$parsers.push(a)},radio:function(a,c,d,e){F(d.name)&&c.attr("name",gb());c.on("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var f=d.ngTrueValue,g=d.ngFalseValue;C(f)||(f=!0);C(g)||(g=!1);c.on("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})});e.$render=function(){c[0].checked=
e.$viewValue};e.$isEmpty=function(a){return a!==f};e.$formatters.push(function(a){return a===f});e.$parsers.push(function(a){return a?f:g})},hidden:z,button:z,submit:z,reset:z,file:z},Te=["badInput"],jc=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,f,g){g&&(Sc[M(f.type)]||Sc.text)(d,e,f,g,c,a)}}}],wb="ng-valid",vb="ng-invalid",Pa="ng-pristine",yb="ng-dirty",Ue=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate",function(a,c,d,e,f,g){function k(a,
c){c=c?"-"+kb(c,"-"):"";g.removeClass(e,(a?vb:wb)+c);g.addClass(e,(a?wb:vb)+c)}this.$modelValue=this.$viewValue=Number.NaN;this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var m=f(d.ngModel),h=m.assign;if(!h)throw w("ngModel")("nonassign",d.ngModel,ha(e));this.$render=z;this.$isEmpty=function(a){return F(a)||""===a||null===a||a!==a};var l=e.inheritedData("$formController")||xb,n=0,p=this.$error={};
e.addClass(Pa);k(!0);this.$setValidity=function(a,c){p[a]!==!c&&(c?(p[a]&&n--,n||(k(!0),this.$valid=!0,this.$invalid=!1)):(k(!1),this.$invalid=!0,this.$valid=!1,n++),p[a]=!c,k(c,a),l.$setValidity(a,c,this))};this.$setPristine=function(){this.$dirty=!1;this.$pristine=!0;g.removeClass(e,yb);g.addClass(e,Pa)};this.$setViewValue=function(d){this.$viewValue=d;this.$pristine&&(this.$dirty=!0,this.$pristine=!1,g.removeClass(e,Pa),g.addClass(e,yb),l.$setDirty());r(this.$parsers,function(a){d=a(d)});this.$modelValue!==
d&&(this.$modelValue=d,h(a,d),r(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}}))};var q=this;a.$watch(function(){var c=m(a);if(q.$modelValue!==c){var d=q.$formatters,e=d.length;for(q.$modelValue=c;e--;)c=d[e](c);q.$viewValue!==c&&(q.$viewValue=c,q.$render())}return c})}],Gd=function(){return{require:["ngModel","^?form"],controller:Ue,link:function(a,c,d,e){var f=e[0],g=e[1]||xb;g.$addControl(f);a.$on("$destroy",function(){g.$removeControl(f)})}}},Id=$({require:"ngModel",link:function(a,
c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),kc=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=!0;var f=function(a){if(d.required&&e.$isEmpty(a))e.$setValidity("required",!1);else return e.$setValidity("required",!0),a};e.$formatters.push(f);e.$parsers.unshift(f);d.$observe("required",function(){f(e.$viewValue)})}}}},Hd=function(){return{require:"ngModel",link:function(a,c,d,e){var f=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";
e.$parsers.push(function(a){if(!F(a)){var c=[];a&&r(a.split(f),function(a){a&&c.push(aa(a))});return c}});e.$formatters.push(function(a){return L(a)?a.join(", "):s});e.$isEmpty=function(a){return!a||!a.length}}}},Ve=/^(true|false|\d+)$/,Jd=function(){return{priority:100,compile:function(a,c){return Ve.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},jd=xa({compile:function(a){a.addClass("ng-binding");return function(a,
d,e){d.data("$binding",e.ngBind);a.$watch(e.ngBind,function(a){d.text(a==s?"":a)})}}}),ld=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass("ng-binding").data("$binding",c);e.$observe("ngBindTemplate",function(a){d.text(a)})}}],kd=["$sce","$parse",function(a,c){return{compile:function(d){d.addClass("ng-binding");return function(d,f,g){f.data("$binding",g.ngBindHtml);var k=c(g.ngBindHtml);d.$watch(function(){return(k(d)||"").toString()},function(c){f.html(a.getTrustedHtml(k(d))||
"")})}}}}],md=Yb("",!0),od=Yb("Odd",0),nd=Yb("Even",1),pd=xa({compile:function(a,c){c.$set("ngCloak",s);a.removeClass("ng-cloak")}}),qd=[function(){return{scope:!0,controller:"@",priority:500}}],lc={};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=na("ng-"+a);lc[c]=["$parse",function(d){return{compile:function(e,f){var g=d(f[c]);return function(c,d){d.on(M(a),function(a){c.$apply(function(){g(c,
{$event:a})})})}}}}]});var td=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var k,m,h;c.$watch(e.ngIf,function(f){Ta(f)?m||(m=c.$new(),g(m,function(c){c[c.length++]=X.createComment(" end ngIf: "+e.ngIf+" ");k={clone:c};a.enter(c,d.parent(),d)})):(h&&(h.remove(),h=null),m&&(m.$destroy(),m=null),k&&(h=Eb(k.clone),a.leave(h,function(){h=null}),k=null))})}}}],ud=["$http","$templateCache","$anchorScroll","$animate","$sce",function(a,
c,d,e,f){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Ua.noop,compile:function(g,k){var m=k.ngInclude||k.src,h=k.onload||"",l=k.autoscroll;return function(g,k,q,r,K){var x=0,v,A,s,u=function(){A&&(A.remove(),A=null);v&&(v.$destroy(),v=null);s&&(e.leave(s,function(){A=null}),A=s,s=null)};g.$watch(f.parseAsResourceUrl(m),function(f){var m=function(){!D(l)||l&&!g.$eval(l)||d()},q=++x;f?(a.get(f,{cache:c}).success(function(a){if(q===x){var c=g.$new();r.template=a;a=K(c,
function(a){u();e.enter(a,null,k,m)});v=c;s=a;v.$emit("$includeContentLoaded");g.$eval(h)}}).error(function(){q===x&&u()}),g.$emit("$includeContentRequested")):(u(),r.template=null)})}}}}],Kd=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){d.html(f.template);a(d.contents())(c)}}}],vd=xa({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),wd=xa({terminal:!0,priority:1E3}),xd=["$locale","$interpolate",function(a,c){var d=
/{}/g;return{restrict:"EA",link:function(e,f,g){var k=g.count,m=g.$attr.when&&f.attr(g.$attr.when),h=g.offset||0,l=e.$eval(m)||{},n={},p=c.startSymbol(),q=c.endSymbol(),t=/^when(Minus)?(.+)$/;r(g,function(a,c){t.test(c)&&(l[M(c.replace("when","").replace("Minus","-"))]=f.attr(g.$attr[c]))});r(l,function(a,e){n[e]=c(a.replace(d,p+k+"-"+h+q))});e.$watch(function(){var c=parseFloat(e.$eval(k));if(isNaN(c))return"";c in l||(c=a.pluralCat(c-h));return n[c](e,f,!0)},function(a){f.text(a)})}}}],yd=["$parse",
"$animate",function(a,c){var d=w("ngRepeat");return{transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,link:function(e,f,g,k,m){var h=g.ngRepeat,l=h.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),n,p,q,t,s,x,v={$id:Ka};if(!l)throw d("iexp",h);g=l[1];k=l[2];(l=l[3])?(n=a(l),p=function(a,c,d){x&&(v[x]=a);v[s]=c;v.$index=d;return n(e,v)}):(q=function(a,c){return Ka(c)},t=function(a){return a});l=g.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!l)throw d("iidexp",
g);s=l[3]||l[1];x=l[2];var A={};e.$watchCollection(k,function(a){var g,k,l=f[0],n,v={},D,B,G,w,C,z,F=[];if(fb(a))C=a,n=p||q;else{n=p||t;C=[];for(G in a)a.hasOwnProperty(G)&&"$"!=G.charAt(0)&&C.push(G);C.sort()}D=C.length;k=F.length=C.length;for(g=0;g<k;g++)if(G=a===C?g:C[g],w=a[G],w=n(G,w,g),Ca(w,"`track by` id"),A.hasOwnProperty(w))z=A[w],delete A[w],v[w]=z,F[g]=z;else{if(v.hasOwnProperty(w))throw r(F,function(a){a&&a.scope&&(A[a.id]=a)}),d("dupes",h,w);F[g]={id:w};v[w]=!1}for(G in A)A.hasOwnProperty(G)&&
(z=A[G],g=Eb(z.clone),c.leave(g),r(g,function(a){a.$$NG_REMOVED=!0}),z.scope.$destroy());g=0;for(k=C.length;g<k;g++){G=a===C?g:C[g];w=a[G];z=F[g];F[g-1]&&(l=F[g-1].clone[F[g-1].clone.length-1]);if(z.scope){B=z.scope;n=l;do n=n.nextSibling;while(n&&n.$$NG_REMOVED);z.clone[0]!=n&&c.move(Eb(z.clone),null,y(l));l=z.clone[z.clone.length-1]}else B=e.$new();B[s]=w;x&&(B[x]=G);B.$index=g;B.$first=0===g;B.$last=g===D-1;B.$middle=!(B.$first||B.$last);B.$odd=!(B.$even=0===(g&1));z.scope||m(B,function(a){a[a.length++]=
X.createComment(" end ngRepeat: "+h+" ");c.enter(a,null,y(l));l=a;z.scope=B;z.clone=a;v[z.id]=z})}A=v})}}}],zd=["$animate",function(a){return function(c,d,e){c.$watch(e.ngShow,function(c){a[Ta(c)?"removeClass":"addClass"](d,"ng-hide")})}}],sd=["$animate",function(a){return function(c,d,e){c.$watch(e.ngHide,function(c){a[Ta(c)?"addClass":"removeClass"](d,"ng-hide")})}}],Ad=xa(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&r(d,function(a,d){c.css(d,"")});a&&c.css(a)},!0)}),Bd=["$animate",
function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(c,d,e,f){var g=[],k=[],m=[],h=[];c.$watch(e.ngSwitch||e.on,function(d){var n,p;n=0;for(p=m.length;n<p;++n)m[n].remove();n=m.length=0;for(p=h.length;n<p;++n){var q=k[n];h[n].$destroy();m[n]=q;a.leave(q,function(){m.splice(n,1)})}k.length=0;h.length=0;if(g=f.cases["!"+d]||f.cases["?"])c.$eval(e.change),r(g,function(d){var e=c.$new();h.push(e);d.transclude(e,function(c){var e=d.element;k.push(c);
a.enter(c,e.parent(),e)})})})}}}],Cd=xa({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,c,d,e,f){e.cases["!"+d.ngSwitchWhen]=e.cases["!"+d.ngSwitchWhen]||[];e.cases["!"+d.ngSwitchWhen].push({transclude:f,element:c})}}),Dd=xa({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,c,d,e,f){e.cases["?"]=e.cases["?"]||[];e.cases["?"].push({transclude:f,element:c})}}),Fd=xa({link:function(a,c,d,e,f){if(!f)throw w("ngTransclude")("orphan",ha(c));f(function(a){c.empty();
c.append(a)})}}),fd=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){"text/ng-template"==d.type&&a.put(d.id,c[0].text)}}}],We=w("ngOptions"),Ed=$({terminal:!0}),gd=["$compile","$parse",function(a,c){var d=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,e={$setViewValue:z};return{restrict:"E",require:["select","?ngModel"],
controller:["$element","$scope","$attrs",function(a,c,d){var m=this,h={},l=e,n;m.databound=d.ngModel;m.init=function(a,c,d){l=a;n=d};m.addOption=function(c){Ca(c,'"option value"');h[c]=!0;l.$viewValue==c&&(a.val(c),n.parent()&&n.remove())};m.removeOption=function(a){this.hasOption(a)&&(delete h[a],l.$viewValue==a&&this.renderUnknownOption(a))};m.renderUnknownOption=function(c){c="? "+Ka(c)+" ?";n.val(c);a.prepend(n);a.val(c);n.prop("selected",!0)};m.hasOption=function(a){return h.hasOwnProperty(a)};
c.$on("$destroy",function(){m.renderUnknownOption=z})}],link:function(e,g,k,m){function h(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(z.parent()&&z.remove(),c.val(a),""===a&&x.prop("selected",!0)):F(a)&&x?c.val(""):e.renderUnknownOption(a)};c.on("change",function(){a.$apply(function(){z.parent()&&z.remove();d.$setViewValue(c.val())})})}function l(a,c,d){var e;d.$render=function(){var a=new ab(d.$viewValue);r(c.find("option"),function(c){c.selected=D(a.get(c.value))})};a.$watch(function(){za(e,
d.$viewValue)||(e=ga(d.$viewValue),d.$render())});c.on("change",function(){a.$apply(function(){var a=[];r(c.find("option"),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function n(e,f,g){function k(){var a={"":[]},c=[""],d,h,s,t,u;s=g.$modelValue;t=z(e)||[];var C=n?Zb(t):t,F,O,B;O={};B=!1;if(q)if(h=g.$modelValue,x&&L(h))for(B=new ab([]),d={},u=0;u<h.length;u++)d[m]=h[u],B.put(x(e,d),h[u]);else B=new ab(h);u=B;var E,J;for(B=0;F=C.length,B<F;B++){h=B;if(n){h=C[B];if("$"===h.charAt(0))continue;
O[n]=h}O[m]=t[h];d=p(e,O)||"";(h=a[d])||(h=a[d]=[],c.push(d));q?d=D(u.remove(x?x(e,O):r(e,O))):(x?(d={},d[m]=s,d=x(e,d)===x(e,O)):d=s===r(e,O),u=u||d);E=l(e,O);E=D(E)?E:"";h.push({id:x?x(e,O):n?C[B]:B,label:E,selected:d})}q||(w||null===s?a[""].unshift({id:"",label:"",selected:!u}):u||a[""].unshift({id:"?",label:"",selected:!0}));O=0;for(C=c.length;O<C;O++){d=c[O];h=a[d];y.length<=O?(s={element:A.clone().attr("label",d),label:h.label},t=[s],y.push(t),f.append(s.element)):(t=y[O],s=t[0],s.label!=d&&
s.element.attr("label",s.label=d));E=null;B=0;for(F=h.length;B<F;B++)d=h[B],(u=t[B+1])?(E=u.element,u.label!==d.label&&E.text(u.label=d.label),u.id!==d.id&&E.val(u.id=d.id),E[0].selected!==d.selected&&(E.prop("selected",u.selected=d.selected),Q&&E.prop("selected",u.selected))):(""===d.id&&w?J=w:(J=v.clone()).val(d.id).prop("selected",d.selected).attr("selected",d.selected).text(d.label),t.push({element:J,label:d.label,id:d.id,selected:d.selected}),E?E.after(J):s.element.append(J),E=J);for(B++;t.length>
B;)t.pop().element.remove()}for(;y.length>O;)y.pop()[0].element.remove()}var h;if(!(h=t.match(d)))throw We("iexp",t,ha(f));var l=c(h[2]||h[1]),m=h[4]||h[6],n=h[5],p=c(h[3]||""),r=c(h[2]?h[1]:m),z=c(h[7]),x=h[8]?c(h[8]):null,y=[[{element:f,label:""}]];w&&(a(w)(e),w.removeClass("ng-scope"),w.remove());f.empty();f.on("change",function(){e.$apply(function(){var a,c=z(e)||[],d={},h,l,p,t,u,w,v;if(q)for(l=[],t=0,w=y.length;t<w;t++)for(a=y[t],p=1,u=a.length;p<u;p++){if((h=a[p].element)[0].selected){h=h.val();
n&&(d[n]=h);if(x)for(v=0;v<c.length&&(d[m]=c[v],x(e,d)!=h);v++);else d[m]=c[h];l.push(r(e,d))}}else if(h=f.val(),"?"==h)l=s;else if(""===h)l=null;else if(x)for(v=0;v<c.length;v++){if(d[m]=c[v],x(e,d)==h){l=r(e,d);break}}else d[m]=c[h],n&&(d[n]=h),l=r(e,d);g.$setViewValue(l);k()})});g.$render=k;e.$watchCollection(z,k);q&&e.$watchCollection(function(){return g.$modelValue},k)}if(m[1]){var p=m[0];m=m[1];var q=k.multiple,t=k.ngOptions,w=!1,x,v=y(X.createElement("option")),A=y(X.createElement("optgroup")),
z=v.clone();k=0;for(var u=g.children(),C=u.length;k<C;k++)if(""===u[k].value){x=w=u.eq(k);break}p.init(m,w,z);q&&(m.$isEmpty=function(a){return!a||0===a.length});t?n(e,g,m):q?l(e,g,m):h(e,g,m,p)}}}}],id=["$interpolate",function(a){var c={addOption:z,removeOption:z};return{restrict:"E",priority:100,compile:function(d,e){if(F(e.value)){var f=a(d.text(),!0);f||e.$set("value",d.text())}return function(a,d,e){var h=d.parent(),l=h.data("$selectController")||h.parent().data("$selectController");l&&l.databound?
d.prop("selected",!1):l=c;f?a.$watch(f,function(a,c){e.$set("value",a);a!==c&&l.removeOption(c);l.addOption(a)}):l.addOption(e.value);d.on("$destroy",function(){l.removeOption(e.value)})}}}}],hd=$({restrict:"E",terminal:!0});P.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):((Da=P.jQuery)&&Da.fn.on?(y=Da,E(Da.fn,{scope:La.scope,isolateScope:La.isolateScope,controller:La.controller,injector:La.injector,inheritedData:La.inheritedData}),Gb("remove",!0,!0,!1),Gb("empty",
!1,!1,!1),Gb("html",!1,!1,!0)):y=S,Ua.element=y,$c(Ua),y(X).ready(function(){Xc(X,fc)}))})(window,document);!window.angular.$$csp()&&window.angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}.ng-animate-block-transitions{transition:0s all!important;-webkit-transition:0s all!important;}.ng-hide-add-active,.ng-hide-remove{display:block!important;}</style>');


/*
 AngularJS v1.2.22
 (c) 2010-2014 Google, Inc. http://angularjs.org
 License: MIT
*/
(function(F,e,O){'use strict';e.module("ngAnimate",["ng"]).directive("ngAnimateChildren",function(){return function(G,s,g){g=g.ngAnimateChildren;e.isString(g)&&0===g.length?s.data("$$ngAnimateChildren",!0):G.$watch(g,function(e){s.data("$$ngAnimateChildren",!!e)})}}).factory("$$animateReflow",["$$rAF","$document",function(e,s){return function(g){return e(function(){g()})}}]).config(["$provide","$animateProvider",function(G,s){function g(e){for(var g=0;g<e.length;g++){var l=e[g];if(l.nodeType==aa)return l}}
function B(l){return e.element(g(l))}var m=e.noop,u=e.forEach,P=s.$$selectors,aa=1,l="$$ngAnimateState",V="$$ngAnimateChildren",J="ng-animate",n={running:!0};G.decorator("$animate",["$delegate","$injector","$sniffer","$rootElement","$$asyncCallback","$rootScope","$document",function(z,F,$,R,E,H,O){function K(a){var b=a.data(l)||{};b.running=!0;a.data(l,b)}function L(a){if(a){var b=[],c={};a=a.substr(1).split(".");($.transitions||$.animations)&&b.push(F.get(P[""]));for(var d=0;d<a.length;d++){var f=
a[d],e=P[f];e&&!c[f]&&(b.push(F.get(e)),c[f]=!0)}return b}}function G(a,b,c){function d(a,b){var c=a[b],d=a["before"+b.charAt(0).toUpperCase()+b.substr(1)];if(c||d)return"leave"==b&&(d=c,c=null),n.push({event:b,fn:c}),h.push({event:b,fn:d}),!0}function f(b,d,e){var f=[];u(b,function(a){a.fn&&f.push(a)});var g=0;u(f,function(b,l){var C=function(){a:{if(d){(d[l]||m)();if(++g<f.length)break a;d=null}e()}};switch(b.event){case "setClass":d.push(b.fn(a,A,k,C));break;case "addClass":d.push(b.fn(a,A||c,
C));break;case "removeClass":d.push(b.fn(a,k||c,C));break;default:d.push(b.fn(a,C))}});d&&0===d.length&&e()}var g=a[0];if(g){var l="setClass"==b,p=l||"addClass"==b||"removeClass"==b,A,k;e.isArray(c)&&(A=c[0],k=c[1],c=A+" "+k);var x=a.attr("class")+" "+c;if(M(x)){var t=m,w=[],h=[],q=m,y=[],n=[],x=(" "+x).replace(/\s+/g,".");u(L(x),function(a){!d(a,b)&&l&&(d(a,"addClass"),d(a,"removeClass"))});return{node:g,event:b,className:c,isClassBased:p,isSetClassOperation:l,before:function(a){t=a;f(h,w,function(){t=
m;a()})},after:function(a){q=a;f(n,y,function(){q=m;a()})},cancel:function(){w&&(u(w,function(a){(a||m)(!0)}),t(!0));y&&(u(y,function(a){(a||m)(!0)}),q(!0))}}}}}function r(a,b,c,d,f,g,n){function p(d){var e="$animate:"+d;q&&(q[e]&&0<q[e].length)&&E(function(){c.triggerHandler(e,{event:a,className:b})})}function A(){p("before")}function m(){p("after")}function x(){p("close");n&&E(function(){n()})}function t(){t.hasBeenRun||(t.hasBeenRun=!0,g())}function w(){if(!w.hasBeenRun){w.hasBeenRun=!0;var d=
c.data(l);d&&(h&&h.isClassBased?k(c,b):(E(function(){var d=c.data(l)||{};r==d.index&&k(c,b,a)}),c.data(l,d)));x()}}var h=G(c,a,b);if(h){b=h.className;var q=e.element._data(h.node),q=q&&q.events;d||(d=f?f.parent():c.parent());var y=c.data(l)||{};f=y.active||{};var z=y.totalActive||0,C=y.last,D;h.isClassBased&&(D=y.running||y.disabled||C&&!C.isClassBased);if(D||N(c,d))t(),A(),m(),w();else{d=!1;if(0<z){D=[];if(h.isClassBased)"setClass"==C.event?(D.push(C),k(c,b)):f[b]&&(v=f[b],v.event==a?d=!0:(D.push(v),
k(c,b)));else if("leave"==a&&f["ng-leave"])d=!0;else{for(var v in f)D.push(f[v]),k(c,v);f={};z=0}0<D.length&&u(D,function(a){a.cancel()})}!h.isClassBased||(h.isSetClassOperation||d)||(d="addClass"==a==c.hasClass(b));if(d)t(),A(),m(),x();else{if("leave"==a)c.one("$destroy",function(a){a=e.element(this);var b=a.data(l);b&&(b=b.active["ng-leave"])&&(b.cancel(),k(a,"ng-leave"))});c.addClass(J);var r=Y++;z++;f[b]=h;c.data(l,{last:h,active:f,index:r,totalActive:z});A();h.before(function(d){var e=c.data(l);
d=d||!e||!e.active[b]||h.isClassBased&&e.active[b].event!=a;t();!0===d?w():(m(),h.after(w))})}}}else t(),A(),m(),w()}function T(a){if(a=g(a))a=e.isFunction(a.getElementsByClassName)?a.getElementsByClassName(J):a.querySelectorAll("."+J),u(a,function(a){a=e.element(a);(a=a.data(l))&&a.active&&u(a.active,function(a){a.cancel()})})}function k(a,b){if(g(a)==g(R))n.disabled||(n.running=!1,n.structural=!1);else if(b){var c=a.data(l)||{},d=!0===b;!d&&(c.active&&c.active[b])&&(c.totalActive--,delete c.active[b]);
if(d||!c.totalActive)a.removeClass(J),a.removeData(l)}}function N(a,b){if(n.disabled)return!0;if(g(a)==g(R))return n.running;var c,d,f;do{if(0===b.length)break;var m=g(b)==g(R),k=m?n:b.data(l)||{};if(k.disabled)return!0;m&&(f=!0);!1!==c&&(m=b.data(V),e.isDefined(m)&&(c=m));d=d||k.running||k.last&&!k.last.isClassBased}while(b=b.parent());return!f||!c&&d}var Y=0;R.data(l,n);H.$$postDigest(function(){H.$$postDigest(function(){n.running=!1})});var Q=s.classNameFilter(),M=Q?function(a){return Q.test(a)}:
function(){return!0};return{enter:function(a,b,c,d){a=e.element(a);b=b&&e.element(b);c=c&&e.element(c);K(a);z.enter(a,b,c);H.$$postDigest(function(){a=B(a);r("enter","ng-enter",a,b,c,m,d)})},leave:function(a,b){a=e.element(a);T(a);K(a);H.$$postDigest(function(){r("leave","ng-leave",B(a),null,null,function(){z.leave(a)},b)})},move:function(a,b,c,d){a=e.element(a);b=b&&e.element(b);c=c&&e.element(c);T(a);K(a);z.move(a,b,c);H.$$postDigest(function(){a=B(a);r("move","ng-move",a,b,c,m,d)})},addClass:function(a,
b,c){a=e.element(a);a=B(a);r("addClass",b,a,null,null,function(){z.addClass(a,b)},c)},removeClass:function(a,b,c){a=e.element(a);a=B(a);r("removeClass",b,a,null,null,function(){z.removeClass(a,b)},c)},setClass:function(a,b,c,d){a=e.element(a);a=B(a);r("setClass",[b,c],a,null,null,function(){z.setClass(a,b,c)},d)},enabled:function(a,b){switch(arguments.length){case 2:if(a)k(b);else{var c=b.data(l)||{};c.disabled=!0;b.data(l,c)}break;case 1:n.disabled=!a;break;default:a=!n.disabled}return!!a}}}]);s.register("",
["$window","$sniffer","$timeout","$$animateReflow",function(l,n,s,B){function E(a,U){S&&S();W.push(U);S=B(function(){u(W,function(a){a()});W=[];S=null;v={}})}function H(a,U){var b=g(a);a=e.element(b);Z.push(a);b=Date.now()+U;b<=da||(s.cancel(ca),da=b,ca=s(function(){G(Z);Z=[]},U,!1))}function G(a){u(a,function(a){(a=a.data(q))&&(a.closeAnimationFn||m)()})}function K(a,b){var c=b?v[b]:null;if(!c){var d=0,e=0,f=0,g=0,m,k,h,q;u(a,function(a){if(a.nodeType==aa){a=l.getComputedStyle(a)||{};h=a[I+P];d=
Math.max(L(h),d);q=a[I+x];m=a[I+t];e=Math.max(L(m),e);k=a[p+t];g=Math.max(L(k),g);var b=L(a[p+P]);0<b&&(b*=parseInt(a[p+w],10)||1);f=Math.max(b,f)}});c={total:0,transitionPropertyStyle:q,transitionDurationStyle:h,transitionDelayStyle:m,transitionDelay:e,transitionDuration:d,animationDelayStyle:k,animationDelay:g,animationDuration:f};b&&(v[b]=c)}return c}function L(a){var b=0;a=e.isString(a)?a.split(/\s*,\s*/):[];u(a,function(a){b=Math.max(parseFloat(a)||0,b)});return b}function J(a){var b=a.parent(),
c=b.data(h);c||(b.data(h,++ba),c=ba);return c+"-"+g(a).getAttribute("class")}function r(a,b,c,d){var e=J(b),f=e+" "+c,l=v[f]?++v[f].total:0,k={};if(0<l){var h=c+"-stagger",k=e+" "+h;(e=!v[k])&&b.addClass(h);k=K(b,k);e&&b.removeClass(h)}d=d||function(a){return a()};b.addClass(c);var h=b.data(q)||{},n=d(function(){return K(b,f)});d=n.transitionDuration;e=n.animationDuration;if(0===d&&0===e)return b.removeClass(c),!1;b.data(q,{running:h.running||0,itemIndex:l,stagger:k,timings:n,closeAnimationFn:m});
a=0<h.running||"setClass"==a;0<d&&T(b,c,a);0<e&&(0<k.animationDelay&&0===k.animationDuration)&&(g(b).style[p]="none 0s");return!0}function T(a,b,c){"ng-enter"!=b&&("ng-move"!=b&&"ng-leave"!=b)&&c?a.addClass(y):g(a).style[I+x]="none"}function k(a,b){var c=I+x,d=g(a);d.style[c]&&0<d.style[c].length&&(d.style[c]="");a.removeClass(y)}function N(a){var b=p;a=g(a);a.style[b]&&0<a.style[b].length&&(a.style[b]="")}function Y(a,b,d,e){function k(a){b.off(x,l);b.removeClass(m);c(b,d);a=g(b);for(var e in s)a.style.removeProperty(s[e])}
function l(a){a.stopPropagation();var b=a.originalEvent||a;a=b.$manualTimeStamp||b.timeStamp||Date.now();b=parseFloat(b.elapsedTime.toFixed(V));Math.max(a-z,0)>=y&&b>=v&&e()}var h=g(b);a=b.data(q);if(-1!=h.getAttribute("class").indexOf(d)&&a){var m="";u(d.split(" "),function(a,b){m+=(0<b?" ":"")+a+"-active"});var n=a.stagger,p=a.timings,t=a.itemIndex,v=Math.max(p.transitionDuration,p.animationDuration),w=Math.max(p.transitionDelay,p.animationDelay),y=w*D,z=Date.now(),x=A+" "+X,r="",s=[];if(0<p.transitionDuration){var B=
p.transitionPropertyStyle;-1==B.indexOf("all")&&(r+=f+"transition-property: "+B+";",r+=f+"transition-duration: "+p.transitionDurationStyle+";",s.push(f+"transition-property"),s.push(f+"transition-duration"))}0<t&&(0<n.transitionDelay&&0===n.transitionDuration&&(r+=f+"transition-delay: "+Q(p.transitionDelayStyle,n.transitionDelay,t)+"; ",s.push(f+"transition-delay")),0<n.animationDelay&&0===n.animationDuration&&(r+=f+"animation-delay: "+Q(p.animationDelayStyle,n.animationDelay,t)+"; ",s.push(f+"animation-delay")));
0<s.length&&(p=h.getAttribute("style")||"",h.setAttribute("style",p+"; "+r));b.on(x,l);b.addClass(m);a.closeAnimationFn=function(){k();e()};h=(t*(Math.max(n.animationDelay,n.transitionDelay)||0)+(w+v)*C)*D;a.running++;H(b,h);return k}e()}function Q(a,b,c){var d="";u(a.split(","),function(a,e){d+=(0<e?",":"")+(c*b+parseInt(a,10))+"s"});return d}function M(a,b,d,e){if(r(a,b,d,e))return function(a){a&&c(b,d)}}function a(a,b,d,e){if(b.data(q))return Y(a,b,d,e);c(b,d);e()}function b(b,c,d,e){var f=M(b,
c,d);if(f){var g=f;E(c,function(){k(c,d);N(c);g=a(b,c,d,e)});return function(a){(g||m)(a)}}e()}function c(a,b){a.removeClass(b);var c=a.data(q);c&&(c.running&&c.running--,c.running&&0!==c.running||a.removeData(q))}function d(a,b){var c="";a=e.isArray(a)?a:a.split(/\s+/);u(a,function(a,d){a&&0<a.length&&(c+=(0<d?" ":"")+a+b)});return c}var f="",I,X,p,A;F.ontransitionend===O&&F.onwebkittransitionend!==O?(f="-webkit-",I="WebkitTransition",X="webkitTransitionEnd transitionend"):(I="transition",X="transitionend");
F.onanimationend===O&&F.onwebkitanimationend!==O?(f="-webkit-",p="WebkitAnimation",A="webkitAnimationEnd animationend"):(p="animation",A="animationend");var P="Duration",x="Property",t="Delay",w="IterationCount",h="$$ngAnimateKey",q="$$ngAnimateCSS3Data",y="ng-animate-block-transitions",V=3,C=1.5,D=1E3,v={},ba=0,W=[],S,ca=null,da=0,Z=[];return{enter:function(a,c){return b("enter",a,"ng-enter",c)},leave:function(a,c){return b("leave",a,"ng-leave",c)},move:function(a,c){return b("move",a,"ng-move",
c)},beforeSetClass:function(a,b,c,e){var f=d(c,"-remove")+" "+d(b,"-add"),g=M("setClass",a,f,function(d){var e=a.attr("class");a.removeClass(c);a.addClass(b);d=d();a.attr("class",e);return d});if(g)return E(a,function(){k(a,f);N(a);e()}),g;e()},beforeAddClass:function(a,b,c){var e=M("addClass",a,d(b,"-add"),function(c){a.addClass(b);c=c();a.removeClass(b);return c});if(e)return E(a,function(){k(a,b);N(a);c()}),e;c()},setClass:function(b,c,e,f){e=d(e,"-remove");c=d(c,"-add");return a("setClass",b,
e+" "+c,f)},addClass:function(b,c,e){return a("addClass",b,d(c,"-add"),e)},beforeRemoveClass:function(a,b,c){var e=M("removeClass",a,d(b,"-remove"),function(c){var d=a.attr("class");a.removeClass(b);c=c();a.attr("class",d);return c});if(e)return E(a,function(){k(a,b);N(a);c()}),e;c()},removeClass:function(b,c,e){return a("removeClass",b,d(c,"-remove"),e)}}}])}])})(window,window.angular);


//author: sparrow.jang
//verion: 1.0.1
!function(){"use strict";var a="placeholder"in document.createElement("input"),t=angular.module("html5.placeholder",[]),n=function(a,t){var n=a.getAttributeNode(t);return n?n.nodeValue:n};t.factory("placeholder",function(){var t;if(a)t=function(a,t){t&&t({back:function(){}})};else{var e="placeholderTmp"+ +new Date,r=function(a,t){return angular.forEach(t,function(t){a.push(t)}),a},o={commit:function(a){angular.forEach(a,function(a){var t,r=angular.element(a);t=n(a,"placeholder"),r.val()==t&&(r.data(e,r.val()),r.val(""))})},doRollback:function(a){angular.forEach(a,function(a){var t,n=angular.element(a);t=n.data(e),t&&(n.val(t),n.data(e,null))})}};t=function(a,t){var n;a.length&&"form"==a[0].tagName.toLowerCase()?(n=a.find("input"),n=r(a.find("textarea"),n)):n=a,o.commit(n),t&&t({back:function(){o.doRollback(n)}})}}return{ensure:t}}),a||t.directive("placeholder",[function(){var a,t,e,r,o=+new Date,l="_placeholder_"+o,u="focus",c="blur",i=/msie 9/i.test(navigator.userAgent);return e=function(a){"password"==a.data(l).type&&a.attr("type","text")},r=function(a){"password"==a.data(l).type&&a.attr("type","password")},a=function(){var a=angular.element(this);a.val()==n(this,"placeholder")&&(a.val(""),r(a))},t=function(){var a=angular.element(this);""==a.val()&&(a.val(n(this,"placeholder")),e(a))},{link:function(n,o,d){n.$watch("ready",function(){return"password"!=o.attr("type")||i?(o.val(d.placeholder).data(l,{type:(o.attr("type")||"").toLowerCase()}).bind(u,a).bind(c,t),e(o),void n.$on("$destroy",function(){o.unbind(u,a).unbind(c,t),r(o)})):{}})}}}])}();
/*
 AngularJS v1.2.22
 (c) 2010-2014 Google, Inc. http://angularjs.org
 License: MIT
*/
(function(p,f,n){'use strict';f.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(e,b){var c={},g={},h,k=!1,l=f.copy,m=f.isUndefined;b.addPollFn(function(){var a=b.cookies();h!=a&&(h=a,l(a,g),l(a,c),k&&e.$apply())})();k=!0;e.$watch(function(){var a,d,e;for(a in g)m(c[a])&&b.cookies(a,n);for(a in c)d=c[a],f.isString(d)||(d=""+d,c[a]=d),d!==g[a]&&(b.cookies(a,d),e=!0);if(e)for(a in d=b.cookies(),c)c[a]!==d[a]&&(m(d[a])?delete c[a]:c[a]=d[a])});return c}]).factory("$cookieStore",
["$cookies",function(e){return{get:function(b){return(b=e[b])?f.fromJson(b):b},put:function(b,c){e[b]=f.toJson(c)},remove:function(b){delete e[b]}}}])})(window,window.angular);


/*
 AngularJS v1.2.22
 (c) 2010-2014 Google, Inc. http://angularjs.org
 License: MIT
*/
(function(q,g,r){'use strict';function F(a){var d=[];t(d,g.noop).chars(a);return d.join("")}function m(a){var d={};a=a.split(",");var c;for(c=0;c<a.length;c++)d[a[c]]=!0;return d}function G(a,d){function c(a,b,c,h){b=g.lowercase(b);if(u[b])for(;f.last()&&v[f.last()];)e("",f.last());w[b]&&f.last()==b&&e("",b);(h=x[b]||!!h)||f.push(b);var n={};c.replace(H,function(a,b,d,c,e){n[b]=s(d||c||e||"")});d.start&&d.start(b,n,h)}function e(a,b){var c=0,e;if(b=g.lowercase(b))for(c=f.length-1;0<=c&&f[c]!=b;c--);
if(0<=c){for(e=f.length-1;e>=c;e--)d.end&&d.end(f[e]);f.length=c}}"string"!==typeof a&&(a=null===a||"undefined"===typeof a?"":""+a);var b,l,f=[],n=a,h;for(f.last=function(){return f[f.length-1]};a;){h="";l=!0;if(f.last()&&y[f.last()])a=a.replace(RegExp("(.*)<\\s*\\/\\s*"+f.last()+"[^>]*>","i"),function(a,b){b=b.replace(I,"$1").replace(J,"$1");d.chars&&d.chars(s(b));return""}),e("",f.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",b)===b&&(d.comment&&d.comment(a.substring(4,
b)),a=a.substring(b+3),l=!1);else if(z.test(a)){if(b=a.match(z))a=a.replace(b[0],""),l=!1}else if(K.test(a)){if(b=a.match(A))a=a.substring(b[0].length),b[0].replace(A,e),l=!1}else L.test(a)&&((b=a.match(B))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(B,c)),l=!1):(h+="<",a=a.substring(1)));l&&(b=a.indexOf("<"),h+=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),d.chars&&d.chars(s(h)))}if(a==n)throw M("badparse",a);n=a}e()}function s(a){if(!a)return"";var d=N.exec(a);a=d[1];var c=d[3];if(d=d[2])p.innerHTML=
d.replace(/</g,"&lt;"),d="textContent"in p?p.textContent:p.innerText;return a+d+c}function C(a){return a.replace(/&/g,"&amp;").replace(O,function(a){var c=a.charCodeAt(0);a=a.charCodeAt(1);return"&#"+(1024*(c-55296)+(a-56320)+65536)+";"}).replace(P,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function t(a,d){var c=!1,e=g.bind(a,a.push);return{start:function(a,l,f){a=g.lowercase(a);!c&&y[a]&&(c=a);c||!0!==D[a]||(e("<"),e(a),g.forEach(l,function(c,f){var k=
g.lowercase(f),l="img"===a&&"src"===k||"background"===k;!0!==Q[k]||!0===E[k]&&!d(c,l)||(e(" "),e(f),e('="'),e(C(c)),e('"'))}),e(f?"/>":">"))},end:function(a){a=g.lowercase(a);c||!0!==D[a]||(e("</"),e(a),e(">"));a==c&&(c=!1)},chars:function(a){c||e(C(a))}}}var M=g.$$minErr("$sanitize"),B=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,A=/^<\/\s*([\w:-]+)[^>]*>/,H=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,L=/^</,
K=/^<\//,I=/\x3c!--(.*?)--\x3e/g,z=/<!DOCTYPE([^>]*?)>/i,J=/<!\[CDATA\[(.*?)]]\x3e/g,O=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,P=/([^\#-~| |!])/g,x=m("area,br,col,hr,img,wbr");q=m("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr");r=m("rp,rt");var w=g.extend({},r,q),u=g.extend({},q,m("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),v=g.extend({},r,m("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")),
y=m("script,style"),D=g.extend({},x,u,v,w),E=m("background,cite,href,longdesc,src,usemap"),Q=g.extend({},E,m("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,target,title,type,valign,value,vspace,width")),p=document.createElement("pre"),N=/^(\s*)([\s\S]*?)(\s*)$/;g.module("ngSanitize",[]).provider("$sanitize",
function(){this.$get=["$$sanitizeUri",function(a){return function(d){var c=[];G(d,t(c,function(c,b){return!/^unsafe/.test(a(c,b))}));return c.join("")}}]});g.module("ngSanitize").filter("linky",["$sanitize",function(a){var d=/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/,c=/^mailto:/;return function(e,b){function l(a){a&&k.push(F(a))}function f(a,c){k.push("<a ");g.isDefined(b)&&(k.push('target="'),k.push(b),k.push('" '));k.push('href="');k.push(a);k.push('">');l(c);k.push("</a>")}
if(!e)return e;for(var n,h=e,k=[],m,p;n=h.match(d);)m=n[0],n[2]==n[3]&&(m="mailto:"+m),p=n.index,l(h.substr(0,p)),f(m,n[0].replace(c,"")),h=h.substring(p+n[0].length);l(h);return a(k.join(""))}}])})(window,window.angular);


/**
 * Angular Dynamic Locale - 0.1.27
 * https://github.com/lgalfaso/angular-dynamic-locale
 * License: MIT
 */

!function(a,b){"function"==typeof define&&define.amd?define([],function(){return b()}):"object"==typeof exports?module.exports=b():b()}(this,function(){"use strict";return angular.module("tmh.dynamicLocale",[]).config(["$provide",function(a){function b(a){return a.$stateful=!0,a}a.decorator("dateFilter",["$delegate",b]),a.decorator("numberFilter",["$delegate",b]),a.decorator("currencyFilter",["$delegate",b])}]).constant("tmhDynamicLocale.STORAGE_KEY","tmhDynamicLocale.locale").provider("tmhDynamicLocale",["tmhDynamicLocale.STORAGE_KEY",function(a){function b(a,b,c,d){var e=document.createElement("script"),f=document.getElementsByTagName("body")[0],g=!1;e.type="text/javascript",e.readyState?e.onreadystatechange=function(){("complete"===e.readyState||"loaded"===e.readyState)&&(e.onreadystatechange=null,d(function(){g||(g=!0,f.removeChild(e),b())},30,!1))}:(e.onload=function(){g||(g=!0,f.removeChild(e),b())},e.onerror=function(){g||(g=!0,f.removeChild(e),c())}),e.src=a,e.async=!1,f.appendChild(e)}function c(a,c,d,g,h,k,l){function m(a,b){f===d&&(angular.forEach(a,function(c,d){b[d]?angular.isArray(b[d])&&(a[d].length=b[d].length):delete a[d]}),angular.forEach(b,function(c,d){angular.isArray(b[d])||angular.isObject(b[d])?(a[d]||(a[d]=angular.isArray(b[d])?[]:{}),m(a[d],b[d])):a[d]=b[d]}))}if(j[d])return j[d];var n,o=h.defer();return d===f?o.resolve(c):(n=k.get(d))?(f=d,g.$evalAsync(function(){m(c,n),e.put(i,d),g.$broadcast("$localeChangeSuccess",d,c),o.resolve(c)})):(f=d,j[d]=o.promise,b(a,function(){var a=angular.injector(["ngLocale"]),b=a.get("$locale");m(c,b),k.put(d,b),delete j[d],g.$apply(function(){e.put(i,d),g.$broadcast("$localeChangeSuccess",d,c),o.resolve(c)})},function(){delete j[d],g.$apply(function(){f===d&&(f=c.id),g.$broadcast("$localeChangeError",d),o.reject(d)})},l)),o.promise}var d,e,f,g="angular/i18n/angular-locale_{{locale}}.js",h="tmhDynamicLocaleStorageCache",i=a,j={};this.localeLocationPattern=function(a){return a?(g=a,this):g},this.useStorage=function(a){h=a},this.useCookieStorage=function(){this.useStorage("$cookieStore")},this.defaultLocale=function(a){d=a},this.storageKey=function(a){return a?(i=a,this):i},this.$get=["$rootScope","$injector","$interpolate","$locale","$q","tmhDynamicLocaleCache","$timeout",function(a,b,j,k,l,m,n){function o(b){return c(p({locale:b}),k,b,a,l,m,n)}var p=j(g);return e=b.get(h),a.$evalAsync(function(){var a;(a=e.get(i)||d)&&o(a)}),{set:o,get:function(){return f}}}]}]).provider("tmhDynamicLocaleCache",function(){this.$get=["$cacheFactory",function(a){return a("tmh.dynamicLocales")}]}).provider("tmhDynamicLocaleStorageCache",function(){this.$get=["$cacheFactory",function(a){return a("tmh.dynamicLocales.store")}]}).run(["tmhDynamicLocale",angular.noop]),"tmh.dynamicLocale"});

angular.module('tp.i18n',['ajaxServices', 'ngCookies', 'tmh.dynamicLocale', 'tinypassServices'])
    .config(['tmhDynamicLocaleProvider', function (tmhDynamicLocaleProvider) {
        // we should keep these locale's coming from cloudflare like this
        tmhDynamicLocaleProvider.localeLocationPattern('/libs/angular-1.2.22/i18n/angular-locale_{{locale | replaceUnderscoreToDash}}.js');
    }])
    .run(['lang', function(lang) {
      var initLocale = (TPParam.TRANSLATION_CONFIG && TPParam.TRANSLATION_CONFIG.initialLocaleId) || 'en_US';

      lang.update(initLocale);
    }])
    .directive('autoFocus', function($timeout) {
      return {
        restrict: 'AC',
        link: function(_scope, _element) {
          var element = _element[0];
          $timeout(function(){
            var value = element.value;
            element.value = '';
            element.focus();
            element.value = value;
          }, 100);
        }
      };
    })
    .directive('t', ['$compile', 'lang', 'getTextFromLocales', function ($compile, lang, getTextFromLocales) {
        // <t arg1="time" arg2="date">current time: {1}, date: {2}</t>
        var attrRegex = /^arg(\d+)$/i;
        return {
            restrict: 'AE',
            compile: function (tElement, tAttr) {
                var text = tElement.html();
                var args = [];
                angular.forEach(tAttr, function(value, key) {
                    var match = key.match(attrRegex);
                    if (match && match[1]) {
                        args[match[1]] = value;
                    }
                });
                return postLink;

                function postLink(scope, el, attr) {
                    var templateContext = lang.getTemplateContext();
                    var context = attr.context ? attr.context : templateContext;

                    onChangeLanguage();

                    activate();

                    function activate() {
                        lang.on(onChangeLanguage);
                        scope.$on('$destroy', function() {
                            lang.off(onChangeLanguage);
                        });
                    }

                    function onChangeLanguage(locale, systemDefaultLocale, locales) {
                      if (!locale) {
                        return;
                      }

                      var getText = getTextFromLocales(locale, systemDefaultLocale, locales);

                      el.empty().append(lang.formatString(getText(context, text), args));
                      $compile(el.contents())(scope);
                    }
                }
            }
        };
    }])
    .directive('languageSelector', ['lang', function (lang) {
        return {
            restrict: 'E',
            scope: {},
            template:
            '<div ng-show="areLanguagesAvailable()" class="language-selector">'+
            '   <div id="language-label" class="language-selector__label" ng-click="toggleMenu()">{{locale | shortLocale}}</div>'+
            '   <ul id="language-list" class="language-selector__list" ng-class="{\'show\': opened === true, \'hide\': opened === false}">'+
            '       <li class="language-selector__list-item" ng-repeat="(index, value) in languages | filter:showAvailableLanguage" ng-click="changeLanguage(value.locale)">'+
            '           <div class="language-selector__country" ng-class="{\'selected\': value.locale === locale}">{{value.localized}}' +
            '             <span class="language-selector__country-image language-selector__country-image--{{value.locale | getCountryCode}}"></span>'+
            '           </div>'+
            '       </li>'+
            '   </ul>'+
            '</div>',
            link: link,
            controller: ['$scope', ctrl]
        };

        function link(scope, elem) {
            scope.toggleMenu = toggleMenu;
            scope.opened = false;
            function toggleMenu() {
                scope.opened = !scope.opened;
                jQuery(window).off('click');

                jQuery(window).on('click', closeMenu);
            }

            function closeMenu(e) {
                if (jQuery(e.target)[0] !== elem.find('#language-label')[0]) {
                    scope.opened = false;
                    jQuery(window).off('click');
                    scope.$apply();
                }
            }
        }

        function ctrl($scope) {
            $scope.languages = [];
            $scope.locale = null;
            $scope.showAvailableLanguage = showAvailableLanguage;
            $scope.changeLanguage = changeLanguage;
            $scope.isLanguagesEnabled = TPParam.TRANSLATION_CONFIG.isEnabled;

            activate();

            $scope.areLanguagesAvailable = function () {
                return $scope.isLanguagesEnabled && $scope.languages.length > 1;
            };

            function activate() {
                lang.on(onChangeLanguage);
                $scope.$on('$destroy', function() {
                    lang.off(onChangeLanguage);
                });

                lang.list()
                    .then(onLoadLanguages);
            }

            function onChangeLanguage(locale) {
                $scope.locale = locale;
            }

            function onLoadLanguages(languages) {
                $scope.languages = languages.sort(function(a, b) {
                  if (a.localized.toLowerCase() === b.localized.toLowerCase()) return 0;
                  return a.localized.toLowerCase() > b.localized.toLowerCase() ? 1 : -1;
                });
            }

            function showAvailableLanguage(language) {
                return language.isEnabled ? language : false;
            }

            function changeLanguage(locale) {
              $scope.locale = locale;
              lang.update($scope.locale);
            }
        }
    }])
    .filter('shortLocale', function() {
        return function(text) {
            var splittedText = text.toUpperCase().split('_');
            return splittedText[0] + '-' + splittedText[1];
        }
    })
    .filter('t', ['lang', function(lang) {
        return function(text, args) {
            var templateContext = lang.getTemplateContext();

            return lang.trc(templateContext, text, args);
        }
    }])
    .filter('tc', ['lang', function(lang) {
        return function(text, context, args) {
            return lang.trc(context, text, args);
        }
    }])
    .filter('replaceUnderscoreToDash', function() {
        return function(text){
            return text.toString().toLowerCase().replace('_','-');
        }
    })
    .filter('replaceDashToUnderscore', function() {
        return function(text) {
            var localeArr;
            if (text.match(/\-/g) === null) {
                return text;
            }

            localeArr = text.toUpperCase().split('-');
            localeArr[0] = localeArr[0].toLowerCase();
            return localeArr.join('_');
        }
    })
    .filter('getCountryCode', function() {
      return function(text) {
        return text.match(/\w{2}$/)[0].toLowerCase();
      }
    })
  .factory('getTextFromLocales', [function () {
    return function (locale, systemDefaultLocale, locales) {
      return function (context, text) {
        context = context ? context + '\u0004' : '';

        var key = context + text;

        var systemDefaultText;
        var systemDefaultTexts = locales && locales[systemDefaultLocale];

        var preferredLocaleTexts = locales && locales[locale];
        var preferredLocaleText = preferredLocaleTexts && (preferredLocaleTexts[key] || preferredLocaleTexts[text]);

        //If there is no texts for preferred(selected/current) locale
        if (typeof preferredLocaleText === 'undefined') {
          systemDefaultText = systemDefaultTexts && (systemDefaultTexts[key] || systemDefaultTexts[text]);
        }
        //If there are no texts for preferred(selected/current) locale and default locale
        return preferredLocaleText || systemDefaultText || text;
      };
    };
  }])
    .factory('lang', ['tpHTTP', '$q', '$locale', '$cookies', 'tmhDynamicLocale',
      'resolveLocale', 'cookieLang', '$rootScope', '$filter', 'getTextFromLocales', function (
        tpHTTP,
        $q,
        $locale,
        $cookies,
        tmhDynamicLocale,
        resolveLocale,
        cookieLang,
        $rootScope,
        $filter,
        getTextFromLocales
    ) {
        var locale = resolveLocale();
        var localeChanged = false;
        var sundayFirstWeekDayByCountry = ['en_US', 'en_GB', 'pt_PT', 'es_CO', 'pt_BR', 'fr_CA', 'ja_JP', 'zz_ZZ'];

        var handlers = [];
        var languages = null;
        var loadLanguages = null;
        var systemDefaultLocale = (TPParam.TRANSLATION_CONFIG && TPParam.TRANSLATION_CONFIG.systemDefaultLocale) || 'en_US';

        var translationMaps = {
                translationMapStatic: {},
                translationMapDynamic: {}
            };

        var locales = {};
        var cachedDynamicLocales = {};
        var _timer;

        init();

        return {
            update: update,
            on: on,
            off: off,
            tr: tr,
            trc: trc,
            list: list,
            formatString: formatString,
            getLang: getLang,
            getTemplateContext: getTemplateContext,
            getCorrectStartWeekDay: getCorrectStartWeekDay,
            getLanguageTag: getLanguageTag
        };

        function getLang() {
            return localeChanged && locale || '';
        }

        function getTemplateContext() {
          return (window.TPParam.TRANSLATION_CONFIG && window.TPParam.TRANSLATION_CONFIG.templateContext) || ''
        }

        function getLanguageTag() {
            // returns IETF language tag, e.g. 'en-US'
            var lang = getLang() || locale;
            return lang.replace("_", "-");
        }

        function init() {
            $rootScope.$on('CHECK_UPDATED_LANGUAGE', checkLangChange);
            startLangChangedWatcher();
            updateMomentJsLocale();
        }

        function startLangChangedWatcher() {
            stopLangChangedWatcher();
            _timer = setInterval(checkLangChange, 500);
        }

        function stopLangChangedWatcher() {
            if (_timer) {
                clearInterval(_timer);
            }
        }

        function checkLangChange() {
            var langInCookie = cookieLang.getCookie('LANG_CHANGED');
            if (langInCookie && langInCookie !== locale && langInCookie !== "\"\"") {
                update(langInCookie);
            }
        }

        function list() {
          if (!TPParam.TRANSLATION_CONFIG.isEnabled) {
            return $q.when([]);
          }

          if (!loadLanguages) {
            loadLanguages = $q.when(TPParam.TRANSLATION_CONFIG.languages).then(function (data) {
              languages = data;
              update(locale);
              return data;
            });
          }

          return loadLanguages;
        }

        function getCorrectStartWeekDay() {
          var lang = getLang() || locale;

          return sundayFirstWeekDayByCountry.indexOf(lang) === -1;
        }

        function tr(text) {
            var args = new Array(arguments.length - 1);
            for(var i = 0; i < args.length; ++i) {
                args[i] = arguments[i + 1];
            }
            var getText = getTextFromLocales(locale, systemDefaultLocale, locales);

            return formatString(getText(null, text), args);
        }

        // now we need context variable for gradle to put key in certain context
        function trc(context, text, params) {
            var args;
            if (angular.isArray(params)) {
                args = params;
            } else {
                args = new Array(arguments.length - 2);
                for(var i = 0; i < args.length; ++i) {
                    args[i] = arguments[i + 2];
                }
            }

          var getText = getTextFromLocales(locale, systemDefaultLocale, locales);

          return formatString(getText(context, text), args);
        }

        function formatString(text, args) {
            if (angular.isUndefined(text) || text === null) {
                return text;
            }
            return text.replace(/<t([^>]+)?>|<\/t>/g, '').replace(/{(\d+)}/g, function (match, number) {
                return typeof args[number] !== 'undefined' ? args[number] : match;
            });
        }

        function handle(texts) {
          locales[locale] = texts;

          handlers.forEach(function (handler) {
            handler(locale, systemDefaultLocale, locales);
          });
        }

        function loadTranslationMap(url, locale) {
            var deferred = $q.defer();
            var script;
            var heads;
            var head;

            if (url) {
                script = document.querySelector('script[src*="' + url + '"]');
                if (!script) {
                    heads = document.getElementsByTagName('head');
                    if (heads && heads.length) {
                        head = heads[0];
                        if (head) {
                            script = document.createElement('script');
                            script.onload = function() {
                                if(!window['translation' + locale]) {
                                    return deferred.reject('Unable to load');
                                }
                                return deferred.resolve(window['translation' + locale]);
                            };

                            script.setAttribute('src', url);
                            script.setAttribute('type', 'text/javascript');
                            script.setAttribute('charset', 'utf-8');
                            head.appendChild(script);
                        }
                    }
                }
            }
            return deferred.promise;
        }

        function loadLocale(localeId) {
            var translationStaticPath = '/ng/common/i18n/platform-translation-map_' + localeId + '.js?version=' + TPParam.TRANSLATION_CONFIG.version;
            var translationDynamicPath = TPParam.TRANSLATION_CONFIG.loadTranslationUrl + '&language=' + localeId;
            var staticTranslation = window['translation_static_' + localeId];

            if (TPParam.TRANSLATION_CONFIG.isStatic) {
                if (staticTranslation) {
                    return $q.when(staticTranslation);
                }

                return loadTranslationMap(translationStaticPath, '_static_' + localeId).then(function() {
                    return $q.when(window['translation_static_' + localeId]);
                });
            }

            return $q.all({
                translationMapStatic: loadTranslationMap(translationStaticPath, '_static_' + localeId).then(function(staticResult) {
                    return staticResult;
                }),
                translationMapDynamic: loadTranslationMap(translationDynamicPath, '_dynamic_' + localeId).then(function(dynamicResult) {
                    return dynamicResult;
                })
            }).then(function(res) {
                translationMaps.translationMapStatic  = res.translationMapStatic;
                translationMaps.translationMapDynamic = res.translationMapDynamic;

                return $q.when(angular.extend({}, res.translationMapStatic, res.translationMapDynamic));
            }).catch(function(res) {
              locales = omit(locales, localeId);
              // TODO: Handle error in a proper way. We can't use generateErrorMessage for that purpose
              /* return TinypassService.generateErrorMessage(res); */
            });
        }

        function omit(object, fields) {
            var fieldsToOmit = [];
            var objectToParse = {};

            if (typeof fields === 'string') {
                fieldsToOmit = [fields];
            }

            if (angular.isArray(fields)) {
                fieldsToOmit = [].concat(fields);
            }

            if (angular.isArray(object)) {
                object.forEach(function(value, index) {
                    objectToParse[index] = value;
                });
            }

            if(angular.isObject(object) && !angular.isArray(object)) {
                objectToParse = angular.extend({}, object);
            }

            fieldsToOmit.forEach(function(field) {
                delete objectToParse[field];
            });

            return objectToParse;
        }

        function on(fn, notRunImmediately) {
            handlers.push(fn);

            if (!notRunImmediately) {
                fn(locale, systemDefaultLocale, locales);
            }
        }

        function off(fn) {
            var index = handlers.indexOf(fn);
            if (index !== -1) {
                handlers.splice(index, 1);
            }
        }

        function update(newLocale) {
          stopLangChangedWatcher();

          if (!(TPParam.TRANSLATION_CONFIG && TPParam.TRANSLATION_CONFIG.isEnabled)) {
            cookieLang.removeCookie('LANG');
            cookieLang.removeCookie('LANG_CHANGED');
            return;
          }

          if (angular.isUndefined(newLocale)) {
            newLocale = cookieLang.getCookie('LANG') || systemDefaultLocale;
          }

          var isLocaleListed = languages && languages.some(function (lang) {
            return lang.locale === newLocale; });

          if (!languages || isLocaleListed) {
            setLngCookie(newLocale);
            updateMomentJsLocale();

            loadLocales(newLocale).then(handle).then(function () {
              $rootScope.$broadcast('EVENT_I18N_LOCALE_CHANGED');
            });
          }

          startLangChangedWatcher();
        }

        function loadLocales(newLocale) {
          if (typeof locales[systemDefaultLocale] === 'undefined') {
            return $q.all(getLocale(newLocale), getLocale(systemDefaultLocale));
          }

          return getLocale(newLocale);
        }

        function getLocale(newLocale) {
            var translationStatic  = window['translation_static_' + newLocale];
            var translationDynamic = window['translation_dynamic_' + newLocale];

            if (locales[newLocale]) {
                return $q.when(locales[newLocale]);
            }

            if (translationStatic || translationDynamic) {
                locales[newLocale] = angular.extend({}, translationStatic, translationDynamic);
                return $q.when(locales[newLocale]);
            }

            return loadLocale(newLocale)
                .then(function (texts) {
                    locales[newLocale] = texts;
                    return texts;
                });
        }

        function setLngCookie(newLocale) {
            locale = newLocale;
            localeChanged = true;

            cookieLang.setCookie('LANG', locale, 1500);
            cookieLang.setCookie('LANG_CHANGED', locale, 1);

            var newLocaleId = $filter('replaceUnderscoreToDash')(newLocale);
            if(!cachedDynamicLocales[newLocaleId] && ($locale.id === newLocaleId)) {
                cachedDynamicLocales[newLocaleId] = angular.copy($locale);
            }

            if(cachedDynamicLocales[newLocaleId]) {
                overrideValues($locale, cachedDynamicLocales[newLocaleId]);
            }

            //When we load page first time, initial angular locale file must be loaded(For example: 'angular-locale_ru-ru') on the back-end
            //No need to load on the front-end dynamically.
            if (newLocale !== TPParam.TRANSLATION_CONFIG.initialLocaleId) {
                if(!cachedDynamicLocales[newLocaleId]) {
                    tmhDynamicLocale.set(newLocaleId).then(function(locale){
                        cachedDynamicLocales[locale.id] = angular.copy(locale);
                    });
                }

                updateInitialLocaleId(locale);
            }
        }

        function updateInitialLocaleId(newLocaleId) {
            if (window.TPParam.TRANSLATION_CONFIG && window.TPParam.TRANSLATION_CONFIG.initialLocaleId) {
                window.TPParam.TRANSLATION_CONFIG.initialLocaleId = newLocaleId;
            }
        }

        function updateMomentJsLocale() {
            if (typeof(moment) !== 'undefined') {
                try {
                    var language = getLanguageTag();

                    switch (language) {
                        case 'zz-ZZ':
                          language = 'x-pseudo';
                          break;
                        case 'sr-RS':
                          language = 'sr-cyrl';
                          break;
                    }

                    if (moment.locale) {
                        // 2.8.1+
                        moment.locale(language);
                    } else {
                        moment.lang(language);
                    }
                } catch (e) {}
            }
        }

        function overrideValues(oldObject, newObject) {
            angular.forEach(oldObject, function(value, key) {
                if (!newObject[key]) {
                    delete oldObject[key];
                } else if (angular.isArray(newObject[key])) {
                    oldObject[key].length = newObject[key].length;
                }
            });
            angular.forEach(newObject, function(value, key) {
                if (angular.isArray(newObject[key]) || angular.isObject(newObject[key])) {
                    if (!oldObject[key]) {
                        oldObject[key] = angular.isArray(newObject[key]) ? [] : {};
                    }
                    overrideValues(oldObject[key], newObject[key]);
                } else {
                    oldObject[key] = newObject[key];
                }
            });
        }
    }])
    .factory('resolveLocale', ['$cookies', '$locale', 'tmhDynamicLocale', '$filter', 'cookieLang',
      function($cookies, $locale, tmhDynamicLocale, $filter, cookieLang) {
        return function resolveLocale() {
            var cookieLocale = cookieLang.getCookie('LANG');

            //var locale = $filter('replaceDashToUnderscore')(cookieLocale || $locale.id);

            //tmhDynamicLocale.set($filter('replaceUnderscoreToDash')(locale));

            return "en_US";
        }
    }])
    .factory('cookieLang', ['TinypassService', function(tinypassService) {
        //Factory uses in checkout/resource/widget/checkout/1.0/js/paypalbtModule.js
        return {
            getCookie: getCookie,
            setCookie: setCookie,
            removeCookie: removeCookie,

            getCountryCode: getCountryCode,
            getLanguageCode: getLanguageCode
        };

        function getCountryCode() {
            if (getCookie("LANG") === null || getCookie("LANG") === undefined || getCookie("LANG") === '') {
                return "us";
            }
            return getCookie("LANG").split("_")[1].toLowerCase();
        }

        function getLanguageCode() {
            if (getCookie("LANG") === null || getCookie("LANG") === undefined || getCookie("LANG") === '') {
                return "en";
            }
            return getCookie("LANG").split("_")[0];
        }

        function getCookie(name) {
            var value = '; ' + document.cookie;
            var parts = value.split('; ' + name + '=');
            if (parts.length > 1) return parts.pop().split(';').shift();
        }

        function setCookie(cname, cvalue, exdays) {
            var d = new Date();
            var expires;
            d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
            expires = 'expires=' + d.toUTCString();
            document.cookie = cname + '=' + cvalue + '; ' + expires + '; domain=' + tinypassService.getTopDomain() + '; path=/;' + tinypassService.getCookieSameSiteAndSecureAttrString();
        }

        function removeCookie(cname) {
            var expires = 'expires=' + (new Date('February 02, 1972 02:02:02')).toUTCString();
            document.cookie = cname + '=' + '; ' + expires + '; domain=' + tinypassService.getTopDomain() + '; path=/;' + tinypassService.getCookieSameSiteAndSecureAttrString();
        }
    }])
    .factory('updateDirAttrOnLangChanges', [
      '$document',
      'lang',
      'ngEventService',
      function(
        $document,
        lang,
        ngEventService
      ) {
        var RTL_LOCALES = ['he_IL', 'ar_EG'];
        var DIRECTIONS = {
          RIGHT_TO_LEFT: 'rtl',
          LEFT_TO_RIGHT: 'ltr',
        }

        function setDirAttribute(direction) {
          $document[0].documentElement.setAttribute('dir', direction);
        }

        ngEventService.subscribe('langChanged', function (event, params) {
          if (params.lang) {
            lang.update(params.lang);
          }
        });

        return function(onLangChange) {
          var currentLocale;
          var currentDirection;

          lang.on(function(newLocale) {
            if (newLocale === currentLocale) {
              return;
            }

            var newLocaleDirection = RTL_LOCALES.indexOf(newLocale) !== -1 ? DIRECTIONS.RIGHT_TO_LEFT : DIRECTIONS.LEFT_TO_RIGHT;

            if (newLocaleDirection !== currentDirection) {
              currentDirection = newLocaleDirection;
              setDirAttribute(newLocaleDirection);
            }

            currentLocale = newLocale;

            if (onLangChange) {
              onLangChange(newLocale);
            }
          });
        }
    }]);

(function () {
  var dateServices = angular.module('dateServices', []);
  var withoutSpinnerHeaderName = 'Piano-request-without-spinner';

  function isIncludesWithoutSpinnerHeader(response) {
    var headers = response && response.config && response.config.headers || {};
    return !!headers[withoutSpinnerHeaderName];
  }

  dateServices.factory('fromIsoToJsDate', function () {
    return function (field, obj) {
      if (!obj.length) {
        if (obj[field]) {
          obj[field] = moment(obj[field]).format();
        }
        return obj[field];
      } else {
        for (var i = obj.length - 1; i >= 0; i--) {
          if (obj[i][field]) {
            obj[i][field] = moment(obj[i][field]).format();
          }
        }
        return obj;
      }
    };
  });

  dateServices.factory('timeStampToDate', function () {
    return function(timestamp) {
      if (!timestamp) {
        return timestamp;
      }
      if (timestamp && (timestamp < 10000000000)) {
        return new Date(timestamp * 1000);
      } else {
        return new Date(timestamp);
      }
    };
  });

  dateServices.factory('TimezoneService', function () {
    return {
      /**
       * Backend expects dates in requests to be in this format (ISO with offset without milliseconds).
       */
      SEND_DATETIME_FORMAT: 'YYYY-MM-DDTHH:mm:ssZZ',

      /**
       * Given date, representing some moment, returns Moment, which points to the same moment,
       * but with the offset based on `TPParam.CLIENT_TIMEZONE`. So the input and output point to the same
       * moment on the timeline (unlike in {@link dateToClientTimezoneMoment}).
       * If no date provided, returns a Moment, that points to the current moment with the above said offset.
       * @throws Would throw an error if `moment.js` or `moment-timezone.js` are not available.
       * @param {Date | string | object} [date] - Any valid representative of MomentInput interface.
       * @returns {Moment}
       */
      dateToTimezonedMoment: function dateToTimezonedMoment(date) {
        return moment.tz(date, TPParam.CLIENT_TIMEZONE);
      },

      /**
       * Given Date object, representing some moment, returns Moment, which has the same date and time,
       * but in the `TPParam.CLIENT_TIMEZONE` timezone. So the input and output point to the two different
       * moments on the timeline (unlike in {@link dateToTimezonedMoment}).
       * @example
       * var date = new Date(); // "Thu Mar 21 2019 10:33:21 GMT+0400 (Samara Standard Time)"
       * TPParam.CLIENT_TIMEZONE; // "America/New_York"
       * dateToClientTimezoneMoment(date).format(); // "2019-03-21T10:33:21-04:00"
       * @throws Would throw an error if `moment.js` or `moment-timezone.js` are not available.
       * @param {Date} date
       * @returns {Moment}
       */
      dateToClientTimezoneMoment: function dateToClientTimezoneMoment(date) {
        return moment.tz({
          year: date.getFullYear(),
          month: date.getMonth(),
          date: date.getDate(),
          hour: date.getHours(),
          minute: date.getMinutes(),
          second: date.getSeconds(),
          millisecond: date.getMilliseconds(),
        }, TPParam.CLIENT_TIMEZONE);
      },

      /**
       * @typedef {Object} DateRangeStringObject
       * @property {string} from
       * @property {string} to
       */

      /**
       * Given two Date objects (range start and range end) returns an object with strings,
       * which are the provided Dates with justified timezones and times in {@link SEND_DATETIME_FORMAT}.
       * Only the date of the Date objects is considered: offset is reset (see {@link dateToClientTimezoneMoment})
       * and time is set to 00:00:00 for `from` and 23:59:59 for `to`.
       * The main use case is when the pn-datepicker provides us the date range, and we need these dates NOT in local timezone.
       * @param {Date} from
       * @param {Date} to
       * @returns {DateRangeStringObject}
       */
      datesToTimezonedStringsRange: function datesToTimezonedStringsRange(from, to) {
        return {
          from: this.dateToClientTimezoneMoment(from).startOf('day').format(this.SEND_DATETIME_FORMAT),
          to: this.dateToClientTimezoneMoment(to).endOf('day').format(this.SEND_DATETIME_FORMAT),
        };
      },

      /**
       * Given Moment, which points to some moment on the timeline, returns Date object, which has
       * the same date and time, but in the browser's timezone.
       * The returned Date points to another moment on the timeline, so we cannot use {@link Moment.toDate}.
       * @param {Moment} m
       * @returns {Date}
       */
      momentToDate: function momentToDate(m) {
        return new Date(
          m.year(),
          m.month(),
          m.date(),
          m.hour(),
          m.minute(),
          m.second()
        );
      },

      dateInClientTimezoneToBrowserTimezone: function dateInClientTimezoneToBrowserTimezone(date) {
        var m = moment.tz(date, TPParam.CLIENT_TIMEZONE);
        return new Date(
          m.year(),
          m.month(),
          m.date(),
          m.hour(),
          m.minute(),
          m.second()
        );
      }
    };
  });

  dateServices.factory('ISODatetimeService', function () {
    return {
      ISO8601_DATE_FORMAT: 'YYYY-MM-DD',
      ISO8601_DATETIME_FORMAT: 'YYYY-MM-DD HH:MM',

      dateToString: function dateToString(value) {
        if (moment.tz) {
          return moment.tz(value, TPParam.CLIENT_TIMEZONE).format(this.ISO8601_DATE_FORMAT);
        } else {
          return moment(value).format(this.ISO8601_DATE_FORMAT);
        }
      },

      datetimeToString: function datetimeToString(value) {
        if (moment.tz) {
          return moment.tz(value, TPParam.CLIENT_TIMEZONE).format(this.ISO8601_DATETIME_FORMAT);
        } else {
          return moment(value).format(this.ISO8601_DATETIME_FORMAT);
        }
      }
    };
  });

  var ajaxServices = angular.module('ajaxServices', []);

  ajaxServices.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
    $httpProvider.defaults.headers.common["Ng-Request"] = "1";
    $httpProvider.interceptors.push('tpHttpInterceptor');
    var spinnerFunction = function (data, headersGetter) {
      var headers = headersGetter && headersGetter();
      var requestWithoutSpinnerHeader = headers && headers[withoutSpinnerHeaderName];

      if (requestWithoutSpinnerHeader || tinypass.withoutWaitPanel) {
        return data;
      }

      tinypass.showWaitPanel();
      return data;
    };
    $httpProvider.defaults.transformRequest.push(spinnerFunction);
  }]);
  ajaxServices.factory('tpHttpInterceptor', ['$q', function ($q) {
    return {
      'response': function (response) {
        if (response.data) {
          if (response.data.models) {
            response.models = response.data.models;
          }
          if (response.data.errors) {
            response.errors = response.data.errors;
          }
        }
        tinypass.updateMetaRefresh();

        if (!isIncludesWithoutSpinnerHeader(response)) {
          tinypass.hideWaitPanel();
        }

        return response;
      },
      'responseError': function (rejection) {
        if (rejection.data) {
          if (rejection.data.models) {
            rejection.models = rejection.data.models;
          }
          if (rejection.data.errors) {
            rejection.errors = rejection.data.errors;
          }
        }

        if (!isIncludesWithoutSpinnerHeader(rejection)) {
          tinypass.hideWaitPanel();
        }

        return $q.reject(rejection);
      }
    }
  }]);

  ajaxServices.factory('repeatHTTP', function($q) {
    var repeat = function (httpCall, config) {
      var config = config || {};
      var defer = config.defer;
      var attempt = config.attempt || 0;
      var times = config.times || 1;
      var cancelConfig = config.cancelConfig || {};

      if (!defer) {
        Log.info('defer is required');
        return $q.reject();
      }

      httpCall()
        .then(function (response) {
          defer.resolve(response);
        })
        .catch(function (response) {
          if (cancelConfig.cancel) {
            return;
          }

          if (attempt >= times) {
            defer.reject(response);
          } else {
            repeat(httpCall, Object.assign({}, config, { attempt: attempt + 1 }));
          }
        });
        return defer.promise;
    };
    return repeat;
  });

  ajaxServices.factory('tpHTTP', ['$http', '$window', '$q', '$rootScope',
    function ($http, $window, $q, $rootScope) {
      var f = function tpHTTP(config, isAbsoluteUrl) {
        var isRelativeUrl = !isAbsoluteUrl;

        if (isRelativeUrl) {
          config.url = $window.TPConfig.PATH + config.url;
        }

        var promise = $http(config);
        promise.then(f.processHeaders);
        return promise;
      };
      f.get = function (url, config) {
        url = $window.TPConfig.PATH + url;
        var promise = $http.get(url, config);
        promise.then(f.processHeaders);
        return promise;
      };
      f.post = function (url, data, config) {
        url = $window.TPConfig.PATH + url;
        var promise = $http.post(url, data, config);
        promise.then(f.processHeaders);
        return promise;
      };
      f.jsonp = function (url, params) {
        params = params || {};
        params.callback = params.callback || 'JSON_CALLBACK';

        var promise = $http.jsonp(url, {
          params: params
        });

        return promise.then(function (response) {
          return response.data;
        });
      };
      f.processResponse = function (response) {
        if (response.data && response.data.models) {
          response.models = response.data.models;
        }
        if (response.data && response.data.errors) {
          response.errors = response.data.errors;
        }

        return response;
      };
      f.processResponseCatch = function (response) {
        if (response.data && response.data.models) {
          response.models = response.data.models;
        }
        if (response.data && response.data.errors) {
          response.errors = response.data.errors;
        }
        return $q.reject(response);
      };

      f.processHeaders = function (response) {
        var headers = response.headers();
        if (headers['execute_js_after']) {
          try {
            eval(headers['execute_js_after']);
          } catch (ex) {
          }
        }
        return response;
      };

      /*
       Extract errors from an angular response message
       */
      f.extractErrors = function (jsonData, scopeForm, scope) {
        if (jsonData && (jsonData['errors'] || jsonData['modalErrors'])) {
          scope.formErrors = (jsonData['errors'] && jsonData['errors'].length) ? jsonData['errors'] : jsonData['modalErrors'];
          angular.forEach(scope.formErrors, function (error) {
            var field = error['field'];
            var key = error['key'];
            var msg = error['msg'];
            if (scopeForm && scopeForm[field]) {
              angular.element('#' + field).focus();
              scopeForm[field].$setValidity('error', false);
              scopeForm[field].$error['msg'] = msg;
            }
          });
        }

      };

      /*
       Reset the form errors.
       */
      f.resetFormErrors = function (scopeForm, scope, jsonData) {
        try {
          if (jsonData) {
            jsonData['errors'] = [];
            jsonData['modalErrors'] = [];
          }
          angular.forEach(scope.formErrors, function (error) {
            scopeForm[error['field']].$setValidity('error', true);
            scopeForm[error['field']].$setPristine();
          });
          delete scope.formErrors;
          scopeForm.$setPristine();
          if (!scope.$$phase) {
            scope.$apply();
          }
        } catch (ex) {
          Log.info("Could not reset form errors!", ex);
        }
      };

      f.setFieldsValid = function (scopeForm, scope) {
        try {
          angular.forEach(scopeForm, function (field, name) {
            if (name.indexOf('$') != 0) {
              field.$setValidity('error', true);
              field.$setPristine();
            }
          });

          scopeForm.$setPristine();
          if (!scope.$$phase) {
            scope.$apply();
          }
        } catch (ex) {
          Log.info("Could not reset form errors!", ex);
        }
      };

      f.extractModels = function (data, $scope) {
        if (data && data.models) {
          for (var name in data.models)
            $scope[name] = data.models[name];
        }
        if (data && data.routes) {
          if (typeof $scope.routes == 'undefined')
            $scope.routes = {};
          for (var route in data.routes)
            $scope.routes[route] = data.routes[route];
        }
      };

      f.promiseResponse = function (httpPromiser, scope) {
        var promiser = $q.defer();
        scope.errors = [];
        httpPromiser.then(function (rsp) {
          if (rsp && rsp["errors"]) {
            angular.copy(rsp["errors"], scope.errors);
          }

          if (rsp && rsp.models) {
            for (var name in rsp.models) {
              if (rsp.models.hasOwnProperty(name)) {
                scope[name] = rsp.models[name];
              }
            }
          }
          promiser.resolve();
        }).catch(function (rsp) {
          if (rsp && rsp["errors"]) {
            angular.copy(rsp["errors"], scope.errors);
          }
          promiser.reject();
        });
        return promiser.promise;
      };

      /**
       * binder for scope with extractModels
       * @param $scope
       * @returns {Function} binded function
       */
      f.extractModelsTo = function ($scope) {
        return function (rsp) {
          f.extractModels(rsp.data, $scope);
        };
      };

      /**
       * Success handler
       * @param loaded
       * @returns {Function}
       */
      f.successHander = function (loaded) {
        return function (rspData) {
          loaded.resolve({ data: rspData, ok: true });
        };
      };

      /**
       * Error handler
       * @param loaded
       * @returns {Function}
       */
      f.errorHander = function (loaded) {
        return function (rspData) {
          loaded.resolve({ data: rspData, ok: false });
        };
      };

      f.promiser = function (httpPromise) {
        var promiser = $q.defer();
        httpPromise.then(f.successHander(promiser))
          .catch(f.errorHander(promiser));
        return promiser.promise;
      };

      f.buildUrl = function (url, params) {
        function forEachSorted(obj, iterator, context) {
          var keys = sortedKeys(obj);
          for (var i = 0; i < keys.length; i++) {
            iterator.call(context, obj[keys[i]], keys[i]);
          }
          return keys;
        }

        function sortedKeys(obj) {
          var keys = [];
          for (var key in obj) {
            if (obj.hasOwnProperty(key)) {
              keys.push(key);
            }
          }
          return keys.sort();
        }

        if (!params) return url;
        var parts = [];
        forEachSorted(params, function (value, key) {
          if (value == null || value == undefined) return;
          if (angular.isObject(value)) {
            value = angular.toJson(value);
          }
          parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
        });
        return url + ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');
      };
      return f;
    }]);

  var tinypassService = angular.module("tinypassServices", []);

  function _setCookie(name, value, expires, path, domain, secure, samesite) {
    // set time, it's in milliseconds
    var today = new Date();
    today.setTime(today.getTime());

    var expires_date = new Date(today.getTime() + (expires));

    document.cookie = name + "=" + value +
      ((expires) ? ";expires=" + expires_date.toGMTString() : "") +
      ((path) ? ";path=" + path : "") +
      ((domain) ? ";domain=" + domain : "") +
      ((secure) ? ";secure" : "") +
      ((samesite) ? ";samesite=" + samesite : "none");
  }

  function _getCookie(name) {

    var matches = document.cookie.match(new RegExp(
      "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
    ))
    return matches ? decodeURIComponent(matches[1]) : undefined
  }

  tinypassService.factory('TinypassService', ['$q', function ($q) {
    var cookieAttrs;
    function _getCookieSameSiteAndSecureAttrString() {
      if (cookieAttrs) {
        return cookieAttrs;
      }
      cookieAttrs = _inIframe() ? ' samesite=none; ' : ' samesite=lax; ';
      if (window.location.protocol === 'https:') {
        cookieAttrs += ' secure;';
      }
      return cookieAttrs;
    }
    function _getTopDomain() {
      var i, h,
        weird_cookie = 'weird_get_top_level_domain=cookie',
        hostname = document.location.hostname.split('.');

      if (hostname.length === 1) {
        return hostname[0];
      }
      if (hostname.length === 4 && !isNaN(hostname[0]) && !isNaN(hostname[3])) {
        return document.location.hostname;
      }

      for (i = hostname.length - 1; i >= 0; i--) {
        h = '.' + hostname.slice(i).join('.');
        var cookieAttrs = _getCookieSameSiteAndSecureAttrString();
        document.cookie = weird_cookie + ';domain=' + h + ';' + cookieAttrs;
        if (document.cookie.indexOf(weird_cookie) > -1) {
          document.cookie = weird_cookie.split('=')[0] + '=;domain=' + h + ';expires=Thu, 01 Jan 1970 00:00:01 GMT;' + cookieAttrs;
          return h;
        }
      }
    }

    function _inIframe() {
      try {
        return window.self !== window.top;
      } catch (e) {
        return true;
      }
    }

    function _setCookie(cname, cvalue, exdays) {
      var d = new Date();
      d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
      var expires = "expires=" + d.toUTCString();
      document.cookie = cname + '=' + cvalue + '; ' + expires + '; domain= ' + _getTopDomain() + '; path=/;' + _getCookieSameSiteAndSecureAttrString();
    }

    function _getCookie(name) {
      var value = "; " + document.cookie;
      var parts = value.split("; " + name + "=");
      if (parts.length > 1) return parts.pop().split(";").shift();
    }

    return {
      setMessage: function (type, msg) {
        tinypass.setMessageDashboard(type, msg);
      },
      hideMessage: function () {
        tinypass.hideMessage();
      },
      cropImage: function (path, image, type, cropX, cropY, cropWidth, cropHeight, onSuccess, onError) {
        tinypass.cropImage(path, image, type, cropX, cropY, cropWidth, cropHeight, onSuccess, onError);
      },
      getISODate: function (from, to) {
        var startDate, endDate;

        startDate = from ? new Date(from.getFullYear(), from.getMonth(), from.getDate()) : new Date();
        endDate = to ? new Date(to.getFullYear(), to.getMonth(), to.getDate(), 23, 59, 59) : new Date();

        return {
          from: moment(startDate).format("YYYY-MM-DDTHH:mm:ssZZ"),
          to: moment(endDate).format("YYYY-MM-DDTHH:mm:ssZZ")
        };
      },
      reduceZeros: function (num) {
        num = Math.round(num);

        var str = ((num / 1000.0) + "");

        if (num != 0) {
          str = (str + (str.indexOf('.') < 0 ? '.' : '') + "000").replace(/(\..{3}).*$/, "$1");
          str = str.substring(0, str.length - Math.min(3, (num + "").length - 2)).replace(/[.]$/, "");

          str = str.split("").reverse().join("").replace(/((\d{3})(?!($|-|.*[.])))/g, '$1,').split("").reverse().join("");
        }
        return str;
      },
      generateRandomString: function (length) {
        length = length || 10;
        var text = "";
        var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        for (var i = 0; i < length; i++) {
          text += possible.charAt(Math.floor(Math.random() * possible.length));
        }
        return text;
      },
      generateSuccessMessage: function (msg) {
        return function () {
          tinypass.setMessage('success', msg);
        }
      },
      generateErrorMessage: function (msg) {
        return function () {
          tinypass.setMessage('error', msg);
          return $q.reject();
        }
      },
      showRequestError: function (resp) {
        tinypass.setMessage('error', resp.data.errors[0].msg);
        return $q.reject(resp)
      },
      showRequestErrorDashboard: function (resp) {
        tinypass.setMessageDashboard('error', resp.data.errors[0].msg);
        return $q.reject(resp)
      },
      // Converts decimal amount to cents. Eg. $1.99 -> 199
      getInMinorUnits: function (amount) {
        if (!amount) {
          return 0;
        }

        return Math.round(amount * 100);
      },
      getCurrencyByCode: function (currencyCode) {
        if (currencyCode == '') {
          return '$'
        }

        var currency;
        switch (currencyCode) {
          case 'USD':
            currency = '$';
            break;
          case 'EUR':
            currency = '€';
            break;
          case 'AUD':
            currency = '$';
            break;
          case 'GBP':
            currency = '£';
            break;
          case 'JPY':
            currency = '¥';
            break;
          default :
            currency = currencyCode;
            break;
        }
        return currency;
      },
      setCookie: _setCookie,
      getCookie: _getCookie,
      getTopDomain: _getTopDomain,
      getCookieSameSiteAndSecureAttrString: _getCookieSameSiteAndSecureAttrString,
    }
  }]);

  tinypassService.factory('LangUtils', [function () {
    return {
      getPersonalName: function (lang, firstName, lastName) {
        var locale = lang.getLang();
        var isGivenSurnameLang = !['zz_ZZ', 'ja_JP'].some(function (x) {
          return x === locale;
        });

        var personalName;
        if (isGivenSurnameLang) {
          personalName = [firstName, lastName].filter(function (x) {
            return !!x;
          }).join(' ');
        } else {
          personalName = [lastName, firstName].filter(function (x) {
            return !!x;
          }).join(' ');
        }

        return personalName;
      },
    }
  }]);

  tinypassService.factory('modalConfirm', ['$rootScope', '$modal',
    function ($rootScope, $modal) {
      return function (title, msg, res, clickFn) {
        var sc = $rootScope.$new();

        sc.title = title;
        sc.msg = msg;

        var modal = {
          scope: sc,
          templateUrl: '/libs/tinypass/_confirm_popup.shtml'
        };

        var modalInstance = $modal.open(modal);

        sc.onOk = function () {
          //If we pass a function it should return a promise
          //checking that a promise is resolved - close modal
          //if the promise is rejected - do not close modal
          if (clickFn && typeof clickFn === "function") {
            clickFn().then(closeModal);
          } else {
            closeModal(res);
          }
        };

        function closeModal(data) {
          modalInstance.close(data);
        }

        return modalInstance.result;
      }
    }]);

  tinypassService.factory('UpdatePerfectScrollbar', ['UpdateSpecificScrollbar', function (UpdateSpecificScrollbar) {
    return function (event) {
      //We always receive event.target even using in $controller
      if (event && event.target && event.target.nodeName) {
        var $targetElement = $(event.target);
        var targetElementParentHeight;

        var $psContainer;

        //We're assuming search was used and '<input>' inside <div class="dropdown-menu"></div>
        if (event.target.nodeName.toLowerCase() == 'input') {

          var $dropdownContainer = $targetElement.parents('.tp-dropdown__container');
          var $dropdownMenuContainer = $targetElement.parents('.dropdown-menu');

          var $currentContainer = $dropdownMenuContainer.length > 0 ? $dropdownMenuContainer : $dropdownContainer;

          var $containers = $currentContainer.find('.ps-container');
          $containers.each(function () {

            var $container = $(this);
            if ($container.is(':visible')) {
              $container.scrollTop(0)
            }
          });

          return;
        }

        targetElementParentHeight = $targetElement.parent().outerHeight(true);
        $psContainer = $targetElement.parents('.ps-container');

        UpdateSpecificScrollbar($psContainer, targetElementParentHeight);
      }
    };
  }]);

  tinypassService.factory('UpdateSpecificScrollbar', function () {
    return function ($psContainer, targetElementParentHeight) {
      var psContainerChildrenHeight = $psContainer.children().height();
      var psContainerVisibleAreaHeight = $psContainer.height();
      var psContainerScrollTop = $psContainer.scrollTop();

      if (((psContainerScrollTop + psContainerVisibleAreaHeight + targetElementParentHeight) >= psContainerChildrenHeight)
        && (psContainerChildrenHeight >= psContainerVisibleAreaHeight)) {
        $psContainer.scrollTop(psContainerScrollTop - targetElementParentHeight);
      }
    }
  });

  tinypassService.factory('iframeService', ['$rootElement', function ($rootElement) {
    return {
      injectHiddenIframe: injectHiddenIframe,
      injectHiddenIframeWithTimeout: injectHiddenIframeWithTimeout,
      injectIframe: injectIframe,
      injectRealIframe: injectRealIframe,
      injectHungTimeoutIframe: injectHungTimeoutIframe,
      appendContentToIframe: appendContentToIframe,
      getAncestorOrigins: getAncestorOrigins
    };

    function getAncestorOrigins() {
      var ancestorOrigins = document.location.ancestorOrigins;

      if (!ancestorOrigins) {
        var referrer = document.referrer;
        var splitRef = referrer.split('/');
        ancestorOrigins = { 0: splitRef[0] + '//' + splitRef[2], length: 1 };
      }

      return ancestorOrigins;
    }

    function injectHiddenIframe(id, url) {
      var src = url ? ' src="' + url + '" ' : '';

      angular.element("#" + id).remove();

      var iframeInit = angular.element('<iframe id="' + id + '"' + src + ' style="display: none"></iframe>');
      var iframe = iframeInit[0];
      $rootElement.append(iframe);

      return iframe;
    }

    function injectHiddenIframeWithTimeout(id, url, timeoutInterval, timeoutCallback) {
      var iframe = injectHiddenIframe(id, url);

      var killerTimeout = window.setTimeout(function () {
        angular.element("#" + id).remove();

        if (timeoutCallback) {
          timeoutCallback();
        }
      }, timeoutInterval || 15000);

      return {
        iframe: iframe,
        cancel: function () {
          window.clearTimeout(killerTimeout);
        }
      };
    }

    function injectIframe(id, url, $element) {
      var src = url ? ' src="' + url + '" ' : '';

      var iframeInit = angular.element('<iframe ' + src + '></iframe>');
      var cssSettings = {
        backgroundColor: "transparent",
        border: "0",
        width: '100%',
        height: '100%',
        position: 'relative',
        zIndex: 4
      };

      return appendIframe(iframeInit, id, $element, cssSettings);
    }

    function injectRealIframe(id, realIframe, $element, cssSettings) {
      var customCssSettings = {
        backgroundColor: "#ffffff",
        border: "0",
        width: '100%',
        height: '100%',
        position: 'relative',
        zIndex: 1
      };

      Object.assign(customCssSettings, cssSettings)

      return appendIframe(angular.element(realIframe), id, $element, customCssSettings);
    }

    function appendIframe(iframeInit, id, $element, cssSettings) {
      angular.element("#" + id).remove();

      iframeInit.attr({
        allowtransparency: "true",
        id: id
      }).css(cssSettings);
      var iframe = iframeInit[0];
      $element.append(iframe);

      return iframe;
    }

    function injectHungTimeoutIframe(id, replyURL) {
      return window.setTimeout(
        function () {
          var iframe = injectHiddenIframe(id);

          var iframeDocument = iframe.contentWindow ? iframe.contentWindow.document : iframe.contentDocument;
          iframeDocument.open("text/html", "replace");
          iframeDocument.write(
            '<html>' +
            '    <head>' +
            '        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">' +
            '        <script type="text/javascript">' +
            '            function submitform() {' +
            '                document.forms["page_return"].submit();' +
            '            }' +
            '        </script>' +
            '    </head>' +
            '    <body onload="submitform()">' +
            '        <form name="page_return" method="post" action="' + replyURL + '">' +
            '            <input type="hidden" name="resultCode" value="999">' +
            '            <input type="hidden" name="message" value="Request timeout">' +
            '        </form>' +
            '    </body>' +
            '</html>'
          );
          iframeDocument.close();
        },
        15000
      );
    }

    function appendContentToIframe(iframe, content) {
      var iframeDocument = iframe.contentWindow ? iframe.contentWindow.document : iframe.contentDocument;
      iframeDocument.open("text/html", "replace");
      iframeDocument.write(content);
      iframeDocument.close();
    }
  }]);

  var selectFactory = angular.module("selectFactory", ['ajaxServices']);
  selectFactory.factory('selectServiceFactory', ['tpHTTP', '$timeout', function (tpHTTP, $timeout) {
    return function (options) {
      var cache = {};

      var invalidateUpdate = !!options.invalidateUpdate;

      var service = {
        search: search
      };

      angular.extend(service, options);

      return service;

      function loadItems(query) {
        var params = service.buildParams(query);

        return tpHTTP.post(service.endpoint, params)
          .then(service.extractItems)
          .catch(function (rsp) {
          });
      }

      function loadAndCacheItems(query) {
        cache[query] = loadItems(query);
        service.instantUpdate = false;

        if (invalidateUpdate) {
          $timeout(function () {
            delete cache[query];
          }, 1000);
        }

        return cache[query];
      }

      function search(query) {
        var resultPromise = cache[query];

        if (!resultPromise || service.instantUpdate) {
          resultPromise = loadAndCacheItems(query);
        }

        return resultPromise;
      }
    };
  }]);
  selectFactory.factory('selectDirectiveFactory', ['$timeout', 'UpdatePerfectScrollbar', '$perfectScrollBarService',
    function ($timeout, UpdatePerfectScrollbar, $perfectScrollBarService) {
      return function (options) {
        return {
          restrict: 'AE',
          replace: true,
          transclude: true,
          scope: {
            ngModel: '=',
            item: '=',
            clickFn: '=?',
            searchFn: '=?',
            clickOnClose: '=?'
          },
          require: 'ngModel',
          templateUrl: options.templateUrl,
          link: link
        };

        function link($scope, element, attr, ngModelCtrl) {
          var searchWaiting;
          var invokedOnceFor = {};

          $scope.disabled = attr.ngDisabled == 'true';
          if ($scope.disabled) {
            return;
          }
          $scope.closeOnSelect = attr.closeOnSelect !== undefined;
          $scope.multiple = attr.multiple !== undefined;
          $scope.excludeSelected = attr.excludeSelected !== undefined;
          $scope.showCheckbox = $scope.multiple && !$scope.excludeSelected;

          $scope.model = {
            filter: '',
            list: [],
            selected: {}
          };

          $scope.onSearch = onSearch;
          $scope.searchItems = searchItems;
          $scope.updateScrollBar = updateScrollBar;
          $scope.cancelClick = cancelClick;
          $scope.closeDropdown = closeDropdown;
          $scope.setItem = setItem;
          $scope.modelContains = modelContains;
          $scope.setFocusAfterClick = setFocusAfterClick;
          $scope.onOpen = onOpen;
          $scope.selectAll = selectAll;

          onSearch();

          if ($scope.multiple) {
            $scope.$watch('ngModel', function () {
              updateSelectedInList();
            }, true);
          }

          function onOpen(subject) {
            if ($scope.clickFn) {
              $scope.clickFn(searchItems);
            }
            invokeOnce(subject);
          }

          function invokeOnce(subject) {
            if (subject && !invokedOnceFor[subject]) {
              invokedOnceFor[subject] = true;
              $perfectScrollBarService.notify('update-perfect-scrollbar');
            }
          }

          function onSearch($event) {

            if (searchWaiting) {
              $timeout.cancel(searchWaiting);
            }
            var secondsWaiting = (!$scope.model.filter) ? 0 : 300;

            searchWaiting = $timeout(function () {
              searchItems($event);
            }, secondsWaiting);
          }

          function selectAll() {
            if (!$scope.multiple) return;

            var selected = $scope.ngModel || [];
            var list = [];
            if (!selected.length) {
              list = angular.copy($scope.model.list);
            }
            $scope.ngModel = list;
            ngModelCtrl.$setViewValue($scope.ngModel);
          }

          function setItem(item, $event) {
            if (item.disabled !== undefined && item.disabled) {
              return;
            }

            if ($scope.multiple) {
              var list = angular.copy($scope.ngModel || []);
              var itemIndex = findItemIndex(item, list);
              if (itemIndex === null) {
                list.push(item);
              } else {
                list.splice(itemIndex, 1);
              }
              $scope.ngModel = list;
              ngModelCtrl.$setViewValue($scope.ngModel);
            } else {
              $scope.ngModel = item;
              ngModelCtrl.$setViewValue($scope.ngModel);
            }

            if ($scope.closeOnSelect) {
              $scope.closeDropdown();
              if ($scope.clickOnClose) {
                $scope.clickOnClose($scope.ngModel);
              }
            }
            updateScrollBar($event)
          }

          function modelContains(item) {
            var index = findItemIndex(item, $scope.ngModel || []);
            return index !== null;
          }

          function findItemIndex(item, list) {
            var length = list.length;
            for (var i = 0; i < length; i++) {
              if (list[i][options.idProperty] === item[options.idProperty]) return i;
            }
            return null;
          }

          function closeDropdown() {
            $('.dropdown.open', element).removeClass('open');
          }

          function cancelClick(event) {
            event.stopPropagation();
            event.preventDefault();
          }

          function updateScrollBar($event) {
            UpdatePerfectScrollbar($event);
          }

          function searchItems($event) {
            var searchFn = $scope.searchFn || options.searchService.search;
            if (!searchFn) return;

            searchFn($scope.model.filter).then(function (items) {
              items.forEach(function (item) {
                item.id = item[options.idProperty];
              });
              $scope.model.list = items;
              if ($event) {
                $scope.updateScrollBar($event);
              }
            });
          }

          function updateSelectedInList() {
            var selected = {};

            if (!$scope.multiple) {
              return;
            }

            if (!$scope.ngModel || !Array.isArray($scope.ngModel) || $scope.ngModel.length <= 0) {
              $scope.model.selected = null;
              return;
            }

            $scope.ngModel.forEach(function (item) {
              selected[item[options.idProperty]] = true;
            });

            $scope.model.selected = selected;
          }

          function setFocusAfterClick() {
            $('input:first', element).focus();
          }
        }
      };
    }]);

  var loggingModule = angular.module("loggingModule", ['ajaxServices']);
  loggingModule.factory('loggingService', function (tpHTTP) {

    var service = {};
    service.logToServer = function (errorMessage) {
      try {
        var error = new Error;
        tpHTTP.post(TPParam.LOG_ERROR, {
          description: errorMessage,
          url: window.location.href,
          trace: error.stack
        });
      } catch (e) {
      }
    };

    return service;
  });

  angular.module("paymentFormModule", [])
    .factory('loaderService', function () {
      return {
        showLoader: showLoader,
        hideLoader: hideLoader
      }

      function showLoader() {
        var loader = document.getElementById('pp-loader');
        if (loader) {
          loader.style.display = 'block';
        }
      }

      function hideLoader() {
        var loader = document.getElementById('pp-loader');
        if (loader) {
          loader.style.display = 'none';
        }
      }
    })
})();

function html5ModeConfig($locationProvider) {
  if (!(window.history && history.pushState)) {
    $locationProvider.html5Mode(false).hashPrefix('!');
  } else {
    $locationProvider.html5Mode(true);
  }
}

/**
 * The function html5ModeConfig is global and it was set as window's property.
 * But jest uses the jsdom testEnvironment and it wasn't happening,
 * so we set needed global variables/functions manually to use them in tests.
 */
window.html5ModeConfig = html5ModeConfig;

String.prototype.format = function () {
  var content = this;
  for (var i = 0; i < arguments.length; i++) {
    var replacement = '{' + i + '}';
    content = content.replace(replacement, arguments[i]);
  }
  return content;
};

String.prototype.capitalize = function() {
  return this.charAt(0).toUpperCase() + this.slice(1);
}

/**
 * angular-ui-utils - Swiss-Army-Knife of AngularJS tools (with no external dependencies!)
 * @version v0.0.4 - 2013-10-23
 * @link http://angular-ui.github.com
 * @license MIT License, http://www.opensource.org/licenses/MIT
 */
angular.module("ui.event",[]).directive("uiEvent",["$parse",function(a){return function(b,c,d){var e=b.$eval(d.uiEvent);angular.forEach(e,function(d,e){var f=a(d);c.bind(e,function(a){var c=Array.prototype.slice.call(arguments);c=c.splice(1),f(b,{$event:a,$params:c}),b.$$phase||b.$apply()})})}}]),angular.module("ui.format",[]).filter("format",function(){return function(a,b){var c=a;if(angular.isString(c)&&void 0!==b)if(angular.isArray(b)||angular.isObject(b)||(b=[b]),angular.isArray(b)){var d=b.length,e=function(a,c){return c=parseInt(c,10),c>=0&&d>c?b[c]:a};c=c.replace(/\$([0-9]+)/g,e)}else angular.forEach(b,function(a,b){c=c.split(":"+b).join(a)});return c}}),angular.module("ui.highlight",[]).filter("highlight",function(){return function(a,b,c){return b||angular.isNumber(b)?(a=a.toString(),b=b.toString(),c?a.split(b).join('<span class="ui-match">'+b+"</span>"):a.replace(new RegExp(b,"gi"),'<span class="ui-match">$&</span>')):a}}),angular.module("ui.include",[]).directive("uiInclude",["$http","$templateCache","$anchorScroll","$compile",function(a,b,c,d){return{restrict:"ECA",terminal:!0,compile:function(e,f){var g=f.uiInclude||f.src,h=f.fragment||"",i=f.onload||"",j=f.autoscroll;return function(e,f){function k(){var k=++m,o=e.$eval(g),p=e.$eval(h);o?a.get(o,{cache:b}).success(function(a){if(k===m){l&&l.$destroy(),l=e.$new();var b;b=p?angular.element("<div/>").html(a).find(p):angular.element("<div/>").html(a).contents(),f.html(b),d(b)(l),!angular.isDefined(j)||j&&!e.$eval(j)||c(),l.$emit("$includeContentLoaded"),e.$eval(i)}}).error(function(){k===m&&n()}):n()}var l,m=0,n=function(){l&&(l.$destroy(),l=null),f.html("")};e.$watch(h,k),e.$watch(g,k)}}}}]),angular.module("ui.indeterminate",[]).directive("uiIndeterminate",[function(){return{compile:function(a,b){return b.type&&"checkbox"===b.type.toLowerCase()?function(a,b,c){a.$watch(c.uiIndeterminate,function(a){b[0].indeterminate=!!a})}:angular.noop}}}]),angular.module("ui.inflector",[]).filter("inflector",function(){function a(a){return a.replace(/^([a-z])|\s+([a-z])/g,function(a){return a.toUpperCase()})}function b(a,b){return a.replace(/[A-Z]/g,function(a){return b+a})}var c={humanize:function(c){return a(b(c," ").split("_").join(" "))},underscore:function(a){return a.substr(0,1).toLowerCase()+b(a.substr(1),"_").toLowerCase().split(" ").join("_")},variable:function(b){return b=b.substr(0,1).toLowerCase()+a(b.split("_").join(" ")).substr(1).split(" ").join("")}};return function(a,b){return b!==!1&&angular.isString(a)?(b=b||"humanize",c[b](a)):a}}),angular.module("ui.jq",[]).value("uiJqConfig",{}).directive("uiJq",["uiJqConfig","$timeout",function(a,b){return{restrict:"A",compile:function(c,d){if(!angular.isFunction(c[d.uiJq]))throw new Error('ui-jq: The "'+d.uiJq+'" function does not exist');var e=a&&a[d.uiJq];return function(a,c,d){function f(){b(function(){c[d.uiJq].apply(c,g)},0,!1)}var g=[];d.uiOptions?(g=a.$eval("["+d.uiOptions+"]"),angular.isObject(e)&&angular.isObject(g[0])&&(g[0]=angular.extend({},e,g[0]))):e&&(g=[e]),d.ngModel&&c.is("select,input,textarea")&&c.bind("change",function(){c.trigger("input")}),d.uiRefresh&&a.$watch(d.uiRefresh,function(){f()}),f()}}}}]),angular.module("ui.keypress",[]).factory("keypressHelper",["$parse",function(a){var b={8:"backspace",9:"tab",13:"enter",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"delete"},c=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};return function(d,e,f,g){var h,i=[];h=e.$eval(g["ui"+c(d)]),angular.forEach(h,function(b,c){var d,e;e=a(b),angular.forEach(c.split(" "),function(a){d={expression:e,keys:{}},angular.forEach(a.split("-"),function(a){d.keys[a]=!0}),i.push(d)})}),f.bind(d,function(a){var c=!(!a.metaKey||a.ctrlKey),f=!!a.altKey,g=!!a.ctrlKey,h=!!a.shiftKey,j=a.keyCode;"keypress"===d&&!h&&j>=97&&122>=j&&(j-=32),angular.forEach(i,function(d){var i=d.keys[b[j]]||d.keys[j.toString()],k=!!d.keys.meta,l=!!d.keys.alt,m=!!d.keys.ctrl,n=!!d.keys.shift;i&&k===c&&l===f&&m===g&&n===h&&e.$apply(function(){d.expression(e,{$event:a})})})})}}]),angular.module("ui.keypress").directive("uiKeydown",["keypressHelper",function(a){return{link:function(b,c,d){a("keydown",b,c,d)}}}]),angular.module("ui.keypress").directive("uiKeypress",["keypressHelper",function(a){return{link:function(b,c,d){a("keypress",b,c,d)}}}]),angular.module("ui.keypress").directive("uiKeyup",["keypressHelper",function(a){return{link:function(b,c,d){a("keyup",b,c,d)}}}]),angular.module("ui.mask",[]).value("uiMaskConfig",{maskDefinitions:{9:/\d/,A:/[a-zA-Z]/,"*":/[a-zA-Z0-9]/}}).directive("uiMask",["uiMaskConfig",function(a){return{priority:100,require:"ngModel",restrict:"A",compile:function(){var b=a;return function(a,c,d,e){function f(a){return angular.isDefined(a)?(s(a),N?(k(),l(),!0):j()):j()}function g(a){angular.isDefined(a)&&(D=a,N&&w())}function h(a){return N?(G=o(a||""),I=n(G),e.$setValidity("mask",I),I&&G.length?p(G):void 0):a}function i(a){return N?(G=o(a||""),I=n(G),e.$viewValue=G.length?p(G):"",e.$setValidity("mask",I),""===G&&void 0!==e.$error.required&&e.$setValidity("required",!1),I?G:void 0):a}function j(){return N=!1,m(),angular.isDefined(P)?c.attr("placeholder",P):c.removeAttr("placeholder"),angular.isDefined(Q)?c.attr("maxlength",Q):c.removeAttr("maxlength"),c.val(e.$modelValue),e.$viewValue=e.$modelValue,!1}function k(){G=K=o(e.$modelValue||""),H=J=p(G),I=n(G);var a=I&&G.length?H:"";d.maxlength&&c.attr("maxlength",2*B[B.length-1]),c.attr("placeholder",D),c.val(a),e.$viewValue=a}function l(){O||(c.bind("blur",t),c.bind("mousedown mouseup",u),c.bind("input keyup click focus",w),O=!0)}function m(){O&&(c.unbind("blur",t),c.unbind("mousedown",u),c.unbind("mouseup",u),c.unbind("input",w),c.unbind("keyup",w),c.unbind("click",w),c.unbind("focus",w),O=!1)}function n(a){return a.length?a.length>=F:!0}function o(a){var b="",c=C.slice();return a=a.toString(),angular.forEach(E,function(b){a=a.replace(b,"")}),angular.forEach(a.split(""),function(a){c.length&&c[0].test(a)&&(b+=a,c.shift())}),b}function p(a){var b="",c=B.slice();return angular.forEach(D.split(""),function(d,e){a.length&&e===c[0]?(b+=a.charAt(0)||"_",a=a.substr(1),c.shift()):b+=d}),b}function q(a){var b=d.placeholder;return"undefined"!=typeof b&&b[a]?b[a]:"_"}function r(){return D.replace(/[_]+/g,"_").replace(/([^_]+)([a-zA-Z0-9])([^_])/g,"$1$2_$3").split("_")}function s(a){var b=0;if(B=[],C=[],D="","string"==typeof a){F=0;var c=!1,d=a.split("");angular.forEach(d,function(a,d){R.maskDefinitions[a]?(B.push(b),D+=q(d),C.push(R.maskDefinitions[a]),b++,c||F++):"?"===a?c=!0:(D+=a,b++)})}B.push(B.slice().pop()+1),E=r(),N=B.length>1?!0:!1}function t(){L=0,M=0,I&&0!==G.length||(H="",c.val(""),a.$apply(function(){e.$setViewValue("")}))}function u(a){"mousedown"===a.type?c.bind("mouseout",v):c.unbind("mouseout",v)}function v(){M=A(this),c.unbind("mouseout",v)}function w(b){b=b||{};var d=b.which,f=b.type;if(16!==d&&91!==d){var g,h=c.val(),i=J,j=o(h),k=K,l=!1,m=y(this)||0,n=L||0,q=m-n,r=B[0],s=B[j.length]||B.slice().shift(),t=M||0,u=A(this)>0,v=t>0,w=h.length>i.length||t&&h.length>i.length-t,C=h.length<i.length||t&&h.length===i.length-t,D=d>=37&&40>=d&&b.shiftKey,E=37===d,F=8===d||"keyup"!==f&&C&&-1===q,G=46===d||"keyup"!==f&&C&&0===q&&!v,H=(E||F||"click"===f)&&m>r;if(M=A(this),!D&&(!u||"click"!==f&&"keyup"!==f)){if("input"===f&&C&&!v&&j===k){for(;F&&m>r&&!x(m);)m--;for(;G&&s>m&&-1===B.indexOf(m);)m++;var I=B.indexOf(m);j=j.substring(0,I)+j.substring(I+1),l=!0}for(g=p(j),J=g,K=j,c.val(g),l&&a.$apply(function(){e.$setViewValue(j)}),w&&r>=m&&(m=r+1),H&&m--,m=m>s?s:r>m?r:m;!x(m)&&m>r&&s>m;)m+=H?-1:1;(H&&s>m||w&&!x(n))&&m++,L=m,z(this,m)}}}function x(a){return B.indexOf(a)>-1}function y(a){if(void 0!==a.selectionStart)return a.selectionStart;if(document.selection){a.focus();var b=document.selection.createRange();return b.moveStart("character",-a.value.length),b.text.length}return 0}function z(a,b){if(0!==a.offsetWidth&&0!==a.offsetHeight)if(a.setSelectionRange)a.focus(),a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}}function A(a){return void 0!==a.selectionStart?a.selectionEnd-a.selectionStart:document.selection?document.selection.createRange().text.length:0}var B,C,D,E,F,G,H,I,J,K,L,M,N=!1,O=!1,P=d.placeholder,Q=d.maxlength,R={};d.uiOptions?(R=a.$eval("["+d.uiOptions+"]"),angular.isObject(R[0])&&(R=function(a,b){for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]?angular.extend(b[c],a[c]):b[c]=angular.copy(a[c]));return b}(b,R[0]))):R=b,d.$observe("uiMask",f),d.$observe("placeholder",g),e.$formatters.push(h),e.$parsers.push(i),c.bind("mousedown mouseup",u),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){"use strict";if(null===this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=0;if(arguments.length>1&&(d=Number(arguments[1]),d!==d?d=0:0!==d&&1/0!==d&&d!==-1/0&&(d=(d>0||-1)*Math.floor(Math.abs(d)))),d>=c)return-1;for(var e=d>=0?d:Math.max(c-Math.abs(d),0);c>e;e++)if(e in b&&b[e]===a)return e;return-1})}}}}]),angular.module("ui.reset",[]).value("uiResetConfig",null).directive("uiReset",["uiResetConfig",function(a){var b=null;return void 0!==a&&(b=a),{require:"ngModel",link:function(a,c,d,e){var f;f=angular.element('<a class="ui-reset" />'),c.wrap('<span class="ui-resetwrap" />').after(f),f.bind("click",function(c){c.preventDefault(),a.$apply(function(){d.uiReset?e.$setViewValue(a.$eval(d.uiReset)):e.$setViewValue(b),e.$render()})})}}}]),angular.module("ui.route",[]).directive("uiRoute",["$location","$parse",function(a,b){return{restrict:"AC",scope:!0,compile:function(c,d){var e;if(d.uiRoute)e="uiRoute";else if(d.ngHref)e="ngHref";else{if(!d.href)throw new Error("uiRoute missing a route or href property on "+c[0]);e="href"}return function(c,d,f){function g(b){var d=b.indexOf("#");d>-1&&(b=b.substr(d+1)),j=function(){i(c,a.path().indexOf(b)>-1)},j()}function h(b){var d=b.indexOf("#");d>-1&&(b=b.substr(d+1)),j=function(){var d=new RegExp("^"+b+"$",["i"]);i(c,d.test(a.path()))},j()}var i=b(f.ngModel||f.routeModel||"$uiRoute").assign,j=angular.noop;switch(e){case"uiRoute":f.uiRoute?h(f.uiRoute):f.$observe("uiRoute",h);break;case"ngHref":f.ngHref?g(f.ngHref):f.$observe("ngHref",g);break;case"href":g(f.href)}c.$on("$routeChangeSuccess",function(){j()}),c.$on("$stateChangeSuccess",function(){j()})}}}}]),angular.module("ui.scrollfix",[]).directive("uiScrollfix",["$window",function(a){"use strict";return{require:"^?uiScrollfixTarget",link:function(b,c,d,e){function f(){var b;if(angular.isDefined(a.pageYOffset))b=a.pageYOffset;else{var e=document.compatMode&&"BackCompat"!==document.compatMode?document.documentElement:document.body;b=e.scrollTop}!c.hasClass("ui-scrollfix")&&b>d.uiScrollfix?c.addClass("ui-scrollfix"):c.hasClass("ui-scrollfix")&&b<d.uiScrollfix&&c.removeClass("ui-scrollfix")}var g=c[0].offsetTop,h=e&&e.$element||angular.element(a);d.uiScrollfix?"string"==typeof d.uiScrollfix&&("-"===d.uiScrollfix.charAt(0)?d.uiScrollfix=g-parseFloat(d.uiScrollfix.substr(1)):"+"===d.uiScrollfix.charAt(0)&&(d.uiScrollfix=g+parseFloat(d.uiScrollfix.substr(1)))):d.uiScrollfix=g,h.on("scroll",f),b.$on("$destroy",function(){h.off("scroll",f)})}}}]).directive("uiScrollfixTarget",[function(){"use strict";return{controller:function(a){this.$element=a}}}]),angular.module("ui.showhide",[]).directive("uiShow",[function(){return function(a,b,c){a.$watch(c.uiShow,function(a){a?b.addClass("ui-show"):b.removeClass("ui-show")})}}]).directive("uiHide",[function(){return function(a,b,c){a.$watch(c.uiHide,function(a){a?b.addClass("ui-hide"):b.removeClass("ui-hide")})}}]).directive("uiToggle",[function(){return function(a,b,c){a.$watch(c.uiToggle,function(a){a?b.removeClass("ui-hide").addClass("ui-show"):b.removeClass("ui-show").addClass("ui-hide")})}}]),angular.module("ui.unique",[]).filter("unique",["$parse",function(a){return function(b,c){if(c===!1)return b;if((c||angular.isUndefined(c))&&angular.isArray(b)){var d=[],e=angular.isString(c)?a(c):function(a){return a},f=function(a){return angular.isObject(a)?e(a):a};angular.forEach(b,function(a){for(var b=!1,c=0;c<d.length;c++)if(angular.equals(f(d[c]),f(a))){b=!0;break}b||d.push(a)}),b=d}return b}}]),angular.module("ui.validate",[]).directive("uiValidate",function(){return{restrict:"A",require:"ngModel",link:function(a,b,c,d){function e(b){return angular.isString(b)?(a.$watch(b,function(){angular.forEach(g,function(a){a(d.$modelValue)})}),void 0):angular.isArray(b)?(angular.forEach(b,function(b){a.$watch(b,function(){angular.forEach(g,function(a){a(d.$modelValue)})})}),void 0):(angular.isObject(b)&&angular.forEach(b,function(b,c){angular.isString(b)&&a.$watch(b,function(){g[c](d.$modelValue)}),angular.isArray(b)&&angular.forEach(b,function(b){a.$watch(b,function(){g[c](d.$modelValue)})})}),void 0)}var f,g={},h=a.$eval(c.uiValidate);h&&(angular.isString(h)&&(h={validator:h}),angular.forEach(h,function(b,c){f=function(e){var f=a.$eval(b,{$value:e});return angular.isObject(f)&&angular.isFunction(f.then)?(f.then(function(){d.$setValidity(c,!0)},function(){d.$setValidity(c,!1)}),e):f?(d.$setValidity(c,!0),e):(d.$setValidity(c,!1),void 0)},g[c]=f,d.$formatters.push(f),d.$parsers.push(f)}),c.uiValidateWatch&&e(a.$eval(c.uiValidateWatch)))}}}),angular.module("ui.utils",["ui.event","ui.format","ui.highlight","ui.include","ui.indeterminate","ui.inflector","ui.jq","ui.keypress","ui.mask","ui.reset","ui.route","ui.scrollfix","ui.showhide","ui.unique","ui.validate"]);
/**
 * angular-ui-utils - Swiss-Army-Knife of AngularJS tools (with no external dependencies!)
 * @version v0.0.4 - 2013-10-23
 * @link http://angular-ui.github.com
 * @license MIT License, http://www.opensource.org/licenses/MIT
 */
!function(a,b){var c=(a.ieShivDebug||!1,["ngInclude","ngPluralize","ngView","ngSwitch","uiCurrency","uiCodemirror","uiDate","uiEvent","uiKeypress","uiKeyup","uiKeydown","uiMask","uiMapInfoWindow","uiMapMarker","uiMapPolyline","uiMapPolygon","uiMapRectangle","uiMapCircle","uiMapGroundOverlay","uiModal","uiReset","uiScrollfix","uiSelect2","uiShow","uiHide","uiToggle","uiSortable","uiTinymce"]);a.myCustomTags=a.myCustomTags||[],c.push.apply(c,a.myCustomTags);for(var d=function(a){var b=[],c=a.replace(/([A-Z])/g,function(a){return" "+a.toLowerCase()}),d=c.split(" ");if(1===d.length){var e=d[0];b.push(e),b.push("x-"+e),b.push("data-"+e)}else{var f=d[0],g=d.slice(1).join("-");b.push(f+":"+g),b.push(f+"-"+g),b.push("x-"+f+"-"+g),b.push("data-"+f+"-"+g)}return b},e=0,f=c.length;f>e;e++)for(var g=d(c[e]),h=0,i=g.length;i>h;h++){var j=g[h];b.createElement(j)}}(window,document);
/**
 * State-based routing for AngularJS
 * @version v0.2.10
 * @link http://angular-ui.github.com/
 * @license MIT License, http://www.opensource.org/licenses/MIT
 */
"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.router"),function(a,b,c){"use strict";function d(a,b){return I(new(I(function(){},{prototype:a})),b)}function e(a){return H(arguments,function(b){b!==a&&H(b,function(b,c){a.hasOwnProperty(c)||(a[c]=b)})}),a}function f(a,b){var c=[];for(var d in a.path){if(a.path[d]!==b.path[d])break;c.push(a.path[d])}return c}function g(a,b){if(Array.prototype.indexOf)return a.indexOf(b,Number(arguments[2])||0);var c=a.length>>>0,d=Number(arguments[2])||0;for(d=0>d?Math.ceil(d):Math.floor(d),0>d&&(d+=c);c>d;d++)if(d in a&&a[d]===b)return d;return-1}function h(a,b,c,d){var e,h=f(c,d),i={},j=[];for(var k in h)if(h[k].params&&h[k].params.length){e=h[k].params;for(var l in e)g(j,e[l])>=0||(j.push(e[l]),i[e[l]]=a[e[l]])}return I({},i,b)}function i(a,b){var c={};return H(a,function(a){var d=b[a];c[a]=null!=d?String(d):null}),c}function j(a,b,c){if(!c){c=[];for(var d in a)c.push(d)}for(var e=0;e<c.length;e++){var f=c[e];if(a[f]!=b[f])return!1}return!0}function k(a,b){var c={};return H(a,function(a){c[a]=b[a]}),c}function l(a,b){var d=1,f=2,g={},h=[],i=g,j=I(a.when(g),{$$promises:g,$$values:g});this.study=function(g){function k(a,c){if(o[c]!==f){if(n.push(c),o[c]===d)throw n.splice(0,n.indexOf(c)),new Error("Cyclic dependency: "+n.join(" -> "));if(o[c]=d,E(a))m.push(c,[function(){return b.get(a)}],h);else{var e=b.annotate(a);H(e,function(a){a!==c&&g.hasOwnProperty(a)&&k(g[a],a)}),m.push(c,a,e)}n.pop(),o[c]=f}}function l(a){return F(a)&&a.then&&a.$$promises}if(!F(g))throw new Error("'invocables' must be an object");var m=[],n=[],o={};return H(g,k),g=n=o=null,function(d,f,g){function h(){--s||(t||e(r,f.$$values),p.$$values=r,p.$$promises=!0,o.resolve(r))}function k(a){p.$$failure=a,o.reject(a)}function n(c,e,f){function i(a){l.reject(a),k(a)}function j(){if(!C(p.$$failure))try{l.resolve(b.invoke(e,g,r)),l.promise.then(function(a){r[c]=a,h()},i)}catch(a){i(a)}}var l=a.defer(),m=0;H(f,function(a){q.hasOwnProperty(a)&&!d.hasOwnProperty(a)&&(m++,q[a].then(function(b){r[a]=b,--m||j()},i))}),m||j(),q[c]=l.promise}if(l(d)&&g===c&&(g=f,f=d,d=null),d){if(!F(d))throw new Error("'locals' must be an object")}else d=i;if(f){if(!l(f))throw new Error("'parent' must be a promise returned by $resolve.resolve()")}else f=j;var o=a.defer(),p=o.promise,q=p.$$promises={},r=I({},d),s=1+m.length/3,t=!1;if(C(f.$$failure))return k(f.$$failure),p;f.$$values?(t=e(r,f.$$values),h()):(I(q,f.$$promises),f.then(h,k));for(var u=0,v=m.length;v>u;u+=3)d.hasOwnProperty(m[u])?h():n(m[u],m[u+1],m[u+2]);return p}},this.resolve=function(a,b,c,d){return this.study(a)(b,c,d)}}function m(a,b,c){this.fromConfig=function(a,b,c){return C(a.template)?this.fromString(a.template,b):C(a.templateUrl)?this.fromUrl(a.templateUrl,b):C(a.templateProvider)?this.fromProvider(a.templateProvider,b,c):null},this.fromString=function(a,b){return D(a)?a(b):a},this.fromUrl=function(c,d){return D(c)&&(c=c(d)),null==c?null:a.get(c,{cache:b}).then(function(a){return a.data})},this.fromProvider=function(a,b,d){return c.invoke(a,null,d||{params:b})}}function n(a){function b(b){if(!/^\w+(-+\w+)*$/.test(b))throw new Error("Invalid parameter name '"+b+"' in pattern '"+a+"'");if(f[b])throw new Error("Duplicate parameter name '"+b+"' in pattern '"+a+"'");f[b]=!0,j.push(b)}function c(a){return a.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&")}var d,e=/([:*])(\w+)|\{(\w+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,f={},g="^",h=0,i=this.segments=[],j=this.params=[];this.source=a;for(var k,l,m;(d=e.exec(a))&&(k=d[2]||d[3],l=d[4]||("*"==d[1]?".*":"[^/]*"),m=a.substring(h,d.index),!(m.indexOf("?")>=0));)g+=c(m)+"("+l+")",b(k),i.push(m),h=e.lastIndex;m=a.substring(h);var n=m.indexOf("?");if(n>=0){var o=this.sourceSearch=m.substring(n);m=m.substring(0,n),this.sourcePath=a.substring(0,h+n),H(o.substring(1).split(/[&?]/),b)}else this.sourcePath=a,this.sourceSearch="";g+=c(m)+"$",i.push(m),this.regexp=new RegExp(g),this.prefix=i[0]}function o(){this.compile=function(a){return new n(a)},this.isMatcher=function(a){return F(a)&&D(a.exec)&&D(a.format)&&D(a.concat)},this.$get=function(){return this}}function p(a){function b(a){var b=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(a.source);return null!=b?b[1].replace(/\\(.)/g,"$1"):""}function c(a,b){return a.replace(/\$(\$|\d{1,2})/,function(a,c){return b["$"===c?0:Number(c)]})}function d(a,b,c){if(!c)return!1;var d=a.invoke(b,b,{$match:c});return C(d)?d:!0}var e=[],f=null;this.rule=function(a){if(!D(a))throw new Error("'rule' must be a function");return e.push(a),this},this.otherwise=function(a){if(E(a)){var b=a;a=function(){return b}}else if(!D(a))throw new Error("'rule' must be a function");return f=a,this},this.when=function(e,f){var g,h=E(f);if(E(e)&&(e=a.compile(e)),!h&&!D(f)&&!G(f))throw new Error("invalid 'handler' in when()");var i={matcher:function(b,c){return h&&(g=a.compile(c),c=["$match",function(a){return g.format(a)}]),I(function(a,e){return d(a,c,b.exec(e.path(),e.search()))},{prefix:E(b.prefix)?b.prefix:""})},regex:function(a,e){if(a.global||a.sticky)throw new Error("when() RegExp must not be global or sticky");return h&&(g=e,e=["$match",function(a){return c(g,a)}]),I(function(b,c){return d(b,e,a.exec(c.path()))},{prefix:b(a)})}},j={matcher:a.isMatcher(e),regex:e instanceof RegExp};for(var k in j)if(j[k])return this.rule(i[k](e,f));throw new Error("invalid 'what' in when()")},this.$get=["$location","$rootScope","$injector",function(a,b,c){function d(b){function d(b){var d=b(c,a);return d?(E(d)&&a.replace().url(d),!0):!1}if(!b||!b.defaultPrevented){var g,h=e.length;for(g=0;h>g;g++)if(d(e[g]))return;f&&d(f)}}return b.$on("$locationChangeSuccess",d),{sync:function(){d()}}}]}function q(a,e,f){function g(a){return 0===a.indexOf(".")||0===a.indexOf("^")}function l(a,b){var d=E(a),e=d?a:a.name,f=g(e);if(f){if(!b)throw new Error("No reference point given for path '"+e+"'");for(var h=e.split("."),i=0,j=h.length,k=b;j>i;i++)if(""!==h[i]||0!==i){if("^"!==h[i])break;if(!k.parent)throw new Error("Path '"+e+"' not valid for state '"+b.name+"'");k=k.parent}else k=b;h=h.slice(i).join("."),e=k.name+(k.name&&h?".":"")+h}var l=w[e];return!l||!d&&(d||l!==a&&l.self!==a)?c:l}function m(a,b){x[a]||(x[a]=[]),x[a].push(b)}function n(b){b=d(b,{self:b,resolve:b.resolve||{},toString:function(){return this.name}});var c=b.name;if(!E(c)||c.indexOf("@")>=0)throw new Error("State must have a valid name");if(w.hasOwnProperty(c))throw new Error("State '"+c+"'' is already defined");var e=-1!==c.indexOf(".")?c.substring(0,c.lastIndexOf(".")):E(b.parent)?b.parent:"";if(e&&!w[e])return m(e,b.self);for(var f in z)D(z[f])&&(b[f]=z[f](b,z.$delegates[f]));if(w[c]=b,!b[y]&&b.url&&a.when(b.url,["$match","$stateParams",function(a,c){v.$current.navigable==b&&j(a,c)||v.transitionTo(b,a,{location:!1})}]),x[c])for(var g=0;g<x[c].length;g++)n(x[c][g]);return b}function o(a){return a.indexOf("*")>-1}function p(a){var b=a.split("."),c=v.$current.name.split(".");if("**"===b[0]&&(c=c.slice(c.indexOf(b[1])),c.unshift("**")),"**"===b[b.length-1]&&(c.splice(c.indexOf(b[b.length-2])+1,Number.MAX_VALUE),c.push("**")),b.length!=c.length)return!1;for(var d=0,e=b.length;e>d;d++)"*"===b[d]&&(c[d]="*");return c.join("")===b.join("")}function q(a,b){return E(a)&&!C(b)?z[a]:D(b)&&E(a)?(z[a]&&!z.$delegates[a]&&(z.$delegates[a]=z[a]),z[a]=b,this):this}function r(a,b){return F(a)?b=a:b.name=a,n(b),this}function s(a,e,g,m,n,q,r,s,x){function z(){r.url()!==M&&(r.url(M),r.replace())}function A(a,c,d,f,h){var i=d?c:k(a.params,c),j={$stateParams:i};h.resolve=n.resolve(a.resolve,j,h.resolve,a);var l=[h.resolve.then(function(a){h.globals=a})];return f&&l.push(f),H(a.views,function(c,d){var e=c.resolve&&c.resolve!==a.resolve?c.resolve:{};e.$template=[function(){return g.load(d,{view:c,locals:j,params:i,notify:!1})||""}],l.push(n.resolve(e,j,h.resolve,a).then(function(f){if(D(c.controllerProvider)||G(c.controllerProvider)){var g=b.extend({},e,j);f.$$controller=m.invoke(c.controllerProvider,null,g)}else f.$$controller=c.controller;f.$$state=a,f.$$controllerAs=c.controllerAs,h[d]=f}))}),e.all(l).then(function(){return h})}var B=e.reject(new Error("transition superseded")),F=e.reject(new Error("transition prevented")),K=e.reject(new Error("transition aborted")),L=e.reject(new Error("transition failed")),M=r.url(),N=x.baseHref();return u.locals={resolve:null,globals:{$stateParams:{}}},v={params:{},current:u.self,$current:u,transition:null},v.reload=function(){v.transitionTo(v.current,q,{reload:!0,inherit:!1,notify:!1})},v.go=function(a,b,c){return this.transitionTo(a,b,I({inherit:!0,relative:v.$current},c))},v.transitionTo=function(b,c,f){c=c||{},f=I({location:!0,inherit:!1,relative:null,notify:!0,reload:!1,$retry:!1},f||{});var g,k=v.$current,n=v.params,o=k.path,p=l(b,f.relative);if(!C(p)){var s={to:b,toParams:c,options:f};if(g=a.$broadcast("$stateNotFound",s,k.self,n),g.defaultPrevented)return z(),K;if(g.retry){if(f.$retry)return z(),L;var w=v.transition=e.when(g.retry);return w.then(function(){return w!==v.transition?B:(s.options.$retry=!0,v.transitionTo(s.to,s.toParams,s.options))},function(){return K}),z(),w}if(b=s.to,c=s.toParams,f=s.options,p=l(b,f.relative),!C(p)){if(f.relative)throw new Error("Could not resolve '"+b+"' from state '"+f.relative+"'");throw new Error("No such state '"+b+"'")}}if(p[y])throw new Error("Cannot transition to abstract state '"+b+"'");f.inherit&&(c=h(q,c||{},v.$current,p)),b=p;var x,D,E=b.path,G=u.locals,H=[];for(x=0,D=E[x];D&&D===o[x]&&j(c,n,D.ownParams)&&!f.reload;x++,D=E[x])G=H[x]=D.locals;if(t(b,k,G,f))return b.self.reloadOnSearch!==!1&&z(),v.transition=null,e.when(v.current);if(c=i(b.params,c||{}),f.notify&&(g=a.$broadcast("$stateChangeStart",b.self,c,k.self,n),g.defaultPrevented))return z(),F;for(var N=e.when(G),O=x;O<E.length;O++,D=E[O])G=H[O]=d(G),N=A(D,c,D===b,N,G);var P=v.transition=N.then(function(){var d,e,g;if(v.transition!==P)return B;for(d=o.length-1;d>=x;d--)g=o[d],g.self.onExit&&m.invoke(g.self.onExit,g.self,g.locals.globals),g.locals=null;for(d=x;d<E.length;d++)e=E[d],e.locals=H[d],e.self.onEnter&&m.invoke(e.self.onEnter,e.self,e.locals.globals);if(v.transition!==P)return B;v.$current=b,v.current=b.self,v.params=c,J(v.params,q),v.transition=null;var h=b.navigable;return f.location&&h&&(r.url(h.url.format(h.locals.globals.$stateParams)),"replace"===f.location&&r.replace()),f.notify&&a.$broadcast("$stateChangeSuccess",b.self,c,k.self,n),M=r.url(),v.current},function(d){return v.transition!==P?B:(v.transition=null,a.$broadcast("$stateChangeError",b.self,c,k.self,n,d),z(),e.reject(d))});return P},v.is=function(a,d){var e=l(a);return C(e)?v.$current!==e?!1:C(d)&&null!==d?b.equals(q,d):!0:c},v.includes=function(a,d){if(E(a)&&o(a)){if(!p(a))return!1;a=v.$current.name}var e=l(a);if(!C(e))return c;if(!C(v.$current.includes[e.name]))return!1;var f=!0;return b.forEach(d,function(a,b){C(q[b])&&q[b]===a||(f=!1)}),f},v.href=function(a,b,c){c=I({lossy:!0,inherit:!1,absolute:!1,relative:v.$current},c||{});var d=l(a,c.relative);if(!C(d))return null;b=h(q,b||{},v.$current,d);var e=d&&c.lossy?d.navigable:d,g=e&&e.url?e.url.format(i(d.params,b||{})):null;return!f.html5Mode()&&g&&(g="#"+f.hashPrefix()+g),"/"!==N&&(f.html5Mode()?g=N.slice(0,-1)+g:c.absolute&&(g=N.slice(1)+g)),c.absolute&&g&&(g=r.protocol()+"://"+r.host()+(80==r.port()||443==r.port()?"":":"+r.port())+(!f.html5Mode()&&g?"/":"")+g),g},v.get=function(a,b){if(!C(a)){var c=[];return H(w,function(a){c.push(a.self)}),c}var d=l(a,b);return d&&d.self?d.self:null},v}function t(a,b,c,d){return a!==b||(c!==b.locals||d.reload)&&a.self.reloadOnSearch!==!1?void 0:!0}var u,v,w={},x={},y="abstract",z={parent:function(a){if(C(a.parent)&&a.parent)return l(a.parent);var b=/^(.+)\.[^.]+$/.exec(a.name);return b?l(b[1]):u},data:function(a){return a.parent&&a.parent.data&&(a.data=a.self.data=I({},a.parent.data,a.data)),a.data},url:function(a){var b=a.url;if(E(b))return"^"==b.charAt(0)?e.compile(b.substring(1)):(a.parent.navigable||u).url.concat(b);if(e.isMatcher(b)||null==b)return b;throw new Error("Invalid url '"+b+"' in state '"+a+"'")},navigable:function(a){return a.url?a:a.parent?a.parent.navigable:null},params:function(a){if(!a.params)return a.url?a.url.parameters():a.parent.params;if(!G(a.params))throw new Error("Invalid params in state '"+a+"'");if(a.url)throw new Error("Both params and url specicified in state '"+a+"'");return a.params},views:function(a){var b={};return H(C(a.views)?a.views:{"":a},function(c,d){d.indexOf("@")<0&&(d+="@"+a.parent.name),b[d]=c}),b},ownParams:function(a){if(!a.parent)return a.params;var b={};H(a.params,function(a){b[a]=!0}),H(a.parent.params,function(c){if(!b[c])throw new Error("Missing required parameter '"+c+"' in state '"+a.name+"'");b[c]=!1});var c=[];return H(b,function(a,b){a&&c.push(b)}),c},path:function(a){return a.parent?a.parent.path.concat(a):[]},includes:function(a){var b=a.parent?I({},a.parent.includes):{};return b[a.name]=!0,b},$delegates:{}};u=n({name:"",url:"^",views:null,"abstract":!0}),u.navigable=null,this.decorator=q,this.state=r,this.$get=s,s.$inject=["$rootScope","$q","$view","$injector","$resolve","$stateParams","$location","$urlRouter","$browser"]}function r(){function a(a,b){return{load:function(c,d){var e,f={template:null,controller:null,view:null,locals:null,notify:!0,async:!0,params:{}};return d=I(f,d),d.view&&(e=b.fromConfig(d.view,d.params,d.locals)),e&&d.notify&&a.$broadcast("$viewContentLoading",d),e}}}this.$get=a,a.$inject=["$rootScope","$templateFactory"]}function s(){var a=!1;this.useAnchorScroll=function(){a=!0},this.$get=["$anchorScroll","$timeout",function(b,c){return a?b:function(a){c(function(){a[0].scrollIntoView()},0,!1)}}]}function t(a,c,d){function e(){return c.has?function(a){return c.has(a)?c.get(a):null}:function(a){try{return c.get(a)}catch(b){return null}}}function f(a,b){var c=function(){return{enter:function(a,b,c){b.after(a),c()},leave:function(a,b){a.remove(),b()}}};if(i)return{enter:function(a,b,c){i.enter(a,null,b,c)},leave:function(a,b){i.leave(a,b)}};if(h){var d=h&&h(b,a);return{enter:function(a,b,c){d.enter(a,null,b),c()},leave:function(a,b){d.leave(a),b()}}}return c()}var g=e(),h=g("$animator"),i=g("$animate"),j={restrict:"ECA",terminal:!0,priority:400,transclude:"element",compile:function(c,e,g){return function(c,e,h){function i(){k&&(k.remove(),k=null),m&&(m.$destroy(),m=null),l&&(q.leave(l,function(){k=null}),k=l,l=null)}function j(f){var h=c.$new(),j=l&&l.data("$uiViewName"),k=j&&a.$current&&a.$current.locals[j];if(f||k!==n){var r=g(h,function(a){q.enter(a,e,function(){(b.isDefined(p)&&!p||c.$eval(p))&&d(a)}),i()});n=a.$current.locals[r.data("$uiViewName")],l=r,m=h,m.$emit("$viewContentLoaded"),m.$eval(o)}}var k,l,m,n,o=h.onload||"",p=h.autoscroll,q=f(h,c);c.$on("$stateChangeSuccess",function(){j(!1)}),c.$on("$viewContentLoading",function(){j(!1)}),j(!0)}}};return j}function u(a,b,c){return{restrict:"ECA",priority:-400,compile:function(d){var e=d.html();return function(d,f,g){var h=g.uiView||g.name||"",i=f.inheritedData("$uiView");h.indexOf("@")<0&&(h=h+"@"+(i?i.state.name:"")),f.data("$uiViewName",h);var j=c.$current,k=j&&j.locals[h];if(k){f.data("$uiView",{name:h,state:k.$$state}),f.html(k.$template?k.$template:e);var l=a(f.contents());if(k.$$controller){k.$scope=d;var m=b(k.$$controller,k);k.$$controllerAs&&(d[k.$$controllerAs]=m),f.data("$ngControllerController",m),f.children().data("$ngControllerController",m)}l(d)}}}}}function v(a){var b=a.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/);if(!b||4!==b.length)throw new Error("Invalid state ref '"+a+"'");return{state:b[1],paramExpr:b[3]||null}}function w(a){var b=a.parent().inheritedData("$uiView");return b&&b.state&&b.state.name?b.state:void 0}function x(a,c){var d=["location","inherit","reload"];return{restrict:"A",require:"?^uiSrefActive",link:function(e,f,g,h){var i=v(g.uiSref),j=null,k=w(f)||a.$current,l="FORM"===f[0].nodeName,m=l?"action":"href",n=!0,o={relative:k},p=e.$eval(g.uiSrefOpts)||{};b.forEach(d,function(a){a in p&&(o[a]=p[a])});var q=function(b){if(b&&(j=b),n){var c=a.href(i.state,j,o);return h&&h.$$setStateInfo(i.state,j),c?void(f[0][m]=c):(n=!1,!1)}};i.paramExpr&&(e.$watch(i.paramExpr,function(a){a!==j&&q(a)},!0),j=e.$eval(i.paramExpr)),q(),l||f.bind("click",function(b){var d=b.which||b.button;d>1||b.ctrlKey||b.metaKey||b.shiftKey||f.attr("target")||(c(function(){a.go(i.state,j,o)}),b.preventDefault())})}}}function y(a,b,c){return{restrict:"A",controller:["$scope","$element","$attrs",function(d,e,f){function g(){a.$current.self===i&&h()?e.addClass(l):e.removeClass(l)}function h(){return!k||j(k,b)}var i,k,l;l=c(f.uiSrefActive||"",!1)(d),this.$$setStateInfo=function(b,c){i=a.get(b,w(e)),k=c,g()},d.$on("$stateChangeSuccess",g)}]}}function z(a){return function(b){return a.is(b)}}function A(a){return function(b){return a.includes(b)}}function B(a,b){function e(a){this.locals=a.locals.globals,this.params=this.locals.$stateParams}function f(){this.locals=null,this.params=null}function g(c,g){if(null!=g.redirectTo){var h,j=g.redirectTo;if(E(j))h=j;else{if(!D(j))throw new Error("Invalid 'redirectTo' in when()");h=function(a,b){return j(a,b.path(),b.search())}}b.when(c,h)}else a.state(d(g,{parent:null,name:"route:"+encodeURIComponent(c),url:c,onEnter:e,onExit:f}));return i.push(g),this}function h(a,b,d){function e(a){return""!==a.name?a:c}var f={routes:i,params:d,current:c};return b.$on("$stateChangeStart",function(a,c,d,f){b.$broadcast("$routeChangeStart",e(c),e(f))}),b.$on("$stateChangeSuccess",function(a,c,d,g){f.current=e(c),b.$broadcast("$routeChangeSuccess",e(c),e(g)),J(d,f.params)}),b.$on("$stateChangeError",function(a,c,d,f,g,h){b.$broadcast("$routeChangeError",e(c),e(f),h)}),f}var i=[];e.$inject=["$$state"],this.when=g,this.$get=h,h.$inject=["$state","$rootScope","$routeParams"]}var C=b.isDefined,D=b.isFunction,E=b.isString,F=b.isObject,G=b.isArray,H=b.forEach,I=b.extend,J=b.copy;b.module("ui.router.util",["ng"]),b.module("ui.router.router",["ui.router.util"]),b.module("ui.router.state",["ui.router.router","ui.router.util"]),b.module("ui.router",["ui.router.state"]),b.module("ui.router.compat",["ui.router"]),l.$inject=["$q","$injector"],b.module("ui.router.util").service("$resolve",l),m.$inject=["$http","$templateCache","$injector"],b.module("ui.router.util").service("$templateFactory",m),n.prototype.concat=function(a){return new n(this.sourcePath+a+this.sourceSearch)},n.prototype.toString=function(){return this.source},n.prototype.exec=function(a,b){var c=this.regexp.exec(a);if(!c)return null;var d,e=this.params,f=e.length,g=this.segments.length-1,h={};if(g!==c.length-1)throw new Error("Unbalanced capture group in route '"+this.source+"'");for(d=0;g>d;d++)h[e[d]]=c[d+1];for(;f>d;d++)h[e[d]]=b[e[d]];return h},n.prototype.parameters=function(){return this.params},n.prototype.format=function(a){var b=this.segments,c=this.params;if(!a)return b.join("");var d,e,f,g=b.length-1,h=c.length,i=b[0];for(d=0;g>d;d++)f=a[c[d]],null!=f&&(i+=encodeURIComponent(f)),i+=b[d+1];for(;h>d;d++)f=a[c[d]],null!=f&&(i+=(e?"&":"?")+c[d]+"="+encodeURIComponent(f),e=!0);return i},b.module("ui.router.util").provider("$urlMatcherFactory",o),p.$inject=["$urlMatcherFactoryProvider"],b.module("ui.router.router").provider("$urlRouter",p),q.$inject=["$urlRouterProvider","$urlMatcherFactoryProvider","$locationProvider"],b.module("ui.router.state").value("$stateParams",{}).provider("$state",q),r.$inject=[],b.module("ui.router.state").provider("$view",r),b.module("ui.router.state").provider("$uiViewScroll",s),t.$inject=["$state","$injector","$uiViewScroll"],u.$inject=["$compile","$controller","$state"],b.module("ui.router.state").directive("uiView",t),b.module("ui.router.state").directive("uiView",u),x.$inject=["$state","$timeout"],y.$inject=["$state","$stateParams","$interpolate"],b.module("ui.router.state").directive("uiSref",x).directive("uiSrefActive",y),z.$inject=["$state"],A.$inject=["$state"],b.module("ui.router.state").filter("isState",z).filter("includedByState",A),B.$inject=["$stateProvider","$urlRouterProvider"],b.module("ui.router.compat").provider("$route",B).directive("ngView",t)}(window,window.angular);
(function(window){
    var _metaTimerID;
    var _metaTimeoutMillis;

    if (typeof(window.tinypass) === 'undefined') window.tinypass = {};

    tinypass.uploadFile2 = function (path, callback) {};

    tinypass.setMessageDashboard = function(type, message) {
        if(type==='error') {
            return tinypass.__setErrorMessageDashboard(message);
        } else {
            return tinypass.__setMessage(type, message);
        }
    };

    tinypass.__buildAlertPopupDashboard = function(type, message) {
        if (message) {
            var alertTop = $(
                '<div class="notification error">' +
                '<span class="message">'+message+'</span>' +
                '<button type="button" class="close close-alert-dashboard">&times;</button>' +
                '</div>');
            $(document.body).append(alertTop);

            alertTop.css('marginLeft',-alertTop.outerWidth()/2);
            alertTop.addClass('in');

            $('.close-alert-dashboard').unbind('click').click(function() {
                $(this).parent().remove();
                tinypass.__buildAlertPopupDashboard();
            });
        }

        var errorNotifi = $('.notification');
        var height = 0;
        var temp = null;
        for (var i = 0; i < errorNotifi.length; i++) {
            temp = $(errorNotifi[i]);
            if (i !== 0) {
                $(errorNotifi[i]).css({ top: 90 + height + 'px' });
            } else {
                $(errorNotifi[i]).css({ top: 90 + 'px' });
            }
            height += $(errorNotifi[i]).outerHeight() + 10;
        }
    };

    tinypass.__setErrorMessageDashboard = function(message) {
        if($('.modal-body').is(":visible")) {
            $('.modal-body  .alert').remove();
            $('.modal-body').prepend(tinypass.__buildAlertPopup('error', message));
        } else if($('#popup').is(":visible")) {
            $('#popup #popup-content .alert').remove();
            $('#popup #popup-content').prepend(tinypass.__buildAlertPopup('error', message));
        } else if ($('.modal .modal-body').length > 0) {
            var modals = $('.modal .modal-body');
            var found = false;
            for (var i = 0; i < modals.length; i++) {
                var modal = modals[i];
                if ($(modal).is(":visible")) {
                    $('.alert', modal).remove();
                    $(modal).prepend($('<div class="row"></div>').append(tinypass.__buildAlertPopup('error', message)));
                    found = true;
                }
            }
            if (!found) {
                if ($('.container .main').length > 0) {
                    tinypass.__buildAlertPopupDashboard('error', message);
                } else {
                    tinypass.__setMessage('error', message);
                }
            }
        } else if ($('.container .main').length > 0) {
            tinypass.__buildAlertPopupDashboard('error', message);
        } else if($('#payscreen #alert').length>0) {
            var alertElement = $('#payscreen #alert');
            alertElement.html(message);
        } else {
            tinypass.__setMessage('error', message);
        }
    };
    tinypass.setMessage = function (type, message) {
        if(type==='error') {
            return tinypass.__setErrorMessage(message);
        } else {
            return tinypass.__setMessage(type, message);
        }
    };
    tinypass.hideMessage = function() {
        $('.alert-top').remove();
        // hide errors too
        $('.tinypass-alert-messase').remove();
        $('.notification.error').remove();
    };

    tinypass.__buildAlertPopup = function(type, message) {
        return $('<div class="alert alert-block alert-' + type + ' tinypass-alert-messase"></div>')
            .append('<button type="button" class="close" data-dismiss="alert">&times;</button>')
            .append($('<span class="message"></span>').text(message));
    };

    tinypass.__setErrorMessage = function (message) {
        if($('.modal-body').is(":visible")) {
            $('.modal-body  .alert').remove();
            $('.modal-body').prepend(tinypass.__buildAlertPopup('error', message));
        } else if($('#popup').is(":visible")) {
            $('#popup #popup-content .alert').remove();
            $('#popup #popup-content').prepend(tinypass.__buildAlertPopup('error', message));
        } else if ($('.modal .modal-body').length > 0) {
            var modals = $('.modal .modal-body');
            var found = false;
            for (var i = 0; i < modals.length; i++) {
                var modal = modals[i];
                if ($(modal).is(":visible")) {
                    $('.alert', modal).remove();
                    $(modal).prepend($('<div class="row"></div>').append(tinypass.__buildAlertPopup('error', message)));
                    found = true;
                }
            }
            if (!found) {
                if ($('.container .main').length > 0) {
                    $('.container .main .alert').remove();
                    $('.container .main').prepend($('<div class="row"></div>').append(tinypass.__buildAlertPopup('error', message)));

                } else {
                    tinypass.__setMessage('error', message);
                }
            }
        } else if ($('.container .main').length > 0) {
            $('.container .main .alert').remove();
            $('.container .main').prepend($('<div class="row"></div>').append(tinypass.__buildAlertPopup('error', message)));
            setTimeout(function() {
                $('.container .main .alert').fadeOut(2000);
            }, 1000);
        } else if($('#payscreen #alert').length>0) {
            var alertElement = $('#payscreen #alert');
            alertElement.html(message);
        } else {
            tinypass.__setMessage('error', message);
        }
    };
    tinypass.__setMessage = function (type, message, permanent) {
        var alertTop = $('<div class="notification">' +
            '<i class="icon-check-white status"></i>' +
            '<span class="message">'+message+'</span>' +
            '</div>');
        $(document.body).append(alertTop);
        if (window.innerWidth > 648) {
            alertTop.css('marginLeft', -alertTop.outerWidth() / 2);
        }
        alertTop.addClass('in');
        setTimeout(function() {
            alertTop.removeClass('in');
        }, 2500);
        setTimeout(function() {
            alertTop.remove();
        }, 5000);
    };

    tinypass.setOpacity = function (elem, fraction) {
        $(elem).css('filter', 'alpha(opacity=' + fraction * 100 + ')')
            .css('-khtml-opacity', fraction)
            .css('-moz-opacity', fraction)
            .css('opacity', fraction);
    }

    tinypass.showWaitPanel = function (config) {
        if (!config) config = {};
//    tinypass.hideMessage();
        tinypass.hideWaitPanel();
        $('body').append($('<div id="waitPanel">' + (config.title ? config.title : 'Loading...') + '</div>').css('display', 'block'));
        if (config.modal) {
            var $e = $('<div id="tinypassModalWindow"/>');
            $e.css('position', 'fixed').css('left', '0').css('top', '0').css('width', '100%').css('height', '100%').css('z-index', '1000');
            if (!config.opacity) {
                $e.css('background-color', 'transparent');
            } else {
                tinypass.setOpacity($e.css('background-color', config.background ? config.background : 'white'), config.opacity);
            }
            $('body').append($e);
        }
    };
    tinypass.hideWaitPanel = function () {
        $("#waitPanel").remove();
        $('#tinypassModalWindow').remove();
    };

    tinypass.__buildPopup = function() {
        return $(
            '<div id="popup" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true" style="display: none;">' +
            '<div id="popup-title" class="modal-header"></div>' +
            '<div id="popup-content" class="modal-body"></div>' +
            '<div id="popup-controls" class="modal-footer"></div>' +
            '</div>'
        );
    }

    tinypass.updateMetaRefresh = function(timeoutInMillis){

        if(timeoutInMillis)
            _metaTimeoutMillis = timeoutInMillis;

        if(_metaTimeoutMillis && !isNaN(_metaTimeoutMillis) ) {
            clearTimeout(_metaTimerID);
            _metaTimerID= setTimeout('window.location.reload()', _metaTimeoutMillis);
        }
    };

    tinypass.__initNewlyAddedContent = function(elem) {
        tinypass.__initToolTips(elem);
    };

    $(document).ready(function () {
        var $body = $('body');
        $body.append(tinypass.__buildPopup());

        $body.ajaxStart(function () {
            tinypass.updateMetaRefresh();
            tinypass.showWaitPanel();
        });
        $body.ajaxStop(function () {
            tinypass.hideWaitPanel();
        });

        $('table.row-alternate').each(function () {
            $(this).find('tr:even').find('td').toggleClass('line-item-alt', true);
            $(this).find('tr:odd').find('td').toggleClass('line-item-alt2', true);
        });

        tinypass.__initNewlyAddedContent($body);

        (function ($) {
            var map = new Array();
            $.Watermark = {
                ShowAll: function () {
                    for (var i = 0; i < map.length; i++) {
                        if (map[i].obj.val() === "") {
                            map[i].obj.val(map[i].text);
                            map[i].obj.toggleClass("watermark", true);
                        } else {
                            map[i].obj.toggleClass("watermark", false);
                        }
                    }
                },
                HideAll: function () {
                    for (var i = 0; i < map.length; i++) {
                        if (map[i].obj.val() === map[i].text)
                            map[i].obj.val("");
                    }
                }
            };

            $.fn.Watermark = function (text) {
                return this.each(
                    function () {
                        var input = $(this);
                        map[map.length] = {text: text, obj: input};
                        function clearMessage() {
                            if (input.hasClass("watermark")) {
                                input.toggleClass("watermark", false).val("");
                            }
                        }

                        function insertMessage() {
                            if (input.val().length === 0) {
                                input.toggleClass("watermark", true).val(text);
                            }
                        }

                        input.focus(clearMessage);
                        input.blur(insertMessage);

                        insertMessage();
                    }
                );
            };
        })(jQuery);
    });


    tinypass.__initToolTips = function(elem) {
        $(elem).find('*[data-toggle="tooltip"]').each(function() {
            var me = $(this);
            if(!me.attr('title')) me.attr('title', me.html());
            me.tooltip({html:true});
        });
    };

    tinypass.hasFlash = function() {
        try {
            return ZeroClipboard.detectFlashSupport();
        } catch(e) {}
        return false;
    };

    /*  using ZeroClipboard: https://github.com/jonrohan/ZeroClipboard/blob/master/docs/instructions.md */
    tinypass.copyToClipboard = function(HTMLElement,options) {
        var clip,elem,_config;
        try {
            if (!tinypass.hasFlash()) { /* what do we want to do here? */ return null;}

            elem = $(HTMLElement);
            _config = {}
            _config['moviePath']='/js/ZeroClipboard.swf';
            for (var o in options) {
                _config[o] = options[o];
            }
            clip = new ZeroClipboard(elem,_config);
            clip.glue(elem);

            return clip;
        } catch(e) {}
    };

    tinypass.initImageCropper = function (selector, options, cropWidth, cropHeight) {};

    tinypass.cropImage = function (path, image, type, aid, cropX, cropY, cropWidth, cropHeight, onSuccess, onError) {}

// Strips spaces from a string.
    tinypass.stripSpaces = function(str) {

        if (str === null || typeof str === 'undefined')
            return str;

        return str.replace(/\s+/g, '');
    };

    tinypass.ccLuhnCheck = function(CardNumber) {
        if (!CardNumber.match(/^\d+$/)) return false;
        var no_digit = CardNumber.length;
        var oddoeven = no_digit & 1;
        var sum = 0;

        for (var count = 0; count < no_digit; count++) {
            var digit = parseInt(CardNumber.charAt(count));
            if (!((count & 1) ^ oddoeven)) {
                digit *= 2;
                if (digit > 9)
                    digit -= 9;
            }
            sum += digit;
        }
        return (sum % 10 === 0);
    };

    tinypass.convertCurrencyAndFormat = function(value, rate) {
        try {
            if(!value || value.match(/.*[^0-9.].*/)) return '?.??';
            if(!rate || rate.match(/.*[^0-9.].*/)) return '?.??';
            var v = parseFloat(value) / parseFloat(rate);
            if(v===0 || isNaN(v)) return '?.??';
            v = (Math.ceil(Math.round(v*10000)/100)/100).toFixed(2).replace(/[.]00$/, "");
            return v;
        } catch (e) {
            return '?.??';
        }
    };


    try {
        $(document).ready(function () {
            $(window).on("resize", function(){
                $('#left-nav').find('#left-nav-panel').height($(window).height() - 121);
            });
            $(window).trigger("resize");
        })
    } catch (e) {
    }
})(window);

var pnErrorWatcher = (function () {
  /**
   * ErrorWatcher
   * @constructor
   */
  function ErrorWatcher() {
    /**
     * Happened errors.
     * @type {Array.<ErrorDetails>}
     */
    var privateErrors = [];

    function isInArray(errorsArray, errorObject) {
      var strings = errorsArray.map(JSON.stringify);
      return strings.indexOf(JSON.stringify(errorObject)) !== -1;
    }

    /**
     * @param {Error|Event} error
     */
    function onError(error) {
      var details = {
        userAgent: navigator.userAgent
      };

      if (error instanceof Error) {
        details.stack = error.stack;
        details.message = error.message;
      }

      if (error instanceof Event) {
        var event = error;
        var hasError = (('error' in event) && event.error);
        details.stack = hasError ? event.error.stack : 'n/a';
        details.message = hasError ? event.error.message : 'n/a';
      }

      var widgetType = getParameterByName('widget');
      details.tags = widgetType ? [widgetType]: ['unknown'];

      // do not allow duplicates
      if (isInArray(privateErrors, details)) {
        return;
      }

      privateErrors.push(details);
    }

    function errorEventListener(errorEvent) {
      try {
        onError(errorEvent);
      } catch (e) {
        console.warn('Can not log an error, something went wrong: ', e);
      }
    }

    /**
     * Manually notify error watcher about happened error. Useful in try{} catch {} blocks
     * @param {Error} error
     */
    this.manualLog = function (error) {
      try {
        onError(error);
      } catch (e) {
        console.warn('Can not log an error, something went wrong: ', e, error);
      }
    };

    this.watchUnhandled = function () {
      if (window.addEventListener) {
        window.addEventListener('error', errorEventListener);
      }
    };

    this.reset = function () {
      window.removeEventListener('error', errorEventListener);
    };

    /**
     * Get watched errors
     */
    this.getErrors = function () {
      return privateErrors
        // return immutable data
        .map(function (value) {
          return Object.assign({}, value)
        })
    };
  }

  return new ErrorWatcher();
}());

// Error handler
// Should go first, before an app script
var errorHandler = (function (errorWatcher) {
  function PostMessageEvent() {
    this.sender = null;
    this.event = null;
    this.params = null;
  }

  var POSTMESSAGE_ERRORS_TIMEOUT = 10000;

  function ErrorHandler() {
    var config = {
      /**
       * An array of regexps
       */
      whitelistUrls: [],
    };

    this.setConfig = function (_config) {
      config = Object.assign(config, _config);
    };

    function __getErrors() {
      return errorWatcher.getErrors().filter(function (error) {
        return config.whitelistUrls.some(function (regexp) {
          return error.stack && error.stack.match(regexp);
        });
      });
    }

    function __postMessageToParent(errorsArray) {
      try {
        var target = window.opener || window.parent;

        var postMessage = Object.assign(new PostMessageEvent(), {
          sender: getParameterByName('iframeId'),
          event: 'EVENT_TP_ERROR_HANDLER',
          params: errorsArray,
        });

        if (target) {
          target.postMessage(JSON.stringify(postMessage), '*');
        }

      } catch (e) {
        console.warn('Can not post message errors to parent: ', e);
      }
    }

    function __sendErrors() {
      try {
        var errorsArray = __getErrors();
        if (errorsArray.length === 0) {
          return
        }
        __postMessageToParent(errorsArray);
      } catch (e) {
        console.warn('Errors can not be sent: ', e);
      }
    }

    function __reset() {
      errorWatcher.reset();
    }

    function __start() {
      errorWatcher.watchUnhandled();
      setTimeout(function () {
        __sendErrors();
        __reset();
      }, POSTMESSAGE_ERRORS_TIMEOUT)
    }

    this.start = function () {
      try {
        __start();
      } catch (e) {
        console.warn('Error logger can not be started: ', e);
      }
    };
  }


  try {
    return new ErrorHandler();
  } catch (e) {
    console.warn('Can\'t initiate errorHandler: ', e);
  }
})(pnErrorWatcher);

(function (errorHandler) {
  try {
    var whiteListUrls = [/\w*\.tinypass\.com/, /localhost/];

    var testMode = localStorage.getItem('__tp-tinypassErrorHandlerTestMode');
    var currentHostName = location && location.hostname;
    if (testMode && currentHostName) {
      whiteListUrls.push(new RegExp(currentHostName));
    }

    errorHandler.setConfig({
      whitelistUrls: whiteListUrls,
    });

    errorHandler.start();
  } catch (e) {
    console.warn('Can\'t configure errorHandler: ', e);
  }
})(errorHandler);

angular.module('exceptionHandler', [])
  .factory('$exceptionHandler', ['$log', function ($log) {
    return function exceptionHandler(exception, cause) {
      $log.warn(exception);

      var errorHandler = window.pnErrorWatcher;

      if (errorHandler) {
        errorHandler.manualLog(exception);
      }
    };
  }]);

// whole list of PPs
window.PP_LIST = {
  PAYPAL: 1,
  CREDIT_CARD: 4,
  DWOLLA: 7,
  AMAZON: 8,
  COINBASE: 9,
  MOCK: 5,
  ZERO: 0,
  PAYPAL_BT: 11,
  WORLDPAY_HPP: 12,
  WORLDPAY_PAYPAL: 13,
  WORLDPAY_IDEAL: 14,
  WORLDPAY_ELV: 15,
  SPREEDLY_CC: 16,
  SPREEDLY_STRIPE_CC: 17,
  SPREEDLY_BEANSTREAM: 18,
  EDGIL_PAYWAY: 19,
  WORLDPAY_CC_TOKEN: 20,
  SPREEDLY_PAYU_LATAM: 21,
  PAYPAL_EXPRESS_CHECKOUT: 22,
  SPREEDLY_OPENPAY: 23,
  EIGEN: 24,
  APPLE_PAY_BT: 25,
  OPENPAY_CASH: 26,
  EASYPAY_MULTIBANCO: 28,
  EASYPAY_MBWAY: 29,
  EASYPAY_DIRECT_DEBIT: 30,
  EASYPAY_BOLETO: 31,
  KLARNA: 32,
  OBI: 33,
  OBI_PAYPAL: 34,
  DATATRANS: 35,
  DATATRANS_POSTFINANCE: 36,
  ONET: 37,
  APPLE_PAY_SS: 38,
  CYBER_SOURCE: 39,
  STRIPE: 40,
  STRIPE_APPLEPAY: 41,
  PAYWAY_APPLEPAY: 42,
  WIRECARD: 45,
  CREDIT_GUARD_CC: 66,
  PAY_U_BRAZIL_BOLETO: 62,
  VOLGA: 63
};
angular.extend(window, window.PP_LIST);

var generalModule = angular.module('generalModule', ['ui.router', 'ajaxServices', 'ngSanitize']);

/**
 * Helper methods
 */
function getMonths() {
  return {
    "01": "1 - Jan",
    "02": "2 - Feb",
    "03": "3 - Mar",
    "04": "4 - Apr",
    "05": "5 - May",
    "06": "6 - Jun",
    "07": "7 - Jul",
    "08": "8 - Aug",
    "09": "9 - Sept",
    "10": "10 - Oct",
    "11": "11 - Nov",
    "12": "12 - Dec"
  }
}

generalModule.factory('cookieService', function () {
  var cs = {};

  cs.getCookie = function (name) {
    var _name = name + '=';
    var decodedCookie = decodeURIComponent(document.cookie);
    var ca = decodedCookie.split(';');
    for (var i = 0; i < ca.length; i++) {
      var c = ca[i];
      while (c.charAt(0) === ' ') {
        c = c.substring(1);
      }
      if (c.indexOf(_name) === 0) {
        return c.substring(_name.length, c.length);
      }
    }
    return '';
  };

  cs.setCookie = function (name, value, expires, path) {
    var cookie = name + '=' + value + ';expires=' + expires;
    if (path) {
      cookie += ';path=' + path;
    }
    document.cookie = cookie;
  };

  cs.eraseCookie = function (name, path) {
    this.setCookie(name, '', new Date().toUTCString(), path);
  };

  return cs;
});

function getYears() {
  var d = new Date().getFullYear();
  var years = {};
  for (var i = d; i < d + 13; ++i) {
    var y = i + "";
    years[y.substring(2)] = i;
  }
  return years;
}

function isString(value) {
  return typeof value === 'string';
}

function isNumber(value) {
  return value && value !== '' && !isNaN(value);
}

function lowercase(string) {
  return isString(string) ? string.toLowerCase() : string;
}

function toBoolean(value) {
  if (typeof value === 'function') {
    value = true;
  } else if (value && value.length !== 0) {
    var v = lowercase("" + value);
    value = !(v === 'f' || v === '0' || v === 'false' || v === 'no' || v === 'n' || v === '[]');
  } else {
    value = false;
  }
  return value;
}

/**
 * Gets a random string
 * @param length The length of the string
 * @returns {string} The random string
 */
function _randomString(length) {
  if (!length) {
    length = 5;
  }

  var text = "";
  var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

  for (var i = 0; i < length; i++) {
    text += possible.charAt(Math.floor(Math.random() * possible.length));
  }

  return text;
}

var util = {
  debug: getParameterByName('debug'),
  log: function () {
    if (util.debug) {
      if (typeof (window.console) !== "undefined" && typeof (window.console.log) !== "undefined") {
        var newArgs = arguments;
        if (isBot()) {
          newArgs = buildSeleniumLogMessage(newArgs);
        }
        if (typeof window.console.log === "object") {
          window.console.log.apply.call(console.log, console, newArgs);
        } else {
          console.log.apply(console, newArgs);
        }
      }
    }

    function buildSeleniumLogMessage(args) {
      // selenium log. It can show only first argument
      var seleniumMessage = "";
      try {
        for (var i = 0; i < args.length; i++) {
          try {
            seleniumMessage += JSON.stringify(args[i]) + ", ";

          } catch (e) {
            seleniumMessage += "" + e;
          }
        }
        return args = [seleniumMessage]
      } catch (e) {
        return args
      }
    }

    function isBot() {
      var documentDetectionKeys = [
        "__webdriver_evaluate",
        "__selenium_evaluate",
        "__webdriver_script_function",
        "__webdriver_script_func",
        "__webdriver_script_fn",
        "__fxdriver_evaluate",
        "__driver_unwrapped",
        "__webdriver_unwrapped",
        "__driver_evaluate",
        "__selenium_unwrapped",
        "__fxdriver_unwrapped",
      ];

      var windowDetectionKeys = [
        "_phantom",
        "__nightmare",
        "_selenium",
        "callPhantom",
        "callSelenium",
        "_Selenium_IDE_Recorder",
      ];

      for (var windowDetectionKey in windowDetectionKeys) {
        var windowDetectionKeyValue = windowDetectionKeys[windowDetectionKey];
        if (window[windowDetectionKeyValue]) {
          return true;
        }
      }
      for (var documentDetectionKey in documentDetectionKeys) {
        var documentDetectionKeyValue = documentDetectionKeys[documentDetectionKey];
        if (window['document'][documentDetectionKeyValue]) {
          return true;
        }
      }

      for (var documentKey in window['document']) {
        if (documentKey.match(/\$[a-z]dc_/) && window['document'][documentKey]['cache_']) {
          return true;
        }
      }

      if (window['external'] && window['external'].toString && window['external'].toString() && (window['external'].toString()['indexOf']('Sequentum') !== -1)) return true;

      if (window['document']['documentElement']['getAttribute']('selenium')) return true;
      if (window['document']['documentElement']['getAttribute']('webdriver')) return true;
      if (window['document']['documentElement']['getAttribute']('driver')) return true;

      return false;
    }

  }
};

var urlParams = null;

function getParameterByName(name) {
  if (!urlParams) {
    var match,
      pl = /\+/g,  // Regex for replacing addition symbol with a space
      search = /([^&=]+)=?([^&]*)/g,
      decode = function (s) {
        return decodeURIComponent(s.replace(pl, " "));
      },
      query = window.location.search.substring(1);

    urlParams = {};
    while (match = search.exec(query)) {
      urlParams[decode(match[1])] = decode(match[2]);
    }
  }

  var value = urlParams[name];
  if (!value && window.TPParam && window.TPParam.params) {
    value = window.TPParam.params[name];
  }
  return value;
}

function getQueryParamInStringByName(url, name) {
  var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'),
    results = regex.exec(url);
  return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
}

function getIntParam(name, def) {
  var p = getParameterByName(name);
  if (typeof p !== 'undefined' && isNaN(p))
    return def;
  return new Number(p);
}

BaseComponentController = {
  _isValid: function () {
    return true;
  },

  displayErrors: function ($scope, errors, errorService, eventService) {
    if (!errors) {
      return;
    }

    if (Array.isArray(errors)) {
      for (var i = 0; i < errors.length; i++) {
        let errorMessage = errors[i].msg || errors[i].message;
        if (errorMessage && errorMessage.trim() !== '') {
          handlePaymentError(errorMessage);
        }
      }

      return;
    }

    if (typeof errors === 'object') {
      if (errors.message) {
        handlePaymentError(errors.message);
      } else {
        util.log("Unable to extract error message", errors);
      }

      return;
    }

    if (typeof errors === 'string') {
      handlePaymentError(errors);
    }

    function handlePaymentError(errorMessage) {
      errorService($scope).global(errorMessage);
      eventService.checkoutPaymentErrorEvent(errorMessage);
    }
  }
};

// CHECKOUT EVENTS DEFINITION.
// This evnts if fired using $rootScope.$broadcase(EVENT_NAME, args1, arg2, arg3)
// This should be handled as following:
// $rootScope.$on(EVENT_NAME, function(event, arg1, arg2, arg3) {
//                      // your code here
//               });
/** Event throws when the payment methods list are changed by the checkout process. It used to change on term selection.
 * Event arguments:
 * <ul>
 * <li><b>paymentMethods</b> - list of the new payment methods that were selected. <b>Mandatory.</b></li>
 * </ul>
 */
var EVENT_CHECKOUT_PAYMENT_METHODS_CHANGED = 'EVENT_CHECKOUT_PAYMENT_METHODS_CHANGED';
/** Event fires when term is selected.
 * Event arguments:
 * <ul>
 * <li><b>term</b> - term object that were used. <b>Mandatory.</b></li>
 * </ul>
 */
var EVENT_CHECKOUT_TERM_SELECTED = 'EVENT_CHECKOUT_TERM_SELECTED';
var EVENT_APPLY_REDEEM_CODE = 'EVENT_APPLY_REDEEM_CODE';
var EVENT_CHECKOUT_CONSENT_CHANGED = 'EVENT_CHECKOUT_CONSENT_CHANGED';
var EVENT_CHECKOUT_RESET_SELECTED_PAYMENT_METHOD = 'EVENT_CHECKOUT_RESET_SELECTED_PAYMENT_METHOD';

/**
 *   Event fires when term price changed
 *   args:  {termId: id , price: price}
 */
var EVENT_CHECKOUT_PRICE_CHANGED = "EVENT_CHECKOUT_PRICE_CHANGED";

var EVENT_CHECKOUT_REDEEM_DONE = "EVENT_CHECKOUT_REDEEM_DONE";

var EVENT_APPLE_PAY_CAN_MAKE_PAYMENTS = "EVENT_APPLE_PAY_CAN_MAKE_PAYMENTS";

/**
 * Events fires when the checkout.access onject is changed
 * Event arguments: none
 * @type {string}
 */
var EVENT_BILLING_COUNTRY_SELECTED = "EVENT_BILLING_COUNTRY_SELECTED";
var EVENT_COUNTRY_OF_RESIDENCE_SELECTED = "EVENT_COUNTRY_OF_RESIDENCE_SELECTED";
var EVENT_SAME_RESIDENCE_CHECKBOX_CHANGED = "EVENT_SAME_RESIDENCE_CHECKBOX_CHANGED";
var EVENT_BILLING_FROM_TAX_REQUEST = "EVENT_BILLING_FROM_TAX_REQUEST";
var EVENT_CC_ZIP_CODE_CHANGED = "EVENT_CC_ZIP_CODE_CHANGED";
var EVENT_USER_ACCESS_CHANGED = "EVENT_USER_ACCESS_CHANGED";
var EVENT_ERRORS_CHANGED = "EVENT_ERRORS_CHANGED";
var EVENT_TERMINAL_ERROR = "EVENT_TERMINAL_ERROR";
//var EVENT_VIEW_ACTIVATED = "EVENT_VIEW_ACTIVATED";
var EVENT_CONFIG_RELOAD = "EVENT_CONFIG_RELOAD";
var EVENT_STATS_TRACKED = "EVENT_STATS_TRACKED";
var EVENT_TRACKING_ID_CHANGED = "EVENT_TRACKING_ID_CHANGED";
var EVENT_PAY_WITH_NEW_CHANGED = "EVENT_PAY_WITH_NEW_CHANGED";

/* should be fired if custom price should be applied along with taxes information */
var EVENT_PAY_WHAT_YOU_WANT_SHOULD_BE_APPLIED = "EVENT_PAY_WHAT_YOU_WANT_SHOULD_BE_APPLIED";
var EVENT_EXPERIAN_ADDRESS_CHANGED = "EVENT_EXPERIAN_ADDRESS_CHANGED";
var EVENT_TAX_RESET_ERRORS = "EVENT_TAX_RESET_ERRORS";
var EVENT_HIGHLIGHT_ERROR_FIELDS = "EVENT_HIGHLIGHT_ERROR_FIELDS";
var ENABLE_SAVE_BUTTON = "ENABLE_SAVE_BUTTON";
var DISABLE_SAVE_BUTTON = "DISABLE_SAVE_BUTTON";

var EVENT_SETUP_CUSTOM_VARIABLES = 'setupCustomVariables';
var EVENT_SETUP_AFFILIATE_STATE = 'setupAffiliateState';
var EVENT_SETUP_EVT_FIELDS = 'setupEVTFields';
var EVENT_ADD_CARD = 'EVENT_ADD_CARD';
var EVENT_INIT_BANCARD = 'EVENT_INIT_BANCARD';
var EVENT_GOTO_PREVIOUS_STATE = 'EVENT_GOTO_PREVIOUS_STATE';
/**
 * Event service that handles firing and subscription handling for the events
 */
generalModule.factory('ngEventService', ['$rootScope', function ($rootScope) {
  var e = {};

  e.fire = function (eventName, arg1, arg2, arg3, arg4, arg5) {
    if (!eventName || eventName === '') throw new Error('eventName is required');
    util.log("[NG EVENT SERVICE] Firing event:", arguments);
    $rootScope.$broadcast(eventName, arg1, arg2, arg3, arg4, arg5);
  };

  e.subscribe = function (eventName, callback) {
    if (!eventName || eventName === '') throw new Error('eventName is required');
    if (!callback) throw new Error('callback is required');
    return $rootScope.$on(eventName, callback.bind(arguments));
  };

  return e;
}]);

generalModule.factory('stateService', function () {
  var params = TPParam && TPParam.params ? TPParam.params : {};
  var state = {
    // whether offer is active or not
    // (it could be not active when iframe is preloaded but not shown yet)
    active: !params.preload
  };
  return {
    get: function (key) {
      return state[key];
    },
    set: function (key, value) {
      state[key] = value;
    }
  }
});

generalModule.factory('eventLogger', ['$http', '$window', function ($http, $window) {
  var endpoints = {
    log: 'https://api.tinypass.com/api/v3/anon/error/log'
    //log: 'http://localhost:8080/api/v3/anon/error/log'
  };

  function buildMessage(eventName, payload, meta) {
    var payloadAsString;
    var metaAsString;
    var message = [];

    try {
      payloadAsString = (typeof payload === 'string') ? {message: payload} : JSON.stringify(payload);
    } catch (e) {
      payloadAsString = 'parse error';
    }

    try {
      metaAsString = JSON.stringify(meta);
    } catch (e) {
      metaAsString = 'meta error';
    }

    message.push('=====checkout event=====');
    message.push('eventName: ' + eventName);

    if (payload) {
      message.push('payload: ' + payloadAsString);
    }

    message.push('meta: ' + metaAsString);
    message.push('=====event body end=====');

    return message.join('\n');
  }

  function getMeta() {
    var meta = {
      aid: null,
      offerId: null,
      gaTrackingId: null
    };

    var aidMatch = location.href.match(/aid=([\w\d]+)&/);
    var offerIdMatch = location.href.match(/offerId=([\w\d]+)&/);

    if (aidMatch) {
      meta.aid = aidMatch[1];
    }

    if (offerIdMatch) {
      meta.offerId = offerIdMatch[1];
    }

    if ($window.ga) {
      $window.ga(function (tracker) {
        meta.gaTrackingId = tracker.get('trackingId');
      });
    }

    return meta;
  }

  function logEvent(eventName, payload) {
    try {
      var meta = getMeta();
      var message = buildMessage(eventName, payload, meta);

      if (!meta) {
        return;
      }

      if (isLogEventDisabled()) {
        return;
      }

      $http({
        method: 'POST',
        url: endpoints.log,
        data: 'log_message=' + generateLogMessage(message),
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          'Piano-request-without-spinner': 1
        }
      });

      function isLogEventDisabled() {
        return ['lGr3ciYmC7', '6qv8OniKQO', 'bMMF5VBfpu'].indexOf(meta.aid) === -1 && eventName !== 'edgilHostedPageSubmitForm';
      }

    } catch (e) {
      console.warn("can't log event due to:", e);
    }
  }

  function logGaEvent(event) {
    logEvent('gaEvent', event);
  }

  function logGaFailedEvent(event) {
    logEvent('gaEvent [FAILED]', event);
  }

  function generateLogMessage(message) {
    var widgetType = getParameterByName('widget');
    var log = [
      {
        message: message,
        tags: widgetType ? [widgetType] : []
      }
    ];

    return JSON.stringify(log);
  }

  return {
    logGaEvent: logGaEvent,
    logGaFailedEvent: logGaFailedEvent,
    logEvent: logEvent
  };
}]);

generalModule.factory('gaService', ['$window', 'stateService', 'integrationEventsService', 'eventLogger', 'eventService',
  function ($window, stateService, integrationEventsService, eventLogger, eventService) {
    var noninteractionEvents = [
      'showOffer',
      'termSelected',
      'promoApplied',
      'promoInvalid',
      'loginSuccess',
      'loginFailed',
      'registrationFailed',
      'registrationSuccess',
      'checkoutSuccess'
    ];

    var me = {};

    me.sendGoogleAnalyticsEvent = function (event) {
      if (event) {
        event.eventCategory = event.eventAction;

        var delimiter = " ";
        event.eventAction = "";

        angular.forEach(event.params, function (value, key) {
          if (value) {
            event.eventAction += delimiter + key + "_" + value;
            delimiter = "____";
            event.eventLabel += " " + key + ":" + value;
          }
        });

        var options = {};

        if (noninteractionEvents.indexOf(event.eventCategory) !== -1) {
          options.nonInteraction = true;
        }

        var eventParams = {
          eventCategory: event.eventCategory,
          eventAction: event.eventAction,
          eventLabel: event.eventLabel
        };

        eventService.emitGAEvent(Object.assign(eventParams, options));
        eventLogger.logGaEvent(event);
      }
    };

    return me;
  }]);

generalModule.factory('statsService', ['ngEventService', 'stateService', '$q', '$http',
  function (ngEventService, stateService, $q, $http) {
    var stats = {};
    var statsParams = null;
    var initStatParams = null;
    var statsWaiters = [];
    var statsPayloadWaiters = [];
    var paramsWaiters = [];
    var isTracked = false;
    var checkoutView = null;

    var campaignStatsKey = 'tpcc_';
    var termsStatsKey = 'terms';
    var statsKeys = [
      'aid',
      'preview',
      'userProvider',
      'userToken',
      'url',
      'tags',
      'tbc',
      'contentCreated',
      'contentSection',
      'contentAuthor',
      'experienceId',
      'experienceExecutionId',
      'experienceActionId',
      'pageViewId',
      'visitId',
      'trackingId',
      'previewTemplateVersion',
      'offerId',
      'checkoutFlowId',
      'offerTemplateId',
      'templateId',
      'templateVariantId',
      'offerTemplateVariantId',
      'templatePubId',
      'templateVersionPubId',
      'templateVersion',
      'templateCategory',
      'isPasswordlessCheckoutEnabled',
      'isSingleStepEnabled',
      'isDoubleOptInEnabled',
      'affiliateState'
    ];

    function handleTrackStatEvent(event, params) {
      stateService.set('active', true);

      if (!TPParam.TRACK_SHOW) {
        return;
      }

      initStatParams = createInitStatParams(params, TPParam.config);
      setStats(params, stats, initStatParams);
      notifyWaiters();

      $http(
        {
          method: 'POST',
          url: getTrackShowUrl(),
          data: {
            initStatParams: initStatParams
          },
          headers: {
            'Piano-request-without-spinner': 1
          }
        }
      ).then(function (resp) {
        isTracked = true;
        setStats(params, resp.data.models.stats, initStatParams);
      });

      function getTrackShowUrl() {
        let url = TPParam.TRACK_SHOW;
        let lang = getParameterByName('lang');
        if (lang) {
          url = url + '?lang=' + lang;
        }
        return url;
      }

      function createInitStatParams(params, checkoutConfig) {
        var initStatParams = {};

        extractCommonParams(params, checkoutConfig, initStatParams);
        extractTermIds(params, checkoutConfig, initStatParams);

        extractCampaignParams(checkoutConfig, initStatParams);
        extractCampaignParams(params, initStatParams);

        extractCheckoutViewParam(initStatParams);

        return initStatParams;
      }

      function extractCheckoutViewParam(params) {
        params.checkoutView = checkoutView;
      }

      function extractCommonParams(params, checkoutConfig, stats) {
        statsKeys.forEach(function (value) {
          if (params && params[value]) {
            stats[value] = params[value];
          } else if (checkoutConfig && checkoutConfig[value]) {
            stats[value] = checkoutConfig[value];
          }
        });
      }

      function extractTermIds(params, checkoutConfig, stats) {
        var terms;
        if (params && params[termsStatsKey]) {
          terms = params[termsStatsKey];
        } else if (checkoutConfig && checkoutConfig[termsStatsKey]) {
          terms = checkoutConfig[termsStatsKey];
        }

        if (!Array.isArray(terms)) {
          return;
        }

        var termIds = [];
        terms.forEach(function (term) {
          if (term) {
            termIds.push(term.termId);
          }
        });

        stats.termIds = termIds;
      }

      function extractCampaignParams(params, stats) {
        if (params) {
          $.each(params, function (index, value) {
            if (index.indexOf(campaignStatsKey) === 0) {
              stats[index] = value;
            }
          });
        }
      }

      function setStats(params, stat, initParams) {
        stats = stat;
        statsParams = params;
        initStatParams = initParams;
      }

      function notifyWaiters() {
        notifyStatsWaiters();
        notifyStatsPayloadWaiters();
        notifyParamsWaiters();

        ngEventService.fire(EVENT_STATS_TRACKED, {params: statsParams, stat: stats});
      }

      function isPreview(params) {
        if (params && params.preview) {
          var preview = params.preview;
          return typeof preview === 'string' ? preview === 'true' : preview;
        }
        return false;
      }

      function notifyStatsWaiters() {
        statsWaiters.forEach(function (promise) {
          promise.resolve(createStatsObject());
        });
        statsWaiters = [];
      }

      function notifyStatsPayloadWaiters() {
        statsPayloadWaiters.forEach(function (promise) {
          promise.resolve(createStatsPayloadObject());
        });
        statsPayloadWaiters = [];
      }

      function notifyParamsWaiters() {
        paramsWaiters.forEach(function (promise) {
          promise.resolve(statsParams);
        });
        paramsWaiters = [];
      }
    }

    function getStats() {
      if (initStatParams) {
        return $q.when(createStatsObject());
      }

      var promise = $q.defer();
      statsWaiters.push(promise);
      return promise.promise;
    }

    function getStatsPayload() {
      if (initStatParams) {
        return $q.when(createStatsPayloadObject());
      }

      var promise = $q.defer();
      statsPayloadWaiters.push(promise);
      return promise.promise;
    }

    function createStatsPayloadObject() {
      return isTracked ?
        {checkoutStats: stats} :
        {initStatParams: initStatParams};
    }

    function createStatsObject() {
      return {
        checkoutStats: stats,
        initStatParams: initStatParams
      };
    }

    function getParams() {
      var promise = $q.defer();
      if (statsParams) {
        promise.resolve(statsParams);
      } else {
        paramsWaiters.push(promise);
      }
      return promise.promise;
    }

    function mergeStats(newStats) {
      getStats().then(function () {
        angular.extend(stats, newStats);
      });
    }

    function setCheckoutView(view) {
      checkoutView = view;
    }

    function trackView(view) {
      setCheckoutView(view);

      if (view === "offer") {
        // the offer tracked by track show action
        return;
      }

      if (!TPParam.TRACK_VIEW) {
        return;
      }

      getStatsPayload().then(function (statsPayload) {
        $http({
          method: 'POST',
          url: TPParam.TRACK_VIEW,
          params: {
            view: view
          },
          data: statsPayload,
          headers: {
            'Piano-request-without-spinner': 1
          }
        }).then(function (resp) {
          if (resp && resp.models && resp.models.checkoutStats) {
            mergeStats(resp.models.checkoutStats);
          }
        })
      })
    }

    function getPageView() {
      let currentStats = createStatsObject();
      let tbc = null;
      if (currentStats && currentStats.initStatParams) {
        tbc = currentStats.initStatParams.tbc;
      }

      let pageViewId = null;
      if (currentStats && currentStats.initStatParams) {
        pageViewId = currentStats.initStatParams.pageViewId;
      }

      return {
        tbc: tbc,
        pageViewId: pageViewId,
      };
    }

    return {
      getStatsPayload: getStatsPayload,
      getStats: getStats,
      mergeStats: mergeStats,
      getParams: getParams,
      trackView: trackView,
      setCheckoutView: setCheckoutView,
      getPageView: getPageView,
      handleTrackStatEvent: handleTrackStatEvent
    };
  }]);

generalModule.factory('browserIdService', ['ngEventService', '$q',
  function (ngEventService, $q) {

    var promise = $q.defer();

    ngEventService.subscribe('passBrowserId', function (event, params) {
      promise.resolve(params.browserId);
    });

    function getBrowserId() {
      return promise.promise;
    }

    return {
      getBrowserId: getBrowserId
    };
  }]);

generalModule.factory('configService', ['ngEventService', function (ngEventService) {
  var config = {};
  return {
    get: function () {
      return config;
    },
    setProperty: function (name, value) {
      config[name] = value;

    },
    changed: function () {
      ngEventService.fire(EVENT_CONFIG_RELOAD, config);
    }
  };
}]);

generalModule.factory('apiService', ['$http', function ($http) {
  var endpointUrl = '/api/v3';
  var config = {
    method: 'post',
    headers: {
      'Piano-request-without-spinner': 1
    }
  };
  return {
    call: function (endpoint, params, method) {
      var newConfig = angular.copy(config);
      newConfig.url = endpointUrl + endpoint;

      if (method) {
        newConfig.method = method;
      }
      newConfig.params = params;
      return $http(newConfig);
    }
  };
}]);

generalModule.factory("modalService", ['$rootScope', '$q', '$http', '$templateCache', '$injector', '$timeout', '$document', '$compile', '$controller',
  function ($rootScope, $q, $http, $templateCache, $injector, $timeout, $document, $compile, $controller) {
    var modalService = {};
    var backdrop = {
      created: false,
      visible: false,
      domEl: null
    };
    var modalWindow = {
      created: false,
      scope: null,
      domEl: null
    };
    var tooTall = false;

    var getTemplatePromise = function (options) {
      return options.template ? $q.when(options.template) :
        $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) {
          return result.data;
        });
    };

    var getResolvePromises = function (resolves) {
      var promisesArr = [];
      angular.forEach(resolves, function (value, key) {
        if (angular.isFunction(value) || angular.isArray(value)) {
          promisesArr.push($q.when($injector.invoke(value)));
        }
      });
      return promisesArr;
    };

    var open = function (modalInstance, modal, modalOptions) {
      var body = $document.find('body').eq(0);

      if (!backdrop.created) {
        var backdropScope = $rootScope.$new(true);
        var backdropDomEl = $compile('<div class="modal-overlay"></div> ')(backdropScope);
        body.append(backdropDomEl);
        backdrop.created = true;
        backdrop.domEl = backdropDomEl;
      }

      if (!backdrop.visible) {
        var $backdrop = $(backdrop.domEl);
        var speed = modalOptions.speed || 600;
        $backdrop.addClass('active');
        $backdrop.animate({opacity: 0.7}, speed);
        backdrop.visible = true;
      }

      var angularDomEl = angular.element('<div class="modal ' + (modalOptions['class'] || '') + '"></div>');
      angularDomEl.addClass('active');
      angularDomEl.animate({opacity: 1.0}, speed);
      angularDomEl.html(modal.content);

      var modalDomEl = $compile(angularDomEl)(modal.scope);
      modalWindow.created = true;
      modalWindow.scope = modal.scope;
      modalWindow.domEl = angularDomEl;
      body.append(modalDomEl);
    };

    var closeDialog = function (modalInstance, modalOptions, callbackOnClose) {
      var speed = modalOptions.speed || 600;
      var ease = "swing";
      if (backdrop.created && backdrop.visible) {
        $(backdrop.domEl).animate({opacity: 0}, speed, ease);
        $(backdrop.domEl).removeClass('active');
        backdrop.visible = false;
      }
      if (modalWindow.created) {
        $(modalWindow.domEl).animate({opacity: 0, marginTop: 0}, speed, ease, function () {
          $(modalWindow.domEl).removeClass('active');
          $(modalWindow.domEl).removeClass('error');
          modalWindow.domEl.remove();
          modalWindow.scope.$destroy();
          modalWindow.scope = null;
          modalWindow.domEl = null;
          modalWindow.created = false;

          if (callbackOnClose) {
            callbackOnClose();
          }
        });
      }
    };

    modalService.openDialog = function (modalOptions) {
      var modalInstance = {
        close: function (callbackOnClose) {
          closeDialog(modalInstance, modalOptions, callbackOnClose);
        }
      };

      util.log("MODAL OPTIONS", modalOptions);

      if (!modalOptions.template && !modalOptions.templateUrl) {
        throw new Error('One of template or templateUrl options is required.');
      }

      var templateAndResolvePromise =
        $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve)));

      templateAndResolvePromise.then(function (tplAndVars) {
        var modalScope = (modalOptions.scope || $rootScope).$new();
        modalScope.close = modalInstance.close;

        var ctrlInstance, ctrlLocals = {};
        var resolveIter = 1;

        //controllers
        if (modalOptions.controller) {
          ctrlLocals.$scope = modalScope;
          ctrlLocals.$modalInstance = modalInstance;
          angular.forEach(modalOptions.resolve, function (value, key) {
            ctrlLocals[key] = tplAndVars[resolveIter++];
          });

          ctrlInstance = $controller(modalOptions.controller, ctrlLocals);
        }


        open(modalInstance, {
          scope: modalScope,
          content: tplAndVars[0]
        }, modalOptions);

      });
    };
    modalService.getModalEl = function () {
      if (modalWindow) {
        return modalWindow.domEl;
      }
      return null;
    };

    return modalService;
  }]);

generalModule.factory('shakeService', function () {
  var me = {};
  me.shake = function (obj) {
    var l = (Math.random() < 0.5 ? -2 : 2);
    for (var i = 0; i < 10; i++) {
      $(obj).animate({'margin-left': (l = -l) + 'px'}, 10 + (i * 2));
    }
    $(obj).animate({'margin-left': 0}, 5);
  };
  return me;
});

generalModule.factory('EventManager', function () {
  return function () {
    var events = {};

    return {
      emit: emit,
      subscribe: subscribe,
      getEventSubscriptionFunc: getEventSubscriptionFunc,
      unsubscribe: unsubscribe,
    };

    /**
     * @param {string} name
     * @param {*} [data]
     */
    function emit(name, data) {
      validateEventName(name);

      var callbacks = events[name];

      if (!callbacks) {
        console.info('Event `', name, '` with no subscribers was emitted.');
        return;
      }

      callbacks.forEach(function (callback) {
        callback.call(this, data);
      });
    }

    /**
     * @param {string} name
     * @param {function} callback
     */
    function subscribe(name, callback) {
      validateEventName(name);
      validateCallback(callback);

      var callbacks = events[name];

      if (!callbacks) {
        callbacks = events[name] = [];
      }

      callbacks.push(callback);

      return unsubscribe.bind(null, name, callback);
    }

    /**
     * Returns a function which lets you subscribe to the '{@param name}' event.
     * @param {string} name
     */
    function getEventSubscriptionFunc(name) {
      return subscribe.bind(null, name);
    }

    /**
     * Generally you should use the unsubscribe function
     * returned by {@link subscribe}. This method is public only just in case.
     * @param {string} name
     * @param {function} callback
     */
    function unsubscribe(name, callback) {
      validateEventName(name);

      var callbacks = events[name];

      if (!callbacks) {
        console.warn('Attempt to unsubscribe from the unknown event `{0}`.'.format(name));
        return;
      }

      var callbackIndex = callbacks.indexOf(callback);

      if (callbackIndex === -1) {
        console.warn('Given callback was not found for the event `{0}`.'.format(name));
        return;
      }

      callbacks.splice(callbackIndex, 1);
    }

    function validateEventName(name) {
      if (!name) {
        throw new TypeError('Expected event name to be a non-empty string, but got ' + name);
      }
    }

    function validateCallback(callback) {
      if (typeof callback !== 'function') {
        throw new TypeError('Expected callback to be a function, but got ' + callback);
      }
    }
  }
});

generalModule.directive('customScript', ['$parse', function ($parse) {
  return {
    restrict: 'EA',
    scope: {},
    link: function (scope, element) {
      function replaceVariables(replacement) {
        var variableKey = replacement.substring(2, replacement.length - 1);
        var scopeValue = $parse(variableKey)(scope.$parent);

        return typeof scopeValue === 'string' ? '\"' + scopeValue + '\"' : scopeValue;
      }

      function interpolateParentScopeVars(scriptText) {
        if (scriptText) {
          return scriptText.replace(/#{(.*?)}/g, replaceVariables);
        }

        return scriptText;
      }

      function revertSpecialSymbols(scriptText) {
        return scriptText
          .replace(/&lt;/g, '<')
          .replace(/&gt;/g, '>')
          .replace(/&amp;/g, '&')
          .replace(/&quot;/g, '"');
      }

      function wrapIntoTryCatch(scriptText) {
        try {
          scriptText = revertSpecialSymbols(interpolateParentScopeVars(scriptText));
        } catch (e) {
          console.error(e);
        }

        return 'try {\n' + scriptText + '\n} catch (e) { console.error(e); }';
      }

      function appendCustomScript() {
        var script = document.createElement('script');
        var scriptText = wrapIntoTryCatch(element.html());

        script.type = 'text/javascript';
        script.innerHTML = scriptText;

        element.empty();

        document.body.appendChild(script);
      }

      element.ready(appendCustomScript);
    }
  };
}]);

generalModule.directive('boilerplateCloseButton', ['configService', function (configService) {
  return {
    restrict: 'E',
    transclude: true,
    replace: true,
    template: "<div " +
      "ng-if='isShowBoilerplateCloseButton()' " +
      "class='boilerplate-close-button' " +
      "ng-click='close()'></div>",
    link: function (scope, element, attr) {
      scope.isShowBoilerplateCloseButton = function () {
        var closeButtonType = configService.get().closeButtonType;
        var showCloseButton = getParameterByName('showCloseButton') !== 'false';
        var isBoilerplateBtnType = closeButtonType === 'boilerplate';

        return showCloseButton && isBoilerplateBtnType;
      }
    }
  };
}]);

/**
 * Added this because IE doesn't support `position: sticky;`.
 * This is a JS version of a CSS rule
 *     [pn-sticky] {
 *       position: sticky;
 *       bottom: 0;
 *     }
 */
generalModule.directive('pnSticky', [
  '$timeout',
  '$interval',
  'utilsService',
  function (
    $timeout,
    $interval,
    utilsService
  ) {
    return {
      restrict: 'A',
      link: function ($scope, $element) {
        var $parent = $element.parent();
        var parent = $parent[0];

        $parent.scroll(utilsService.throttle(parentScrollHandler, 200));

        // Parent may have scroll from the start, but if it's contents
        // are loaded asynchronously, we don't know when the scroll appears.
        // So we use an interval which is cancelled on the first scroll.
        var initHandlerInterval = $interval(initialChecker, 100, 100);
        var isInitialCheckerCancelled = false;
        var isFixed = false;

        $scope.$on('$destroy', cancelInitialChecker);

        function parentScrollHandler() {
          cancelInitialChecker();

          if (parent.scrollHeight > parent.clientHeight) {
            if (!isFixed) {
              $element.css({
                position: 'fixed',
                bottom: '0',
              });
              isFixed = true;
            }
          } else {
            if (isFixed) {
              $element.css({
                position: 'static',
                bottom: '',
              });
              isFixed = false;
            }
          }
        }

        function initialChecker() {
          if (parent.scrollHeight > parent.clientHeight) {
            $element.css({
              position: 'fixed',
              bottom: '0',
            });
            cancelInitialChecker();
          }
        }

        function cancelInitialChecker() {
          if (!isInitialCheckerCancelled) {
            $interval.cancel(initHandlerInterval);
            isInitialCheckerCancelled = true;
          }
        }
      },
    };
  }
]);

generalModule.factory('windowStateService', [function () {
  function inIframe() {
    try {
      return window.self !== window.top;
    } catch (e) {
      return true;
    }
  }

  function inIframeOrChildWindow() {
    return inIframe() || window.opener;
  }

  return {
    checkIframeOrChildWindow: function () {
//            if (!inIframeOrChildWindow()) {
//                errorService().terminal('Window state is invalid ');
//                return false;
//            }
      return true;
    }
  }
}]);

generalModule.factory('exposeTemplateParams', function () {
  return function (params) {
    var genericProperties = [
      'aid',
      'debug',
      'displayMode',
      'iframeId',
      'offerId',
      'tags',
      'templateId',
      'templateVariantId',
      'url',
      'width'
    ];

    // do not forget to update composer property list in offer.js
    var composerProperties = [
      "trackingId",
      "experienceId",
      "experienceExecutionId",
      "experienceActionId"
    ];

    var paramsToScope = genericProperties.concat(composerProperties);

    var resultParams = {};
    angular.forEach(paramsToScope, function (paramName) {
      if (params[paramName]) {
        resultParams[paramName] = params[paramName];
      }
    });

    return resultParams;
  }
});

generalModule.factory('exposeCustomVariables', function () {
  return function (customVariablesJson) {
    var customVariables = {};
    try {
      customVariables = JSON.parse(customVariablesJson);
    } catch (e) {
    }
    return customVariables;
  };
});

generalModule.factory('exposeCustomCookies', function () {
  return function (customCookiesJson) {
    var customCookies = {};
    try {
      customCookies = JSON.parse(customCookiesJson);
    } catch (e) {
    }
    return customCookies;
  };
});

generalModule.factory('exposeActiveMeters', function () {
  return function (activeMetersJson) {
    var activeMeters = [];
    try {
      activeMeters = JSON.parse(activeMetersJson);
    } catch (e) {
    }
    return activeMeters;
  };
});

generalModule.service('integrationEventsService', function () {
  this.dispatchLocal = function (eventName, data) {
    IntegrationEvents.dispatchLocal(eventName, data);
  };

  // subscribe on events from integration scripts
  this.listenExternal = function (eventName, callback) {
    IntegrationEvents.listenExternal(eventName, callback);
  };

  this.listenLocal = function (eventName, callback) {
    IntegrationEvents.listenLocal(eventName, callback);
  };
});

generalModule.factory('topLocation', ['$window', 'eventService', '$q',
  function ($window, eventService, $q) {
    var topLocation = function () {
      var deferred = $q.defer();

      eventService.postMessage('getLocation', {
        resultCallback: function (params) {
          var parser = $window.document.createElement('a');
          parser.href = params.result;
          deferred.resolve(parser);
        }
      });

      return deferred.promise;
    };
    topLocation.hash = function (value) {
      eventService.postMessage('setLocationHash', {
        hash: value
      });
    };

    return topLocation;
  }]);

generalModule.factory('addQueryParameterToUrl', function () {
  return function (url, queryParameterName, queryParameterValue) {
    var urlFragment;
    var lastUrlIndexBeforeHash;
    if (url.indexOf('#') > 0) {
      lastUrlIndexBeforeHash = url.indexOf('#');
      urlFragment = url.substring(url.indexOf('#'), url.length);
    } else {
      urlFragment = '';
      lastUrlIndexBeforeHash = url.length;
    }

    var urlWithoutFragment = url.substring(0, lastUrlIndexBeforeHash);
    var urlParts = urlWithoutFragment.split('?');

    var newQueryString = '?';
    if (urlParts.length > 1) {
      var parameters = urlParts[1];
      if (parameters.length) {
        newQueryString += parameters + '&';
      }
    }

    newQueryString += queryParameterName + '=' + encodeURIComponent(queryParameterValue);

    return urlParts[0] + newQueryString + urlFragment;
  }
});

generalModule.factory('setupTrackingId', ['ngEventService', function (ngEventService) {
  return function (trackingId) {
    var oldTrackingId = piano._getTrackingId();
    piano._setTrackingId(trackingId);

    if (oldTrackingId !== trackingId) {
      ngEventService.fire(EVENT_TRACKING_ID_CHANGED, trackingId);
    }
  };
}]);

generalModule.service('utilsService', ['cookieService', function (cookieService) {
  this.isIphone = function () {
    return /iPhone/.test(navigator.userAgent) && !window.MSStream;
  };

  this.isIOS = function () {
    return !!navigator.platform && /iP(ad|hone|od)/.test(navigator.platform);
  };

  this.isFbOrInstagramApp = function () {
    var ua = navigator.userAgent || navigator.vendor || window.opera;
    return (ua.indexOf('FBAN') > -1) || (ua.indexOf('FBAV') > -1) || (ua.indexOf('Instagram') > -1);
  }

  /**
   * Checks if a given value is present in a collection using strict equality
   * for comparisons, i.e. ===
   * @param collection, Array
   * @param target, any
   * @returns boolean
   */
  this.contains = function (collection, target) {
    if (!angular.isArray(collection)) {
      util.log('method contains() works only with Arrays');
      return false;
    }

    return collection.some(function (item) {
      return item === target;
    });
  };

  /**
   * Gets the last element or last n elements of an array.
   * @param collection, array
   * @returns {*}
   */
  this.last = function (collection) {
    if (!angular.isArray(collection)) {
      util.log('method last() works only with Arrays');
      return;
    }

    return collection[collection.length - 1];
  };

  /**
   * Iterates over elements of a collection, executing the callback for each element.
   * Callbacks may exit iteration early by explicitly returning false
   * Objects are iterated like arrays
   * @param collection, array or object
   * @param callback
   */
  this.forEach = function (collection, callback) {
    if (angular.isArray(collection)) {
      collection.forEach(function (item, index) {
        callback(item, index);
      });

      return collection;
    }

    if (angular.isObject(collection)) {
      Object.keys(collection).forEach(function (key) {
        callback(collection[key], key);
      });

      return collection;
    }

    return collection;
  };

  /**
   * Creates an array of values by running each element in the collection through the callback.
   * Objects are iterated like arrays
   * @param collection, array or object
   * @param callback
   * @returns Array
   */
  this.map = function (collection, callback) {
    if (angular.isArray(collection)) {
      return collection.map(function (item, index) {
        return callback(item, index);
      });
    }

    if (angular.isObject(collection)) {
      return Object.keys(collection).map(function (key) {
        return callback(collection[key], key);
      });
    }

    return [];
  };

  /**
   * Reduces a collection to a value which is the accumulated result of running each element
   * in the collection through the callback, where each successive callback execution consumes
   * the return value of the previous execution. If accumulator is not provided the first element
   * of the collection will be used as the initial accumulator value.
   * @param collection
   * @param callback
   * @param accumulator
   */
  this.reduce = function (collection, callback, accumulator) {
    if (!angular.isArray(collection)) {
      return undefined;
    }

    return collection.reduce(callback, accumulator);
  };

  /**
   * Iterates over elements of a collection, returning the first element that
   * the callback returns truey for.
   * @param collection
   * @param callback
   */
  this.find = function (collection, callback) {
    if (!angular.isArray(collection)) {
      util.log('method find() works only with Arrays');
      return;
    }

    return collection.find(callback);
  };

  this.filter = function (collection, callback) {
    if (!angular.isArray(collection)) {
      util.log('method filter() works only with Arrays');
      // return empty array for lodash compability
      return [];
    }

    return collection.filter(callback);
  };

  /**
   * Creates a shallow clone of object excluding the specified properties. Property names may be
   * specified as individual arguments or as arrays of property names. If a callback is provided
   * it will be executed for each property of object omitting the properties the callback returns
   * truey for
   * @param object, Object or Array
   * @param fields, String or Array[string]
   */
  this.omit = function (object, fields) {
    var fieldsToOmit = [];
    var objectToParse = {};

    if (typeof fields === 'string') {
      fieldsToOmit = [fields];
    }

    if (angular.isArray(fields)) {
      fieldsToOmit = [].concat(fields);
    }

    if (angular.isArray(object)) {
      object.forEach(function (value, index) {
        objectToParse[index] = value;
      });
    }

    if (angular.isObject(object) && !angular.isArray(object)) {
      objectToParse = angular.extend({}, object);
    }

    fieldsToOmit.forEach(function (field) {
      delete objectToParse[field];
    });

    return objectToParse;
  };

  this.debounce = function (func, wait, immediate) {
    var timeout;
    return function () {
      var context = this;
      var args = arguments;
      var later = function () {
        timeout = null;
        if (!immediate) func.apply(context, args);
      };
      var callNow = immediate && !timeout;
      clearTimeout(timeout);
      timeout = setTimeout(later, wait);
      if (callNow) func.apply(context, args);
    };
  };

  this.setExtendExpiredAccessCookie = function (aid, value) {
    var expires = new Date();
    expires.setMonth(expires.getMonth() + 6);
    cookieService.setCookie(aid + '__eea', value ? 'true' : 'false', expires.toUTCString(), '/');
  }

  this.removeExtendExpiredAccessCookie = function (aid) {
    cookieService.eraseCookie(aid + '__eea', '/');
  }

  this.jwtDecode = function (token, options) {
    if (!token) {
      return '';
    }

    options = options || {};
    var pos = options.header === true ? 0 : 1;
    return JSON.parse(base64_url_decode(token.split('.')[pos]));
  };

  /**
   * The code was extracted from:
   * https://github.com/davidchambers/Base64.js
   */

  var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

  function InvalidCharacterError(message) {
    this.message = message;
  }

  InvalidCharacterError.prototype = new Error();
  InvalidCharacterError.prototype.name = 'InvalidCharacterError';

  function polyfill(input) {
    var str = String(input).replace(/=+$/, '');
    if (str.length % 4 === 1) {
      throw new InvalidCharacterError('\'atob\' failed: The string to be decoded is not correctly encoded.');
    }
    for (
      // initialize result and counters
      var bc = 0, bs, buffer, idx = 0, output = '';
      // get next character
      buffer = str.charAt(idx++);
      // character found in table? initialize bit storage and add its ascii value;
      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
        // and if not first of each 4 characters,
        // convert the first 8 bits to one ascii character
      bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
    ) {
      // try to find character in table (0-63, not found => -1)
      buffer = chars.indexOf(buffer);
    }
    return output;
  }

  var atob = window.atob && window.atob.bind(window) || polyfill;

  function b64DecodeUnicode(str) {
    return decodeURIComponent(atob(str).replace(/(.)/g, function (m, p) {
      var code = p.charCodeAt(0).toString(16).toUpperCase();
      if (code.length < 2) {
        code = '0' + code;
      }
      return '%' + code;
    }));
  }

  var base64_url_decode = function (str) {
    var output = str.replace(/-/g, '+').replace(/_/g, '/');
    switch (output.length % 4) {
      case 0:
        break;
      case 2:
        output += '==';
        break;
      case 3:
        output += '=';
        break;
      default:
        throw 'Illegal base64url string!';
    }

    try {
      return b64DecodeUnicode(output);
    } catch (err) {
      return atob(output);
    }
  };

  // https://learn.javascript.ru/task/throttle
  this.throttle = function (func, ms) {
    var isThrottled = false;
    var savedArgs;
    var savedThis;

    function wrapper() {
      if (isThrottled) {
        savedArgs = arguments;
        savedThis = this;
        return;
      }

      func.apply(this, arguments);

      isThrottled = true;

      setTimeout(function () {
        isThrottled = false;
        if (savedArgs) {
          wrapper.apply(savedThis, savedArgs);
          savedArgs = savedThis = null;
        }
      }, ms);
    }

    return wrapper;
  }

  /**
   * Given an array of functions, returns a function that calls all given functions one by one.
   * @param {Array<Function>} functionsToCall
   * @returns {Function}
   */
  this.combine = function (functionsToCall) {
    return function () {
      functionsToCall.forEach(function (func) {
        if (typeof func === 'function') {
          func();
        }
      });
    };
  }

  // from StringUtils.java
  var EMAIL_REGEXP = /^([_A-Za-z0-9-&№^=%'"!?*+./#\\$]+)@([_A-Za-z0-9-&№^=%'"!?*+./#\\]+)\.([_A-Za-z0-9-+.]+)$/;

  // from StringUtils.java
  this.isEmailValid = function (email) {
    var _email = email && email.trim();

    if (!_email) {
      return false;
    }

    if (_email.length > 255) {
      return false;
    }

    return EMAIL_REGEXP.test(_email);
  }

  this.queryStringToMap = function (url) {
    var urlParams = {};
    if (!url) {
      return urlParams;
    }
    var match,
      pl = /\+/g,  // Regex for replacing addition symbol with a space
      search = /([^&=]+)=?([^&]*)/g,
      decode = function (s) {
        return decodeURIComponent(s.replace(pl, " "));
      };
    while (match = search.exec(url)) {
      urlParams[decode(match[1])] = decode(match[2]);
    }
    return urlParams;
  }

  this.getAccountBasedProvidersIDs = function (accountBasedProviders) {
    if (!Array.isArray(accountBasedProviders) || !accountBasedProviders.length) {
      return [];
    }

    return accountBasedProviders.reduce(function (result, provider) {
      if (provider.id !== undefined) {
        result.push(provider.id);
      }

      return result;
    }, []);
  }
}]);

generalModule.factory('getTrackingId', function () {
  return function () {
    return piano._getTrackingId();
  };
});

generalModule.factory('trackExternalEvent', function () {
  return function (eventType, eventGroupId, customParams) {
    piano._logAutoMicroConversion(eventType, eventGroupId, customParams);
  };
});

generalModule.factory('interceptAjax', ['lang', function (lang) {
  /*
   * Override the wait panel
   */
  tinypass.waitLockedBy = null;
  // wait panel can be cause of freezes during user typing.
  tinypass.withoutWaitPanel = false;
  var EVENT_SHOW_WAIT_PANEL = "EVENT_SHOW_WAIT_PANEL";
  var waitEL = null;
  tinypass.showWaitPanel = function (id, content) {
    if (typeof window.CustomEvent === 'function') {
      document.dispatchEvent(new CustomEvent(EVENT_SHOW_WAIT_PANEL, {
        detail: {
          id: id,
          content: content
        }
      }));
    }
  };

  tinypass.hideWaitPanel = function (id) {
    if ((!id && tinypass.waitLockedBy === 'others') || id === tinypass.waitLockedBy) {
      if (waitEL) {
        waitEL.stop();
        waitEL.remove();
      }
      tinypass.waitLockedBy = null;
    }
  };

  return {
    appendLoaderTo: function (className) {
      document.addEventListener(EVENT_SHOW_WAIT_PANEL, function (event) {
        _showWaitPanel(event);
      });

      function _showWaitPanel(event) {
        if (tinypass.withoutWaitPanel || tinypass.waitLockedBy) {
          return;
        }
        tinypass.waitLockedBy = event.detail.id || 'others';
        if (waitEL) {
          waitEL.remove();
        }
        if (!event.detail.content) {
          waitEL = $('<div id="waitParent"><div id="waitPanel">' + lang.tr('Loading...') + '</div></div>');
        } else {
          waitEL = $('<div id="waitParent">' + event.detail.content + '</div>');
        }
        $('.' + className).prepend(waitEL);
        // waitEL.animate({opacity: 1}, 600);
      }
    }
  }
}]);

/**
 * Defines keys based on KeyboardEvent.key (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).
 * Complete list of key values can be found here:
 * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values.
 */
generalModule.factory('keysService', [
  function () {
    var service = {
      isEscape: isEscape,
      isEnter: isEnter,
    };

    return service;

    function isEscape(key) {
      // 'Esc' is IE-specific
      return key === 'Esc' || key === 'Escape';
    }

    function isEnter(key) {
      return key === 'Enter';
    }
  }
]);

generalModule.factory('windowService', ['$window', function ($window) {
  var newWindow;
  var timer;

  return {
    openWindow: openWindow,
  };

  function openWindow(params, onWindowClosedCallback) {
    clearTimer();
    closeWindow();

    newWindow = $window.open(params.url, params.target, params.features);

    timer = setInterval(function () {
      if (!newWindow) {
        clearTimer();
        return;
      }

      if (newWindow.closed) {
        onWindowClosedCallback && onWindowClosedCallback();
        clearTimer();
      }
    }, 1000);

    return newWindow;
  }

  function clearTimer() {
    if (timer) {
      clearInterval(timer);
      timer = null;
    }
  }

  function closeWindow() {
    if (newWindow) {
      newWindow.close();
      newWindow = null;
    }
  }
}]);

generalModule.filter('encodeURIComponent', ['$window', function ($window) {
  return $window.encodeURIComponent;
}]);

var Helper = function () {
};

Helper.wrapMethod = function (funcName, from, to) {
  to[funcName] = function (arg1, arg2, arg3) {
    return from[funcName](arg1, arg2, arg3);
  }
};

var IntegrationEvents = (function () {
  /**
   * Keep track of all available events in system
   * an error will be thrown if someone will try to send
   * event not listed here
   */
  var availableEvents = {
    'externalApiFieldset.change': 'externalApiFieldset.change',
    'ga.created': 'ga.created',
    'ga.performance.tracker.created': 'ga.performance.tracker.created'
  };

  var eventPrefixLocal = '_piano_._local_.';
  var eventPrefixExternal = '_piano_._external_.';

  /**
   * Use that method to send events FROM the angular component
   * to the outside world. Or better use angular wrapper -
   * IntegrationEventsService
   * @param eventName
   * @param data
   */
  function dispatchLocal(eventName, data) {
    throwIfNotAllowed(eventName);

    document.dispatchEvent(new CustomEvent(prefixedLocal(eventName), {detail: immutable(data)}));
  }

  /**
   * Use that method to send events TO the angular component
   * from the outside world.
   * @param eventName
   * @param data
   */
  function dispatchExternal(eventName, data) {
    throwIfNotAllowed(eventName);

    document.dispatchEvent(new CustomEvent(prefixedExternal(eventName), {detail: immutable(data)}));
  }

  /**
   * Listening events sent by angular components
   * @param eventName
   * @param callback
   */
  function listenLocal(eventName, callback) {
    document.addEventListener(prefixedLocal(eventName), function (data) {
      callback(data);
    });
  }

  /**
   * Listening events sent by the custom script / from template
   * @param eventName
   * @param callback
   */
  function listenExternal(eventName, callback) {
    document.addEventListener(prefixedExternal(eventName), function (data) {
      callback(data);
    });
  }

  function prefixedLocal(eventName) {
    return eventPrefixLocal + eventName;
  }

  function prefixedExternal(eventName) {
    return eventPrefixExternal + eventName;
  }

  function throwIfNotAllowed(eventName) {
    if (!(eventName in availableEvents)) {
      throw new Error('event ' + eventName + ' is not recognized');
    }
  }

  function immutable(data) {
    var isDate = angular.isDate(data);
    var isArray = angular.isArray(data);
    var isObject = angular.isObject(data);

    if (isDate) {
      return new Date(data);
    }

    if (isArray) {
      return angular.copy(data, []);
    }

    if (isObject && !isArray) {
      return angular.copy(data, {});
    }

    return data;
  }

  return {
    dispatchLocal: dispatchLocal,
    dispatchExternal: dispatchExternal,
    listenLocal: listenLocal,
    listenExternal: listenExternal
  };
}());

// https://tc39.github.io/ecma262/#sec-array.prototype.findIndex
if (!Array.prototype.findIndex) {
  Object.defineProperty(Array.prototype, 'findIndex', {
    value: function (predicate) {
      // 1. Let O be ? ToObject(this value).
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If IsCallable(predicate) is false, throw a TypeError exception.
      if (typeof predicate !== 'function') {
        throw new TypeError('predicate must be a function');
      }

      // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
      var thisArg = arguments[1];

      // 5. Let k be 0.
      var k = 0;

      // 6. Repeat, while k < len
      while (k < len) {
        // a. Let Pk be ! ToString(k).
        // b. Let kValue be ? Get(O, Pk).
        // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
        // d. If testResult is true, return k.
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
          return k;
        }
        // e. Increase k by 1.
        k++;
      }

      // 7. Return -1.
      return -1;
    }
  });
}

// Piano API available in iframe global scope
var piano = (function (integrationEvents) {
  var self = {};
  var module = {};

  /**
   * Listen events that are sent from angular
   * this is for integration purpose - to allow custom
   * scripts in the templates listen to events we
   * want them to be able to listen
   * @param eventName, see all available events in IntegrationEvents, add yours if you wish
   * @param callback
   */
  module.listen = function (eventName, callback) {
    integrationEvents.listenLocal(eventName, callback);
  };

  /**
   * Send an event to angular environment
   * (event from custom scripts)
   * this is for integration purpose - to allow custom
   * scripts in the templates communicate with Angular
   * components through our event API (we need to listen for a given
   * event in the component)
   * @param eventName, see all available events in IntegrationEvents, add yours if you wish
   * @param data, any data
   */
  module.externalEvent = function (eventName, data) {
    integrationEvents.dispatchExternal(eventName, data);
  };

  module._setTrackingId = function (trackingId) {
    self.trackingId = trackingId;
  };

  module._getTrackingId = function () {
    return self.trackingId;
  };

  var doLog = function (url, params) {
    if (!self.trackingId) {
      return;
    }
    var os = ((TPParam || {}).params || {}).os || 'desktop';
    switch (os) {
      case 'ios':
      case 'android':
        doLogForMobileSDK(url, params);
        break;
      default:
        parent.postMessage(JSON.stringify({event: 'iframeLogRequest', url: url, queryParams: params}), '*')
    }
  };

  var doLogForMobileSDK = function (url, params) {
    var queryParams = [];
    for (var key in params) {
      var value = params[key];
      queryParams.push(encodeURIComponent(key) + '=' + encodeURIComponent(typeof value === 'object' ? JSON.stringify(value) : value));
    }

    queryParams = queryParams.join('&');
    var queryString = url + '?' + queryParams;
    if (!util.debug && navigator.sendBeacon) {
      navigator.sendBeacon(queryString);
    } else {
      var request = new XMLHttpRequest();
      request.open('GET', queryString, false);
      request.send();
    }
  };

  module._logAutoMicroConversion = function (eventType, eventGroupId, customParams) {
    var logEventParams = {
      tracking_id: self.trackingId,
      event_type: eventType,
      event_group_id: eventGroupId,
      custom_params: (customParams || "")
    };

    if (typeof eventGroupId === 'undefined') {
      util.log('Parameter eventGroupId is required to log micro conversion.')
      return;
    }

    if (typeof eventType === 'undefined') {
      util.log('Parameter eventType is required to log micro conversion.')
      return;
    }

    doLog('/api/v3/conversion/logAutoMicroConversion', logEventParams)
  };

  /**
   * Send request about funnel step
   * All this function have duplicate in tp.log object
   * @param stepNumber
   * @param stepName
   * @param customParams
   */
  module.logFunnelStep = function (stepNumber, stepName, customParams) {
    var logEventParams = {
      tracking_id: self.trackingId,
      step_number: stepNumber,
      step_name: stepName,
      custom_params: (customParams || "")
    };

    if (typeof stepNumber === 'undefined') {
      util.log('Parameter stepNumber is required to log funnel step.')
      return;
    }
    if (typeof stepName === 'undefined') {
      util.log('Parameter stepName is required to log funnel step.')
      return;
    }

    doLog('/api/v3/conversion/logFunnelStep', logEventParams)
  };

  /**
   * Send request about micro conversion
   * This function have duplicate in tp.log object
   * @param eventGroupId
   * @param customParams
   */
  module.logMicroConversion = function (eventGroupId, customParams) {
    var logEventParams = {
      tracking_id: self.trackingId,
      event_group_id: eventGroupId,
      custom_params: (customParams || "")
    };

    if (typeof eventGroupId === 'undefined') {
      util.log('Parameter eventGroupId is required to log micro conversion.')
      return;
    }

    doLog('/api/v3/conversion/logMicroConversion', logEventParams)
  };

  /**
   * Send request about conversion
   * This function have duplicate in tp.log object
   * @param termId
   * @param termName
   * @param stepNumber
   * @param amount
   * @param currency
   * @param customParams
   * @param conversionCategory
   */
  var doLogConversion = function (termId, termName, stepNumber, amount, currency, customParams, conversionCategory) {
    var logParams = {
      tracking_id: self.trackingId,
      term_id: termId,
      term_name: termName
    };

    if (typeof termId === 'undefined') {
      util.log('Parameter termId is required to log conversion.')
      return;
    }
    if (typeof termName === 'undefined') {
      util.log('Parameter termName is required to log conversion.')
      return;
    }
    if (typeof stepNumber !== 'undefined') {
      logParams.step_number = stepNumber;
    }
    if (typeof amount !== 'undefined') {
      logParams.amount = amount;
    }
    if (typeof currency !== 'undefined') {
      logParams.currency = currency;
    }
    if (typeof customParams !== 'undefined') {
      logParams.custom_params = customParams;
    }
    if (typeof conversionCategory !== 'undefined') {
      logParams.conversion_category = conversionCategory;
    }

    doLog('/api/v3/conversion/log', logParams)
  };

  /**
   * Send request about conversion
   * This function have duplicate in tp.log object
   */
  module.logConversion = function (params) {
    if (typeof params === 'object') {
      doLogConversion(
        params.term_id,
        params.term_name,
        params.step_number,
        params.amount,
        params.currency,
        params.custom_params,
        params.conversion_category
      );
    } else {
      doLogConversion.apply(this, arguments);
    }
  };

  /**
   * Set user into template and reload content
   * @param userToken
   */
  module.reloadTemplateWithUserToken = function (userToken) {
  };

  return module;
}(IntegrationEvents));

var eventModule = angular.module('eventModule', ['generalModule']);

eventModule.factory('eventService', ['$window', '$rootScope', '$q', 'configService', function ($window, $rootScope, $q, configService) {

  var es = {};

  es.last = null;
  es.resultCallbacks = {};

  /**
   * Post a message to the parent frame
   * @param eventName
   * @param eventData
   */
  es.postMessage = function (eventName, eventData) {
    var os = ((TPParam || {}).params || {}).os || 'desktop';
    try {
      switch (os) {
        case 'ios':
          iosMessage(eventName, eventData);
          break;
        case 'android':
          androidMessage(eventName, eventData);
          break;
        default:
          desktopMessage(eventName, eventData);
      }
    } catch (e) {
      util.log("[EVENT SERVICE] Event wasn't expected: ", eventName);
    }
  };

  es.customPostMessage = function (eventName, eventData, origin, recipient) {
    var message = {};
    message.sender = getIFrameId();
    message.event = eventName;
    message.params = eventData;

    util.log("[EVENT SERVICE] Custom post message:" + eventName, message);
    $.postMessage(JSON.stringify(message), origin, recipient);
  };

  /**
   * Resize event
   * @param params
   */
  es.resizeEvent = function (params) {
    params.iframeId = getIFrameId();
    if (es.last === null) {
      es.postMessage('loaded', params);
      es.last = params;
    } else if (params.height !== es.last.height || params.width !== es.last.width) {
      var closeButtonTypeParam = configService.get().closeButtonType;

      if (closeButtonTypeParam !== undefined) {
        params.closeButtonType = closeButtonTypeParam;
      }

      es.postMessage('resize', params);
      es.last = params;
    }
  };

  /**
   * Purge event
   * @param params
   */
  es.purgeEvent = function (params) {
    es.postMessage('purge', params);
  };

  /**
   * Close event
   * @param params
   */
  es.closeEvent = function (params) {
    es.postMessage('close', params);
  };

  /**
   * Close and refresh event
   * @param params
   */
  es.closeAndRefreshEvent = function (params) {
    es.postMessage('closeAndRefresh', params);
  };

  /**
   * Fires after changing of the state
   * For example: After selecting a term in the offer
   * @param stateName
   * @param termObject
   */
  es.checkoutStateChange = function (stateName, termObject) {
    es.postMessage('checkoutStateChange',
      { stateName: stateName, offerId: TPParam.config.offerId, term: termObject });
  };

  /**
   *
   * @param params
   */
  es.startCheckoutEvent = function (params) {
    es.postMessage('startCheckout', params);
  };

  /**
   * Fires after initialization of the bank secure state
   */
  es.startThreeDBankSecure = function () {
    es.postMessage('startThreeDBankSecure');
  };

  /**
   * Fire a custom event - used for external integration
   * @param params
   */
  es.loginRequiredEvent = function (params) {
    var promiser = $q.defer();
    params.resultCallback = function (object) {
      promiser.resolve(object)
    };

    es.postMessage('loginRequired', params);
    return promiser.promise;
  };

  es.initContext = function () {
    var promiser = $q.defer();
    es.postMessage('initContext', {
      resultCallback: function (object) {
        promiser.resolve(object)
      }
    });
    return promiser.promise;
  };

  es.gigyaPasswordlessLoginEvent = function (params) {
    params.iframeId = getIFrameId();
    es.postMessage('gigyaPasswordlessLogin', params);
  };

  /**
   * Fire a custom event - used for external integration
   * @param params
   * @param name
   */
  es.customEvent = function (name, params) {
    es.postMessage(name, params);
  };

  /**
   * System error event.  Checkout process will stop
   */
  es.systemErrorEvent = function (params) {
    es.postMessage('error', params);
  };

  /**
   * Fire when users click ‘submit payment’
   */
  es.submitPayment = function (params) {
    es.postMessage('submitPayment', params);
  };

  /**
   * Fire when the checkout process has completed
   */
  es.completeEvent = function (params) {
    es.postMessage('complete', params);
  };

  /**
   * Fire when user already has access to resource
   */
  es.alreadyPurchasedEvent = function (params) {
    es.postMessage('alreadyPurchased', params);
  };

  /**
   * Fire when the checkout payment has error
   */
  es.checkoutPaymentErrorEvent = function (message) {
    es.postMessage('checkoutPaymentError', { message: message });
  };

  /**
   * Fire in mobile devices after login event click
   */
  es.loginEvent = function (params) {
    es.postMessage('login', params);
  };

  /**
   * Fire in mobile devices after register event click
   */
  es.registerEvent = function (params) {
    es.postMessage('register', params);
  };

  /**
   * Fire to request parent window sizes (width, height).
   */
  es.getParentSize = function () {
    es.postMessage('parentSize');
  };

  es.isMobileDevice = function () {
    return TPParam && TPParam.params && (TPParam.params.os === 'ios' || TPParam.params.os === 'android');
  };

  es.emitGAEvent = function (eventParams) {
    es.postMessage('emitGAEvent', eventParams);
  };

  es.emitMetricsEvent = function (eventParams) {
    es.postMessage('emitMetricsEvent', eventParams);
  };

  $().ready(function() {
    $.receiveMessage(function (event) {
      var postMessageParams;
      var ignoredOrigins = ["https://core.spreedly.com", "https://jsl.prod.obi.aol.com", "https://pay.datatrans.com",
        "https://vpos.infonet.com.py:8888", "https://vpos.infonet.com.py", "https://flex.cybersource.com", "https://testflex.cybersource.com"];//non-JSON messages
      try {
        util.log("[EVENT SERVICE] Received message:", event);

        if (ignoredOrigins.indexOf(event.origin) !== -1) {
          return;
        }

        // remove comments from the event data, otherwise JSON.parse method fires error during the parse some events
        var eventData = event.data.replace(/\/\*.*?\*\//g, '');
        postMessageParams = JSON.parse(eventData);

        if (postMessageParams.sender && postMessageParams.sender.indexOf('piano-id-') === 0) {
          postMessageParams.event = postMessageParams.sender + '-' + postMessageParams.event;
        }
        if(postMessageParams.eventName === 'init-social'){
          postMessageParams = {
            event: 'init-social',
            params: postMessageParams
          };
        }
        if (postMessageParams.event && postMessageParams.event.indexOf('-3ds-complete') !== -1) {
          postMessageParams = {
            event: '3ds-complete',
            params: postMessageParams
          };
        }

        $rootScope.$broadcast(postMessageParams.event, postMessageParams.params);
        if (postMessageParams.params && postMessageParams.params.resultCallbackId) {
          if (es.resultCallbacks[postMessageParams.params.resultCallbackId]) {
            es.resultCallbacks[postMessageParams.params.resultCallbackId](postMessageParams.params);
            delete es.resultCallbacks[postMessageParams.params.resultCallbackId];
          }
        }
      } catch (err) {
        util.log("[EVENT SERVICE][Could not parse message:", event);
        return;
      }
    });
  });

  function iosMessage(eventName, eventData) {
    window.webkit.messageHandlers[eventName].postMessage(eventData);
  }

  function androidMessage(eventName, eventData) {
    var convertedData = JSON.stringify(eventData);
    PianoAndroid[eventName](convertedData);
  }

  function getIFrameId() {
    return getParameterByName('iframeId');
  }

  function desktopMessage(eventName, eventData) {
    var message = {};
    es.parentURL = getParameterByName('url');
    if (!es.parentURL) {
      es.parentURL = (window.location !== window.parent.location) ? document.referrer : document.location.href;
    }
    message.sender = getIFrameId();
    message.displayMode = getParameterByName('displayMode');
    message.recipient = "opener";
    message.event = eventName;
    message.params = eventData;

    if (eventData && eventData.resultCallback) {
      var resultEventId = _randomString(16);
      message.params.resultCallbackId = resultEventId;
      es.resultCallbacks[resultEventId] = eventData.resultCallback;

      delete eventData["resultCallback"];
    }

    util.log("[EVENT SERVICE] Post message:" + eventName, message);
    $.postMessage(JSON.stringify(message), es.parentURL, message.displayMode === 'popup' ? $window.opener : $window.parent);
  }

  return es;
}]);

var errorModule = angular.module('errorModule', ['generalModule']);

errorModule.factory('errorService', ['$rootScope', 'eventService', 'ngEventService',
  function ($rootScope, eventService, ngEventService) {
    /**
     *  This is error map by errorInstanceId
     *  Look like following structure:
     *  {
     *    'errorInstanceId' : {
     *          errors : [
     *             {
     *                type: "global", "component", "terminal" was displayed
     *                field: "field", - optional parameter
     *                fieldTitle: "user frendle field name", - optional parameter
     *                message: "error message",
     *                displayed: true/false  error was displayed
     *             }
     *         ]
     *       childs : [
     *         errors: []
     *         childs: []
     *       ],
     *       errorInstanceId : 'errorInstanceId',
     *       $id: "DD" // scope $id.
     *    }
     *  }
     */
    var errors = {};

    var _isScope = function (obj) {
      return obj && obj.$evalAsync && obj.$watch;
    };

    var _TYPES = {
      GLOBAL: "global",
      COMPONENT: "component",
      TERMINAL: "terminal"
    };

    return function ($scope) {
      var me = {};
      var myErrors = null;

      var init = function () {
        var parentErrorInstanceId, getParentErrorInstanceId;

        if ($scope) {
          if (!_isScope($scope)) {
            throw Error("The first parameter should be scope");
          }

          if (!$scope.errorInstanceId) {
            $scope.errorInstanceId = _randomString(16);
            myErrors = { children: [], errors: [], errorInstanceId: $scope.errorInstanceId, $id: $scope.$id };
            errors[$scope.errorInstanceId] = myErrors;

            getParentErrorInstanceId = function (sc) {
              if (!sc) {
                return null;
              }

              if (sc.errorInstanceId) {
                return sc.errorInstanceId;
              }

              if (sc.$parent) {
                return getParentErrorInstanceId(sc.$parent);
              }
            };

            parentErrorInstanceId = getParentErrorInstanceId($scope.$parent);

            if (parentErrorInstanceId) {
              var parentScope = errors[parentErrorInstanceId];
              parentScope.children.push(myErrors);
            }
          } else {
            myErrors = errors[$scope.errorInstanceId];
          }
        }
      };

      me.error = function (type, error) {
        if (!$scope) {
          throw Error("The $scope is undefined");
        }

        var _error = error;

        if (!_error) {
          _error = {}
        }

        if (angular.isString(_error)) {

          _error = {
            message: error
          }
        }

        _error.type = type;
        _error.errorInstanceId = $scope.errorInstanceId;

        myErrors.errors.push(_error);

        ngEventService.fire(EVENT_ERRORS_CHANGED);
      };

      me.global = function (error) {
        me.error(_TYPES.GLOBAL, error);
      };

      me.globals = function (errorsList) {
        angular.forEach(errorsList, function (error) {
          me.error(_TYPES.GLOBAL, error);
        });
      };

      me.component = function (error) {
        me.error(_TYPES.COMPONENT, error);
      };

      me.components = function (errorsList) {
        angular.forEach(errorsList, function (error) {
          me.error(_TYPES.COMPONENT, error);
        });
      };

      me.terminal = function (error) {
        var _error = error;
        if (!_error) {
          _error = {}
        }

        if (angular.isString(_error)) {

          _error = {
            message: error
          }
        }

        _error.type = _TYPES.TERMINAL;
        if ($scope) {
          _error.errorInstanceId = $scope.errorInstanceId;
        }

        ngEventService.fire(EVENT_TERMINAL_ERROR, _error);

        $rootScope.terminalError = _error.message;
        $rootScope.terminalErrorHeading = _error.heading;
        eventService.systemErrorEvent({ message: _error.message });
      };

      me.reset = function () {
        if ($scope) {
          if (myErrors.errors.length > 0) {
            myErrors.errors = [];
            ngEventService.fire(EVENT_ERRORS_CHANGED, $scope.errorInstanceId);
          }
        }
      };

      me.errors = function (withoutChildren) {
        var result = [];
        if ($scope) {
          var getErrors = function (errorInstance) {
            angular.forEach(errorInstance.errors, function (error) {
              result.push(error)
            });
            if (!withoutChildren) {
              angular.forEach(errorInstance.children, function (child) {
                getErrors(child)
              })
            }
          };
          getErrors(myErrors)
        } else {
          angular.forEach(errors, function (errorInstance) {
            angular.forEach(errorInstance.errors, function (error) {
              result.push(error)
            });
          });
        }

        return result;
      };
      me.childrenErrors = function () {
        var result = [];
        if ($scope) {
          var getErrors = function (errorInstance) {
            angular.forEach(errorInstance.errors, function (error) {
              result.push(error)
            });
            angular.forEach(errorInstance.children, function (child) {
              getErrors(child)
            })
          };
          angular.forEach(myErrors.children, function (child) {
            getErrors(child)
          });
        } else {
          result = [];
        }

        return result;
      };

      me.resetDisplayed = function () {
        var id = me.getId();
        angular.forEach(errors, function (errorInstance) {
          var _errors = [];
          angular.forEach(errorInstance.errors, function (error) {
            if (error.displayedOn !== id) {
              _errors.push(error)
            }
          });

          errorInstance.errors = _errors
        });

        ngEventService.fire(EVENT_ERRORS_CHANGED, $scope.errorInstanceId);
      };

      me.TYPES = _TYPES;
      me.getId = function () {
        if ($scope) {
          return $scope.errorInstanceId;
        }
        return null;
      };

      init();
      return me;
    }
  }]);

var tpComponentsModule = angular.module('tpComponentsModule', ['generalModule', 'containerServiceModule']);

/**
 * All links that href to an external URL will be set to target="_blank"
 * _parent is also permitted.  All other values will be defaulted to _blank.
 *
 * Registers "external_link" event when user follows external link.
 */
tpComponentsModule.directive('a', ['trackExternalEvent', 'getTrackingId', 'addQueryParameterToUrl', '$timeout',
  'ngEventService',
  function (trackExternalEvent, getTrackingId, addQueryParameterToUrl, $timeout, ngEventService) {
    function getURLToTrack(href) {
      var urlToTrack = href.split(/[?#]/)[0];
      var lastCharacterNumber = urlToTrack.length - 1;
      if (urlToTrack[lastCharacterNumber] === '/') {
        urlToTrack = urlToTrack.slice(0, lastCharacterNumber)
      }
      return urlToTrack;
    }

    return {
      restrict: 'E',
      link: function (scope, element) {
        var unsubTrackingIdChanged;
        $timeout(function () {
          var elAttr = element.attr("href");
          if (elAttr && elAttr.indexOf("http") === 0) {
            //The only allowed targets are _parent and _blank. _blank is the default
            if (element.attr("target") !== "_parent" && element.attr("target") !== "_top") {
              element.attr("target", "_blank");
            }
            addTrackingIdToHref();
            unsubTrackingIdChanged = ngEventService.subscribe(EVENT_TRACKING_ID_CHANGED, function () {
              $timeout(function () {
                addTrackingIdToHref();
              });
            });
          }

          function addTrackingIdToHref() {
            var needTrackingId = element.attr("noptid") === undefined;
            var trackingId = getTrackingId();
            if (needTrackingId && trackingId) {
              // add trackingId into external links
              element.attr('href', addQueryParameterToUrl(element.attr('href'), '_ptid', trackingId));
            }
          }
        });

        element.on('click', function (event) {
          if (event.type === 'click') {
            var href = element.attr("href") || "";

            if (href.lastIndexOf("http", 0) === 0) {
              // href starts with "http" => track

              trackExternalEvent('EXTERNAL_LINK', decodeURI(getURLToTrack(href)), {
                'href': encodeURI(href)
              });
            }
          }
        });

        scope.$on('$destroy', function () {
          unsubTrackingIdChanged && unsubTrackingIdChanged();
        });
      }
    };
  }]);

tpComponentsModule.directive('radioTrackBy', function () {
  return {
    restrict: "A",
    scope: {
      ngModel: "=",
      ngValue: "=",
      radioTrackBy: "@"
    },
    link: function (ng) {
      if (ng.ngValue[ng.radioTrackBy] === ng.ngModel[ng.radioTrackBy]) {
        ng.ngModel = ng.ngValue;
      }
    }
  };
});

tpComponentsModule.factory('getExternalEventParams', function () {
  function lowerCaseFirstLetter(string) {
    return string.charAt(0).toLowerCase() + string.slice(1);
  }

  function getExternalEventParams(attrs) {
    var params = {};
    for (var attrName in attrs) {
      if (attrs.hasOwnProperty(attrName) && attrName.indexOf('externalEvent') === 0 && attrName !== 'externalEvent') {
        params[lowerCaseFirstLetter(attrName.split('externalEvent')[1])] = attrs[attrName];
      }
    }
    return params;
  }

  return getExternalEventParams;
});

/**
 * Send "customEvent" if click on element with directive.
 */
tpComponentsModule.directive('externalEvent', ['eventService', 'getExternalEventParams', 'trackExternalEvent',
  function (eventService, getExternalEventParams, trackExternalEvent) {
    return {
      restrict: 'A',
      link: function (scope, element, attrs) {
        element.on('submit click', function (event) {
          if (~['click', 'submit'].indexOf(event.type)) {
            // track external event
            var externalEventParams = getExternalEventParams(attrs);
            trackExternalEvent('EXTERNAL_EVENT', attrs.externalEvent, externalEventParams);

            eventService.customEvent('customEvent', {
              eventName: attrs.externalEvent,
              params: getExternalEventParams(attrs)
            });
          }
        });
      }
    };
  }]);

/**
 * This directive will advance the checkout process to the next view
 */
tpComponentsModule.directive('showIf', ['$animate', function ($animate) {
  return {
    restrict: 'A',
    link: function (scope, element, attr) {
      scope.$watch(attr.showIf, function ngShowWatchAction(value) {
        element.html(toBoolean(value) ? value : '');
        element.toggleClass('ng-hide', toBoolean(value));
      });
    }
  };
}]);

/**
 * @returns {Boolean} Returns 'true' if 'mobile device', 'false' if 'other device'.
 */
tpComponentsModule.factory('checkMobile', ['$q', '$timeout', 'containerService',
  function ($q, $timeout, containerService) {
    return function () {
      var width = containerService.getNewWidth();
      return width <= 600;
    }
  }]);

/**
 * Show content if mobile device
 */
tpComponentsModule.directive('mobile', ['checkMobile', function (checkMobile) {
  return {
    restrict: 'A',
    transclude: true,
    scope: {},
    template: '<div class="mobile-mode" ng-if="check()" ng-transclude></div>',
    controller: ["$scope", function (scope) {
      scope.check = function () {
        return checkMobile()
      };
    }]
  };
}]);

/**
 * Show content if not mobile device
 */
tpComponentsModule.directive('desktop', ['checkMobile', function (checkMobile) {
  return {
    restrict: 'A',
    transclude: true,
    scope: {},
    template: '<div class="desktop-mode" ng-if="check()" ng-transclude></div>',
    controller: ["$scope", function (scope) {
      scope.check = function () {
        return !checkMobile()
      };
    }]
  };
}]);

/**
 * Run your function on keyup enter key
 */
tpComponentsModule.directive("onEnter", ['$parse', function ($parse) {
  return function (scope, element, attr) {
    var fn = $parse(attr['onEnter']);
    element.bind('keyup', function (event) {
      if (event.keyCode === 13) {
        scope.$apply(function () {
          fn(scope, { $event: event });
        });
      }
    });
  }
}]);

tpComponentsModule.directive("errorMessage", ['$parse', function ($parse) {
  return {
    scope: false,
    controller: ['$scope', '$element', '$attrs', 'ngEventService', 'errorService', 'shakeService',
      function ($scope, $element, $attrs, ngEventService, errorService, shakeService) {
        var types = errorService($scope).TYPES;
        var errorInstanceId = errorService($scope).getId();
        var field = $attrs['name'];
        var style = $attrs['errorMessage'];
        var errorEl = null;

        var clearErrors = function () {
          if (errorEl) {
            errorEl.remove();
          }
          $element.removeClass('error');
        };

        var unsubErrorsChanged = ngEventService.subscribe(EVENT_ERRORS_CHANGED, function () {
          clearErrors();
          var myError = null;
          var errors = errorService($scope).errors();

          angular.forEach(errors, function (error) {
            if (angular.isObject(error) && error.field === field && error.type === types.COMPONENT) {
              myError = error;
            }
          });

          if ($element.is(":visible") && myError && (!myError.displayed || myError.displayedOn === errorInstanceId)) {
            myError.displayed = true;

            if (style === "shake") {
              shakeService.shake($element);
              $element.addClass('error');
            } else {
              errorEl = $("<div class='" + style + "'>" + myError.message + "</div>");
              $element.after(errorEl);
              $element.addClass('error');
            }
          }
        });

        $element.click(function () {
          clearErrors();
        });

        $scope.$on('$destroy', function () {
          unsubErrorsChanged();
        });
      }]
  }
}]);

/**
 * Directive to set modal width from template
 */
tpComponentsModule.directive('config', ['containerService', 'configService',
  function (containerService, configService) {
    return {
      restrict: 'E',
      link: function (scope, element, $attrs) {
        if (isNumber($attrs.width)) {
          containerService.setConfigWidth($attrs.width);
          containerService.resize();
        }

        var hasProperties = false;

        angular.forEach($attrs, function (value, name) {
          if (!startsWith(name, '$')) {
            hasProperties = true;
            configService.setProperty(name, value);
          }
        });

        if (hasProperties) {
          configService.changed();
        }

        function startsWith(str, prefix) {
          return (str.substr(0, prefix.length) === prefix);
        }
      }
    };
  }]);

/**
 * Directive to hide 'no-child' blocks, emulate css selector :black
 */

tpComponentsModule.directive('hideIfBlank', ['$animate',
  function ($animate) {
    return {
      link: function (scope, element) {
        scope.$watch(function () {
        }, function () {
          var usefulText = element.text().replace(/[\s\uFEFF\xA0\n]/gim, '');
          var isBlank = element.children().length === 0 && usefulText === '';
          element.toggleClass('ng-hide', isBlank);
        });
      }
    };
  }
]);

tpComponentsModule.directive('reCaptcha', ['ngEventService', 'checkMobile', 'containerService',
  function (ngEventService, checkMobile, containerService) {

    var attemptsToRender = 3;
    var id;
    var resetSubscription;

    return {
      restrict: 'EA',
      template: "",
      scope: {
        key: '@',
        showResetButton: '=?',
        onResolve: '&?',
        onReady: '&?',
        onExpired: '&?'
      },
      link: link
    };

    function link($scope, $element) {
      var isMobile = false;

      if (!$scope.key) {
        console.warn('There is no re-captcha site-key. See more: https://developers.google.com/recaptcha/docs/display');
        return;
      }

      init();

      $scope.resolve = resolve;

      function init() {
        render(attemptsToRender);
        isMobileDevice();
        resetSubscription = subscribeToCaptchaReset();
      }

      $element.on('$destroy', resetSubscription);

      function render(attemps) {

        if (attemps === 0) {
          console.warn("ReCaptcha can't be initialized");
          return;
        }

        try {
          id = grecaptcha.render($element.get(0), {
            'sitekey': $scope.key,
            'callback': resolve,
            'expired-callback': function () {
              $scope.onExpired && $scope.onExpired();
            }
          });

          if ($scope.showResetButton) {
            $element.addClass('re-captcha--right-padded');
            addResetButton(id);
          }

          $(window).on('resize', _.debounce(onIframeResize, 300));

          if ($scope.onReady) {
            $scope.onReady({ id: id });
          }

        } catch (e) {
          setTimeout(function () {
            render(attemps--);
          }, 1000);
        }
      }

      function subscribeToCaptchaReset() {
        return ngEventService.subscribe('RECAPTCHA_RESET', function () {
          if (grecaptcha && grecaptcha.reset) {
            grecaptcha.reset(id);
          }
        });
      }

      function onIframeResize() {
        isMobileDevice();
        resizeCaptcha();
      }

      function resizeCaptcha() {
        var isWideScreen = containerService.getNewWidth() > 320;

        if (!isMobile) {
          $element.removeClass('re-captcha--mobile re-captcha--mobile-wide');
          return;
        }

        if (isWideScreen) {
          $element.addClass('re-captcha--mobile-wide');
        } else {
          $element.removeClass('re-captcha--mobile-wide');
        }

        $element.addClass('re-captcha--mobile');

      }

      function isMobileDevice() {
        isMobile = checkMobile();
      }

      function addResetButton(id) {
        if (grecaptcha && grecaptcha.reset) {
          var refreshButtonElement = document.createElement('div');
          refreshButtonElement.className = 'reset-icon pn-icon--refresh';
          refreshButtonElement.onclick = function () {
            grecaptcha.reset(id);
            addResetButton(id);
          };

          appendResetElement(refreshButtonElement);
        }
      }

      function appendResetElement(element) {
        if (!angular.element('.reset-icon.pn-icon--refresh').length) {
          $element.append(element);
        }
      }

      function resolve(response) {
        $element.addClass('captcha-resolved');

        if (!$scope.onResolve) {
          return;
        }

        $scope.$apply(function () {
          $scope.onResolve({ response: response });
        });
      }
    }
  }]);

tpComponentsModule.directive('ngEnter', function () {
  return function (scope, element, attrs) {
    element.bind("keydown keypress", function (event) {
      if (event.which === 13) {
        scope.$apply(function () {
          //noinspection JSUnresolvedVariable
          scope.$eval(attrs.ngEnter);
        });

        event.preventDefault();
      }
    });
  };
})

var userServiceModule = angular.module('userServiceModule', ['ui.router', 'ajaxServices', 'ngSanitize', 'generalModule', 'tp.i18n']);

userServiceModule.factory('userService', [
  '$rootScope', '$rootElement', '$q', 'tpHTTP', 'eventService',
  'ngEventService', 'errorService', 'gaService', 'lang', 'utilsService', 'cookieService',
  function (
          $rootScope, $rootElement, $q, tpHTTP, eventService,
          ngEventService, errorService, gaService, lang, utilsService, cookieService
  ) {
    var loginWindowId = _randomString(16);
    var loginWindow = null;
    var loginSuccessPosted = false;
    var loginSuccessCallbacks = [];

    var configProvider = function () {
      return {
        app: {},
        user: {},
        stats: {},
        // fills params that is passed to login iframe on creation in URL
        fillLoginIframeParams: emptyFn,

        // fills params for login required event to submit to Google Analytics
        fillLoginRequiredParamsToGoogleAnalytics: emptyFn,

        // fills params for login required event to submit to publisher's web site
        fillLoginRequiredEventParams: emptyFn,

        // fills params for login success event to submit to publisher's web site
        fillLoginSuccessEventParams: emptyFn
      }
    }

    var userService = {};

    userService.$rootScope = $rootScope;
    userService.rootElement = $rootElement;

    var emptyFn = function () {
    };

    userService.getConfig = function () {
      return {
        app: configProvider().app,
        user: configProvider().user,
        stats: configProvider().stats,

        // fills params that is passed to login iframe on creation in URL
        fillLoginIframeParams: configProvider().fillLoginIframeParams || emptyFn,

        // fills params for login required event to submit to Google Analytics
        fillLoginRequiredParamsToGoogleAnalytics: configProvider().fillLoginRequiredParamsToGoogleAnalytics || emptyFn,

        // fills params for login required event to submit to publisher's web site
        fillLoginRequiredEventParams: configProvider().fillLoginRequiredEventParams || emptyFn,

        // fills params for login success event to submit to publisher's web site
        fillLoginSuccessEventParams: configProvider().fillLoginSuccessEventParams || emptyFn
      };
    };

    userService.init = function (getConfigFn) {
      configProvider = getConfigFn;

      if (!TPParam.LOGIN) {
        throw "Login handler URL (variable TPParam.LOGIN) is not set";
      }
    };

    /**
     * Will return true is we have a valid logged in user
     */
    userService.isUserValid = function () {
      return userService.getConfig().user && userService.getConfig().user.valid === true;
    };

    userService.getUserUid = function () {
      return userService.getConfig().user && userService.getConfig().user.uid;
    };

    /**
     * Will return true if current date greater than last login time plus token expire time
     * Last login time will be set only if "extend expires access" is enabled
     */
    userService.isUserReadOnly = function () {
      if (this.isPianoIdUserProvider()) {
        return false;
      }

      var eea = cookieService.getCookie(userService.getConfig().app.aid + '__eea');
      var user = userService.getConfig().user;
      return eea !== 'true' ? false : Date.now() > (parseInt(user.login_timestamp, 10) + user.token_expiration);
    };

    userService.isUserConfirmed = function () {
      return userService.getConfig().user && userService.getConfig().user.confirmed !== false;
    };

    userService.allowLogout = function () {
      return userService.isUserValid() && userService.isProviderAllowLogout();
    };

    userService.allowLogin = function () {
      return userService.allowTinypassAccountsLogin() || userService.isGigyaUserProvider();
    };

    userService.allowTinypassAccountsLogin = function () {
      var app = userService.getConfig().app;
      return app && app.useTinypassAccounts;
    };

    userService.isPublisherUserRefProvider = function () {
      return getUserProvider() === 'publisher_user_ref';
    };

    userService.isGigyaUserProvider = function () {
      return getUserProvider() === 'gigya';
    };
    userService.isCondeUserProvider = function () {
      return getUserProvider() === 'conde';
    };
    userService.isPianoIdUserProvider = function () {
      return getUserProvider() === 'piano_id';
    };
    userService.isPianoIdLiteUserProvider = function () {
      return getUserProvider() === 'piano_id_lite';
    };
    userService.isJanrainUserProvider = function () {
      return getUserProvider() === 'janrain';
    };

    function getUserProvider() {
      var source = window.TPParam.params || window.TPParam.app || userService.getConfig().app;
      return source ? source.userProvider : '';
    }

    userService.allowMyAccountLogin = function () {
      return userService.allowTinypassAccountsLogin();
    };

    userService.allowTinypassAccountsLogout = function () {
      return userService.isProviderAllowLogout() && userService.isUserValid();
    };

    userService.isProviderAllowLogout = function () {
      return userService.allowTinypassAccountsLogin()
              || userService.isCondeUserProvider()
              || userService.isPianoIdUserProvider()
              || userService.isGigyaUserProvider()
              || userService.isJanrainUserProvider();
    };

    userService.logout = function () {
      if (userService.isProviderAllowLogout()) {
        eventService.postMessage("logout", {closeOnLogout: getParameterByName("closeOnLogout")});
      }
      utilsService.removeExtendExpiredAccessCookie(userService.getConfig().app.aid);
      loginSuccessPosted = false;
    };

    userService.loginSuccessNoPostMessage = function (params) {
      return postMessageLoginSuccess(params);
    };

    userService.onUserProfileUpdated = function (params) {
      eventService.postMessage("userProfileUpdateSuccess", params);
    };

    /**
     * Register function is the same as the login function except
     * that it specifies which screen start on on.  Obviously, that is register
     */
    userService.register = function () {
      return userService.login('register');
    };

    var loginDeferred;


    userService.checkUser = function (params) {
      return tpHTTP({
        method: 'get',
        url: '/checkout/user/check',
        params: params
      });
    };

    /**
     * Login method will open up a Login/Register popup if the app is configured
     * for tinypassAccounts.  Otherwise, it will fire a loginRequired event.
     */
    userService.login = function (startScreen, customParams) {
      function _generatePopup(iframeParams, src) {
        var width = parseInt(getParameterByName("parentWidth"), 10);
        var height = parseInt(getParameterByName("parentHeight"), 10);
        var w = iframeParams.width ? iframeParams.width : width;
        var h = iframeParams.height ? iframeParams.height : height;
        // Fixes dual-screen position   Most browsers   Firefox

        var dualScreenLeft = parseInt(getParameterByName("parentDualScreenLeft"), 10);
        var dualScreenTop = parseInt(getParameterByName("parentDualScreenTop"), 10);
        var parentOuterHeight = parseInt(getParameterByName("parentOuterHeight"), 10);

        var left = ((width / 2) - (w / 2)) + dualScreenLeft;
        var top = ((parentOuterHeight / 2) - (h / 2)) + dualScreenTop;

        var newWindow = window.open(src, loginWindowId, 'scrollbars=yes,status=0,toolbar=0,resizable=1, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);

        // Puts focus on the newWindow
        //noinspection JSUnresolvedVariable
        if (window.focus) {
          newWindow.focus();
        }

        return newWindow;
      }

      /* Default start screen is login */
      if (!startScreen) {
        startScreen = 'login';
      }

      var aid = getParameterByName("aid");
      var hostUrl = getParameterByName("url");
      loginDeferred = $q.defer();
      var promise = loginDeferred.promise;

      eventService.postMessage("loginStart", {});

      promise.finally(function () {
        eventService.postMessage("loginEnd", {});
      });

      util.log('[USER SERVICE] Cannot continue without valid user...sending loginRequiredEvent');
      if (userService.allowTinypassAccountsLogin()) {
        loginSuccessPosted = false;
        var iframeParams = {
          displayMode: "popup",
          aid: aid,
          width: 360,
          height: 660,
          state: startScreen,
          iframeId: "login-" + _randomString(10),
          host_url: hostUrl,
          url: window.location.href
        };
        userService.getConfig().fillLoginIframeParams(iframeParams);

        var src = TPParam.LOGIN + "?" + $.param(iframeParams, true) + '#/' + startScreen;

        loginWindow = _generatePopup(iframeParams, src);


        ngEventService.subscribe('readyToSubmitStats', function () {
          eventService.customPostMessage('submitStats', userService.getConfig().stats, document.location.origin, loginWindow);
        });

        ngEventService.subscribe("loginSuccess", function (event, params) {
          params = params || {};
          params.reloadAfterLogin = true;

          loginDeferred.resolve(params);
          onExternalLogin(params);
          if (loginWindow && loginWindow.closed === false) {
            try {
              loginWindow.document.body.innerHTML = null;
            } catch (e) {
            }
            loginWindow.close();
          }
        });

      } else {
        var gaEventParams = {
          aid: aid
        };
        userService.getConfig().fillLoginRequiredParamsToGoogleAnalytics(gaEventParams);

        gaService.sendGoogleAnalyticsEvent({
          eventAction: 'loginRequired', eventLabel: 'Login required',
          params: gaEventParams
        });

        var loginRequiredEventParams = {};
        loginRequiredEventParams.startScreen = startScreen;
        userService.getConfig().fillLoginRequiredEventParams(loginRequiredEventParams);

        fillCustomParams(loginRequiredEventParams, customParams);

        eventService.loginRequiredEvent(loginRequiredEventParams).then(function (object) {
          if (object.callbackNotFound || object.result !== false) {
            loginDeferred.reject(false);
            errorService().terminal(lang.trc("checkout.platform", "Cannot start checkout. User not logged in"));
          }
        });
      }
      return loginDeferred.promise;
    };

    function fillCustomParams(eventParams, customParams) {
      if (customParams) {
        return Object.assign(eventParams, customParams);
      }

      return eventParams;
    }

    userService.onLoginSuccess = function (callback, oneTime) {
      if (callback) {
        loginSuccessCallbacks.push({callback: callback, oneTime: oneTime})
      }
    };

    userService.cleanSuccessLoginCallbacks = function () {
      loginSuccessCallbacks = utilsService.filter(loginSuccessCallbacks, function (c) {
        return !c.oneTime;
      });
    };

    userService.loginSuccessPosted = function () {
      return loginSuccessPosted;
    };

    userService.setLoginSuccessPosted = function (value) {
      loginSuccessPosted = value;
    };

    userService.onExternalLogin = onExternalLogin;

    /**
     * handle event from modal Login window
     */
    ngEventService.subscribe('changeLocale', function (event, params) {
      if (params && params.locale) {
        lang.list()
                .then(function (list) {
                  for (var index in list) {
                    if (list[index].locale === params.locale) {
                      lang.update(params.locale);
                      break;
                    }
                  }
                });
      }
    });

    ngEventService.subscribe("externalLoginSuccess", function (event, params) {
      params = params || {};
      params.reloadAfterLogin = true;
      onExternalLogin(params);
    });

    function onExternalLogin(params) {
      if (!!params.extendExpiredAccessEnabled) {
        utilsService.setExtendExpiredAccessCookie(userService.getConfig().app.aid, params.extendExpiredAccessEnabled);
      }
      return userService.loginSuccessNoPostMessage(
              params
      ).then(function () {
        if (loginDeferred) {
          loginDeferred.resolve(params);
        }
      });
    }

    function postMessageLoginSuccess(params) {
      var deferred = $q.defer();
      if (!loginSuccessPosted) {
        loginSuccessPosted = true;

        if (!params) {
          params = {};
        }

        userService.getConfig().fillLoginSuccessEventParams(params);

        params.resultCallback = function () {

          angular.forEach(loginSuccessCallbacks, function (c) {
            c.callback(params);
          });

          loginSuccessCallbacks = utilsService.filter(loginSuccessCallbacks, function (c) {
            return !c.oneTime;
          });

          deferred.resolve(params);
        };

        eventService.postMessage("loginSuccess", params);
      } else {
        deferred.reject(false);
      }
      return deferred.promise;
    }

    userService.userChanged = function (user) {
      if (loginDeferred) {
        loginDeferred.resolve(user);
      }
    };

    return userService;
  }]);

var containerServiceModule = angular.module('containerServiceModule', ['ui.router', 'ngSanitize', 'generalModule']);

containerServiceModule.factory('containerService', [
  '$window', '$rootScope', '$rootElement', '$timeout', '$interval',
  '$document', 'eventService', 'errorService',
  'windowStateService', 'ngEventService'
  , function (
    $window, $rootScope,
    $rootElement, $timeout, $interval, $document, eventService, errorService,
    windowStateService, ngEventService
  ) {
    var containerService = {};
    var currentResizeSubscribers = {};
    var resizeIframeEl;
    var resizeIframeElDoc;
    containerService.$rootScope = $rootScope;
    containerService.rootElement = $rootElement;

    $(document)
      .on('focus', 'input, textarea, select', function () {
        eventService.postMessage('inputFocus');
      })
      .on('blur', 'input, textarea, select', function () {
        eventService.postMessage('inputBlur');
      });

    function getNewHeight(resizeIframeEl, resizeIframeElDoc) {
      var iframeBody = resizeIframeEl.document ? resizeIframeEl.document.body : resizeIframeEl.body;
      var iframeDocument = resizeIframeElDoc.documentElement || {};

      return Math.max(
              iframeBody.scrollHeight, iframeDocument.scrollHeight,
              iframeBody.offsetHeight, iframeDocument.offsetHeight,
              iframeBody.clientHeight, iframeDocument.clientHeight
      );
    }

    function onResizeHandler(resizeIframeEl, resizeIframeElDoc, iframeSizes) {
      var newHeight = getNewHeight(resizeIframeEl, resizeIframeElDoc);

      if (newHeight !== iframeSizes.lastHeight) {
        iframeSizes.lastHeight = newHeight;
        containerService.resize();
      }
    }

    function polyfillRemove() {
      if (!('remove' in Element.prototype)) {
        Element.prototype.remove = function() {
          if (this.parentNode) {
            this.parentNode.removeChild(this);
          }
        };
      }
    }

    containerService.getConfig = function () {
      return {
        container: this._getConfigFn().container
      };
    };

    containerService.getPreferredWidth = function () {
      return this.preferredWidth;
    };

    containerService.setPreferredWidth = function (newPreferredWidth) {
      this.preferredWidth = newPreferredWidth;
    };

    containerService.setConfigWidth = function(newConfigWidth) {
      this.widthFromConfigDirective = newConfigWidth;
    }

    containerService.init = function (options, getConfigFn) {
      this._getConfigFn = getConfigFn;

      var displayModeParam = getParameterByName('displayMode');
      this.isModal = displayModeParam === "modal";
      this.isPopup = displayModeParam === "popup";
      this.isInline = displayModeParam === "inline";
      this.isPreview = !!getParameterByName('preview');
      this.isOpenedFromInlineCheckout = getParameterByName('isOpenedFromInlineCheckout') === 'true';

      this.container = this.getConfig().container;
      this.suggestedWidth = getIntParam('width', 1);
      this.preferredWidth = options.preferredWidth;

      containerService.clearResizeHandler();
      containerService.initResizeHandler(this.container);
    };

    containerService.clearResizeHandler = function () {
      currentResizeSubscribers.interval && $interval.cancel(currentResizeSubscribers.interval);
      polyfillRemove();
      currentResizeSubscribers.handleResizeIFrame && currentResizeSubscribers.handleResizeIFrame.remove();
      currentResizeSubscribers.resizeObs && currentResizeSubscribers.resizeObs.disconnect();
      currentResizeSubscribers.loaded && currentResizeSubscribers.loaded();
      currentResizeSubscribers = {};
    };

    containerService.initResizeHandler = function (container) {
      var handleResizeFrame = document.createElement('iframe');
      currentResizeSubscribers.handleResizeIFrame = handleResizeFrame;
      var iframeSizes = { lastHeight: -1 };
      container.css('position', 'relative');

      handleResizeFrame.width = '100%';
      handleResizeFrame.height = '100%';
      handleResizeFrame.setAttribute('style', 'position: absolute !important; z-index: -1 !important;');

      container.prepend(handleResizeFrame);

      resizeIframeEl = (handleResizeFrame.contentWindow || handleResizeFrame.contentDocument);
      resizeIframeElDoc = handleResizeFrame.contentDocument || {};
      var onResizeHandlerFn = onResizeHandler.bind(this, resizeIframeEl, resizeIframeElDoc, iframeSizes);

      if (typeof ResizeObserver === 'function') {
        var ro = new ResizeObserver(onResizeHandlerFn);
        ro.observe(handleResizeFrame);
        currentResizeSubscribers.resizeObs = ro;
      } else {
        resizeIframeEl.onresize = onResizeHandlerFn;
      }

      currentResizeSubscribers.interval = $interval(onResizeHandlerFn, 500);

      window.onload = function () {
        containerService.resize();
      };

      containerService.onReady(function () {
        containerService.resize();
      });
      //rootElement.height calc right at div with display:block only in Internet Explorer
      //This resize is called after parent block set display:block
      currentResizeSubscribers.loaded = ngEventService.subscribe('loaded', function () {
        containerService.resize();
      });
    };

    containerService.onReady = function (fn) {
      // in case the document is already rendered
      if (document.readyState !== 'loading') fn();
      // modern browsers
      else if (document.addEventListener) document.addEventListener('DOMContentLoaded', fn);
      // IE <= 8
      else document.attachEvent('onreadystatechange', function () {
          if (document.readyState === 'complete') fn();
        });
    };

    ngEventService.subscribe("RESIZE_MODAL_CHECKOUT", function (event, params) {
      var iframe = params.iframe;
      var width = params.width;

      setTimeout(function () {
        containerService.suggestedWidth = width;

        if (iframe.config.width) {
          containerService.suggestedWidth = (width < iframe.config.width) ? width : iframe.config.width;
        }

        containerService.resize();
      }, 100);
    });

    containerService.resize = function _resize() {
      var newHeight;
      if (resizeIframeEl && resizeIframeElDoc) {
        newHeight = getNewHeight(resizeIframeEl, resizeIframeElDoc)
      } else {
        var containerHeight = containerService.rootElement.height();
        var parentElementHeight = containerService.rootElement[0].parentElement ?
          containerService.rootElement[0].parentElement.clientHeight :
          0;
        newHeight = containerHeight ? containerHeight : parentElementHeight;
      }

      if (!containerService.isModal && !containerService.isPopup && !containerService.isPreview) {
        eventService.resizeEvent({ height: newHeight });
        return;
      }

      var newWidth = containerService.getNewWidth();

      angular.element('body').css('min-width', newWidth);
      angular.element('body').width(newWidth);
      containerService.rootElement.width(newWidth);
      containerService.container.width(newWidth);

      eventService.resizeEvent({ width: newWidth, height: newHeight });
      setTimeout(containerService.scrollTop, 500);
    };

    containerService.scrollTop = function () {
      document.defaultView.scrollTo(0, 0);
    };

    containerService.getNewWidth = function() {
      if (containerService.isModal || containerService.isPopup) {

        if (this.widthFromConfigDirective) {
          containerService.preferredWidth = this.widthFromConfigDirective;
        }

        var newWidth = containerService.suggestedWidth;

        if (containerService.preferredWidth <= newWidth || isNaN(newWidth)) {
          newWidth = containerService.preferredWidth;
        }

        return parseInt(newWidth);
      }

      return parseInt(containerService.suggestedWidth);
    }

    containerService.getCenterScreen = function (w, h) {
      w = w || 0;
      h = h || 0;

      var width = parseInt(getParameterByName("parentWidth"), 10);
      var dualScreenLeft = parseInt(getParameterByName("parentDualScreenLeft"), 10);
      var dualScreenTop = parseInt(getParameterByName("parentDualScreenTop"), 10);
      var parentOuterHeight = parseInt(getParameterByName("parentOuterHeight"), 10);

      var left = ((width / 2) - (w / 2)) + dualScreenLeft;
      var top = ((parentOuterHeight / 2) - (h / 2)) + dualScreenTop;
      return { left: left, top: top };
    };

    containerService.getOriginUrl = function () {
      return getParameterByName("url");
    };

    containerService.purge = function (closeEventParams) {
      try {
        containerService.rootElement.remove();
      } catch (e) {
      }
      eventService.purgeEvent(closeEventParams);
    };

    containerService.close = function (closeEventParams) {
      try {
        containerService.rootElement.remove();
      } catch (e) {
      }
      eventService.closeEvent(closeEventParams);
    };

    return containerService;
  }]);

angular.module('pianoIdProviderModule', [
  'generalModule'
])
  .factory('pianoIdProvider', [
    '$sce', '$window', '$q', 'lang', 'errorService', 'eventService', 'ngEventService', 'userService', 'containerService',
    function ($sce, $window, $q, lang, errorService, eventService, ngEventService, userService, containerService) {

      var isNewUser = false;
      let stage = null;
      let preloaderHeight = null;
      var locale;
      var origin;
      var iframeOrigin;

      var widgetOptions = {};

      var me = {};
      var authPianoIdParams = {};

      var viewCtrl;

      me.init = function (_widgetOptions) {
        widgetOptions = _widgetOptions;
        me.setOrigin(widgetOptions.pianoIdUrl);

        authPianoIdParams = {
          aid: widgetOptions.aid,
          checkout: widgetOptions.checkout,
          customFormParams: widgetOptions.customFormParams,
          isPasswordlessCheckoutEnabled: widgetOptions.isPasswordlessCheckoutEnabled(),
          isPreventPasswordlessLogin: widgetOptions.isPreventPasswordlessLogin,
          isSingleStepEnabled: widgetOptions.isSingleStepEnabled(),
          affiliateIssuerId: widgetOptions.getAffiliateIssuerId(),
          userLoginEmail: widgetOptions.userLoginEmail,
          passwordlessSetPaymentEmail: widgetOptions.passwordlessSetPaymentEmail,
          isSentLoginEmail: widgetOptions.isSentLoginEmail,
          isSingleStepFormShown: function () { return viewCtrl ? widgetOptions.isSingleStepFormShown(viewCtrl) : false; },
          getUserToken: widgetOptions.getUserToken,
          getPageView : widgetOptions.getPageView
        };

      };

      me.setStage = function (value) {
        stage = value;
      };

      me.getStage = function () {
        return stage;
      };

      me.setPreloaderHeight = function (value) {
        preloaderHeight = value;
      };

      me.getPreloaderHeight = function () {
        return preloaderHeight;
      };

      me.setViewCtrl = function (_viewCtrl) {
        viewCtrl = _viewCtrl;
      };

      me.getWidgetOptions = function () {
        return widgetOptions;
      };

      me.setOrigin = function (newOrigin) {
        origin = newOrigin;
        iframeOrigin = getIframeOrigin(origin);
      };

      me.register = function () {
      };

      me.login = function () {
      };

      me.resetPassword = function () {
      };

      // me.onLoginSuccess = onLoginSuccess;

      me.isNewUser = function () {
        return isNewUser;
      };

      me.setupDoubleOptInParams = function ($element, iframeOrigin) {
        return widgetOptions.getDoubleOptInParams &&
          widgetOptions.getDoubleOptInParams().then(function (checkoutParams) {
          var iframe = $element.find('iframe')[0];

          if (!iframe) {
            return;
          }
          var params = {
            tbc: checkoutParams.tbc,
            termId: checkoutParams.params.termId,
            showOfferParams: JSON.stringify(checkoutParams.params),
            trackingId: checkoutParams.trackingId
          };

          eventService.customPostMessage(
            'setupDoubleOptInParams',
            params,
            iframeOrigin,
            iframe.contentWindow);
        });
      };

      me.authPianoIdController = function ($scope, $element) {
        $scope.id = 'piano-id-' + _randomString(5);
        var aidsForNewPianoIdVersion = [
          // add publisher aid here for new piano id version
          'G18rIJWQ2G',
          '45L2BaS6pu' // the spectator
        ];
        lang.on(function (newLocale) {
          updateLang($element, newLocale);
        });

        var customFormParams = authPianoIdParams.customFormParams;
        $scope.formName = customFormParams().formName;

        updateIframeUrl();

        $scope.error_msg = lang.trc('checkout.platform', 'You should sign in or sign up first');

        var unsubLoginSuccess = ngEventService.subscribe($scope.id + '-loginSuccess', function (event, params) {
          onLoginSuccess(authPianoIdParams.aid, params);
        });

        var unsubResize = ngEventService.subscribe($scope.id + '-resize', function (event, params) {
          resize(params, $element);
        });

        var unsubCustomEvent = ngEventService.subscribe($scope.id + '-customEvent', function (event, params) {
          eventService.customEvent('customEvent', params);
        });

        var unsubLoginResponse = ngEventService.subscribe($scope.id + '-loginResponse', function (event, params) {
          ngEventService.fire('pianoIdSingleStepLoginResponse', params);
        });

        var unsubSubmitPianoIdLoginForm = ngEventService.subscribe('submitPianoIdLoginForm', function () {
          var iframe = $element.find('iframe');
          eventService.customPostMessage('submitLoginForm', null, iframeOrigin, iframe[0].contentWindow);
        });

        var unsubUpdatePianoIdAuthIframeUrl = ngEventService.subscribe('updatePianoIdAuthIframeUrl', function () {
          updateIframeUrl();
        });

        var unsubLoaded = ngEventService.subscribe($scope.id + '-loaded', function (event, params) {
          subscribeLoaded($element);
          // authPianoIdParams.setupDoubleOptInParams(iframeOrigin);
          me.setupDoubleOptInParams($element, iframeOrigin);
        });

        var unsubPianoIdEvent = ngEventService.subscribe($scope.id + '-pianoIdEvent', function (event, params) {
          if (params.event === 'passwordlessEmailSent') {
            widgetOptions.passwordlessEmailSentHandler(params.params.loginTokenId);
          }
          subscribePianoIdEvent(params, customFormParams().trackingId, params.params.formName);
        });

        var loginRequiredEventParams = {
          preventExternalLogin: true
        };

        userService.getConfig().fillLoginRequiredEventParams(loginRequiredEventParams);
        eventService.loginRequiredEvent(loginRequiredEventParams);

        function isNewPianoIdVersion() {
          return aidsForNewPianoIdVersion.indexOf(authPianoIdParams.aid) >= 0;
        }

        function getIndexForPianoId2IfNeed() {
          return isNewPianoIdVersion() ? 'index3.html' : '';
        }

        function buildUrl(base, id) {
          base += getIndexForPianoId2IfNeed();
          var containerWidth = containerService.rootElement.width();
          var query = {
            aid: authPianoIdParams.aid,
            checkout: authPianoIdParams.checkout,
            template: authPianoIdParams.template,
            sender: id,
            origin: document.location.origin || document.location.href,
            width: containerWidth,
            lang: locale || '',
            stage: me.getStage() || authPianoIdParams.affiliateIssuerId,

            site: $window.TPParam.params.url,
            screen: getAuthScreen(),
            create_passwordless_user: authPianoIdParams.isPasswordlessCheckoutEnabled && !authPianoIdParams.isPreventPasswordlessLogin(),
            single_step: authPianoIdParams.isSingleStepFormShown(),
            display_mode: 'inline',
            tbc: authPianoIdParams.getPageView && authPianoIdParams.getPageView().tbc,
            page_view_id: authPianoIdParams.getPageView && authPianoIdParams.getPageView().pageViewId,
            tracking_id: authPianoIdParams.customFormParams().trackingId
          };

          if (me.getPreloaderHeight()) {
            query.preloader_height = me.getPreloaderHeight();
          }

          if ($scope.formName) {
            query.form_name = $scope.formName;
          } else if (!!authPianoIdParams.userLoginEmail()) {
            query.email = authPianoIdParams.userLoginEmail();
            authPianoIdParams.passwordlessSetPaymentEmail();
          }

          return [base, $.param(query)].join('?');
        }

        function getAuthScreen() {
          if (userService.isUserValid() && !userService.isUserConfirmed()) {
            return 'email_is_not_confirmed';
          }

          if (authPianoIdParams.isSentLoginEmail()) {
            return 'passwordless_confirmation';
          }

          return authPianoIdParams.isPasswordlessCheckoutEnabled ? 'login' : 'register';
        }

        function updateIframeUrl() {
          var url = buildUrl(origin, $scope.id);
          $scope.url = $sce.trustAsResourceUrl(url);
        }

        $scope.unsubscribeNgEventService = function () {
          unsubLoginSuccess();
          unsubResize();
          unsubCustomEvent();
          unsubLoginResponse();
          unsubSubmitPianoIdLoginForm();
          unsubUpdatePianoIdAuthIframeUrl();
          unsubLoaded();
          unsubPianoIdEvent();
          errorService($scope).reset();
        };

      };

      me.formPianoIdController = function ($scope, $element) {
        var submitDefer;
        var loadedDefer = $q.defer();

        var submitSuccess = false;
        $scope.isFormHidden = true;

        $scope.id = 'piano-id-' + _randomString(5);

        var customFormParams = authPianoIdParams.customFormParams;
        $scope.formName = customFormParams().formName;
        $scope.hideIfComplete = customFormParams().hideCompletedFields;

        lang.on(function (newLocale) {
          updateLang($element, newLocale);
        });
        var url = buildUrl(origin + 'form', $scope.id);

        var unsubProfileUpdated = ngEventService.subscribe($scope.id + '-profileUpdated', function (event, params) {
          submitSuccess = true;
          if (submitDefer) {
            submitDefer.resolve(true);
          }
        });

        var unsubScopeIdChanged = ngEventService.subscribe($scope.id + '-change', function (event, params) {
          submitSuccess = false;
        });

        var unsubProfileUpdatedError = ngEventService.subscribe($scope.id + '-profileUpdatedError', function (event, params) {
          submitSuccess = false;
          if (submitDefer) {
            submitDefer.resolve(false);
          }
        });

        var unsubPianoIdEvent = ngEventService.subscribe($scope.id + '-pianoIdEvent', function (event, params) {

          if (params.event === 'cfFormImpression') {
            $scope.$apply(function () {
              $scope.isFormHidden = false;
            });
          }

          subscribePianoIdEvent(params, customFormParams().trackingId, params.params.formName);
        });

        var unsubResize = ngEventService.subscribe($scope.id + '-resize', function (event, params) {
          resize(params, $element);
        });

        var unsubLoaded = ngEventService.subscribe($scope.id + '-loaded', function (event, params) {
          subscribeLoaded($element);
          loadedDefer.resolve();
        });

        var unsubStateReady = ngEventService.subscribe($scope.id + '-stateReady', function (event, params) {
          var iframe = $element.find('iframe');
          eventService.customPostMessage('setToken', authPianoIdParams.getUserToken(), iframeOrigin, iframe[0].contentWindow);
        });

        function buildUrl(base, id) {
          var containerWidth = containerService.rootElement.width();
          var query = {
            form_name: $scope.formName,
            hide_if_complete: $scope.hideIfComplete,

            aid: authPianoIdParams.aid,
            checkout: authPianoIdParams.checkout,
            sender: id,
            origin: document.location.origin || document.location.href,
            width: containerWidth,
            lang: locale || '',
            stage: me.getStage() || authPianoIdParams.affiliateIssuerId,
            access_token: authPianoIdParams.getUserToken(),

            passwordless: authPianoIdParams.isPasswordlessCheckoutEnabled,
            tbc: authPianoIdParams.getPageView || authPianoIdParams.getPageView().tbc,
            page_view_id: authPianoIdParams.getPageView || authPianoIdParams.getPageView().pageViewId
          };


          if (me.getPreloaderHeight()) {
            query.preloader_height = me.getPreloaderHeight();
          }

          return [base, $.param(query)].join('?');
        }

        $scope.url = $sce.trustAsResourceUrl(url);

        $scope._isValid = function () {
          return loadedDefer.promise
            .then(function () {
              if ($scope.isFullFilled || submitSuccess) {
                return true;
              }

              var iframe = $element.find('iframe');

              if (!submitSuccess) {
                submitDefer = $q.defer();
                eventService.customPostMessage('submit', {}, iframeOrigin, iframe[0].contentWindow);
              }

              return submitDefer.promise;
            });
        };

        $scope.unsubscribeNgEventService = function () {
          unsubProfileUpdated();
          unsubScopeIdChanged();
          unsubProfileUpdatedError();
          unsubPianoIdEvent();
          unsubResize();
          unsubLoaded();
          unsubStateReady();
        };

      };

      me.emailConfirmationRequiredController = function ($scope, $element) {
        $scope.id = 'piano-id-' + _randomString(5);
        lang.on(function (newLocale) {
          updateLang($element, newLocale);
        });

        var url = buildUrl(origin, $scope.id);
        $scope.url = $sce.trustAsResourceUrl(url);
        var customFormParams = authPianoIdParams.customFormParams;

        var unsubResize = ngEventService.subscribe($scope.id + '-resize', function (event, params) {
          resize(params, $element);
        });

        var unsubLoaded = ngEventService.subscribe($scope.id + '-loaded', function () {
          subscribeLoaded($element);
          // emailConfirmationParams.setupDoubleOptInParams(iframeOrigin);
          me.setupDoubleOptInParams($element, iframeOrigin);
        });

        var unsubPianoIdEvent = ngEventService.subscribe($scope.id + '-pianoIdEvent', function (event, params) {
          subscribePianoIdEvent(params, customFormParams().trackingId);
        });

        function buildUrl(base, id) {
          var containerWidth = containerService.rootElement.width();
          var query = {
            aid: authPianoIdParams.aid,
            sender: id,
            origin: document.location.origin || document.location.href,
            site: $window.TPParam.params.url,
            screen: 'email_confirmation_required',
            checkout: authPianoIdParams.checkout,
            width: containerWidth,
            lang: locale || '',
            passwordless: authPianoIdParams.isPasswordlessCheckoutEnabled,
            stage: me.getStage() || authPianoIdParams.affiliateIssuerId,
            access_token: authPianoIdParams.getUserToken(),

            tbc: authPianoIdParams.getPageView || authPianoIdParams.getPageView().tbc,
            page_view_id: authPianoIdParams.getPageView || authPianoIdParams.getPageView().pageViewId
          };

          if (me.getPreloaderHeight()) {
            query.preloader_height = me.getPreloaderHeight();
          }

          return [base, $.param(query)].join('?');
        }

        $scope.$on('$destroy', function () {
          unsubResize();
          unsubLoaded();
          unsubPianoIdEvent();
        });
      };

      function onLoginSuccess(aid, data) {
        var user = data.user;
        user.firstName = user.given_name;
        user.lastName = user.family_name;
        user.valid = true;
        user.confirmed = !(data.user && data.user.email_confirmation_required);
        user.uid = user.sub;

        isNewUser = !!data.registration;
        var hostUrl = containerService.getOriginUrl();

        userService.checkUser({
          aid: aid,
          url: hostUrl,
          userToken: data.token,
          fromUserIdentity: true
        }).then(function (checkUserRes) {
          return checkUserRes.models.token_list;
        }).catch(function () {
          return null;
        }).then(function (tokenList) {
          userService.onExternalLogin({
            token_list: tokenList,
            cookie_domain: data.cookie_domain,
            user_token: data.token,
            params: data.user,
            user: user,
            registration: isNewUser,
            extendExpiredAccessEnabled: data.extendExpiredAccessEnabled,
            stage: data.stage
          });
        });
      }

      function getIframeOrigin(url) {
        if (url.indexOf('http') === 0) {
          return url;
        } else {
          return document.location.origin || document.location.href;
        }
      }

      function updateLang($element, newLocale) {
        locale = newLocale || locale;
        var iframe = $element.find('iframe')[0];
        if (!iframe) {
          return;
        }
        eventService.customPostMessage('lang', { lang: locale }, iframeOrigin, iframe.contentWindow);
      }

      function resize(params, $element) {
        if (params.height === 0) {
          return;
        }

        var height = {
          height: params.height + 'px'
        };
        var elements = $element.find('#piano-id-container, iframe');

        if (params.animate) {
          elements.animate(height, 200);
        } else {
          elements.css(height);
        }

        containerService.resize();
      }

      function subscribeLoaded($element) {
        var container = $element.parent();
        var iframe = $element.find('iframe');
        var containerWidth = container.width();
        var center = containerService.getCenterScreen();
        var originUrl = containerService.getOriginUrl();

        var params = {
          width: containerWidth,
          center: center,
          originUrl: originUrl
        };
        eventService.customPostMessage('resize', params, iframeOrigin, iframe[0].contentWindow);
        updateLang($element);
      }

      function subscribePianoIdEvent(params, trackingId, formName) {
        var additionParams = {
          trackingId: trackingId,
          formName: formName
        };

        var extendedParams = {
          event: params.event,
          params: $.extend({}, params.params, additionParams),
          iframeId: getParameterByName('iframeId')
        };

        eventService.postMessage('pianoIdEvent', extendedParams);
      }

      return me;
    }])

  .directive('pianoId', ['userService', 'pianoIdProvider', '$injector',
    function (userService, pianoIdProvider, $injector) {
      return {
        restrict: 'EA',
        require: '?^view',
        template: '<div id="piano-id-container">' +
          '  <auth-piano-id ng-if="authIsExist()"></auth-piano-id>' +
          '  <form-piano-id ng-if="formIsExist()"></form-piano-id>' +
          '</div>',
        link: function ($scope, $element, $attrs, viewCtrl) {
          var viewService;
          let hasStage = !!$attrs.stage;
          let stage = null;

          try {
            viewService = $injector.get('viewService');
          } catch (e) {
          }

          $scope.formIsExist = function () {
            return userService.isUserValid()
                    && !pianoIdProvider.isNewUser()
                    && pianoIdProvider.getWidgetOptions().widgetSpecificCheckIfVisible();
          };
          $scope.authIsExist = function () {
            return (!viewCtrl || viewService.isActive(viewCtrl.stateName))
                    && !(userService.isUserValid() && userService.isUserConfirmed())
                    && (!hasStage || (hasStage && stage));
          };

          $scope.isUserValid = userService.isUserValid;
          pianoIdProvider.setPreloaderHeight($attrs.preloaderHeight);

          if (hasStage) {
            $scope.$watch($attrs.stage, function (value) {
              stage = value;
              pianoIdProvider.setStage(stage);
            });
          }
        }
      };
    }])
  .directive('emailConfirmationRequired', ['pianoIdProvider', '$injector',
    function (pianoIdProvider, $injector) {
      return {
        restrict: 'EA',
        scope: {},
        require: '^view',
        template: '<iframe id="{{id}}" ng-src="{{url}}" style="width:100%;"></iframe>',
        link: function ($scope, $element, attrs, viewCtrl) {
          var viewService;
          try {
            viewService = $injector.get('viewService');
          } catch (e) {}

          if (!viewService.isActive(viewCtrl.stateName)) {
            $element.remove();
            return;
          }

          if (viewCtrl) {
            pianoIdProvider.setViewCtrl(viewCtrl);
          }

          pianoIdProvider.emailConfirmationRequiredController($scope, $element);
        }
      };
    }])
  .directive('authPianoId', ['pianoIdProvider', 'errorService',
    function (pianoIdProvider, errorService) {
      return {
        restrict: 'EA',
        scope: {},
        require: '?^view',
        template: '<iframe id="{{id}}" ng-src="{{url}}" style="width:100%;"></iframe>',
        link: function ($scope, $element, attrs, viewCtrl) {
          var widgetOptions = pianoIdProvider.getWidgetOptions();

          if (viewCtrl) {
            pianoIdProvider.setViewCtrl(viewCtrl);

            if (viewCtrl.stateName !== 'auth') {
              viewCtrl.registerComponentController($scope, {
                passwordlessLoginForm: widgetOptions.isPasswordlessCheckoutEnabled
              });

              $scope._isValid = function () {
                errorService($scope).reset();

                if (widgetOptions.isSingleStepEnabled()) {
                  return true;
                }

                errorService($scope).global($scope.error_msg);
                return false;

              };

              $scope.$on('$destroy', function () {
                viewCtrl.unregisterComponentController($scope);
              });
            }
          }

          pianoIdProvider.authPianoIdController($scope, $element);
        }
      };
    }])
  .directive('formPianoId', ['pianoIdProvider', function (pianoIdProvider) {
    return {
      restrict: 'EA',
      require: '?^view',
      scope: {},
      template: '<iframe ng-hide="isFormHidden" id="{{id}}" ng-src="{{url}}" style="width:100%;"></iframe>',
      link: function ($scope, $element, attrs, viewCtrl) {
        if (viewCtrl) {
          pianoIdProvider.setViewCtrl(viewCtrl);

          if (viewCtrl.stateName === 'auth') {
            $element.remove();
            return;
          }
          viewCtrl.registerComponentController($scope);
        }

        $scope.$on('$destroy', function () {
          $scope.isFullFilled = true;
          if (viewCtrl) {
            viewCtrl && viewCtrl.unregisterComponentController($scope);
          }
        });

        pianoIdProvider.formPianoIdController($scope, $element);
      }
    };
  }]);

'use strict';

angular.module('creditRedemptionModule', [
  'generalModule'
])
  .factory('creditRedemptionService', ['eventService', 'userService', function (eventService, userService) {
    const me = {
      affiliateState: {}
    };

    function getAffiliateCreditState() {
      if (me.affiliateState && me.affiliateState.creditStates && me.affiliateState.creditStates.length > 0) {
        return me.affiliateState.creditStates[0];
      }

      return null;
    }

    function getRedeemedItemWithMinimalExpirationTS(redeemedItems) {
      let foundItem = null;

      if (!(redeemedItems && redeemedItems.length)) {
        return foundItem;
      }

      redeemedItems.forEach(function (item) {
        if (!foundItem || foundItem.exp > item.exp) {
          foundItem = item;
        }
      });

      return foundItem;
    }

    me.setAffiliateState = function (affiliateState) {
      me.affiliateState = affiliateState;
    };

    me.credits = function () {
      const creditState = getAffiliateCreditState();

      return creditState ? creditState.total - creditState.spent : 0;
    };

    me.creditsTotal = function () {
      const creditState = getAffiliateCreditState();

      return creditState ? creditState.total : 0;
    };

    me.creditExpirationTime = function () {
      const creditState = getAffiliateCreditState();
      let redeemedItem = null;
      let expirationTime = new Date();

      if (creditState) {
        redeemedItem = getRedeemedItemWithMinimalExpirationTS(creditState.redeemedItems);
      }

      if (redeemedItem && redeemedItem.exp) {
        expirationTime = new Date(redeemedItem.exp * 1000);
      }

      return expirationTime;
    };

    me.redeemCredit = function () {
      const creditState = getAffiliateCreditState();

      if (creditState) {
        eventService.postMessage('redeemCredit', {
          cid: creditState.cid,
          itemId: me.affiliateState.redemptionCandidateItemId,
          newRedemptionMethod: me.redemptionMethod()
        });
      }
    };

    me.toggleRedemptionMethod = function () {
      const creditState = getAffiliateCreditState();

      if (creditState) {
        creditState.redemptionMethod = creditState.redemptionMethod === 'A' ? 'M' : 'A'
      }
    };

    me.redemptionMethod = function () {
      const creditState = getAffiliateCreditState();

      if (creditState) {
        return creditState.redemptionMethod;
      }

      return null;
    };


    me.setupScope = function ($scope) {
      $scope.affiliateState = me.affiliateState;
      $scope.credits = me.credits;
      $scope.creditsTotal = me.creditsTotal;
      $scope.creditExpirationTime = me.creditExpirationTime;
      $scope.redeemCredit = me.redeemCredit;
      $scope.toggleRedemptionMethod = me.toggleRedemptionMethod;
      $scope.redemptionMethod = me.redemptionMethod;
    };

    return me;
  }])
;

var tpDrop = function ($injector, $document, $rootScope, $q, $http, $templateCache, $controller, $compile, $interval, $timeout) {
    var DROPDOWN_CONTAINER_SELECTOR = '.tp-dropdown__container';
    var SEARCH_FIELD_SELECTOR = '.search-query';
    var DROPDOWN_LIST = '.tp-dropdown__list';
    var DROPDOWN_ITEM_LINK = '.tp-dropdown__link';
    var DROPDOWN_SELECT = '.tp-dropdown__select';
    var ENTER_KEY = 'Enter';
    var ESCAPE_KEY = 'Escape';
    var DOWN_ARROW_KEY = 'ArrowDown';
    var UP_ARROW_KEY = 'ArrowUp';
    var INPUT_TAG_NAME = 'INPUT';

  return function (opts) {
    return $q
      .all({
        tpl: getTemplate(opts),
        opts: $q.when(opts)
      })
      .then(show)
  };

  function calculateCenteredCoordinates(root, opts) {
    var isHorizontalAxis = opts.side === 'right' || opts.side === 'left';
    var prop = isHorizontalAxis ? 'top' : 'left';
    var char = isHorizontalAxis ? 'height' : 'width';
    var oChar = isHorizontalAxis ? 'outerHeight' : 'outerWidth';

    var res = prop === 'left' ?
      makePositionFromStart(prop, char, oChar, root, opts) :
      makeCentering(prop, char, oChar, root, opts);

    if (opts.side === 'right') {
      res = makePostShifting('left', 'outerWidth', opts, res);
    }
    else if (opts.side === 'left') {
      res = makePreShifting('right', 'width', 'left', 'scrollLeft', root, opts, res);
    }
    else if (opts.side === 'top') {
      res = makePreShifting('bottom', 'height', 'top', 'scrollTop', root, opts, res);
    }
    else /* (opts.side === 'bottom'*/{
      res = makePostShifting('top', 'outerHeight', opts, res);
    }

    return res;

    function makePreShifting(prop, char, otherProp, scroll, root, opts, res) {
      res[prop] = root[char]() - calcOffset(opts.centerOn, otherProp) - root[scroll]();
      return res;
    }

    function makePostShifting(prop, char, opts, res) {
      res[prop] = calcOffset(opts.centerOn, prop) + opts.centerOn[char]();
      return res;
    }

    function makePositionFromStart(prop, char, oChar, root, opts) {
      var res = {};
      res[prop] = !isRTL(root) ?
        calcOffset(opts.centerOn, prop) :
        calcRtlOffset(prop, char, oChar, root, opts);
      return res;
    }

    function makeCentering(prop, char, oChar, root, opts) {
      var res = {};
      res[prop] = !isRTL(root) ?
        calcOffset(opts.centerOn, prop) + opts.centerOn[oChar]() / 2 - opts.style[char] / 2
        : calcOffset(opts.centerOn, prop) + opts.centerOn[oChar]() / 2 - opts.style[char] / 2 + (opts.centerOn[oChar]() - opts.style[char]);
      return res;
    }

    function calcRtlOffset(prop, char, oChar, root, opts) {
      var selectorWidth = opts.centerOn[oChar]();
      var dropdownWidth = opts.style[char];

      return calcOffset(opts.centerOn, prop) + (selectorWidth - dropdownWidth);
    }

    function calcOffset(el, prop) {
      return el.offset()[prop];
    }
  }

  function isRTL(root) {
    return root.context.dir === 'rtl';
  }

  function calcCenter(root, opts) {
    return {
      left: root.width() / 2 - opts.style.width / 2,
      top: root.height() / 2 - opts.style.height / 2
    }
  }

  function calculate(root, opts) {
    return opts.centerOn
      ? calculateCenteredCoordinates(root, opts)
      : calcCenter(root, opts);
  }

  function findRoot(opts) {
    if (opts.centerOn) {
      var fixedParent = opts
        .centerOn
        .parents()
        .filter(function () {
          var p = $(this).css('position');
          return (p === 'fixed' || p === 'absolute' ) && $(this).hasClass('modal') === false;
        })
        .last();
      return fixedParent.length > 0 ? fixedParent : $document.find('body');
    }
    else {
      return $document.find('body');
    }
  }

  function show(input) {
    var state = $q.defer(),
      tpl = input.tpl,
      opts = input.opts || {style: {width: 200}},
      root = findRoot(opts),
      scope = (opts.scope || $rootScope).$new(),
      $documentBody = $document.find('body'),
      coordinates,
      sideClass;

    scope.$close = close;
    scope.$dismiss = dismiss;

    var rejecter = opts.rejecter || byOuterClick();
    rejecter.then(dismiss, dismiss);

    if (opts.controller) {
      $controller(opts.controller, {$scope: scope})
    }

    var el = $compile(angular.element(tpl))(scope);
    root.append(el);
    $documentBody.addClass('component-opened');

    var positionElement = function () {
      reverseOverflowingSide(opts, el);
      sideClass = opts.side || 'bottom';
      coordinates = calculate(root, opts);
      decorateElement();
      setFocusToSearchInput();
      addKeydownListener();
    };
    if (scope.type && scope.type === 'enchained') {
      var intervalId = $interval(positionElement, 50);
      var cancelInterval = function () {
        $interval.cancel(intervalId)
      };
      state.promise.then(cancelInterval, cancelInterval);
    } else {
      $timeout(positionElement, 0);
    }

    return state.promise;

    function setFocusToSearchInput() {
        var $dropdownContainer = angular.element(DROPDOWN_CONTAINER_SELECTOR);
        if ($dropdownContainer.is(':visible')) {
            $dropdownContainer.find(SEARCH_FIELD_SELECTOR).focus();
        }
    }

    function byOuterClick() {
      var defer = $q.defer();
      $document.on('click', dismissByClick);
      return defer.promise;

      function dismissByClick(event) {
        $document.off('click', dismissByClick);
        if (event) {
          event.preventDefault();
          event.stopPropagation();
        }
        defer.reject();
      }
    }

    function close(res) {
      el.remove();
      state.resolve(res);
      $documentBody.removeClass('component-opened');
      angular.element(DROPDOWN_SELECT).focus();
    }

    function dismiss(res) {
      el.remove();
      state.reject(res);
      $documentBody.removeClass('component-opened');
    }

    function decorateElement() {
      el.css({//todo remove, it should be realized as child provider's
        display: 'block',
        position: 'absolute'
      })
        .on('click', function (event) {
          event.preventDefault();
          event.stopPropagation();

          if (opts.closeOnSelect) {
            dismiss();
          }
        })
        .addClass(sideClass)
        .addClass(opts.cl)
        .css(coordinates)
        .css(opts.style);
    }

    function reverseOverflowingSide(opts, el) {
      switch (opts.side) {
        case 'right':
          if ((opts.centerOn.offset().left + opts.centerOn.width() + el.width()) > window.innerWidth) {
            opts.side = 'left';
          }
          break;
        case 'left':
          if ((opts.centerOn.offset().left - el.width()) < 0) {
            opts.side = 'right';
          }
          break;
        case 'bottom':
          if ((opts.centerOn.offset().top + opts.centerOn.height() + el.height()) > window.innerHeight) {
            opts.side = 'top';
          }
          break;
        case 'top':
          if ((opts.centerOn.offset().top - el.height()) < 0) {
            opts.side = 'bottom';
          }
          break;
      }
    }

    function addKeydownListener() {
      var $dropdownList = angular.element(DROPDOWN_LIST);
      $dropdownList.on('keydown', function(e) {
        handleKeydown(e);
      });
    }

    function handleKeydown(e) {
      switch (e.key) {
        case ESCAPE_KEY:
          close();
          break;
        case ENTER_KEY:
          e.target.click();
          break;
        case DOWN_ARROW_KEY:
          e.preventDefault();
          if (e.target.nextElementSibling) {
            e.target.nextElementSibling.focus();
          } else {
            if (e.target.tagName === INPUT_TAG_NAME) {
              angular.element(DROPDOWN_ITEM_LINK).first().focus();
            }
          }
          break;
        case UP_ARROW_KEY:
          e.preventDefault();
          if (e.target.previousElementSibling) {
            e.target.previousElementSibling.focus();
          } else {
            if (e.target.tagName !== INPUT_TAG_NAME) {
              angular.element(SEARCH_FIELD_SELECTOR).focus();
            }
          }
          break;
      }
    }
  }

  function getTemplate(options) {
    return options.template ? $q.when(options.template) :
      $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) {
        return result.data;
      });
  }
};

tpDrop.$inject = ['$injector', '$document', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$compile', '$interval', '$timeout'];

angular.module('tpDrop.module', ['ngSanitize', 'generalModule'])
  .factory('tpDrop', tpDrop);

var EVENT_TEMPLATE_RELOADED = "EVENT_TEMPLATE_RELOADED";

var requiredModules = [
  'exceptionHandler',
  'tpComponentsModule',
  'generalModule',
  'eventModule',
  'errorModule',
  'userServiceModule',
  'containerServiceModule',
  'tp.i18n',
  'html5.placeholder',
  'pianoIdProviderModule',
  'creditRedemptionModule'
];

switch (window.TPTemplateType) {
  case 'NEWSCYCLE_OFFER':
    requiredModules.push('newscycleModule');
    break;
  case 'ZUORA_OFFER':
    requiredModules.push('zuoraModule');
    break;
  case 'NEWSLETTER_SIGNUP':
    requiredModules.push('newsletterModule');
    break;
  case 'LICENSING_LANDING_PAGE':
  case 'LICENSING_CONTRACT_LIST':
  case 'LICENSING_REDEEM_RESULT':
    requiredModules.push('tpDrop.module');
    requiredModules.push('licensingModule');
    break;
  default:
    break;
}

var showTemplateModule = angular.module('showTemplateModule', requiredModules);

showTemplateModule.config(['$compileProvider', '$qProvider', function ($compileProvider, $qProvider) {
  if ($compileProvider.debugInfoEnabled) {
    $compileProvider.debugInfoEnabled(false);
  }

  if ($compileProvider.commentDirectivesEnabled) {
    $compileProvider.commentDirectivesEnabled(false);
  }

  if ($compileProvider.cssClassDirectivesEnabled) {
    $compileProvider.cssClassDirectivesEnabled(false);
  }

  if ($compileProvider.aHrefSanitizationWhitelist) {
    $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|data|local|ftp|mailto|file|javascript|sms):/);
  }

  if ($qProvider.errorOnUnhandledRejections) {
    $qProvider.errorOnUnhandledRejections(false);
  }
}]);

showTemplateModule.run(['interceptAjax', function (interceptAjax) {
  interceptAjax.appendLoaderTo('showTemplate');
}]);

/**
 * Main template directive
 */
showTemplateModule.directive('template', [
  'template', 'exposeTemplateParams', 'exposeCustomVariables', 'exposeActiveMeters', 'exposeCustomCookies', 'setupTrackingId', 'utilsService',
  'browserIdService',
  'errorService',
  'eventService',
  'creditRedemptionService',
  'statsService',
  function (template, exposeTemplateParams, exposeCustomVariables, exposeActiveMeters, exposeCustomCookies, setupTrackingId,
            utilsService,  browserIdService, errorService, eventService, creditRedemptionService, statsService) {
    return {
      restrict: 'A',
      link: function (scope, element) {
        element.addClass('showTemplate');
      },
      controller: ['$scope', '$element', '$attrs', 'ngEventService', 'lang', '$timeout', 'eventService', function ($scope, $element, $attrs, ngEventService, lang, $timeout, eventService) {
        var isTemplateCacheable = false;
        var options = {
          preferredWidth: $attrs.width,
          preferredHeight: $attrs.height
        };
        ngEventService.subscribe('trackStat', statsService.handleTrackStatEvent);

        template.init(options);
        piano.reloadTemplateWithUserToken = function (userToken) {
          template.reloadWithUserToken(userToken);
        };

        var unsubLangChanged = ngEventService.subscribe('langChanged', function (event, params) {
            lang.update(params.lang);
        });

        Helper.wrapMethod('isUserValid', template, $scope);
        Helper.wrapMethod('allowTinypassAccountsLogin', template, $scope);
        Helper.wrapMethod('allowTinypassAccountsLogout', template, $scope);
        Helper.wrapMethod('register', template, $scope);
        Helper.wrapMethod('login', template, $scope);
        Helper.wrapMethod('logout', template, $scope);
        Helper.wrapMethod('close', template, $scope);
        Helper.wrapMethod('closeAndRefresh', template, $scope);

        creditRedemptionService.setupScope($scope);

        $scope.credit = function () {
          return $scope.credits() === 1 ? 'credit' : 'credits';
        };

        function updateZuoraParams(zuoraSelectedRatePlanIds) {
          angular.forEach(zuoraSelectedRatePlanIds, function (item) {
            var selectedRatePlan = null;

            if (item.type == 'product') {
              var selectedProduct = utilsService.find(TPParam.zuoraInternal.products, function (product) {
                return product.id === item.sourceId;
              });
              if (selectedProduct && selectedProduct.productRatePlans && selectedProduct.productRatePlans.length > 0) {
                selectedRatePlan = utilsService.find(selectedProduct.productRatePlans, function (plan) {
                  return plan.id === item.ratePlanId;
                });

                if (selectedRatePlan) {
                  $scope.zuora.selectedItems.push({
                    type: item.type,
                    product: selectedProduct,
                    ratePlan: selectedRatePlan
                  });
                }
              }

            } else {
              var selectedPromoCode = utilsService.find(TPParam.zuoraInternal.promoCodes, function (promoCode) {
                return String(promoCode.id) === item.sourceId;
              });

              if (selectedPromoCode && selectedPromoCode.ratePlanGroups && selectedPromoCode.ratePlanGroups.length > 0) {
                angular.forEach(selectedPromoCode.ratePlanGroups, function (group) {
                  if (!selectedRatePlan && group && group.length > 0) {
                    selectedRatePlan = utilsService.find(group, function (plan) {
                      return plan.id === item.ratePlanId;
                    });
                  }
                });

                var productByRatePlan = utilsService.find(TPParam.zuoraInternal.products, function (product) {
                  if (product && product.productRatePlans && product.productRatePlans.length > 0) {
                    return utilsService.find(product.productRatePlans, function (plan) {
                      return plan.id === item.ratePlanId;
                    });
                  }

                  return false;
                });

                if (selectedRatePlan) {
                  $scope.zuora.selectedItems.push({
                    type: item.type,
                    promotionCode: selectedPromoCode,
                    product: productByRatePlan,
                    ratePlan: selectedRatePlan
                  });
                }
              }
            }
          });
        }

        function updateScopeValues() {
          $scope.app = TPParam.app;
          $scope.user = TPParam.user;
          $scope.terminalError = TPParam.error;
          $scope.zuora = TPParam.zuora || {};
          $scope.zuora.selectedItems = [];
          $scope.initiated = TPParam.initiated;

          var zuoraSelectedRatePlanIds = TPParam.zuoraSelectedRatePlanIds || [];
          updateZuoraParams(zuoraSelectedRatePlanIds);

          $scope.zuora.getProductBySku = function (productCode) {
            return utilsService.find(TPParam.zuoraInternal.products, function (product) {
              return product.sku === productCode;
            }) || {};
          };

          var params = {};
          angular.extend(params, TPParam.params);
          $scope.params = exposeTemplateParams(params);
          $scope.custom = exposeCustomVariables(params.customVariables || {});
          $scope.customCookies = exposeCustomCookies(params.customCookies || {});
          $scope.activeMeters = exposeActiveMeters(params.activeMeters || []);

          browserIdService.getBrowserId().then(function (browserId) {
            $scope.browserId = browserId;
          });

          if ($scope.params.trackingId) {
            setupTrackingId($scope.params.trackingId);
          }

          $scope.isShowBoilerplateCloseButton = template.isShowBoilerplateCloseButton.bind(this, isTemplateCacheable);
        }

        function applyTemplateContext(userDataContext) {
          $timeout(function() {
            var userContext = userDataContext.userContext;
            isTemplateCacheable = true;
            angular.extend(TPParam.params, userDataContext.iframeParams);
            TPParam.user = _exposeUser(userContext.user_info.user);
            TPParam.params.experienceId = userContext.experience_id;
            TPParam.params.experienceExecutionId = userContext.experience_execution_id;
            TPParam.params.experienceActionId = userContext.experience_action_id;
            if (userContext.template_language) {
              lang.update(userContext.template_language);
            }
            TPParam.GEO_COUNTRY_CODE = userContext.country_code;
            TPParam.GEO_COUNTRY_POSTAL_CODE = userContext.postal_code;
            TPParam.initiated = true;
            template.config.url = TPParam.params.url;
            template.setUser(TPParam.params.userToken, TPParam.params.userProvider);
            updateScopeValues();
            template.init(options);
            ngEventService.fire('templateInitiated');
            ngEventService.fire('updatePianoIdAuthIframeUrl');
            eventService.customEvent('customEvent', {
              eventName: 'templateInitiated',
            });
          });
        }

        function _exposeUser(userJson) {
          var user = {};
          try {
            user = JSON.parse(userJson);
          } catch (e) {
          }
          return user;
        }

        var unsubTemplateReloaded = ngEventService.subscribe(EVENT_TEMPLATE_RELOADED, function () {
          updateScopeValues();
        });

        var unsubStatsTracked = ngEventService.subscribe(EVENT_STATS_TRACKED, function () {
          updateScopeValues();
        });

        var unsubTemplateContextDeferredLoadingInit = ngEventService.subscribe('userDataContextLoaded', function (event, params) {
          applyTemplateContext(params);
        });

        eventService.initContext().then(function (ctx) {
          $timeout(function(){
            window.TPParam.params.affiliateState = ctx.affiliateState;
            $scope.affiliateState = ctx.affiliateState;
            creditRedemptionService.setAffiliateState(ctx.affiliateState);
          }, 0);
        });

        var unsubSetupCustomVariables = ngEventService.subscribe(EVENT_SETUP_CUSTOM_VARIABLES, function (event, customVariables) {
          window.TPParam.params.customVariables = customVariables;
          $scope.custom = exposeCustomVariables(customVariables || {});
          $scope.$apply();
        });

        $scope.$on('$destroy', function () {
          unsubLangChanged();
          unsubTemplateReloaded();
          unsubStatsTracked();
          unsubTemplateContextDeferredLoadingInit();
          unsubSetupCustomVariables();
        });

        updateScopeValues();
      }]
    };
  }]);

showTemplateModule.factory('template', [
  '$window', '$rootScope', '$rootElement', '$timeout',
  'eventService', 'ngEventService', 'errorService',
  'containerService', 'userService', 'configService', 'trackExternalEvent', 'lang',
   'setupTrackingId', 'pianoIdProvider', 'updateDirAttrOnLangChanges',
  function ($window, $rootScope, $rootElement, $timeout,
            eventService, ngEventService, errorService,
            containerService, userService, configService, trackExternalEvent, lang,
             setupTrackingId, pianoIdProvider, updateDirAttrOnLangChanges
  ) {
    var template = {};
    template.$rootScope = $rootScope;
    template.rootElement = $rootElement;

    template.config = {
      "aid": TPParam.params.aid,
      "url": TPParam.params.url,
      "userToken": TPParam.params.userToken,
      "userProvider": TPParam.params.userProvider,
      "authStartScreen": TPParam.params.authStartScreen,
      pianoIdUrl: (TPParam.params.pianoIdUrl || 'https://id.tinypass.com/id/')
    };

    var anonUser = {
      displayName: null,
      email: null,
      firstName: null,
      lastName: null,
      uid: "anon",
      valid: false
    };

    var closeButtonTypes = {
      default: 'default',
      boilerplate: 'boilerplate',
    };

    template.init = function (options) {
      var templateContainer = angular.element("#template-container");

      containerService.init({preferredWidth: options.preferredWidth || 735}, function () {
        return {
          container: templateContainer
        };
      });

      if (TPParam.error) {
        errorService().terminal(lang.trc("checkout.platform", "Cannot initialize template"));
        return;
      }

      if (TPParam.consoleError) {
        util.log("%c[SHOW_TEMPLATE] Error: ".concat(TPParam.consoleError), "color: red;");
      }

      userService.init(function () {
        return {
          app: TPParam.app,
          user: TPParam.user,
          fillLoginIframeParams: function (iframeParams) {
            iframeParams.templateId = TPParam.params.templateId;
            iframeParams.templateVariantId = TPParam.params.templateVariantId;
          },
          fillLoginRequiredParamsToGoogleAnalytics: function (gaEventParams) {
            gaEventParams.templateId = TPParam.params.templateId;
            gaEventParams.templateVariantId = TPParam.params.templateVariantId;
          },
          fillLoginRequiredEventParams: function (loginRequiredEventParams) {
            loginRequiredEventParams.templateId = TPParam.params.templateId;
            loginRequiredEventParams.templateVariantId = TPParam.params.templateVariantId;
            if (template.isSiteLicensing) {
              loginRequiredEventParams.isSiteLicensing = template.isSiteLicensing;
            }
          },
          fillLoginSuccessEventParams: function (loginSuccessEventParams) {
            // nothing to do
          }
        };
      });


      // setup piano-id
      var templateWidgetOptionsForPianoIdIntegration = {
        aid: template.getConfig().aid,
        pianoIdUrl: template.getConfig().pianoIdUrl,
        checkout: 0,
        getDoubleOptInParams: undefined,
        customFormParams: template.getCustomFormParams,
        passwordlessEmailSentHandler: function () {},
        isPasswordlessCheckoutEnabled: function () {},
        isPreventPasswordlessLogin: function () {},
        isSingleStepEnabled: function () {},
        getAffiliateIssuerId: function () {}, // todo to implement this!!!!
        userLoginEmail: function () {
          return undefined;
        }, // todo to implement this!!!!
        passwordlessSetPaymentEmail: function () {},
        isSentLoginEmail: function () {
          return false;
        }, // todo maybe to implement this!!!!
        isSingleStepFormShown: function () { return false; },
        getUserToken: function () {
          return template.getConfig().userToken;
        },

        widgetSpecificCheckIfVisible: function () {
          return !!template.getCustomFormParams().formName;
        },
        getPageView : function(){
          return {
            tbc : $window.TPParam.params.tbc,
            pageViewId : $window.TPParam.params.pageViewId
          };
        }
      };
      pianoIdProvider.init(templateWidgetOptionsForPianoIdIntegration);

    };

    // TODO to add the parameters window.TPParam.params to the page
    template.getCustomFormParams = function () {
      var customFormParams = {};

      var customForm;

      var formNameByTermIdJson = window.TPParam.params.formNameByTermId;
      if (formNameByTermIdJson) {
        var formNameByTermId = JSON.parse(formNameByTermIdJson);

        var customFormTermId = co.input.customFormTermId;
        if (customFormTermId) {
          customForm = formNameByTermId[customFormTermId];
        }
      }

      if (customForm) {
        customFormParams.formName = customForm;
        customFormParams.hideCompletedFields = window.TPParam.params.hideCompletedFields || false;
      }

      customFormParams.trackingId = window.TPParam.params.trackingId;

      return customFormParams;
    };

    template.isUserValid = function () {
      return userService.isUserValid();
    };

    template.allowTinypassAccountsLogin = function () {
      return userService.allowTinypassAccountsLogin();
    };

    template.allowTinypassAccountsLogout = function () {
      return userService.allowTinypassAccountsLogout();
    };

    template.register = function () {
      if (eventService.isMobileDevice()) {
        eventService.registerEvent({});
      } else {
        userService.register();
      }
    };

    template.login = function (startScreen, customParams) {
      if (eventService.isMobileDevice()) {
        eventService.loginEvent({});
      } else {
        userService.login(startScreen, customParams);
      }
    };

    template.logout = function () {
      userService.logout();
      template.config.userToken = '';
      TPParam.user = anonUser;
      ngEventService.fire(EVENT_TEMPLATE_RELOADED);
    };

    template.close = function () {
      // close event will be logged in "checkProccessesForClose" handler

      containerService.close();
    };

    template.closeAndRefresh = function (url) {
      var externalEventParams = {};
      if (url) {
        externalEventParams['url'] = url;
      }

      trackExternalEvent('EXTERNAL_EVENT', 'close', externalEventParams);

      eventService.closeAndRefreshEvent(url);
    };

    template.reloadWithUserToken = function (userToken) {
      template.config.userToken = userToken;
      template.reload();
    };

    template.reload = function (isLoginSuccess) {
      var params = getUserCheckParams(template.config);
      params['fromUserIdentity'] = true;

      userService.checkUser(params).then(function (resp) {
        TPParam.user = resp.models.user;
        ngEventService.fire(EVENT_TEMPLATE_RELOADED);
        if (isLoginSuccess) {
          // should be removed after TPWEBAPP-28431
          ngEventService.fire('EVENT_TEMPLATE_LOGIN_SUCCESS');
        }
      }, function () {
        errorService().terminal(lang.trc("checkout.platform", "Check user failed"));
        return false;
      });
    };

    template.isShowBoilerplateCloseButton = function(isTemplateCacheable) {
      var closeButtonType = configService.get().closeButtonType;
      var showCloseButton = isTemplateCacheable
        ? TPParam.params.showCloseButton
        : getParameterByName('showCloseButton') !== 'false';
      var isBoilerplateBtnType = closeButtonType === closeButtonTypes.boilerplate;

      return showCloseButton && isBoilerplateBtnType;
    };

    template.getConfig = function () {
      return template.config;
    };

    template.setUser = function(userToken, userProvider) {
      template.config.userToken = userToken;
      template.config.userProvider = userProvider;
    };

    ngEventService.subscribe("checkProccessesForClose", function () {
      trackExternalEvent('EXTERNAL_EVENT', 'close', {});

      containerService.purge();
    });

    ngEventService.subscribe("reloadOffer", function (e, config) {
      template.config.userToken = config.userToken;
      template.reload();
    });

    ngEventService.subscribe('successfullyCreditRedeem', function (e, params) {
      util.log('[SHOW_TEMPLATE] redeem credit successfully: ', params);
    });

    ngEventService.subscribe('creditRedeemFailed', function (e, p) {
      let message = p && p.message;
      errorService().terminal(lang.trc('checkout.platform', 'Cannot redeem credit: ') + message);
      util.log('%c[SHOW_TEMPLATE] Cannot redeem credit: '.concat(message), "color: red;");
    });

    userService.onLoginSuccess(function (params) {
      template.config.userToken = params.user_token;
      template.reload(true);
    }, false);

    updateDirAttrOnLangChanges();

    return template;

    function getUserCheckParams(config) {
      var params = {};
      var paramNames = ["aid", "url", "userToken", "userProvider", "userRef"];

      angular.forEach(paramNames, function (p) {
        params[p] = typeof config[p] !== 'undefined' ? config[p] : getParameterByName(p);
      });

      return params;
    }
  }]);

angular.element(document).ready(function () {
  window["TPInjector"] = angular.bootstrap(document.getElementById("ng-app"), ['showTemplateModule'], {
    strictDi: true
  });
});

'use strict';
angular.module("ngLocale", [], ["$provide", function($provide) {
var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"};
$provide.value("$locale", {
  "DATETIME_FORMATS": {
    "AMPMS": [
      "a.m.",
      "p.m."
    ],
    "DAY": [
      "domingo",
      "lunes",
      "martes",
      "mi\u00e9rcoles",
      "jueves",
      "viernes",
      "s\u00e1bado"
    ],
    "MONTH": [
      "enero",
      "febrero",
      "marzo",
      "abril",
      "mayo",
      "junio",
      "julio",
      "agosto",
      "septiembre",
      "octubre",
      "noviembre",
      "diciembre"
    ],
    "SHORTDAY": [
      "dom",
      "lun",
      "mar",
      "mi\u00e9",
      "jue",
      "vie",
      "s\u00e1b"
    ],
    "SHORTMONTH": [
      "ene",
      "feb",
      "mar",
      "abr",
      "may",
      "jun",
      "jul",
      "ago",
      "sep",
      "oct",
      "nov",
      "dic"
    ],
    "fullDate": "EEEE, d 'de' MMMM 'de' y",
    "longDate": "d 'de' MMMM 'de' y",
    "medium": "dd/MM/yyyy HH:mm:ss",
    "mediumDate": "dd/MM/yyyy",
    "mediumTime": "HH:mm:ss",
    "short": "dd/MM/yy HH:mm",
    "shortDate": "dd/MM/yy",
    "shortTime": "HH:mm"
  },
  "NUMBER_FORMATS": {
    "CURRENCY_SYM": "\u20ac",
    "DECIMAL_SEP": ",",
    "GROUP_SEP": ".",
    "PATTERNS": [
      {
        "gSize": 3,
        "lgSize": 3,
        "macFrac": 0,
        "maxFrac": 3,
        "minFrac": 0,
        "minInt": 1,
        "negPre": "-",
        "negSuf": "",
        "posPre": "",
        "posSuf": ""
      },
      {
        "gSize": 3,
        "lgSize": 3,
        "macFrac": 0,
        "maxFrac": 2,
        "minFrac": 2,
        "minInt": 1,
        "negPre": "-",
        "negSuf": "\u00a0\u00a4",
        "posPre": "",
        "posSuf": "\u00a0\u00a4"
      }
    ]
  },
  "id": "es-mx",
  "pluralCat": function (n) {  if (n == 1) {   return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}
});
}]);
