text: 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)