//http://balupton.github.com/history.js/scripts/bundled/html4+html5/jquery.history.js
window.JSON || (window.JSON = {}), function () {
  function f(a) {
    return a < 10 ? "0" + a : a
  }
  function quote(a) {
    return escapable.lastIndex = 0, escapable.test(a) ? '"' + a.replace(escapable, function (a) {
      var b = meta[a];
      return typeof b == "string" ? b : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
    }) + '"' : '"' + a + '"'
  }
  function str(a, b) {
    var c, d, e, f, g = gap,
        h, i = b[a];
    i && typeof i == "object" && typeof i.toJSON == "function" && (i = i.toJSON(a)), typeof rep == "function" && (i = rep.call(b, a, i));
    switch (typeof i) {
    case "string":
      return quote(i);
    case "number":
      return isFinite(i) ? String(i) : "null";
    case "boolean":
    case "null":
      return String(i);
    case "object":
      if (!i) return "null";
      gap += indent, h = [];
      if (Object.prototype.toString.apply(i) === "[object Array]") {
        f = i.length;
        for (c = 0; c < f; c += 1) h[c] = str(c, i) || "null";
        return e = h.length === 0 ? "[]" : gap ? "[\n" + gap + h.join(",\n" + gap) + "\n" + g + "]" : "[" + h.join(",") + "]", gap = g, e
      }
      if (rep && typeof rep == "object") {
        f = rep.length;
        for (c = 0; c < f; c += 1) d = rep[c], typeof d == "string" && (e = str(d, i), e && h.push(quote(d) + (gap ? ": " : ":") + e))
      } else
      for (d in i) Object.hasOwnProperty.call(i, d) && (e = str(d, i), e && h.push(quote(d) + (gap ? ": " : ":") + e));
      return e = h.length === 0 ? "{}" : gap ? "{\n" + gap + h.join(",\n" + gap) + "\n" + g + "}" : "{" + h.join(",") + "}", gap = g, e
    }
  }
  "use strict", typeof Date.prototype.toJSON != "function" && (Date.prototype.toJSON = function (a) {
    return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z" : null
  }, String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (a) {
    return this.valueOf()
  });
  var JSON = window.JSON,
      cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
      escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
      gap, indent, meta = {
      "\b": "\\b",
      "\t": "\\t",
      "\n": "\\n",
      "\f": "\\f",
      "\r": "\\r",
      '"': '\\"',
      "\\": "\\\\"
      },
      rep;
  typeof JSON.stringify != "function" && (JSON.stringify = function (a, b, c) {
    var d;
    gap = "", indent = "";
    if (typeof c == "number") for (d = 0; d < c; d += 1) indent += " ";
    else typeof c == "string" && (indent = c);
    rep = b;
    if (!b || typeof b == "function" || typeof b == "object" && typeof b.length == "number") return str("", {
      "": a
    });
    throw new Error("JSON.stringify")
  }), typeof JSON.parse != "function" && (JSON.parse = function (text, reviver) {
    function walk(a, b) {
      var c, d, e = a[b];
      if (e && typeof e == "object") for (c in e) Object.hasOwnProperty.call(e, c) && (d = walk(e, c), d !== undefined ? e[c] = d : delete e[c]);
      return reviver.call(a, b, e)
    }
    var j;
    text = String(text), cx.lastIndex = 0, cx.test(text) && (text = text.replace(cx, function (a) {
      return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
    }));
    if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) return j = eval("(" + text + ")"), typeof reviver == "function" ? walk({
      "": j
    }, "") : j;
    throw new SyntaxError("JSON.parse")
  })
}(), function (a, b) {
  "use strict";
  var c = a.History = a.History || {},
      d = a.jQuery;
  if (typeof c.Adapter != "undefined") throw new Error("History.js Adapter has already been loaded...");
  c.Adapter = {
    bind: function (a, b, c) {
      d(a).bind(b, c)
    },
    trigger: function (a, b, c) {
      d(a).trigger(b, c)
    },
    extractEventData: function (a, c, d) {
      var e = c && c.originalEvent && c.originalEvent[a] || d && d[a] || b;
      return e
    },
    onDomLoad: function (a) {
      d(a)
    }
  }, typeof c.init != "undefined" && c.init()
}(window), function (a, b) {
  "use strict";
  var c = a.document,
      d = a.setTimeout || d,
      e = a.clearTimeout || e,
      f = a.setInterval || f,
      g = a.History = a.History || {};
  if (typeof g.initHtml4 != "undefined") throw new Error("History.js HTML4 Support has already been loaded...");
  g.initHtml4 = function () {
    if (typeof g.initHtml4.initialized != "undefined") return !1;
    g.initHtml4.initialized = !0, g.enabled = !0, g.savedHashes = [], g.isLastHash = function (a) {
      var b = g.getHashByIndex(),
          c;
      return c = a === b, c
    }, g.saveHash = function (a) {
      return g.isLastHash(a) ? !1 : (g.savedHashes.push(a), !0)
    }, g.getHashByIndex = function (a) {
      var b = null;
      return typeof a == "undefined" ? b = g.savedHashes[g.savedHashes.length - 1] : a < 0 ? b = g.savedHashes[g.savedHashes.length + a] : b = g.savedHashes[a], b
    }, g.discardedHashes = {}, g.discardedStates = {}, g.discardState = function (a, b, c) {
      var d = g.getHashByState(a),
          e;
      return e = {
        discardedState: a,
        backState: c,
        forwardState: b
      }, g.discardedStates[d] = e, !0
    }, g.discardHash = function (a, b, c) {
      var d = {
        discardedHash: a,
        backState: c,
        forwardState: b
      };
      return g.discardedHashes[a] = d, !0
    }, g.discardedState = function (a) {
      var b = g.getHashByState(a),
          c;
      return c = g.discardedStates[b] || !1, c
    }, g.discardedHash = function (a) {
      var b = g.discardedHashes[a] || !1;
      return b
    }, g.recycleState = function (a) {
      var b = g.getHashByState(a);
      return g.discardedState(a) && delete g.discardedStates[b], !0
    }, g.emulated.hashChange && (g.hashChangeInit = function () {
      g.checkerFunction = null;
      var b = "",
          d, e, h, i;
      return g.isInternetExplorer() ? (d = "historyjs-iframe", e = c.createElement("iframe"), e.setAttribute("id", d), e.style.display = "none", c.body.appendChild(e), e.contentWindow.document.open(), e.contentWindow.document.close(), h = "", i = !1, g.checkerFunction = function () {
        if (i) return !1;
        i = !0;
        var c = g.getHash() || "",
            d = g.unescapeHash(e.contentWindow.document.location.hash) || "";
        return c !== b ? (b = c, d !== c && (h = d = c, e.contentWindow.document.open(), e.contentWindow.document.close(), e.contentWindow.document.location.hash = g.escapeHash(c)), g.Adapter.trigger(a, "hashchange")) : d !== h && (h = d, g.setHash(d, !1)), i = !1, !0
      }) : g.checkerFunction = function () {
        var c = g.getHash();
        return c !== b && (b = c, g.Adapter.trigger(a, "hashchange")), !0
      }, g.intervalList.push(f(g.checkerFunction, g.options.hashChangeInterval)), !0
    }, g.Adapter.onDomLoad(g.hashChangeInit)), g.emulated.pushState && (g.onHashChange = function (b) {
      var d = b && b.newURL || c.location.href,
          e = g.getHashByUrl(d),
          f = null,
          h = null,
          i = null,
          j;
      return g.isLastHash(e) ? (g.busy(!1), !1) : (g.doubleCheckComplete(), g.saveHash(e), e && g.isTraditionalAnchor(e) ? (g.Adapter.trigger(a, "anchorchange"), g.busy(!1), !1) : (f = g.extractState(g.getFullUrl(e || c.location.href, !1), !0), g.isLastSavedState(f) ? (g.busy(!1), !1) : (h = g.getHashByState(f), j = g.discardedState(f), j ? (g.getHashByIndex(-2) === g.getHashByState(j.forwardState) ? g.back(!1) : g.forward(!1), !1) : (g.pushState(f.data, f.title, f.url, !1), !0))))
    }, g.Adapter.bind(a, "hashchange", g.onHashChange), g.pushState = function (b, d, e, f) {
      if (g.getHashByUrl(e)) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");
      if (f !== !1 && g.busy()) return g.pushQueue({
        scope: g,
        callback: g.pushState,
        args: arguments,
        queue: f
      }), !1;
      g.busy(!0);
      var h = g.createStateObject(b, d, e),
          i = g.getHashByState(h),
          j = g.getState(!1),
          k = g.getHashByState(j),
          l = g.getHash();
      return g.storeState(h), g.expectedStateId = h.id, g.recycleState(h), g.setTitle(h), i === k ? (g.busy(!1), !1) : i !== l && i !== g.getShortUrl(c.location.href) ? (g.setHash(i, !1), !1) : (g.saveState(h), g.Adapter.trigger(a, "statechange"), g.busy(!1), !0)
    }, g.replaceState = function (a, b, c, d) {
      if (g.getHashByUrl(c)) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");
      if (d !== !1 && g.busy()) return g.pushQueue({
        scope: g,
        callback: g.replaceState,
        args: arguments,
        queue: d
      }), !1;
      g.busy(!0);
      var e = g.createStateObject(a, b, c),
          f = g.getState(!1),
          h = g.getStateByIndex(-2);
      return g.discardState(f, e, h), g.pushState(e.data, e.title, e.url, !1), !0
    }), g.emulated.pushState && g.getHash() && !g.emulated.hashChange && g.Adapter.onDomLoad(function () {
      g.Adapter.trigger(a, "hashchange")
    })
  }, typeof g.init != "undefined" && g.init()
}(window), function (a, b) {
  "use strict";
  var c = a.console || b,
      d = a.document,
      e = a.navigator,
      f = a.sessionStorage || !1,
      g = a.setTimeout,
      h = a.clearTimeout,
      i = a.setInterval,
      j = a.clearInterval,
      k = a.JSON,
      l = a.alert,
      m = a.History = a.History || {},
      n = a.history;
  k.stringify = k.stringify || k.encode, k.parse = k.parse || k.decode;
  if (typeof m.init != "undefined") throw new Error("History.js Core has already been loaded...");
  m.init = function () {
    return typeof m.Adapter == "undefined" ? !1 : (typeof m.initCore != "undefined" && m.initCore(), typeof m.initHtml4 != "undefined" && m.initHtml4(), !0)
  }, m.initCore = function () {
    if (typeof m.initCore.initialized != "undefined") return !1;
    m.initCore.initialized = !0, m.options = m.options || {}, m.options.hashChangeInterval = m.options.hashChangeInterval || 100, m.options.safariPollInterval = m.options.safariPollInterval || 500, m.options.doubleCheckInterval = m.options.doubleCheckInterval || 500, m.options.storeInterval = m.options.storeInterval || 1e3, m.options.busyDelay = m.options.busyDelay || 250, m.options.debug = m.options.debug || !1, m.options.initialTitle = m.options.initialTitle || d.title, m.intervalList = [], m.clearAllIntervals = function () {
      var a, b = m.intervalList;
      if (typeof b != "undefined" && b !== null) {
        for (a = 0; a < b.length; a++) j(b[a]);
        m.intervalList = null
      }
    }, m.debug = function () {
      (m.options.debug || !1) && m.log.apply(m, arguments)
    }, m.log = function () {
      var a = typeof c != "undefined" && typeof c.log != "undefined" && typeof c.log.apply != "undefined",
          b = d.getElementById("log"),
          e, f, g, h, i;
      a ? (h = Array.prototype.slice.call(arguments), e = h.shift(), typeof c.debug != "undefined" ? c.debug.apply(c, [e, h]) : c.log.apply(c, [e, h])) : e = "\n" + arguments[0] + "\n";
      for (f = 1, g = arguments.length; f < g; ++f) {
        i = arguments[f];
        if (typeof i == "object" && typeof k != "undefined") try {
          i = k.stringify(i)
        } catch (j) {}
        e += "\n" + i + "\n"
      }
      return b ? (b.value += e + "\n-----\n", b.scrollTop = b.scrollHeight - b.clientHeight) : a || l(e), !0
    }, m.getInternetExplorerMajorVersion = function () {
      var a = m.getInternetExplorerMajorVersion.cached = typeof m.getInternetExplorerMajorVersion.cached != "undefined" ? m.getInternetExplorerMajorVersion.cached : function () {
        var a = 3,
            b = d.createElement("div"),
            c = b.getElementsByTagName("i");
        while ((b.innerHTML = "<!--[if gt IE " + ++a + "]><i></i><![endif]-->") && c[0]);
        return a > 4 ? a : !1
      }();
      return a
    }, m.isInternetExplorer = function () {
      var a = m.isInternetExplorer.cached = typeof m.isInternetExplorer.cached != "undefined" ? m.isInternetExplorer.cached : Boolean(m.getInternetExplorerMajorVersion());
      return a
    }, m.emulated = {
      pushState: !Boolean(a.history && a.history.pushState && a.history.replaceState && !/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent) && !/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),
      hashChange: Boolean(!("onhashchange" in a || "onhashchange" in d) || m.isInternetExplorer() && m.getInternetExplorerMajorVersion() < 8)
    }, m.enabled = !m.emulated.pushState, m.bugs = {
      setHash: Boolean(!m.emulated.pushState && e.vendor === "Apple Computer, Inc." && /AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),
      safariPoll: Boolean(!m.emulated.pushState && e.vendor === "Apple Computer, Inc." && /AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),
      ieDoubleCheck: Boolean(m.isInternetExplorer() && m.getInternetExplorerMajorVersion() < 8),
      hashEscape: Boolean(m.isInternetExplorer() && m.getInternetExplorerMajorVersion() < 7)
    }, m.isEmptyObject = function (a) {
      for (var b in a) return !1;
      return !0
    }, m.cloneObject = function (a) {
      var b, c;
      return a ? (b = k.stringify(a), c = k.parse(b)) : c = {}, c
    }, m.getRootUrl = function () {
      var a = d.location.protocol + "//" + (d.location.hostname || d.location.host);
      if (d.location.port || !1) a += ":" + d.location.port;
      return a += "/", a
    }, m.getBaseHref = function () {
      var a = d.getElementsByTagName("base"),
          b = null,
          c = "";
      return a.length === 1 && (b = a[0], c = b.href.replace(/[^\/]+$/, "")), c = c.replace(/\/+$/, ""), c && (c += "/"), c
    }, m.getBaseUrl = function () {
      var a = m.getBaseHref() || m.getBasePageUrl() || m.getRootUrl();
      return a
    }, m.getPageUrl = function () {
      var a = m.getState(!1, !1),
          b = (a || {}).url || d.location.href,
          c;
      return c = b.replace(/\/+$/, "").replace(/[^\/]+$/, function (a, b, c) {
        return /\./.test(a) ? a : a + "/"
      }), c
    }, m.getBasePageUrl = function () {
      var a = d.location.href.replace(/[#\?].*/, "").replace(/[^\/]+$/, function (a, b, c) {
        return /[^\/]$/.test(a) ? "" : a
      }).replace(/\/+$/, "") + "/";
      return a
    }, m.getFullUrl = function (a, b) {
      var c = a,
          d = a.substring(0, 1);
      return b = typeof b == "undefined" ? !0 : b, /[a-z]+\:\/\//.test(a) || (d === "/" ? c = m.getRootUrl() + a.replace(/^\/+/, "") : d === "#" ? c = m.getPageUrl().replace(/#.*/, "") + a : d === "?" ? c = m.getPageUrl().replace(/[\?#].*/, "") + a : b ? c = m.getBaseUrl() + a.replace(/^(\.\/)+/, "") : c = m.getBasePageUrl() + a.replace(/^(\.\/)+/, "")), c.replace(/\#$/, "")
    }, m.getShortUrl = function (a) {
      var b = a,
          c = m.getBaseUrl(),
          d = m.getRootUrl();
      return m.emulated.pushState && (b = b.replace(c, "")), b = b.replace(d, "/"), m.isTraditionalAnchor(b) && (b = "./" + b), b = b.replace(/^(\.\/)+/g, "./").replace(/\#$/, ""), b
    }, m.store = {}, m.idToState = m.idToState || {}, m.stateToId = m.stateToId || {}, m.urlToId = m.urlToId || {}, m.storedStates = m.storedStates || [], m.savedStates = m.savedStates || [], m.normalizeStore = function () {
      m.store.idToState = m.store.idToState || {}, m.store.urlToId = m.store.urlToId || {}, m.store.stateToId = m.store.stateToId || {}
    }, m.getState = function (a, b) {
      typeof a == "undefined" && (a = !0), typeof b == "undefined" && (b = !0);
      var c = m.getLastSavedState();
      return !c && b && (c = m.createStateObject()), a && (c = m.cloneObject(c), c.url = c.cleanUrl || c.url), c
    }, m.getIdByState = function (a) {
      var b = m.extractId(a.url),
          c;
      if (!b) {
        c = m.getStateString(a);
        if (typeof m.stateToId[c] != "undefined") b = m.stateToId[c];
        else if (typeof m.store.stateToId[c] != "undefined") b = m.store.stateToId[c];
        else {
          for (;;) {
            b = (new Date).getTime() + String(Math.random()).replace(/\D/g, "");
            if (typeof m.idToState[b] == "undefined" && typeof m.store.idToState[b] == "undefined") break
          }
          m.stateToId[c] = b, m.idToState[b] = a
        }
      }
      return b
    }, m.normalizeState = function (a) {
      var b, c;
      if (!a || typeof a != "object") a = {};
      if (typeof a.normalized != "undefined") return a;
      if (!a.data || typeof a.data != "object") a.data = {};
      b = {}, b.normalized = !0, b.title = a.title || "", b.url = m.getFullUrl(m.unescapeString(a.url || d.location.href)), b.hash = m.getShortUrl(b.url), b.data = m.cloneObject(a.data), b.id = m.getIdByState(b), b.cleanUrl = b.url.replace(/\??\&_suid.*/, ""), b.url = b.cleanUrl, c = !m.isEmptyObject(b.data);
      if (b.title || c) b.hash = m.getShortUrl(b.url).replace(/\??\&_suid.*/, ""), /\?/.test(b.hash) || (b.hash += "?"), b.hash += "&_suid=" + b.id;
      return b.hashedUrl = m.getFullUrl(b.hash), (m.emulated.pushState || m.bugs.safariPoll) && m.hasUrlDuplicate(b) && (b.url = b.hashedUrl), b
    }, m.createStateObject = function (a, b, c) {
      var d = {
        data: a,
        title: b,
        url: c
      };
      return d = m.normalizeState(d), d
    }, m.getStateById = function (a) {
      a = String(a);
      var c = m.idToState[a] || m.store.idToState[a] || b;
      return c
    }, m.getStateString = function (a) {
      var b, c, d;
      return b = m.normalizeState(a), c = {
        data: b.data,
        title: a.title,
        url: a.url
      }, d = k.stringify(c), d
    }, m.getStateId = function (a) {
      var b, c;
      return b = m.normalizeState(a), c = b.id, c
    }, m.getHashByState = function (a) {
      var b, c;
      return b = m.normalizeState(a), c = b.hash, c
    }, m.extractId = function (a) {
      var b, c, d;
      return c = /(.*)\&_suid=([0-9]+)$/.exec(a), d = c ? c[1] || a : a, b = c ? String(c[2] || "") : "", b || !1
    }, m.isTraditionalAnchor = function (a) {
      var b = !/[\/\?\.]/.test(a);
      return b
    }, m.extractState = function (a, b) {
      var c = null,
          d, e;
      return b = b || !1, d = m.extractId(a), d && (c = m.getStateById(d)), c || (e = m.getFullUrl(a), d = m.getIdByUrl(e) || !1, d && (c = m.getStateById(d)), !c && b && !m.isTraditionalAnchor(a) && (c = m.createStateObject(null, null, e))), c
    }, m.getIdByUrl = function (a) {
      var c = m.urlToId[a] || m.store.urlToId[a] || b;
      return c
    }, m.getLastSavedState = function () {
      return m.savedStates[m.savedStates.length - 1] || b
    }, m.getLastStoredState = function () {
      return m.storedStates[m.storedStates.length - 1] || b
    }, m.hasUrlDuplicate = function (a) {
      var b = !1,
          c;
      return c = m.extractState(a.url), b = c && c.id !== a.id, b
    }, m.storeState = function (a) {
      return m.urlToId[a.url] = a.id, m.storedStates.push(m.cloneObject(a)), a
    }, m.isLastSavedState = function (a) {
      var b = !1,
          c, d, e;
      return m.savedStates.length && (c = a.id, d = m.getLastSavedState(), e = d.id, b = c === e), b
    }, m.saveState = function (a) {
      return m.isLastSavedState(a) ? !1 : (m.savedStates.push(m.cloneObject(a)), !0)
    }, m.getStateByIndex = function (a) {
      var b = null;
      return typeof a == "undefined" ? b = m.savedStates[m.savedStates.length - 1] : a < 0 ? b = m.savedStates[m.savedStates.length + a] : b = m.savedStates[a], b
    }, m.getHash = function () {
      var a = m.unescapeHash(d.location.hash);
      return a
    }, m.unescapeString = function (b) {
      var c = b,
          d;
      for (;;) {
        d = a.unescape(c);
        if (d === c) break;
        c = d
      }
      return c
    }, m.unescapeHash = function (a) {
      var b = m.normalizeHash(a);
      return b = m.unescapeString(b), b
    }, m.normalizeHash = function (a) {
      var b = a.replace(/[^#]*#/, "").replace(/#.*/, "");
      return b
    }, m.setHash = function (a, b) {
      var c, e, f;
      return b !== !1 && m.busy() ? (m.pushQueue({
        scope: m,
        callback: m.setHash,
        args: arguments,
        queue: b
      }), !1) : (c = m.escapeHash(a), m.busy(!0), e = m.extractState(a, !0), e && !m.emulated.pushState ? m.pushState(e.data, e.title, e.url, !1) : d.location.hash !== c && (m.bugs.setHash ? (f = m.getPageUrl(), m.pushState(null, null, f + "#" + c, !1)) : d.location.hash = c), m)
    }, m.escapeHash = function (b) {
      var c = m.normalizeHash(b);
      return c = a.escape(c), m.bugs.hashEscape || (c = c.replace(/\%21/g, "!").replace(/\%26/g, "&").replace(/\%3D/g, "=").replace(/\%3F/g, "?")), c
    }, m.getHashByUrl = function (a) {
      var b = String(a).replace(/([^#]*)#?([^#]*)#?(.*)/, "$2");
      return b = m.unescapeHash(b), b
    }, m.setTitle = function (a) {
      var b = a.title,
          c;
      b || (c = m.getStateByIndex(0), c && c.url === a.url && (b = c.title || m.options.initialTitle));
      try {
        d.getElementsByTagName("title")[0].innerHTML = b.replace("<", "&lt;").replace(">", "&gt;").replace(" & ", " &amp; ")
      } catch (e) {}
      return d.title = b, m
    }, m.queues = [], m.busy = function (a) {
      typeof a != "undefined" ? m.busy.flag = a : typeof m.busy.flag == "undefined" && (m.busy.flag = !1);
      if (!m.busy.flag) {
        h(m.busy.timeout);
        var b = function () {
          var a, c, d;
          if (m.busy.flag) return;
          for (a = m.queues.length - 1; a >= 0; --a) {
            c = m.queues[a];
            if (c.length === 0) continue;
            d = c.shift(), m.fireQueueItem(d), m.busy.timeout = g(b, m.options.busyDelay)
          }
        };
        m.busy.timeout = g(b, m.options.busyDelay)
      }
      return m.busy.flag
    }, m.busy.flag = !1, m.fireQueueItem = function (a) {
      return a.callback.apply(a.scope || m, a.args || [])
    }, m.pushQueue = function (a) {
      return m.queues[a.queue || 0] = m.queues[a.queue || 0] || [], m.queues[a.queue || 0].push(a), m
    }, m.queue = function (a, b) {
      return typeof a == "function" && (a = {
        callback: a
      }), typeof b != "undefined" && (a.queue = b), m.busy() ? m.pushQueue(a) : m.fireQueueItem(a), m
    }, m.clearQueue = function () {
      return m.busy.flag = !1, m.queues = [], m
    }, m.stateChanged = !1, m.doubleChecker = !1, m.doubleCheckComplete = function () {
      return m.stateChanged = !0, m.doubleCheckClear(), m
    }, m.doubleCheckClear = function () {
      return m.doubleChecker && (h(m.doubleChecker), m.doubleChecker = !1), m
    }, m.doubleCheck = function (a) {
      return m.stateChanged = !1, m.doubleCheckClear(), m.bugs.ieDoubleCheck && (m.doubleChecker = g(function () {
        return m.doubleCheckClear(), m.stateChanged || a(), !0
      }, m.options.doubleCheckInterval)), m
    }, m.safariStatePoll = function () {
      var b = m.extractState(d.location.href),
          c;
      if (!m.isLastSavedState(b)) c = b;
      else
      return;
      return c || (c = m.createStateObject()), m.Adapter.trigger(a, "popstate"), m
    }, m.back = function (a) {
      return a !== !1 && m.busy() ? (m.pushQueue({
        scope: m,
        callback: m.back,
        args: arguments,
        queue: a
      }), !1) : (m.busy(!0), m.doubleCheck(function () {
        m.back(!1)
      }), n.go(-1), !0)
    }, m.forward = function (a) {
      return a !== !1 && m.busy() ? (m.pushQueue({
        scope: m,
        callback: m.forward,
        args: arguments,
        queue: a
      }), !1) : (m.busy(!0), m.doubleCheck(function () {
        m.forward(!1)
      }), n.go(1), !0)
    }, m.go = function (a, b) {
      var c;
      if (a > 0) for (c = 1; c <= a; ++c) m.forward(b);
      else {
        if (!(a < 0)) throw new Error("History.go: History.go requires a positive or negative integer passed.");
        for (c = -1; c >= a; --c) m.back(b)
      }
      return m
    };
    if (m.emulated.pushState) {
      var o = function () {};
      m.pushState = m.pushState || o, m.replaceState = m.replaceState || o
    } else m.onPopState = function (b, c) {
      var e = !1,
          f = !1,
          g, h;
      return m.doubleCheckComplete(), g = m.getHash(), g ? (h = m.extractState(g || d.location.href, !0), h ? m.replaceState(h.data, h.title, h.url, !1) : (m.Adapter.trigger(a, "anchorchange"), m.busy(!1)), m.expectedStateId = !1, !1) : (e = m.Adapter.extractEventData("state", b, c) || !1, e ? f = m.getStateById(e) : m.expectedStateId ? f = m.getStateById(m.expectedStateId) : f = m.extractState(d.location.href), f || (f = m.createStateObject(null, null, d.location.href)), m.expectedStateId = !1, m.isLastSavedState(f) ? (m.busy(!1), !1) : (m.storeState(f), m.saveState(f), m.setTitle(f), m.Adapter.trigger(a, "statechange"), m.busy(!1), !0))
    }, m.Adapter.bind(a, "popstate", m.onPopState), m.pushState = function (b, c, d, e) {
      if (m.getHashByUrl(d) && m.emulated.pushState) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");
      if (e !== !1 && m.busy()) return m.pushQueue({
        scope: m,
        callback: m.pushState,
        args: arguments,
        queue: e
      }), !1;
      m.busy(!0);
      var f = m.createStateObject(b, c, d);
      return m.isLastSavedState(f) ? m.busy(!1) : (m.storeState(f), m.expectedStateId = f.id, n.pushState(f.id, f.title, f.url), m.Adapter.trigger(a, "popstate")), !0
    }, m.replaceState = function (b, c, d, e) {
      if (m.getHashByUrl(d) && m.emulated.pushState) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");
      if (e !== !1 && m.busy()) return m.pushQueue({
        scope: m,
        callback: m.replaceState,
        args: arguments,
        queue: e
      }), !1;
      m.busy(!0);
      var f = m.createStateObject(b, c, d);
      return m.isLastSavedState(f) ? m.busy(!1) : (m.storeState(f), m.expectedStateId = f.id, n.replaceState(f.id, f.title, f.url), m.Adapter.trigger(a, "popstate")), !0
    };
    if (f) {
      try {
        m.store = k.parse(f.getItem("History.store")) || {}
      } catch (p) {
        m.store = {}
      }
      m.normalizeStore()
    } else m.store = {}, m.normalizeStore();
    m.Adapter.bind(a, "beforeunload", m.clearAllIntervals), m.Adapter.bind(a, "unload", m.clearAllIntervals), m.saveState(m.storeState(m.extractState(d.location.href, !0))), f && (m.onUnload = function () {
      var a, b;
      try {
        a = k.parse(f.getItem("History.store")) || {}
      } catch (c) {
        a = {}
      }
      a.idToState = a.idToState || {}, a.urlToId = a.urlToId || {}, a.stateToId = a.stateToId || {};
      for (b in m.idToState) {
        if (!m.idToState.hasOwnProperty(b)) continue;
        a.idToState[b] = m.idToState[b]
      }
      for (b in m.urlToId) {
        if (!m.urlToId.hasOwnProperty(b)) continue;
        a.urlToId[b] = m.urlToId[b]
      }
      for (b in m.stateToId) {
        if (!m.stateToId.hasOwnProperty(b)) continue;
        a.stateToId[b] = m.stateToId[b]
      }
      m.store = a, m.normalizeStore(), f.setItem("History.store", k.stringify(a))
    }, m.intervalList.push(i(m.onUnload, m.options.storeInterval)), m.Adapter.bind(a, "beforeunload", m.onUnload), m.Adapter.bind(a, "unload", m.onUnload));
    if (!m.emulated.pushState) {
      m.bugs.safariPoll && m.intervalList.push(i(m.safariStatePoll, m.options.safariPollInterval));
      if (e.vendor === "Apple Computer, Inc." || (e.appCodeName || "") === "Mozilla") m.Adapter.bind(a, "hashchange", function () {
        m.Adapter.trigger(a, "popstate")
      }), m.getHash() && m.Adapter.onDomLoad(function () {
        m.Adapter.trigger(a, "hashchange")
      })
    }
  }, m.init()
}(window)
