UNPKG

behave-history

Version:

A better browser history manager

327 lines (294 loc) 26.8 kB
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ "use strict"; var _prototypeProperties = function (child, staticProps, instanceProps) { if (staticProps) Object.defineProperties(child, staticProps); if (instanceProps) Object.defineProperties(child.prototype, instanceProps); }; var registry = {}; var isPending = {}; var isHandled = {}; var isFunction = function (candidate) { return Object.prototype.toString.call(candidate) === "[object Function]"; }; var BehaveDispatcher = (function () { function BehaveDispatcher() { this._isDispatching = false; this._pendingPayload = null; } _prototypeProperties(BehaveDispatcher, null, { register: { value: function register(id, deps, callback) { if (isFunction(deps) && !callback) { callback = deps; deps = []; } var errorMessage = "" + id + " is already registered with the dispatcher!"; if (registry[id]) throw new Error(errorMessage); registry[id] = { deps: deps, fn: callback }; }, writable: true, enumerable: true, configurable: true }, unregister: { value: function unregister(id) { delete registry[id]; }, writable: true, enumerable: true, configurable: true }, purge: { value: function purge() { for (var id in registry) { delete registry[id]; }for (var id in isPending) { delete isPending[id]; }for (var id in isHandled) { delete isHandled[id]; } }, writable: true, enumerable: true, configurable: true }, dispatch: { value: function dispatch(payload) { this._startDispatching(payload); try { for (var id in registry) { if (isPending[id]) continue; this._invokeCallback(id); } } finally { this._stopDispatching(); } }, writable: true, enumerable: true, configurable: true }, _invokeCallback: { value: function InvokeCallback(id) { var cb = registry[id]; isPending[id] = true; if (cb.deps.length) this._waitFor(cb.deps); registry[id].fn(this._pendingPayload); isHandled[id] = true; }, writable: true, enumerable: true, configurable: true }, _waitFor: { value: function WaitFor(ids) { for (var i = 0; i < ids.length; i++) { var id = ids[i]; if (isPending[id]) continue; this._invokeCallback(id); } }, writable: true, enumerable: true, configurable: true }, _startDispatching: { value: function StartDispatching(payload) { for (var id in registry) { isPending[id] = false; isHandled[id] = false; } this._pendingPayload = payload; this._isDispatching = true; }, writable: true, enumerable: true, configurable: true }, _stopDispatching: { value: function StopDispatching() { this._pendingPayload = null; this._isDispatching = false; }, writable: true, enumerable: true, configurable: true } }); return BehaveDispatcher; })(); module.exports = new BehaveDispatcher(); },{}],2:[function(require,module,exports){ "use strict"; var _interopRequire = function (obj) { return obj && (obj["default"] || obj); }; var BehaveHistory = _interopRequire(require("./index")); var dispatcher = _interopRequire(require("behave-dispatcher")); var behaveHistory = new BehaveHistory({ dispatcher: dispatcher }); dispatcher.register("ConsoleService", function (evt) { if (evt.type === "ROUTE_CHANGE") console.log(evt); }); behaveHistory.start(); window.dispatcher = dispatcher; window.behaveHistory = behaveHistory; },{"./index":3,"behave-dispatcher":1}],3:[function(require,module,exports){ "use strict"; var _prototypeProperties = function (child, staticProps, instanceProps) { if (staticProps) Object.defineProperties(child, staticProps); if (instanceProps) Object.defineProperties(child.prototype, instanceProps); }; var routeStripper = /^[#\/]|\s+$/g; var BehaveHistory = (function () { function BehaveHistory() { var _this = this; var options = arguments[0] === undefined ? {} : arguments[0]; this._root = options.root || "/"; this._location = window.location; this._history = window.history; this._wantsHashChange = options.hashChange || false; this._hasPushState = !!(this._history && this._history.pushState); this._eventType = options.eventType || "ROUTE"; this._started = false; this._baseUrl = this._location.protocol + "//" + this._location.host; if (!options.dispatcher) throw new Error("No dispatcher passed to history!"); this._dispatcher = options.dispatcher; this._dispatcher.register("HistoryService", function (evt) { if (evt.type !== _this._eventType) return; if (!evt.options) evt.options = {}; if (_this._started) _this._update(evt); }); } _prototypeProperties(BehaveHistory, null, { start: { value: function start() { var _this2 = this; var evt = this._hasPushState ? "popstate" : "hashchange"; window.addEventListener(evt, function (e) { return _this2._handleHistoryEvent(e); }); this._started = true; }, writable: true, enumerable: true, configurable: true }, stop: { value: function stop() { var _this3 = this; var evt = this._hasPushState ? "popstate" : "hashchange"; window.removeEventListener(evt, function (e) { return _this3._handleHistoryEvent(e); }); this._started = false; }, writable: true, enumerable: true, configurable: true }, _update: { value: function Update(evt) { if (evt.route === this._getFragment()) return; var url = this._baseUrl + this._root + evt.route; if (this._hasPushState && !this._wantsHashChange) { this._pushState(evt.data || {}, url, !!evt.options.replace); } else { this._updateHash(evt.route, !!evt.options.replace); } this.dispatcher.dispatch({ type: "ROUTE_CHANGE", route: evt.route, data: evt.data, options: evt.options }); }, writable: true, enumerable: true, configurable: true }, _pushState: { value: function PushState(data, route, replace) { this._history[replace ? "replaceState" : "pushState"](data, document.title, route); }, writable: true, enumerable: true, configurable: true }, _updateHash: { value: function UpdateHash(route, replace) { if (replace) { var href = this._location.href.replace(/(javascript:|#).*$/, ""); this._location.replace(href + "#" + route); } else { // Some browsers require that `hash` contains a leading #. this._location.hash = "#/" + route; } }, writable: true, enumerable: true, configurable: true }, _getFragment: { value: function GetFragment(fragment) { if (!fragment) fragment = this[this._hasPushState ? "_getPath" : "_getHash"](); return fragment.replace(routeStripper, ""); }, writable: true, enumerable: true, configurable: true }, _getHash: { value: function GetHash() { var match = this._location.href.match(/#(.*)$/); return match ? match[1] : ""; }, writable: true, enumerable: true, configurable: true }, _getPath: { value: function GetPath() { var path = decodeURI(this._location.pathname + this._getSearch()); var root = this._root.slice(0, -1); if (!path.indexOf(root)) path = path.slice(root.length); return path.charAt(0) === "/" ? path.slice(1) : path; }, writable: true, enumerable: true, configurable: true }, _getSearch: { value: function GetSearch() { var match = this._location.href.replace(/#.*/, "").match(/\?.+/); return match ? match[0] : ""; }, writable: true, enumerable: true, configurable: true }, _handleHistoryEvent: { value: function HandleHistoryEvent(e) { var data = {}; if (e.type === "popstate" && e.state !== null) data = e.state; this._dispatcher.dispatch({ type: this._eventType, route: this._getFragment(), data: data, options: { originalEvent: e } }); }, writable: true, enumerable: true, configurable: true } }); return BehaveHistory; })(); module.exports = BehaveHistory; },{}]},{},[2]) //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9ncnVudC1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYmVoYXZlLWRpc3BhdGNoZXIvZGlzdC9pbmRleC5qcyIsIi9Vc2Vycy9ra2VtcGxlL0RvY3VtZW50cy9wcm9qZWN0cy9iZWhhdmUvYmVoYXZlLWhpc3Rvcnkvc3JjL2Rldi5qcyIsIi9Vc2Vycy9ra2VtcGxlL0RvY3VtZW50cy9wcm9qZWN0cy9iZWhhdmUvYmVoYXZlLWhpc3Rvcnkvc3JjL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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RSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDeEQsZUFBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztPQUN4RDs7Ozs7QUFFRCxjQUFVO2FBQUEscUJBQUc7QUFDVCxZQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqRSxlQUFPLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO09BQ2hDOzs7OztBQUVELHVCQUFtQjthQUFBLDRCQUFDLENBQUMsRUFBRTtBQUNuQixZQUFJLElBQUksR0FBRyxFQUFFLENBQUM7O0FBRWQsWUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM5RCxZQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztBQUN0QixjQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVU7QUFDckIsZUFBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUU7QUFDMUIsY0FBSSxFQUFFLElBQUk7QUFDVixpQkFBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRTtTQUNoQyxDQUFDLENBQUM7T0FDTjs7Ozs7OztTQXJHQyxhQUFhOzs7aUJBd0dKLGFBQWEiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfcHJvdG90eXBlUHJvcGVydGllcyA9IGZ1bmN0aW9uIChjaGlsZCwgc3RhdGljUHJvcHMsIGluc3RhbmNlUHJvcHMpIHtcbiAgaWYgKHN0YXRpY1Byb3BzKSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjaGlsZCwgc3RhdGljUHJvcHMpO1xuICBpZiAoaW5zdGFuY2VQcm9wcykgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2hpbGQucHJvdG90eXBlLCBpbnN0YW5jZVByb3BzKTtcbn07XG5cbnZhciByZWdpc3RyeSA9IHt9O1xudmFyIGlzUGVuZGluZyA9IHt9O1xudmFyIGlzSGFuZGxlZCA9IHt9O1xuXG52YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIChjYW5kaWRhdGUpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjYW5kaWRhdGUpID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCI7XG59O1xuXG52YXIgQmVoYXZlRGlzcGF0Y2hlciA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJlaGF2ZURpc3BhdGNoZXIoKSB7XG4gICAgdGhpcy5faXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3BlbmRpbmdQYXlsb2FkID0gbnVsbDtcbiAgfVxuXG4gIF9wcm90b3R5cGVQcm9wZXJ0aWVzKEJlaGF2ZURpc3BhdGNoZXIsIG51bGwsIHtcbiAgICByZWdpc3Rlcjoge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlZ2lzdGVyKGlkLCBkZXBzLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihkZXBzKSAmJiAhY2FsbGJhY2spIHtcbiAgICAgICAgICBjYWxsYmFjayA9IGRlcHM7XG4gICAgICAgICAgZGVwcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSBcIlwiICsgaWQgKyBcIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgZGlzcGF0Y2hlciFcIjtcbiAgICAgICAgaWYgKHJlZ2lzdHJ5W2lkXSkgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIHJlZ2lzdHJ5W2lkXSA9IHtcbiAgICAgICAgICBkZXBzOiBkZXBzLFxuICAgICAgICAgIGZuOiBjYWxsYmFja1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0sXG4gICAgdW5yZWdpc3Rlcjoge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHVucmVnaXN0ZXIoaWQpIHtcbiAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W2lkXTtcbiAgICAgIH0sXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9LFxuICAgIHB1cmdlOiB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcHVyZ2UoKSB7XG4gICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KSB7XG4gICAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W2lkXTtcbiAgICAgICAgfWZvciAodmFyIGlkIGluIGlzUGVuZGluZykge1xuICAgICAgICAgIGRlbGV0ZSBpc1BlbmRpbmdbaWRdO1xuICAgICAgICB9Zm9yICh2YXIgaWQgaW4gaXNIYW5kbGVkKSB7XG4gICAgICAgICAgZGVsZXRlIGlzSGFuZGxlZFtpZF07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9LFxuICAgIGRpc3BhdGNoOiB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcGF0Y2gocGF5bG9hZCkge1xuICAgICAgICB0aGlzLl9zdGFydERpc3BhdGNoaW5nKHBheWxvYWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICBpZiAoaXNQZW5kaW5nW2lkXSkgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLl9pbnZva2VDYWxsYmFjayhpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuX3N0b3BEaXNwYXRjaGluZygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSxcbiAgICBfaW52b2tlQ2FsbGJhY2s6IHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBJbnZva2VDYWxsYmFjayhpZCkge1xuICAgICAgICB2YXIgY2IgPSByZWdpc3RyeVtpZF07XG5cbiAgICAgICAgaXNQZW5kaW5nW2lkXSA9IHRydWU7XG4gICAgICAgIGlmIChjYi5kZXBzLmxlbmd0aCkgdGhpcy5fd2FpdEZvcihjYi5kZXBzKTtcbiAgICAgICAgcmVnaXN0cnlbaWRdLmZuKHRoaXMuX3BlbmRpbmdQYXlsb2FkKTtcbiAgICAgICAgaXNIYW5kbGVkW2lkXSA9IHRydWU7XG4gICAgICB9LFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSxcbiAgICBfd2FpdEZvcjoge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIFdhaXRGb3IoaWRzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGlkID0gaWRzW2ldO1xuICAgICAgICAgIGlmIChpc1BlbmRpbmdbaWRdKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLl9pbnZva2VDYWxsYmFjayhpZCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9LFxuICAgIF9zdGFydERpc3BhdGNoaW5nOiB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gU3RhcnREaXNwYXRjaGluZyhwYXlsb2FkKSB7XG4gICAgICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJ5KSB7XG4gICAgICAgICAgaXNQZW5kaW5nW2lkXSA9IGZhbHNlO1xuICAgICAgICAgIGlzSGFuZGxlZFtpZF0gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wZW5kaW5nUGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgICAgIHRoaXMuX2lzRGlzcGF0Y2hpbmcgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0sXG4gICAgX3N0b3BEaXNwYXRjaGluZzoge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIFN0b3BEaXNwYXRjaGluZygpIHtcbiAgICAgICAgdGhpcy5fcGVuZGluZ1BheWxvYWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9pc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gQmVoYXZlRGlzcGF0Y2hlcjtcbn0pKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IEJlaGF2ZURpc3BhdGNoZXIoKTsiLCJpbXBvcnQgQmVoYXZlSGlzdG9yeSBmcm9tICcuL2luZGV4JztcbmltcG9ydCBkaXNwYXRjaGVyIGZyb20gJ2JlaGF2ZS1kaXNwYXRjaGVyJztcblxudmFyIGJlaGF2ZUhpc3RvcnkgPSBuZXcgQmVoYXZlSGlzdG9yeSh7XG4gICAgZGlzcGF0Y2hlcjogZGlzcGF0Y2hlclxufSk7XG5cbmRpc3BhdGNoZXIucmVnaXN0ZXIoJ0NvbnNvbGVTZXJ2aWNlJywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgaWYgKGV2dC50eXBlID09PSAnUk9VVEVfQ0hBTkdFJykgY29uc29sZS5sb2coZXZ0KTtcbn0pO1xuXG5iZWhhdmVIaXN0b3J5LnN0YXJ0KCk7XG5cbndpbmRvdy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcbndpbmRvdy5iZWhhdmVIaXN0b3J5ID0gYmVoYXZlSGlzdG9yeTtcbiIsImNvbnN0IHJvdXRlU3RyaXBwZXIgPSAvXlsjXFwvXXxcXHMrJC9nO1xuXG5jbGFzcyBCZWhhdmVIaXN0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zPXt9KSB7XG5cbiAgICAgICAgdGhpcy5fcm9vdCA9IG9wdGlvbnMucm9vdCB8fCAnLyc7XG4gICAgICAgIHRoaXMuX2xvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgICB0aGlzLl9oaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7XG4gICAgICAgIHRoaXMuX3dhbnRzSGFzaENoYW5nZSA9IG9wdGlvbnMuaGFzaENoYW5nZSB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5faGFzUHVzaFN0YXRlID0gISEodGhpcy5faGlzdG9yeSAmJiB0aGlzLl9oaXN0b3J5LnB1c2hTdGF0ZSk7XG4gICAgICAgIHRoaXMuX2V2ZW50VHlwZSA9IG9wdGlvbnMuZXZlbnRUeXBlIHx8ICdST1VURSc7XG4gICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9iYXNlVXJsID0gdGhpcy5fbG9jYXRpb24ucHJvdG9jb2wgK1xuICAgICAgICAgICAgICAgICcvLycgKyB0aGlzLl9sb2NhdGlvbi5ob3N0O1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5kaXNwYXRjaGVyKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGRpc3BhdGNoZXIgcGFzc2VkIHRvIGhpc3RvcnkhJyk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoZXIgPSBvcHRpb25zLmRpc3BhdGNoZXI7XG5cbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hlci5yZWdpc3RlcignSGlzdG9yeVNlcnZpY2UnLCAoZXZ0KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZ0LnR5cGUgIT09IHRoaXMuX2V2ZW50VHlwZSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFldnQub3B0aW9ucykgZXZ0Lm9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGFydGVkKSB0aGlzLl91cGRhdGUoZXZ0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhcnQoKSB7XG4gICAgICAgIHZhciBldnQgPSAodGhpcy5faGFzUHVzaFN0YXRlKSA/ICdwb3BzdGF0ZScgOiAnaGFzaGNoYW5nZSc7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2dCwgKGUpID0+IHRoaXMuX2hhbmRsZUhpc3RvcnlFdmVudChlKSk7XG4gICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHN0b3AoKSB7XG4gICAgICAgIHZhciBldnQgPSAodGhpcy5faGFzUHVzaFN0YXRlKSA/ICdwb3BzdGF0ZScgOiAnaGFzaGNoYW5nZSc7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGV2dCwgKGUpID0+IHRoaXMuX2hhbmRsZUhpc3RvcnlFdmVudChlKSk7XG4gICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBfdXBkYXRlKGV2dCkge1xuICAgICAgICBpZiAoZXZ0LnJvdXRlID09PSB0aGlzLl9nZXRGcmFnbWVudCgpKSByZXR1cm47XG5cbiAgICAgICAgdmFyIHVybCA9IHRoaXMuX2Jhc2VVcmwgKyB0aGlzLl9yb290ICsgZXZ0LnJvdXRlO1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNQdXNoU3RhdGUgJiYgIXRoaXMuX3dhbnRzSGFzaENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fcHVzaFN0YXRlKGV2dC5kYXRhIHx8IHt9LCB1cmwsICEhZXZ0Lm9wdGlvbnMucmVwbGFjZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVIYXNoKGV2dC5yb3V0ZSwgISFldnQub3B0aW9ucy5yZXBsYWNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiAnUk9VVEVfQ0hBTkdFJyxcbiAgICAgICAgICAgIHJvdXRlOiBldnQucm91dGUsXG4gICAgICAgICAgICBkYXRhOiBldnQuZGF0YSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGV2dC5vcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9wdXNoU3RhdGUoZGF0YSwgcm91dGUsIHJlcGxhY2UpIHtcbiAgICAgICAgdGhpcy5faGlzdG9yeVsocmVwbGFjZSkgPyAncmVwbGFjZVN0YXRlJyA6ICdwdXNoU3RhdGUnXShkYXRhLCBkb2N1bWVudC50aXRsZSwgcm91dGUpO1xuICAgIH1cblxuICAgIF91cGRhdGVIYXNoKHJvdXRlLCByZXBsYWNlKSB7XG4gICAgICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICAgICAgICBsZXQgaHJlZiA9IHRoaXMuX2xvY2F0aW9uLmhyZWYucmVwbGFjZSgvKGphdmFzY3JpcHQ6fCMpLiokLywgJycpO1xuICAgICAgICAgICAgdGhpcy5fbG9jYXRpb24ucmVwbGFjZShocmVmICsgJyMnICsgcm91dGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU29tZSBicm93c2VycyByZXF1aXJlIHRoYXQgYGhhc2hgIGNvbnRhaW5zIGEgbGVhZGluZyAjLlxuICAgICAgICAgICAgdGhpcy5fbG9jYXRpb24uaGFzaCA9ICcjLycgKyByb3V0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9nZXRGcmFnbWVudChmcmFnbWVudCkge1xuICAgICAgICBpZiAoIWZyYWdtZW50KSBmcmFnbWVudCA9IHRoaXNbKHRoaXMuX2hhc1B1c2hTdGF0ZSkgPyAnX2dldFBhdGgnIDogJ19nZXRIYXNoJ10oKTtcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50LnJlcGxhY2Uocm91dGVTdHJpcHBlciwgJycpO1xuICAgIH1cblxuICAgIF9nZXRIYXNoKCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLl9sb2NhdGlvbi5ocmVmLm1hdGNoKC8jKC4qKSQvKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAnJztcbiAgICB9XG5cbiAgICBfZ2V0UGF0aCgpIHtcbiAgICAgICAgdmFyIHBhdGggPSBkZWNvZGVVUkkodGhpcy5fbG9jYXRpb24ucGF0aG5hbWUgKyB0aGlzLl9nZXRTZWFyY2goKSk7XG4gICAgICAgIHZhciByb290ID0gdGhpcy5fcm9vdC5zbGljZSgwLCAtMSk7XG4gICAgICAgIGlmICghcGF0aC5pbmRleE9mKHJvb3QpKSBwYXRoID0gcGF0aC5zbGljZShyb290Lmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nID8gcGF0aC5zbGljZSgxKSA6IHBhdGg7XG4gICAgfVxuXG4gICAgX2dldFNlYXJjaCgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gdGhpcy5fbG9jYXRpb24uaHJlZi5yZXBsYWNlKC8jLiovLCAnJykubWF0Y2goL1xcPy4rLyk7XG4gICAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzBdIDogJyc7XG4gICAgfVxuXG4gICAgX2hhbmRsZUhpc3RvcnlFdmVudChlKSB7XG4gICAgICAgIHZhciBkYXRhID0ge307XG5cbiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ3BvcHN0YXRlJyAmJiBlLnN0YXRlICE9PSBudWxsKSBkYXRhID0gZS5zdGF0ZTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLl9ldmVudFR5cGUsXG4gICAgICAgICAgICByb3V0ZTogdGhpcy5fZ2V0RnJhZ21lbnQoKSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBvcHRpb25zOiB7IG9yaWdpbmFsRXZlbnQ6IGUgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJlaGF2ZUhpc3Rvcnk7XG4iXX0=