diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..62bb2d4 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,86 @@ +{ + // See http://jshint.com/docs/ for details + + "maxerr" : 50, // {int} Maximum error before stopping + + // Enforcing + "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) + "camelcase" : false, // true: Identifiers must be in camelCase + "curly" : true, // true: Require {} for every new block or scope + "eqeqeq" : true, // true: Require triple equals (===) for comparison + "freeze" : true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc. + "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() + "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` + "indent" : 4, // {int} Number of spaces to use for indentation + "latedef" : false, // true: Require variables/functions to be defined before being used + "newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()` + "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` + "noempty" : true, // true: Prohibit use of empty blocks + "nonbsp" : true, // true: Prohibit "non-breaking whitespace" characters. + "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment) + "plusplus" : false, // true: Prohibit use of `++` & `--` + "quotmark" : false, // Quotation mark consistency: + // false : do nothing (default) + // true : ensure whatever is used is consistent + // "single" : require single quotes + // "double" : require double quotes + "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) + "unused" : true, // true: Require all defined variables be used + "strict" : true, // true: Requires all functions run in ES5 Strict Mode + "maxparams" : false, // {int} Max number of formal params allowed per function + "maxdepth" : false, // {int} Max depth of nested blocks (within functions) + "maxstatements" : false, // {int} Max number statements per function + "maxcomplexity" : false, // {int} Max cyclomatic complexity per function + "maxlen" : 79, // {int} Max number of characters per line + + // Relaxing + "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) + "boss" : false, // true: Tolerate assignments where comparisons would be expected + "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. + "eqnull" : false, // true: Tolerate use of `== null` + "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) + "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) + "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) + // (ex: `for each`, multiple try/catch, function expression…) + "evil" : false, // true: Tolerate use of `eval` and `new Function()` + "expr" : false, // true: Tolerate `ExpressionStatement` as Programs + "funcscope" : false, // true: Tolerate defining variables inside control statements + "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict') + "iterator" : false, // true: Tolerate using the `__iterator__` property + "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block + "laxbreak" : false, // true: Tolerate possibly unsafe line breakings + "laxcomma" : false, // true: Tolerate comma-first style coding + "loopfunc" : false, // true: Tolerate functions being defined in loops + "multistr" : false, // true: Tolerate multi-line strings + "noyield" : false, // true: Tolerate generator functions with no yield statement in them. + "notypeof" : false, // true: Tolerate invalid typeof operator values + "proto" : false, // true: Tolerate using the `__proto__` property + "scripturl" : false, // true: Tolerate script-targeted URLs + "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` + "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation + "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` + "validthis" : false, // true: Tolerate using this in a non-constructor function + + // Environments + "browser" : true, // Web Browser (window, document, etc) + "browserify" : true, // Browserify (node.js code in the browser) + "couch" : false, // CouchDB + "devel" : true, // Development/debugging (alert, confirm, etc) + "dojo" : false, // Dojo Toolkit + "jasmine" : false, // Jasmine + "jquery" : false, // jQuery + "mocha" : true, // Mocha + "mootools" : false, // MooTools + "node" : false, // Node.js + "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) + "prototypejs" : false, // Prototype and Scriptaculous + "qunit" : false, // QUnit + "rhino" : false, // Rhino + "shelljs" : false, // ShellJS + "worker" : false, // Web Workers + "wsh" : false, // Windows Scripting Host + "yui" : false, // Yahoo User Interface + + // Custom Globals + "globals" : {} // additional predefined global variables +} diff --git a/dist/js/gamepad-client.js b/dist/js/gamepad-client.js index 5649ec3..e83b7b0 100755 --- a/dist/js/gamepad-client.js +++ b/dist/js/gamepad-client.js @@ -10,7 +10,7 @@ var error = utils.error; var trace = utils.trace; -utils.polyfill(window); +utils.polyfill(); utils.lockOrientation('landscape-primary'); @@ -29,8 +29,8 @@ document.addEventListener('keyup', function (e) { trace('User pressed "F"; entering/exiting fullscreen'); return utils.toggleFullScreen(); case 78: // Pressing NF (really just N) should toggle full-screen mode. - trace('User pressed "NF"; exiting fullscreen and will not automatically ' + - 'open next time'); + trace('User pressed "NF"; exiting fullscreen and will not ' + + 'automatically open next time'); localStorage.disableAutoFullScreen = '1'; return utils.toggleFullScreen(); } @@ -52,7 +52,7 @@ document.addEventListener('click', function (e) { var peerId = utils.getPeerId(); -var peer = new Peer('controller_' + peerId, { +var peer = new window.Peer('controller_' + peerId, { key: settings.PEERJS_KEY, debug: settings.DEBUG ? 3 : 0 }); @@ -79,7 +79,8 @@ conn.on('open', function () { function send(msg) { if (settings.DEBUG) { - console.log('Sent: ' + (typeof msg === 'object' ? JSON.stringify(msg) : msg)); + console.log('Sent: ' + + (typeof msg === 'object' ? JSON.stringify(msg) : msg)); } conn.send(msg); } @@ -116,7 +117,8 @@ function angularShape(canvas, coords) { } function linearFill(shape, color1, color2, coords) { - var bg = shape.createLinearGradient(coords[0], coords[1], coords[2], coords[3]); + var bg = shape.createLinearGradient(coords[0], coords[1], coords[2], + coords[3]); bg.addColorStop(0, color1); bg.addColorStop(1, color2); shape.fillStyle = bg; @@ -187,15 +189,16 @@ var gamepadState = { function bindPress(button, eventName, isPressed) { - document.querySelector('#' + button).addEventListener(eventName, function (e) { - // Handle D-pad presses. - if (e.target && e.target.parentNode === dpad) { - dpad.classList.toggle(this.id); - } + document.querySelector('#' + button) + .addEventListener(eventName, function (e) { + // Handle D-pad presses. + if (e.target && e.target.parentNode === dpad) { + dpad.classList.toggle(this.id); + } - gamepadState[button] = isPressed; - send({type: 'state', data: gamepadState}); - }); + gamepadState[button] = isPressed; + send({type: 'state', data: gamepadState}); + }); } @@ -290,8 +293,12 @@ bindKeyPresses('keyup', false); })(window, document); },{"./lib/utils":2,"./settings":3}],2:[function(require,module,exports){ +module.exports = function (window, document) { +'use strict'; + function trace(text, level) { - console[level || 'log']((window.performance.now() / 1000).toFixed(3) + ': ' + text); + console[level || 'log']( + (window.performance.now() / 1000).toFixed(3) + ': ' + text); } @@ -305,17 +312,18 @@ function warn(text) { } -function polyfill(win) { - if (!('performance' in win)) { - win.performance = { +function polyfill() { + if (!('performance' in window)) { + window.performance = { now: function () { return +new Date(); } }; } - if (('origin' in win.location)) { - win.location.origin = win.location.protocol + '//' + win.location.host; + if (('origin' in window.location)) { + window.location.origin = (window.location.protocol + '//' + + window.location.host); } } @@ -343,7 +351,7 @@ function fieldFocused(e) { function hasTouchEvents() { return ('ontouchstart' in window || - window.DocumentTouch && document instanceof DocumentTouch); + window.DocumentTouch && document instanceof window.DocumentTouch); } function injectCSS(opts) { @@ -384,7 +392,8 @@ function toggleFullScreen() { } else if (document.documentElement.mozRequestFullScreen) { document.documentElement.mozRequestFullScreen(); } else if (document.documentElement.webkitRequestFullscreen) { - document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); + document.documentElement.webkitRequestFullscreen( + Element.ALLOW_KEYBOARD_INPUT); } else if (document.documentElement.msRequestFullscreen) { document.documentElement.msRequestFullscreen(); } @@ -403,16 +412,16 @@ function toggleFullScreen() { } -function lockOrientation() { - var lo = (screen.LockOrientation || - screen.mozLockOrientation || - screen.webkitLockOrientation || - screen.msLockOrientation); +function lockOrientation(orientation) { + var lo = (window.screen.LockOrientation || + window.screen.mozLockOrientation || + window.screen.webkitLockOrientation || + window.screen.msLockOrientation); if (!lo) { return warn('Orientation could not be locked'); } - lo(orientation); + return lo(orientation); } @@ -424,37 +433,46 @@ function triggerEvent(type) { } -module.exports.trace = trace; -module.exports.error = error; -module.exports.warn = warn; -module.exports.polyfill = polyfill; -module.exports.getPeerId = getPeerId; -module.exports.fieldFocused = fieldFocused; -module.exports.hasTouchEvents = hasTouchEvents; -module.exports.injectCSS = injectCSS; -module.exports.escape = escape; -module.exports.isFullScreen = isFullScreen; -module.exports.toggleFullScreen = toggleFullScreen; -module.exports.lockOrientation = lockOrientation; -module.exports.triggerEvent = triggerEvent; +return { + trace: trace, + error: error, + warn: warn, + polyfill: polyfill, + getPeerId: getPeerId, + fieldFocused: fieldFocused, + hasTouchEvents: hasTouchEvents, + injectCSS: injectCSS, + escape: escape, + isFullScreen: isFullScreen, + toggleFullScreen: toggleFullScreen, + lockOrientation: lockOrientation, + triggerEvent: triggerEvent +}; + +}; },{}],3:[function(require,module,exports){ +'use strict'; + var settings_local = {}; try { settings_local = require('./settings_local.js'); } catch (e) { } + var settings = { - API_URL: 'http://localhost:5000', // This URL to the Galaxy API. No trailing slash. + API_URL: 'http://localhost:5000', // Galaxy API URL. No trailing slash. DEBUG: false, PEERJS_KEY: '', // Sign up for a key at http://peerjs.com/peerserver VERSION: '0.0.1' // Version of the `gamepad.js` script }; -for (var key in settings_local) { - settings[key] = settings_local[key]; -} +// Override each default setting with user-defined setting. +Object.keys(settings_local).forEach(function (key) { + settings[key] = settings_local[key]; +}); + module.exports = settings; @@ -464,4 +482,5 @@ module.exports = { PEERJS_KEY: 'rovu5xmqo69wwmi' }; -},{}] \ No newline at end of file +},{}]},{},[1]) +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9vcHQvZ2FsYXh5LmpzLW1vYmlsZS1nYW1lcGFkL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIuL3NyYy9qcy9jbGllbnQuanMiLCIvb3B0L2dhbGF4eS5qcy1tb2JpbGUtZ2FtZXBhZC9zcmMvanMvbGliL3V0aWxzLmpzIiwiL29wdC9nYWxheHkuanMtbW9iaWxlLWdhbWVwYWQvc3JjL2pzL3NldHRpbmdzLmpzIiwiL29wdC9nYWxheHkuanMtbW9iaWxlLWdhbWVwYWQvc3JjL2pzL3NldHRpbmdzX2xvY2FsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIihmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyB2YXIgcGVlciA9IHJlcXVpcmUoJy4vbGliL3BlZXInKTtcbi8vIHZhciBQcm9taXNlID0gcmVxdWlyZSgnLi9saWIvcHJvbWlzZS0xLjAuMCcpOyAgLy8ganNoaW50IGlnbm9yZTpsaW5lXG52YXIgc2V0dGluZ3MgPSByZXF1aXJlKCcuL3NldHRpbmdzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL2xpYi91dGlscycpO1xudmFyIGVycm9yID0gdXRpbHMuZXJyb3I7XG52YXIgdHJhY2UgPSB1dGlscy50cmFjZTtcblxuXG51dGlscy5wb2x5ZmlsbCgpO1xuXG5cbnV0aWxzLmxvY2tPcmllbnRhdGlvbignbGFuZHNjYXBlLXByaW1hcnknKTtcbmZ1bmN0aW9uIHdhbnRzQXV0b0Z1bGxTY3JlZW4oKSB7XG4gIHJldHVybiAhKCdkaXNhYmxlQXV0b0Z1bGxTY3JlZW4nIGluIGxvY2FsU3RvcmFnZSk7XG59XG5cblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBmdW5jdGlvbiAoZSkge1xuICBpZiAodXRpbHMuZmllbGRGb2N1c2VkKGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICBjYXNlIDcwOiAgLy8gUHJlc3NpbmcgRiBzaG91bGQgdG9nZ2xlIGZ1bGwtc2NyZWVuIG1vZGUuXG4gICAgICB0cmFjZSgnVXNlciBwcmVzc2VkIFwiRlwiOyBlbnRlcmluZy9leGl0aW5nIGZ1bGxzY3JlZW4nKTtcbiAgICAgIHJldHVybiB1dGlscy50b2dnbGVGdWxsU2NyZWVuKCk7XG4gICAgY2FzZSA3ODogIC8vIFByZXNzaW5nIE5GIChyZWFsbHkganVzdCBOKSBzaG91bGQgdG9nZ2xlIGZ1bGwtc2NyZWVuIG1vZGUuXG4gICAgICB0cmFjZSgnVXNlciBwcmVzc2VkIFwiTkZcIjsgZXhpdGluZyBmdWxsc2NyZWVuIGFuZCB3aWxsIG5vdCAnICtcbiAgICAgICAgJ2F1dG9tYXRpY2FsbHkgb3BlbiBuZXh0IHRpbWUnKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5kaXNhYmxlQXV0b0Z1bGxTY3JlZW4gPSAnMSc7XG4gICAgICByZXR1cm4gdXRpbHMudG9nZ2xlRnVsbFNjcmVlbigpO1xuICB9XG59KTtcblxuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gIGlmICh1dGlscy5maWVsZEZvY3VzZWQoZSkgfHwgIXdhbnRzQXV0b0Z1bGxTY3JlZW4oKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cmFjZSgnQXV0b21hdGljYWxseSBlbnRlcmluZyBmdWxsc2NyZWVuJyk7XG4gIHV0aWxzLnRvZ2dsZUZ1bGxTY3JlZW4oKTtcbn0pO1xuXG5cbi8vIGlmIHRoZXJlJ3Mgbm90IGEgcGluLCB0ZWxsIHRoZSB1c2VyIHRvIG9wZW4gdGhlIGdhbWUgb24gYW5vdGhlciBkZXZpY2Vcbi8vIGZpcnN0LiBpbnN0ZWFkIG9mIHJlbGVnYXRpbmcgbW9iaWxlIHRvIGJlIGFsd2F5cyBhIGNvbnRyb2xsZXIsIGFsbG93IHRoZVxuLy8gZ2FtZSB0byBtaXJyb3IgdGhlIGRlc2t0b3AgKMOgIGxhIFdpaVUpLlxuXG52YXIgcGVlcklkID0gdXRpbHMuZ2V0UGVlcklkKCk7XG5cbnZhciBwZWVyID0gbmV3IHdpbmRvdy5QZWVyKCdjb250cm9sbGVyXycgKyBwZWVySWQsIHtcbiAga2V5OiBzZXR0aW5ncy5QRUVSSlNfS0VZLFxuICBkZWJ1Zzogc2V0dGluZ3MuREVCVUcgPyAzIDogMFxufSk7XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBmdW5jdGlvbiAoKSB7XG4gIHBlZXIuZGVzdHJveSgpO1xufSk7XG5cbnZhciBjb25uID0gcGVlci5jb25uZWN0KHBlZXJJZCk7XG5cbmNvbm4ub24oJ29wZW4nLCBmdW5jdGlvbiAoKSB7XG4gIHRyYWNlKCdNeSBwZWVyIElEOiAnICsgcGVlci5pZCk7XG4gIHRyYWNlKCdNeSBjb25uZWN0aW9uIElEOiAnICsgY29ubi5pZCk7XG5cbiAgY29ubi5vbignZGF0YScsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdHJhY2UoJ1JlY2VpdmVkOiAnICsgZGF0YSk7XG4gIH0pO1xuXG4gIGNvbm4ub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGVycm9yKGVyci5tZXNzYWdlKTtcbiAgfSk7XG59KTtcblxuXG5mdW5jdGlvbiBzZW5kKG1zZykge1xuICBpZiAoc2V0dGluZ3MuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZygnU2VudDogJyArXG4gICAgICAodHlwZW9mIG1zZyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShtc2cpIDogbXNnKSk7XG4gIH1cbiAgY29ubi5zZW5kKG1zZyk7XG59XG5cblxuLyoqXG4gKiBUcmFkaXRpb25hbCwgTkVTLWluc3BpcmVkIGdhbWVwYWQuXG4gKi9cbnZhciBkcGFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RwYWQnKTtcbnZhciBzZWxlY3RCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VsZWN0Jyk7XG52YXIgc3RhcnRCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3RhcnQnKTtcbnZhciBiQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2InKTtcbnZhciBhQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2EnKTtcblxuXG4vKipcbiAqIERyYXcgRC1wYWQuXG4gKi9cbnZhciBjYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHBhZC1ib2R5Jyk7XG5cbmZ1bmN0aW9uIGFuZ3VsYXJTaGFwZShjYW52YXMsIGNvb3Jkcykge1xuICB2YXIgc2hhcGUgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgdmFyIGkgPSAwO1xuICBzaGFwZS5iZWdpblBhdGgoKTtcbiAgc2hhcGUubW92ZVRvKGNvb3Jkc1swXVswXSwgY29vcmRzWzBdWzFdKTtcbiAgY29vcmRzLnNsaWNlKDEpO1xuXG4gIGZvciAoOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgc2hhcGUubGluZVRvKGNvb3Jkc1tpXVswXSwgY29vcmRzW2ldWzFdKTtcbiAgfVxuXG4gIHNoYXBlLmNsb3NlUGF0aCgpO1xuICByZXR1cm4gc2hhcGU7XG59XG5cbmZ1bmN0aW9uIGxpbmVhckZpbGwoc2hhcGUsIGNvbG9yMSwgY29sb3IyLCBjb29yZHMpIHtcbiAgdmFyIGJnID0gc2hhcGUuY3JlYXRlTGluZWFyR3JhZGllbnQoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSxcbiAgICBjb29yZHNbM10pO1xuICBiZy5hZGRDb2xvclN0b3AoMCwgY29sb3IxKTtcbiAgYmcuYWRkQ29sb3JTdG9wKDEsIGNvbG9yMik7XG4gIHNoYXBlLmZpbGxTdHlsZSA9IGJnO1xuICBzaGFwZS5maWxsKCk7XG59XG5cbmZ1bmN0aW9uIHlTaWRlKGNhbnZhcywgeSwgeEZyb20sIHhUbykge1xuICB2YXIgc2hhcGUgPSBhbmd1bGFyU2hhcGUoY2FudmFzLCBbXG4gICAgW3ksIHhGcm9tXSxcbiAgICBbeSArIDUsIHhGcm9tICsgMy41XSxcbiAgICBbeSArIDUsIHhUbyArIDMuNV0sXG4gICAgW3ksIHhUb11cbiAgXSk7XG4gIGxpbmVhckZpbGwoc2hhcGUsICcjNjY2JywgJyMwMDAnLCBbeSwgeEZyb20sIHkgKyAxNSwgeEZyb21dKTtcbn1cblxuZnVuY3Rpb24geFNpZGUoY2FudmFzLCB4LCB5RnJvbSwgeVRvKSB7XG4gIHZhciBzaGFwZSA9IGFuZ3VsYXJTaGFwZShjYW52YXMsIFtcbiAgICBbeUZyb20sIHhdLFxuICAgIFt5RnJvbSArIDUsIHggKyAzLjVdLFxuICAgIFt5VG8gKyA1LCB4ICsgMy41XSxcbiAgICBbeVRvLCB4XVxuICBdKTtcbiAgbGluZWFyRmlsbChzaGFwZSwgJyM2NjYnLCAnIzAwMCcsIFt5RnJvbSwgeCwgeUZyb20sIHggKyAxNV0pO1xufVxuXG4vLyBEcmF3IHRoZSBzaWRlcyBmaXJzdC5cbnhTaWRlKGNhbnZhcywgNjMuNSwgMCwgMTAwKTtcbnhTaWRlKGNhbnZhcywgMTAwLCAzNi41LCA2My41KTtcbnlTaWRlKGNhbnZhcywgNjMuNSwgMCwgMzYuNSk7XG55U2lkZShjYW52YXMsIDYzLjUsIDYzLjUsIDEwMCk7XG55U2lkZShjYW52YXMsIDEwMCwgMzYuNSwgNjMuNSk7XG5cbi8vIERyYXcgdGhlIEQtcGFkLlxudmFyIHBsdXMgPSBhbmd1bGFyU2hhcGUoY2FudmFzLCBbXG4gIFswLCAzNi41XSxcbiAgWzM2LjUsIDM2LjVdLFxuICBbMzYuNSwgMF0sXG4gIFs2My41LCAwXSxcbiAgWzYzLjUsIDM2LjVdLFxuICBbMTAwLCAzNi41XSxcbiAgWzEwMCwgNjMuNV0sXG4gIFs2My41LCA2My41XSxcbiAgWzYzLjUsIDEwMF0sXG4gIFszNi41LCAxMDBdLFxuICBbMzYuNSwgNjNdLFxuICBbMCwgNjMuNV1cbl0pO1xuXG5wbHVzLmZpbGxTdHlsZSA9ICcjMWExYTFhJztcbnBsdXMuc2hhZG93Q29sb3IgPSAncmdiYSgwLDAsMCwuNiknO1xucGx1cy5zaGFkb3dCbHVyID0gMTU7XG5wbHVzLnNoYWRvd09mZnNldFggPSAyMDtcbnBsdXMuc2hhZG93T2Zmc2V0WSA9IDEwO1xucGx1cy5maWxsKCk7XG5cblxudmFyIGdhbWVwYWRTdGF0ZSA9IHtcbiAgdXA6IGZhbHNlLFxuICByaWdodDogZmFsc2UsXG4gIGRvd246IGZhbHNlLFxuICBsZWZ0OiBmYWxzZSxcbiAgc2VsZWN0OiBmYWxzZSxcbiAgc3RhcnQ6IGZhbHNlLFxuICBiOiBmYWxzZSxcbiAgYTogZmFsc2Vcbn07XG5cblxuZnVuY3Rpb24gYmluZFByZXNzKGJ1dHRvbiwgZXZlbnROYW1lLCBpc1ByZXNzZWQpIHtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBidXR0b24pXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gSGFuZGxlIEQtcGFkIHByZXNzZXMuXG4gICAgICBpZiAoZS50YXJnZXQgJiYgZS50YXJnZXQucGFyZW50Tm9kZSA9PT0gZHBhZCkge1xuICAgICAgICBkcGFkLmNsYXNzTGlzdC50b2dnbGUodGhpcy5pZCk7XG4gICAgICB9XG5cbiAgICAgIGdhbWVwYWRTdGF0ZVtidXR0b25dID0gaXNQcmVzc2VkO1xuICAgICAgc2VuZCh7dHlwZTogJ3N0YXRlJywgZGF0YTogZ2FtZXBhZFN0YXRlfSk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gYmluZEtleVByZXNzZXMoZXZlbnROYW1lLCBpc1ByZXNzZWQpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKHV0aWxzLmZpZWxkRm9jdXNlZChlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICBjYXNlIDM4OlxuICAgICAgICAvLyBTZW5kIGV2ZW50IG9ubHkgb25jZS5cbiAgICAgICAgaWYgKGlzUHJlc3NlZCAmJiBnYW1lcGFkU3RhdGUudXApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2FtZXBhZFN0YXRlLnVwID0gaXNQcmVzc2VkO1xuICAgICAgICBkcGFkLmNsYXNzTmFtZSA9IGlzUHJlc3NlZCA/ICd1cCcgOiAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM5OlxuICAgICAgICBpZiAoaXNQcmVzc2VkICYmIGdhbWVwYWRTdGF0ZS5yaWdodCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnYW1lcGFkU3RhdGUucmlnaHQgPSBpc1ByZXNzZWQ7XG4gICAgICAgIGRwYWQuY2xhc3NOYW1lID0gaXNQcmVzc2VkID8gJ3JpZ2h0JyA6ICcnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDA6XG4gICAgICAgIGlmIChpc1ByZXNzZWQgJiYgZ2FtZXBhZFN0YXRlLmRvd24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2FtZXBhZFN0YXRlLmRvd24gPSBpc1ByZXNzZWQ7XG4gICAgICAgIGRwYWQuY2xhc3NOYW1lID0gaXNQcmVzc2VkID8gJ2Rvd24nIDogJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzNzpcbiAgICAgICAgaWYgKGlzUHJlc3NlZCAmJiBnYW1lcGFkU3RhdGUubGVmdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnYW1lcGFkU3RhdGUubGVmdCA9IGlzUHJlc3NlZDtcbiAgICAgICAgZHBhZC5jbGFzc05hbWUgPSBpc1ByZXNzZWQgPyAnbGVmdCcgOiAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEzOlxuICAgICAgICBpZiAoaXNQcmVzc2VkICYmIGdhbWVwYWRTdGF0ZS5zdGFydCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnYW1lcGFkU3RhdGUuc3RhcnQgPSBpc1ByZXNzZWQ7XG4gICAgICAgIHN0YXJ0QnV0dG9uLmRhdGFzZXQucHJlc3NlZCA9ICtpc1ByZXNzZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2NTpcbiAgICAgICAgaWYgKGlzUHJlc3NlZCAmJiBnYW1lcGFkU3RhdGUuYSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnYW1lcGFkU3RhdGUuYSA9IGlzUHJlc3NlZDtcbiAgICAgICAgYUJ1dHRvbi5kYXRhc2V0LnByZXNzZWQgPSAraXNQcmVzc2VkO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjY6XG4gICAgICAgIGlmIChpc1ByZXNzZWQgJiYgZ2FtZXBhZFN0YXRlLmIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2FtZXBhZFN0YXRlLmIgPSBpc1ByZXNzZWQ7XG4gICAgICAgIGJCdXR0b24uZGF0YXNldC5wcmVzc2VkID0gK2lzUHJlc3NlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoZS5zaGlmdEtleSB8fCAoIWlzUHJlc3NlZCAmJiBnYW1lcGFkU3RhdGUuc2VsZWN0KSkge1xuICAgICAgICAgIC8vIElmIHRoZSBTaGlmdCBrZXkgd2FzIHByZXNzZWQgb3IgdW5wcmVzc2VkLCB0b2dnbGUgaXRzIHN0YXRlLlxuICAgICAgICAgIGdhbWVwYWRTdGF0ZS5zZWxlY3QgPSBpc1ByZXNzZWQ7XG4gICAgICAgICAgc2VsZWN0QnV0dG9uLmRhdGFzZXQucHJlc3NlZCA9ICtpc1ByZXNzZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIChpLmUuLCBhbnkgb3RoZXIga2V5IHdhcyBwcmVzc2VkKSwgYmFpbC5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZW5kKGdhbWVwYWRTdGF0ZSk7XG4gIH0pO1xufVxuXG5cbk9iamVjdC5rZXlzKGdhbWVwYWRTdGF0ZSkuZm9yRWFjaChmdW5jdGlvbiAoYnV0dG9uKSB7XG4gIGlmICh1dGlscy5oYXNUb3VjaEV2ZW50cygpKSB7XG4gICAgYmluZFByZXNzKGJ1dHRvbiwgJ3RvdWNoc3RhcnQnLCB0cnVlKTtcbiAgICBiaW5kUHJlc3MoYnV0dG9uLCAndG91Y2hlbmQnLCBmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgYmluZFByZXNzKGJ1dHRvbiwgJ21vdXNlZG93bicsIHRydWUpO1xuICAgIGJpbmRQcmVzcyhidXR0b24sICdtb3VzZXVwJywgZmFsc2UpO1xuICB9XG59KTtcblxuXG5iaW5kS2V5UHJlc3Nlcygna2V5ZG93bicsIHRydWUpO1xuYmluZEtleVByZXNzZXMoJ2tleXVwJywgZmFsc2UpO1xuXG5cbn0pKHdpbmRvdywgZG9jdW1lbnQpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCkge1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiB0cmFjZSh0ZXh0LCBsZXZlbCkge1xuICBjb25zb2xlW2xldmVsIHx8ICdsb2cnXShcbiAgICAod2luZG93LnBlcmZvcm1hbmNlLm5vdygpIC8gMTAwMCkudG9GaXhlZCgzKSArICc6ICcgKyB0ZXh0KTtcbn1cblxuXG5mdW5jdGlvbiBlcnJvcih0ZXh0KSB7XG4gIHJldHVybiB0cmFjZSh0ZXh0LCAnZXJyb3InKTtcbn1cblxuXG5mdW5jdGlvbiB3YXJuKHRleHQpIHtcbiAgcmV0dXJuIHRyYWNlKHRleHQsICd3YXJuJyk7XG59XG5cblxuZnVuY3Rpb24gcG9seWZpbGwoKSB7XG4gIGlmICghKCdwZXJmb3JtYW5jZScgaW4gd2luZG93KSkge1xuICAgIHdpbmRvdy5wZXJmb3JtYW5jZSA9IHtcbiAgICAgIG5vdzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gK25ldyBEYXRlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGlmICgoJ29yaWdpbicgaW4gd2luZG93LmxvY2F0aW9uKSkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gPSAod2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArXG4gICAgICB3aW5kb3cubG9jYXRpb24uaG9zdCk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBnZXRQZWVySWQoKSB7XG4gIHJldHVybiAod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoJy5odG1sJykgP1xuICAgIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpIDogd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnN1YnN0cigxKSk7XG59XG5cblxudmFyIEZJRUxEX0ZPQ1VTRURfVEFHUyA9IFtcbiAgJ2lucHV0JyxcbiAgJ2tleWdlbicsXG4gICdtZXRlcicsXG4gICdvcHRpb24nLFxuICAnb3V0cHV0JyxcbiAgJ3Byb2dyZXNzJyxcbiAgJ3NlbGVjdCcsXG4gICd0ZXh0YXJlYSdcbl07XG5mdW5jdGlvbiBmaWVsZEZvY3VzZWQoZSkge1xuICByZXR1cm4gRklFTERfRk9DVVNFRF9UQUdTLmluZGV4T2YoZS50YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xO1xufVxuXG5cbmZ1bmN0aW9uIGhhc1RvdWNoRXZlbnRzKCkge1xuICByZXR1cm4gKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fFxuICAgIHdpbmRvdy5Eb2N1bWVudFRvdWNoICYmIGRvY3VtZW50IGluc3RhbmNlb2Ygd2luZG93LkRvY3VtZW50VG91Y2gpO1xufVxuXG5mdW5jdGlvbiBpbmplY3RDU1Mob3B0cykge1xuICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgbGluay5ocmVmID0gb3B0cy5ocmVmO1xuICBsaW5rLm1lZGlhID0gJ2FsbCc7XG4gIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICBsaW5rLnR5cGUgPSAndGV4dC9jc3MnO1xuICBPYmplY3Qua2V5cyhvcHRzIHx8IHt9KS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgbGlua1twcm9wXSA9IG9wdHNbcHJvcF07XG4gIH0pO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJykuYXBwZW5kQ2hpbGQobGluayk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZSh0ZXh0KSB7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csICcmIzM5OycpXG4gICAgICAgICAgICAgLnJlcGxhY2UoL1wiL2csICcmIzM0OycpO1xufVxuXG5mdW5jdGlvbiBpc0Z1bGxTY3JlZW4oKSB7XG4gIHJldHVybiAoIWRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50ICYmICAvLyBzdGFuZGFyZCBtZXRob2RcbiAgICAhZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgJiZcbiAgICAhZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgJiZcbiAgICAhZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCk7ICAvLyB2ZW5kb3ItcHJlZml4ZWQgbWV0aG9kc1xufVxuXG5mdW5jdGlvbiB0b2dnbGVGdWxsU2NyZWVuKCkge1xuICBpZiAoaXNGdWxsU2NyZWVuKCkpIHtcbiAgICB0cmFjZSgnRW50ZXJpbmcgZnVsbCBzY3JlZW4nKTtcbiAgICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlbikge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm1velJlcXVlc3RGdWxsU2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbihcbiAgICAgICAgRWxlbWVudC5BTExPV19LRVlCT0FSRF9JTlBVVCk7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdHJhY2UoJ0V4aXRpbmcgZnVsbCBzY3JlZW4nKTtcbiAgICBpZiAoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKSB7XG4gICAgICBkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbikge1xuICAgICAgZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBsb2NrT3JpZW50YXRpb24ob3JpZW50YXRpb24pIHtcbiAgdmFyIGxvID0gKHdpbmRvdy5zY3JlZW4uTG9ja09yaWVudGF0aW9uIHx8XG4gICAgd2luZG93LnNjcmVlbi5tb3pMb2NrT3JpZW50YXRpb24gfHxcbiAgICB3aW5kb3cuc2NyZWVuLndlYmtpdExvY2tPcmllbnRhdGlvbiB8fFxuICAgIHdpbmRvdy5zY3JlZW4ubXNMb2NrT3JpZW50YXRpb24pO1xuICBpZiAoIWxvKSB7XG4gICAgcmV0dXJuIHdhcm4oJ09yaWVudGF0aW9uIGNvdWxkIG5vdCBiZSBsb2NrZWQnKTtcbiAgfVxuXG4gIHJldHVybiBsbyhvcmllbnRhdGlvbik7XG59XG5cblxuZnVuY3Rpb24gdHJpZ2dlckV2ZW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKTtcbiAgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIHRydWUsIHRydWUpO1xuICBldmVudC5ldmVudE5hbWUgPSB0eXBlO1xuICAoZG9jdW1lbnQuYm9keSB8fCB3aW5kb3cpLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuXG5cbnJldHVybiB7XG4gIHRyYWNlOiB0cmFjZSxcbiAgZXJyb3I6IGVycm9yLFxuICB3YXJuOiB3YXJuLFxuICBwb2x5ZmlsbDogcG9seWZpbGwsXG4gIGdldFBlZXJJZDogZ2V0UGVlcklkLFxuICBmaWVsZEZvY3VzZWQ6IGZpZWxkRm9jdXNlZCxcbiAgaGFzVG91Y2hFdmVudHM6IGhhc1RvdWNoRXZlbnRzLFxuICBpbmplY3RDU1M6IGluamVjdENTUyxcbiAgZXNjYXBlOiBlc2NhcGUsXG4gIGlzRnVsbFNjcmVlbjogaXNGdWxsU2NyZWVuLFxuICB0b2dnbGVGdWxsU2NyZWVuOiB0b2dnbGVGdWxsU2NyZWVuLFxuICBsb2NrT3JpZW50YXRpb246IGxvY2tPcmllbnRhdGlvbixcbiAgdHJpZ2dlckV2ZW50OiB0cmlnZ2VyRXZlbnRcbn07XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzZXR0aW5nc19sb2NhbCA9IHt9O1xudHJ5IHtcbiAgc2V0dGluZ3NfbG9jYWwgPSByZXF1aXJlKCcuL3NldHRpbmdzX2xvY2FsLmpzJyk7XG59IGNhdGNoIChlKSB7XG59XG5cblxudmFyIHNldHRpbmdzID0ge1xuICBBUElfVVJMOiAnaHR0cDovL2xvY2FsaG9zdDo1MDAwJywgIC8vIEdhbGF4eSBBUEkgVVJMLiBObyB0cmFpbGluZyBzbGFzaC5cbiAgREVCVUc6IGZhbHNlLFxuICBQRUVSSlNfS0VZOiAnJywgIC8vIFNpZ24gdXAgZm9yIGEga2V5IGF0IGh0dHA6Ly9wZWVyanMuY29tL3BlZXJzZXJ2ZXJcbiAgVkVSU0lPTjogJzAuMC4xJyAgLy8gVmVyc2lvbiBvZiB0aGUgYGdhbWVwYWQuanNgIHNjcmlwdFxufTtcblxuLy8gT3ZlcnJpZGUgZWFjaCBkZWZhdWx0IHNldHRpbmcgd2l0aCB1c2VyLWRlZmluZWQgc2V0dGluZy5cbk9iamVjdC5rZXlzKHNldHRpbmdzX2xvY2FsKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcblx0c2V0dGluZ3Nba2V5XSA9IHNldHRpbmdzX2xvY2FsW2tleV07XG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHRpbmdzO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIERFQlVHOiB0cnVlLFxuICBQRUVSSlNfS0VZOiAncm92dTV4bXFvNjl3d21pJ1xufTtcbiJdfQ== diff --git a/dist/js/gamepad-client.min.js b/dist/js/gamepad-client.min.js index fa6f6b3..9a3e944 100755 --- a/dist/js/gamepad-client.min.js +++ b/dist/js/gamepad-client.min.js @@ -1 +1 @@ -!function e(t,n,r){function o(l,u){if(!n[l]){if(!t[l]){var i="function"==typeof require&&require;if(!u&&i)return i(l,!0);if(c)return c(l,!0);var s=new Error("Cannot find module '"+l+"'");throw s.code="MODULE_NOT_FOUND",s}var a=n[l]={exports:{}};t[l][0].call(a.exports,function(e){var n=t[l][1][e];return o(n?n:e)},a,a.exports,e,t,n,r)}return n[l].exports}for(var c="function"==typeof require&&require,l=0;l/g,">").replace(/'/g,"'").replace(/"/g,"""):e}function d(){return!(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement)}function f(){d()?(n("Entering full screen"),document.documentElement.requestFullscreen?document.documentElement.requestFullscreen():document.documentElement.mozRequestFullScreen?document.documentElement.mozRequestFullScreen():document.documentElement.webkitRequestFullscreen?document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT):document.documentElement.msRequestFullscreen&&document.documentElement.msRequestFullscreen()):(n("Exiting full screen"),document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.msExitFullscreen&&document.msExitFullscreen())}function m(){var e=screen.LockOrientation||screen.mozLockOrientation||screen.webkitLockOrientation||screen.msLockOrientation;return e?(e(orientation),void 0):o("Orientation could not be locked")}function p(e){var t=document.createEvent("HTMLEvents");t.initEvent(e,!0,!0),t.eventName=e,(document.body||window).dispatchEvent(t)}var g=["input","keygen","meter","option","output","progress","select","textarea"];t.exports.trace=n,t.exports.error=r,t.exports.warn=o,t.exports.polyfill=c,t.exports.getPeerId=l,t.exports.fieldFocused=u,t.exports.hasTouchEvents=i,t.exports.injectCSS=s,t.exports.escape=a,t.exports.isFullScreen=d,t.exports.toggleFullScreen=f,t.exports.lockOrientation=m,t.exports.triggerEvent=p},{}],3:[function(e,t){var n={};try{n=e("./settings_local.js")}catch(r){}var o={API_URL:"http://localhost:5000",DEBUG:!1,PEERJS_KEY:"",VERSION:"0.0.1"};for(var c in n)o[c]=n[c];t.exports=o},{"./settings_local.js":4}],4:[function(e,t){t.exports={DEBUG:!0,PEERJS_KEY:"rovu5xmqo69wwmi"}},{}]},{},[1]); \ No newline at end of file +!function e(t,n,r){function o(l,i){if(!n[l]){if(!t[l]){var u="function"==typeof require&&require;if(!i&&u)return u(l,!0);if(c)return c(l,!0);var a=new Error("Cannot find module '"+l+"'");throw a.code="MODULE_NOT_FOUND",a}var s=n[l]={exports:{}};t[l][0].call(s.exports,function(e){var n=t[l][1][e];return o(n?n:e)},s,s.exports,e,t,n,r)}return n[l].exports}for(var c="function"==typeof require&&require,l=0;l/g,">").replace(/'/g,"'").replace(/"/g,"""):e}function f(){return!(t.fullscreenElement||t.mozFullScreenElement||t.webkitFullscreenElement||t.msFullscreenElement)}function d(){f()?(n("Entering full screen"),t.documentElement.requestFullscreen?t.documentElement.requestFullscreen():t.documentElement.mozRequestFullScreen?t.documentElement.mozRequestFullScreen():t.documentElement.webkitRequestFullscreen?t.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT):t.documentElement.msRequestFullscreen&&t.documentElement.msRequestFullscreen()):(n("Exiting full screen"),t.exitFullscreen?t.exitFullscreen():t.mozCancelFullScreen?t.mozCancelFullScreen():t.webkitExitFullscreen?t.webkitExitFullscreen():t.msExitFullscreen&&t.msExitFullscreen())}function m(t){var n=e.screen.LockOrientation||e.screen.mozLockOrientation||e.screen.webkitLockOrientation||e.screen.msLockOrientation;return n?n(t):o("Orientation could not be locked")}function p(n){var r=t.createEvent("HTMLEvents");r.initEvent(n,!0,!0),r.eventName=n,(t.body||e).dispatchEvent(r)}var g=["input","keygen","meter","option","output","progress","select","textarea"];return{trace:n,error:r,warn:o,polyfill:c,getPeerId:l,fieldFocused:i,hasTouchEvents:u,injectCSS:a,escape:s,isFullScreen:f,toggleFullScreen:d,lockOrientation:m,triggerEvent:p}}},{}],3:[function(e,t){"use strict";var n={};try{n=e("./settings_local.js")}catch(r){}var o={API_URL:"http://localhost:5000",DEBUG:!1,PEERJS_KEY:"",VERSION:"0.0.1"};Object.keys(n).forEach(function(e){o[e]=n[e]}),t.exports=o},{"./settings_local.js":4}],4:[function(e,t){t.exports={DEBUG:!0,PEERJS_KEY:"rovu5xmqo69wwmi"}},{}]},{},[1]); \ No newline at end of file diff --git a/dist/js/gamepad-host.js b/dist/js/gamepad-host.js index 65591a2..32b7331 100755 --- a/dist/js/gamepad-host.js +++ b/dist/js/gamepad-host.js @@ -4,14 +4,14 @@ // var peer = require('./lib/peer'); // var Promise = require('./lib/promise-1.0.0.js'); // jshint ignore:line -var Modal = require('./lib/modal'); +var Modal = require('./lib/modal')(window, document); var settings = require('./settings'); -var utils = require('./lib/utils'); +var utils = require('./lib/utils')(window, document); var error = utils.error; var trace = utils.trace; -utils.polyfill(window); +utils.polyfill(); /** @@ -40,12 +40,12 @@ gamepad.state = {}; * @memberOf gamepad */ gamepad.peerHandshake = function (peerId) { - return new Promise(function (resolve, reject) { + return new Promise(function (resolve) { if (!peerId) { peerId = utils.getPeerId(); // The host ID. } - var peer = new Peer(peerId, { + var peer = new window.Peer(peerId, { key: settings.PEERJS_KEY, debug: settings.DEBUG ? 3 : 0 }); @@ -79,11 +79,13 @@ gamepad.peerConnect = function (peer) { gamepad._updateState(data.data); break; default: - console.warn('WebRTC message received of unknown type: "' + data.type + '"'); + console.warn( + 'WebRTC message received of unknown type: "' + data.type + '"'); break; } - trace('Received: ' + (typeof data === 'object' ? JSON.stringify(data) : '')); + trace('Received: ' + + (typeof data === 'object' ? JSON.stringify(data) : '')); }); conn.on('error', function (err) { @@ -110,16 +112,20 @@ gamepad.pair = function (peerId) { return new Promise(function (resolve) { return gamepad.peerHandshake(peerId).then(function (peer) { - var pairId = peer.id; // This should be the same as `peerId`, but this comes from PeerJS, which is the source of truth. + // `pairId` should be the same as `peerId`, + // but `peer.id` is the source of truth. + var pairId = peer.id; var pairIdEsc = encodeURIComponent(pairId); var pairUrl = galaxyOrigin + '/client.html?' + pairIdEsc; // Update the querystring in the address bar. - window.history.replaceState(null, null, window.location.pathname + '?' + pairIdEsc); + window.history.replaceState(null, null, + window.location.pathname + '?' + pairIdEsc); var content = ( '' ); @@ -220,7 +226,7 @@ gamepad._bind = function (eventName, listener) { * @param {Function} [listener] (Optional) The listener function to remove. * @return {Boolean} Was unbinding the listener successful. */ -Gamepad.prototype.unbind = function (eventName, listener) { +gamepad.prototype.unbind = function (eventName, listener) { // Remove everything for all event types. if (typeof eventName === 'undefined') { this.listeners = {}; @@ -273,6 +279,9 @@ module.exports = gamepad; })(window, document); },{"./lib/modal":2,"./lib/utils":3,"./settings":4}],2:[function(require,module,exports){ +module.exports = function (window, document) { +'use strict'; + var utils = require('./utils'); @@ -340,11 +349,17 @@ Modal.prototype.open = function () { }; -module.exports = Modal; +return Modal; + +}; },{"./utils":3}],3:[function(require,module,exports){ +module.exports = function (window, document) { +'use strict'; + function trace(text, level) { - console[level || 'log']((window.performance.now() / 1000).toFixed(3) + ': ' + text); + console[level || 'log']( + (window.performance.now() / 1000).toFixed(3) + ': ' + text); } @@ -358,17 +373,18 @@ function warn(text) { } -function polyfill(win) { - if (!('performance' in win)) { - win.performance = { +function polyfill() { + if (!('performance' in window)) { + window.performance = { now: function () { return +new Date(); } }; } - if (('origin' in win.location)) { - win.location.origin = win.location.protocol + '//' + win.location.host; + if (('origin' in window.location)) { + window.location.origin = (window.location.protocol + '//' + + window.location.host); } } @@ -396,7 +412,7 @@ function fieldFocused(e) { function hasTouchEvents() { return ('ontouchstart' in window || - window.DocumentTouch && document instanceof DocumentTouch); + window.DocumentTouch && document instanceof window.DocumentTouch); } function injectCSS(opts) { @@ -437,7 +453,8 @@ function toggleFullScreen() { } else if (document.documentElement.mozRequestFullScreen) { document.documentElement.mozRequestFullScreen(); } else if (document.documentElement.webkitRequestFullscreen) { - document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); + document.documentElement.webkitRequestFullscreen( + Element.ALLOW_KEYBOARD_INPUT); } else if (document.documentElement.msRequestFullscreen) { document.documentElement.msRequestFullscreen(); } @@ -456,16 +473,16 @@ function toggleFullScreen() { } -function lockOrientation() { - var lo = (screen.LockOrientation || - screen.mozLockOrientation || - screen.webkitLockOrientation || - screen.msLockOrientation); +function lockOrientation(orientation) { + var lo = (window.screen.LockOrientation || + window.screen.mozLockOrientation || + window.screen.webkitLockOrientation || + window.screen.msLockOrientation); if (!lo) { return warn('Orientation could not be locked'); } - lo(orientation); + return lo(orientation); } @@ -477,18 +494,55 @@ function triggerEvent(type) { } -module.exports.trace = trace; -module.exports.error = error; -module.exports.warn = warn; -module.exports.polyfill = polyfill; -module.exports.getPeerId = getPeerId; -module.exports.fieldFocused = fieldFocused; -module.exports.hasTouchEvents = hasTouchEvents; -module.exports.injectCSS = injectCSS; -module.exports.escape = escape; -module.exports.isFullScreen = isFullScreen; -module.exports.toggleFullScreen = toggleFullScreen; -module.exports.lockOrientation = lockOrientation; -module.exports.triggerEvent = triggerEvent; +return { + trace: trace, + error: error, + warn: warn, + polyfill: polyfill, + getPeerId: getPeerId, + fieldFocused: fieldFocused, + hasTouchEvents: hasTouchEvents, + injectCSS: injectCSS, + escape: escape, + isFullScreen: isFullScreen, + toggleFullScreen: toggleFullScreen, + lockOrientation: lockOrientation, + triggerEvent: triggerEvent +}; -},{}] \ No newline at end of file +}; + +},{}],4:[function(require,module,exports){ +'use strict'; + +var settings_local = {}; +try { + settings_local = require('./settings_local.js'); +} catch (e) { +} + + +var settings = { + API_URL: 'http://localhost:5000', // Galaxy API URL. No trailing slash. + DEBUG: false, + PEERJS_KEY: '', // Sign up for a key at http://peerjs.com/peerserver + VERSION: '0.0.1' // Version of the `gamepad.js` script +}; + +// Override each default setting with user-defined setting. +Object.keys(settings_local).forEach(function (key) { + settings[key] = settings_local[key]; +}); + + +module.exports = settings; + +},{"./settings_local.js":5}],5:[function(require,module,exports){ +module.exports = { + DEBUG: true, + PEERJS_KEY: 'rovu5xmqo69wwmi' +}; + +},{}]},{},[1])(1) +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9vcHQvZ2FsYXh5LmpzLW1vYmlsZS1nYW1lcGFkL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIuL3NyYy9qcy9ob3N0LmpzIiwiL29wdC9nYWxheHkuanMtbW9iaWxlLWdhbWVwYWQvc3JjL2pzL2xpYi9tb2RhbC5qcyIsIi9vcHQvZ2FsYXh5LmpzLW1vYmlsZS1nYW1lcGFkL3NyYy9qcy9saWIvdXRpbHMuanMiLCIvb3B0L2dhbGF4eS5qcy1tb2JpbGUtZ2FtZXBhZC9zcmMvanMvc2V0dGluZ3MuanMiLCIvb3B0L2dhbGF4eS5qcy1tb2JpbGUtZ2FtZXBhZC9zcmMvanMvc2V0dGluZ3NfbG9jYWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIoZnVuY3Rpb24gKHdpbmRvdywgZG9jdW1lbnQpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gdmFyIHBlZXIgPSByZXF1aXJlKCcuL2xpYi9wZWVyJyk7XG4vLyB2YXIgUHJvbWlzZSA9IHJlcXVpcmUoJy4vbGliL3Byb21pc2UtMS4wLjAuanMnKTsgIC8vIGpzaGludCBpZ25vcmU6bGluZVxudmFyIE1vZGFsID0gcmVxdWlyZSgnLi9saWIvbW9kYWwnKSh3aW5kb3csIGRvY3VtZW50KTtcbnZhciBzZXR0aW5ncyA9IHJlcXVpcmUoJy4vc2V0dGluZ3MnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vbGliL3V0aWxzJykod2luZG93LCBkb2N1bWVudCk7XG52YXIgZXJyb3IgPSB1dGlscy5lcnJvcjtcbnZhciB0cmFjZSA9IHV0aWxzLnRyYWNlO1xuXG5cbnV0aWxzLnBvbHlmaWxsKCk7XG5cblxuLyoqXG4gKiBBIGxpYnJhcnkgZm9yIGNvbnRyb2xsaW5nIGFuIEhUTUw1IGdhbWUgdXNpbmcgV2ViUlRDLlxuICpcbiAqIEBleHBvcnRzIGdhbWVwYWRcbiAqIEBuYW1lc3BhY2UgZ2FtZXBhZFxuICovXG5mdW5jdGlvbiBnYW1lcGFkKCkge1xufVxuXG5cbmdhbWVwYWQubGlzdGVuZXJzID0ge307XG5nYW1lcGFkLnN0YXRlID0ge307XG5cblxuLyoqXG4gKiBEb2VzIGEgaGFuZHNoYWtlIHdpdGggUGVlckpTJyBXZWJTb2NrZXQgc2VydmVyIHRvIGdldCBhIHBlZXIgSUQuXG4gKlxuICogT25jZSB3ZSBoYXZlIHRoZSBwZWVyIElELCB3ZSBjYW4gdGVsbCB0aGUgY29udHJvbGxlciBob3cgdG8gZmluZCB1cy4gVGhlblxuICogYWxsIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgaG9zdCBhbmQgdGhlIGNvbnRyb2xsZXIgaXMgcGVlci10by1wZWVyIHZpYVxuICogV2ViUlRDIGRhdGEgY2hhbm5lbHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBlZXJJZCBUaGUgcGVlciBJRC5cbiAqIEByZXR1cm5zIHtQcm9taXNlfVxuICogQG1lbWJlck9mIGdhbWVwYWRcbiAqL1xuZ2FtZXBhZC5wZWVySGFuZHNoYWtlID0gZnVuY3Rpb24gKHBlZXJJZCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICBpZiAoIXBlZXJJZCkge1xuICAgICAgcGVlcklkID0gdXRpbHMuZ2V0UGVlcklkKCk7ICAvLyBUaGUgaG9zdCBJRC5cbiAgICB9XG5cbiAgICB2YXIgcGVlciA9IG5ldyB3aW5kb3cuUGVlcihwZWVySWQsIHtcbiAgICAgIGtleTogc2V0dGluZ3MuUEVFUkpTX0tFWSxcbiAgICAgIGRlYnVnOiBzZXR0aW5ncy5ERUJVRyA/IDMgOiAwXG4gICAgfSk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICAgcGVlci5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICBwZWVyLm9uKCdvcGVuJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhY2UoJ015IHBlZXIgSUQ6ICcgKyBwZWVyLmlkKTtcbiAgICAgIHJlc29sdmUocGVlcik7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuXG4vKipcbiAqIExpc3RlbnMgZm9yIGEgcGVlciBjb25uZWN0aW9uIHdpdGggdGhlIGNvbnRyb2xsZXIgdmlhIFdlYlJUQyBkYXRhIGNoYW5uZWxzLlxuICpcbiAqIElmIG9uZSBpcyBnaXZlbiwgd2Ugd2lsbCB0ZWxsIFBlZXJKUyB0byB1c2UgdGhlIHBlZXIgSUQgdGhlIHF1ZXJ5LXN0cmluZy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqIEBtZW1iZXJPZiBnYW1lcGFkXG4gKi9cbmdhbWVwYWQucGVlckNvbm5lY3QgPSBmdW5jdGlvbiAocGVlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHBlZXIub24oJ2Nvbm5lY3Rpb24nLCBmdW5jdGlvbiAoY29ubikge1xuICAgICAgY29ubi5vbignZGF0YScsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnc3RhdGUnOlxuICAgICAgICAgICAgZ2FtZXBhZC5fdXBkYXRlU3RhdGUoZGF0YS5kYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICdXZWJSVEMgbWVzc2FnZSByZWNlaXZlZCBvZiB1bmtub3duIHR5cGU6IFwiJyArIGRhdGEudHlwZSArICdcIicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0cmFjZSgnUmVjZWl2ZWQ6ICcgK1xuICAgICAgICAgICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShkYXRhKSA6ICcnKSk7XG4gICAgICB9KTtcblxuICAgICAgY29ubi5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGVycm9yKGVyci5tZXNzYWdlKTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcblxuICAgICAgLy8gV2UndmUgY29ubmVjdGVkIHRvIGEgY29udHJvbGxlci5cbiAgICAgIHJlc29sdmUoY29ubik7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuXG4vKipcbiAqIENvbm5lY3RzIHRvIGEgcGVlciAoY29udHJvbGxlcikuXG4gKlxuICogRXN0YWJsaXNoZXMgY29ubmVjdGlvbiB3aXRoIHBlZXIuXG4gKlxuICogQHJldHVybnMge1Byb21pc2V9XG4gKiBAbWVtYmVyT2YgZ2FtZXBhZFxuICovXG5nYW1lcGFkLnBhaXIgPSBmdW5jdGlvbiAocGVlcklkKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXG4gICAgcmV0dXJuIGdhbWVwYWQucGVlckhhbmRzaGFrZShwZWVySWQpLnRoZW4oZnVuY3Rpb24gKHBlZXIpIHtcbiAgICAgIC8vIGBwYWlySWRgIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBgcGVlcklkYCxcbiAgICAgIC8vIGJ1dCBgcGVlci5pZGAgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aC5cbiAgICAgIHZhciBwYWlySWQgPSBwZWVyLmlkO1xuICAgICAgdmFyIHBhaXJJZEVzYyA9IGVuY29kZVVSSUNvbXBvbmVudChwYWlySWQpO1xuICAgICAgdmFyIHBhaXJVcmwgPSBnYWxheHlPcmlnaW4gKyAnL2NsaWVudC5odG1sPycgKyBwYWlySWRFc2M7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcXVlcnlzdHJpbmcgaW4gdGhlIGFkZHJlc3MgYmFyLlxuICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIG51bGwsXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArICc/JyArIHBhaXJJZEVzYyk7XG5cbiAgICAgIHZhciBjb250ZW50ID0gKFxuICAgICAgICAnPGRpdiBjbGFzcz1cIm1vZGFsLWlubmVyIG1vZGFsLXBhaXJcIj4nICtcbiAgICAgICAgICAnPGgyPlVSTDwvaDI+PHA+PGEgaHJlZj1cIicgKyBwYWlyVXJsICtcbiAgICAgICAgICAgICdcIiBjbGFzcz1cInBhaXItdXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JyArIHBhaXJVcmwgKyAnPC9hPjwvcD4nICtcbiAgICAgICAgICAnPGgyPkNvZGU8L2gyPjxwIGNsYXNzPVwicGFpci1jb2RlXCI+JyArIHBhaXJJZEVzYyArICc8L3A+JyArXG4gICAgICAgICc8L2Rpdj4nXG4gICAgICApO1xuXG4gICAgICB2YXIgbW9kYWwgPSBuZXcgTW9kYWwoe1xuICAgICAgICBpZDogJ3BhaXJpbmctc2NyZWVuJyxcbiAgICAgICAgY2xhc3NlczogJ3NsaW0nLFxuICAgICAgICB0aXRsZTogJ1BhaXIgeW91ciBtb2JpbGUgcGhvbmUnLFxuICAgICAgICBjb250ZW50OiBjb250ZW50XG4gICAgICB9LCB0cnVlKTtcblxuICAgICAgLy8gdG9kbzogcmVwbGFjZSBgc2V0VGltZW91dGBzIHdpdGggYHRyYW5zaXRpb25lbmRgIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gV2FpdGluZyBmb3IgdGhlIHRyYW5zaXRpb24gdG8gZW5kLlxuICAgICAgICBtb2RhbC5vcGVuKCk7XG4gICAgICB9LCAxNTApO1xuXG4gICAgICBbXG4gICAgICAgICdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9U291cmNlK1NhbnMrUHJvOjMwMCw0MDAsNzAwJyxcbiAgICAgICAgJy9jc3MvbW9kYWwuY3NzJyAgLy8gdG9kbzogZG8gbm90IGhhcmRjb2RlIGFic29sdXRlIHBhdGhcbiAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoc3R5bGVzaGVldCkge1xuICAgICAgICB1dGlscy5pbmplY3RDU1Moe2hyZWY6IHN0eWxlc2hlZXR9KTtcbiAgICAgIH0pO1xuXG4gICAgICBnYW1lcGFkLnBlZXJDb25uZWN0KHBlZXIpLnRoZW4oZnVuY3Rpb24gKGNvbm4pIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1BlZXIgY29ubmVjdGVkJyk7XG4gICAgICAgIG1vZGFsLmNsb3NlKCk7XG4gICAgICAgIHJlc29sdmUoY29ubik7XG4gICAgICB9KTtcblxuICAgIH0pLmNhdGNoKGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKSk7XG4gIH0pO1xufTtcblxuXG5nYW1lcGFkLl91cGRhdGVTdGF0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gT2JqZWN0LmtleXMoZGF0YSB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICBpZiAoIXRoaXMuc3RhdGVba2V5XSAmJiBkYXRhW2tleV0pIHtcbiAgICAgLy8gQnV0dG9uIHB1c2hlZC5cbiAgICAgZ2FtZXBhZC5fZW1pdCgnYnV0dG9uZG93bicsIGtleSk7XG4gICAgIGdhbWVwYWQuX2VtaXQoJ2J1dHRvbmRvd24uJyArIGtleSwga2V5KTtcbiAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZVtrZXldICYmICFkYXRhW2tleV0pIHtcbiAgICAgLy8gQnV0dG9uIHJlbGVhc2VkLlxuICAgICBnYW1lcGFkLl9lbWl0KCdidXR0b251cCcsIGtleSk7XG4gICAgIGdhbWVwYWQuX2VtaXQoJ2J1dHRvbnVwLicgKyBrZXksIGtleSk7XG4gICB9XG4gfS5iaW5kKHRoaXMpKTtcbn07XG5cblxuZ2FtZXBhZC5oaWRlUGFpcmluZ1NjcmVlbiA9IGZ1bmN0aW9uICgpIHtcbiAgTW9kYWwuY2xvc2VBbGwoKTtcbn07XG5cblxuLyoqXG4gKiBGaXJlcyBhbiBpbnRlcm5hbCBldmVudCB3aXRoIGdpdmVuIGRhdGEuXG4gKlxuICogQG1ldGhvZCBfZmlyZVxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50IHRvIGZpcmUgKGUuZy4sIGBidXR0b25kb3duYCkuXG4gKiBAcGFyYW0geyp9IGRhdGEgRGF0YSB0byBwYXNzIHRvIHRoZSBsaXN0ZW5lci5cbiAqIEBwcml2YXRlXG4gKi9cbmdhbWVwYWQuX2VtaXQgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBkYXRhKSB7XG4gICh0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgIGxpc3RlbmVyLmFwcGx5KGxpc3RlbmVyLCBbZGF0YV0pO1xuICB9KTtcbn07XG5cblxuLyoqXG4gKiBCaW5kcyBhIGxpc3RlbmVyIHRvIGEgZ2FtZXBhZCBldmVudC5cbiAqXG4gKiBAbWV0aG9kIGJpbmRcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWUgRXZlbnQgdG8gYmluZCB0byAoZS5nLiwgYGJ1dHRvbmRvd25gKS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIExpc3RlbmVyIHRvIGNhbGwgd2hlbiBnaXZlbiBldmVudCBvY2N1cnMuXG4gKiBAcmV0dXJuIHtHYW1lcGFkfSBTZWxmXG4gKi9cbmdhbWVwYWQuX2JpbmQgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mKHRoaXMubGlzdGVuZXJzW2V2ZW50XSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhpcy5saXN0ZW5lcnNbZXZlbnRdID0gW107XG4gIH1cblxuICB0aGlzLmxpc3RlbmVyc1tldmVudF0ucHVzaChsaXN0ZW5lcik7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlcyBsaXN0ZW5lciBvZiBnaXZlbiB0eXBlLlxuICpcbiAqIElmIG5vIHR5cGUgaXMgZ2l2ZW4sIGFsbCBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQuIElmIG5vIGxpc3RlbmVyIGlzIGdpdmVuLCBhbGxcbiAqIGxpc3RlbmVycyBvZiBnaXZlbiB0eXBlIGFyZSByZW1vdmVkLlxuICpcbiAqIEBtZXRob2QgdW5iaW5kXG4gKiBAcGFyYW0ge1N0cmluZ30gW3R5cGVdIFR5cGUgb2YgbGlzdGVuZXIgdG8gcmVtb3ZlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2xpc3RlbmVyXSAoT3B0aW9uYWwpIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBXYXMgdW5iaW5kaW5nIHRoZSBsaXN0ZW5lciBzdWNjZXNzZnVsLlxuICovXG5nYW1lcGFkLnByb3RvdHlwZS51bmJpbmQgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAvLyBSZW1vdmUgZXZlcnl0aGluZyBmb3IgYWxsIGV2ZW50IHR5cGVzLlxuICBpZiAodHlwZW9mIGV2ZW50TmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXIgZnVuY3Rpb25zIGZvciB0aGF0IGV2ZW50IHR5cGUuXG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSA9IFtdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdGhpcy5saXN0ZW5lcnNbZXZlbnROYW1lXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0aGlzLmxpc3RlbmVyc1tldmVudE5hbWVdLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBpZHgpIHtcbiAgICAvLyBSZW1vdmUgb25seSB0aGUgbGlzdGVuZXIgZnVuY3Rpb24gcGFzc2VkIHRvIHRoaXMgbWV0aG9kLlxuICAgIGlmICh2YWx1ZSA9PT0gbGlzdGVuZXIpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzW2V2ZW50TmFtZV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cblxuXG4vLyB0b2RvOiB0aGVzZSBhcmUgbWFwcGVkIGRpcmVjdGx5IHRvIE5FUyBjb250cm9sbGVyLiBmaXggdGhpcy5cbmdhbWVwYWQuYnV0dG9ucyA9IHtcbiAgYToge1xuICAgIGNsaWNrZWQ6IGdhbWVwYWQuX2JpbmRcbiAgfVxufTtcblxuXG5nYW1lcGFkLnZlcnNpb24gPSBzZXR0aW5ncy5WRVJTSU9OO1xuXG5cbnZhciBnYWxheHlPcmlnaW4gPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xudmFyIGRhdGFPcmlnaW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1nYWxheHktb3JpZ2luXScpO1xuaWYgKGRhdGFPcmlnaW4pIHtcbiAgZ2FtZXBhZC5nYWxheHlPcmlnaW4gPSBkYXRhT3JpZ2luLmRhdGFzZXQuZ2FsYXh5T3JpZ2luO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gZ2FtZXBhZDtcblxufSkod2luZG93LCBkb2N1bWVudCk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50KSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuXG5mdW5jdGlvbiBNb2RhbChvcHRzLCBpbmplY3QpIHtcbiAgLy8gQ3JlYXRlIHByb3BlcnRpZXMgZm9yIGBpZGAsIGBjbGFzc2VzYCwgYHRpdGxlYCwgYW5kIGBjb250ZW50YC5cbiAgT2JqZWN0LmtleXMob3B0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdGhpc1trZXldID0gb3B0c1trZXldO1xuICB9LmJpbmQodGhpcykpO1xuXG4gIGlmIChpbmplY3QpIHtcbiAgICB0aGlzLmluamVjdCgpO1xuICB9XG59XG5cbk1vZGFsLmNsb3NlQWxsID0gTW9kYWwucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAvLyBDbG9zZSBhbnkgb3BlbiBtb2RhbC5cbiAgdmFyIG9wZW5lZE1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1kLXNob3cnKTtcbiAgaWYgKG9wZW5lZE1vZGFsKSB7XG4gICAgb3BlbmVkTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnbWQtc2hvdycpO1xuICB9XG4gIC8vIFRPRE86IFdhaXQgdW50aWwgdHJhbnNpdGlvbiBlbmQuXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnZ2FsYXh5LW92ZXJsYXllZCcpO1xuICB9LCAxNTApO1xufTtcblxuTW9kYWwuaW5qZWN0T3ZlcmxheSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gSW5qZWN0IHRoZSBvdmVybGF5IHdlIHVzZSBmb3Igb3ZlcmxheWluZyBpdCBiZWhpbmQgbW9kYWxzLlxuICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZC1vdmVybGF5JykpIHtcbiAgICB2YXIgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGQuY2xhc3NOYW1lID0gJ21kLW92ZXJsYXknO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7XG4gIH1cbn07XG5cbk1vZGFsLnByb3RvdHlwZS5odG1sID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBkLmlkID0gJ21vZGFsLScgKyB0aGlzLmlkO1xuICBkLmNsYXNzTmFtZSA9ICdtZC1tb2RhbCBtZC1lZmZlY3QtMSAnICsgKHRoaXMuY2xhc3NlcyB8fCAnJyk7XG4gIGQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgZC5pbm5lckhUTUwgPSAoXG4gICAgJzxkaXYgY2xhc3M9XCJtZC1jb250ZW50XCI+JyArXG4gICAgICAnPGgzPicgKyB1dGlscy5lc2NhcGUodGhpcy50aXRsZSkgKyAnPC9oMz4gJyArXG4gICAgICAnPGEgY2xhc3M9XCJtZC1jbG9zZVwiIHRpdGxlPVwiQ2xvc2VcIj48c3Bhbj48ZGl2PkNsb3NlPC9kaXY+PC9zcGFuPjwvYT4nICtcbiAgICAgICc8ZGl2PicgKyB0aGlzLmNvbnRlbnQgKyAnPC9kaXY+JyArXG4gICAgJzwvZGl2PidcbiAgKTtcbiAgcmV0dXJuIGQ7XG59O1xuXG5Nb2RhbC5wcm90b3R5cGUuaW5qZWN0ID0gZnVuY3Rpb24gKCkge1xuICBNb2RhbC5pbmplY3RPdmVybGF5KCk7XG5cbiAgdGhpcy5lbCA9IHRoaXMuaHRtbCgpO1xuICB0aGlzLmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5lbCk7XG4gIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnZ2FsYXh5LW92ZXJsYXllZCcpO1xuXG4gIHJldHVybiB0aGlzLmVsO1xufTtcblxuTW9kYWwucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgnbWQtc2hvdycpO1xufTtcblxuXG5yZXR1cm4gTW9kYWw7XG5cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50KSB7XG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIHRyYWNlKHRleHQsIGxldmVsKSB7XG4gIGNvbnNvbGVbbGV2ZWwgfHwgJ2xvZyddKFxuICAgICh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgLyAxMDAwKS50b0ZpeGVkKDMpICsgJzogJyArIHRleHQpO1xufVxuXG5cbmZ1bmN0aW9uIGVycm9yKHRleHQpIHtcbiAgcmV0dXJuIHRyYWNlKHRleHQsICdlcnJvcicpO1xufVxuXG5cbmZ1bmN0aW9uIHdhcm4odGV4dCkge1xuICByZXR1cm4gdHJhY2UodGV4dCwgJ3dhcm4nKTtcbn1cblxuXG5mdW5jdGlvbiBwb2x5ZmlsbCgpIHtcbiAgaWYgKCEoJ3BlcmZvcm1hbmNlJyBpbiB3aW5kb3cpKSB7XG4gICAgd2luZG93LnBlcmZvcm1hbmNlID0ge1xuICAgICAgbm93OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiArbmV3IERhdGUoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgaWYgKCgnb3JpZ2luJyBpbiB3aW5kb3cubG9jYXRpb24pKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLm9yaWdpbiA9ICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0KTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGdldFBlZXJJZCgpIHtcbiAgcmV0dXJuICh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZignLmh0bWwnKSA/XG4gICAgd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHIoMSkgOiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3Vic3RyKDEpKTtcbn1cblxuXG52YXIgRklFTERfRk9DVVNFRF9UQUdTID0gW1xuICAnaW5wdXQnLFxuICAna2V5Z2VuJyxcbiAgJ21ldGVyJyxcbiAgJ29wdGlvbicsXG4gICdvdXRwdXQnLFxuICAncHJvZ3Jlc3MnLFxuICAnc2VsZWN0JyxcbiAgJ3RleHRhcmVhJ1xuXTtcbmZ1bmN0aW9uIGZpZWxkRm9jdXNlZChlKSB7XG4gIHJldHVybiBGSUVMRF9GT0NVU0VEX1RBR1MuaW5kZXhPZihlLnRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTE7XG59XG5cblxuZnVuY3Rpb24gaGFzVG91Y2hFdmVudHMoKSB7XG4gIHJldHVybiAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8XG4gICAgd2luZG93LkRvY3VtZW50VG91Y2ggJiYgZG9jdW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuRG9jdW1lbnRUb3VjaCk7XG59XG5cbmZ1bmN0aW9uIGluamVjdENTUyhvcHRzKSB7XG4gIHZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICBsaW5rLmhyZWYgPSBvcHRzLmhyZWY7XG4gIGxpbmsubWVkaWEgPSAnYWxsJztcbiAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gIGxpbmsudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gIE9iamVjdC5rZXlzKG9wdHMgfHwge30pLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICBsaW5rW3Byb3BdID0gb3B0c1twcm9wXTtcbiAgfSk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKS5hcHBlbmRDaGlsZChsaW5rKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlKHRleHQpIHtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgcmV0dXJuIHRleHQucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgICAgICAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAgICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgJyYjMzk7JylcbiAgICAgICAgICAgICAucmVwbGFjZSgvXCIvZywgJyYjMzQ7Jyk7XG59XG5cbmZ1bmN0aW9uIGlzRnVsbFNjcmVlbigpIHtcbiAgcmV0dXJuICghZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgJiYgIC8vIHN0YW5kYXJkIG1ldGhvZFxuICAgICFkb2N1bWVudC5tb3pGdWxsU2NyZWVuRWxlbWVudCAmJlxuICAgICFkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCAmJlxuICAgICFkb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50KTsgIC8vIHZlbmRvci1wcmVmaXhlZCBtZXRob2RzXG59XG5cbmZ1bmN0aW9uIHRvZ2dsZUZ1bGxTY3JlZW4oKSB7XG4gIGlmIChpc0Z1bGxTY3JlZW4oKSkge1xuICAgIHRyYWNlKCdFbnRlcmluZyBmdWxsIHNjcmVlbicpO1xuICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKFxuICAgICAgICBFbGVtZW50LkFMTE9XX0tFWUJPQVJEX0lOUFVUKTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0cmFjZSgnRXhpdGluZyBmdWxsIHNjcmVlbicpO1xuICAgIGlmIChkb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xuICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pIHtcbiAgICAgIGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKSB7XG4gICAgICBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbikge1xuICAgICAgZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO1xuICAgIH1cbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvY2tPcmllbnRhdGlvbihvcmllbnRhdGlvbikge1xuICB2YXIgbG8gPSAod2luZG93LnNjcmVlbi5Mb2NrT3JpZW50YXRpb24gfHxcbiAgICB3aW5kb3cuc2NyZWVuLm1vekxvY2tPcmllbnRhdGlvbiB8fFxuICAgIHdpbmRvdy5zY3JlZW4ud2Via2l0TG9ja09yaWVudGF0aW9uIHx8XG4gICAgd2luZG93LnNjcmVlbi5tc0xvY2tPcmllbnRhdGlvbik7XG4gIGlmICghbG8pIHtcbiAgICByZXR1cm4gd2FybignT3JpZW50YXRpb24gY291bGQgbm90IGJlIGxvY2tlZCcpO1xuICB9XG5cbiAgcmV0dXJuIGxvKG9yaWVudGF0aW9uKTtcbn1cblxuXG5mdW5jdGlvbiB0cmlnZ2VyRXZlbnQodHlwZSkge1xuICB2YXIgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpO1xuICBldmVudC5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSk7XG4gIGV2ZW50LmV2ZW50TmFtZSA9IHR5cGU7XG4gIChkb2N1bWVudC5ib2R5IHx8IHdpbmRvdykuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5cblxucmV0dXJuIHtcbiAgdHJhY2U6IHRyYWNlLFxuICBlcnJvcjogZXJyb3IsXG4gIHdhcm46IHdhcm4sXG4gIHBvbHlmaWxsOiBwb2x5ZmlsbCxcbiAgZ2V0UGVlcklkOiBnZXRQZWVySWQsXG4gIGZpZWxkRm9jdXNlZDogZmllbGRGb2N1c2VkLFxuICBoYXNUb3VjaEV2ZW50czogaGFzVG91Y2hFdmVudHMsXG4gIGluamVjdENTUzogaW5qZWN0Q1NTLFxuICBlc2NhcGU6IGVzY2FwZSxcbiAgaXNGdWxsU2NyZWVuOiBpc0Z1bGxTY3JlZW4sXG4gIHRvZ2dsZUZ1bGxTY3JlZW46IHRvZ2dsZUZ1bGxTY3JlZW4sXG4gIGxvY2tPcmllbnRhdGlvbjogbG9ja09yaWVudGF0aW9uLFxuICB0cmlnZ2VyRXZlbnQ6IHRyaWdnZXJFdmVudFxufTtcblxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHNldHRpbmdzX2xvY2FsID0ge307XG50cnkge1xuICBzZXR0aW5nc19sb2NhbCA9IHJlcXVpcmUoJy4vc2V0dGluZ3NfbG9jYWwuanMnKTtcbn0gY2F0Y2ggKGUpIHtcbn1cblxuXG52YXIgc2V0dGluZ3MgPSB7XG4gIEFQSV9VUkw6ICdodHRwOi8vbG9jYWxob3N0OjUwMDAnLCAgLy8gR2FsYXh5IEFQSSBVUkwuIE5vIHRyYWlsaW5nIHNsYXNoLlxuICBERUJVRzogZmFsc2UsXG4gIFBFRVJKU19LRVk6ICcnLCAgLy8gU2lnbiB1cCBmb3IgYSBrZXkgYXQgaHR0cDovL3BlZXJqcy5jb20vcGVlcnNlcnZlclxuICBWRVJTSU9OOiAnMC4wLjEnICAvLyBWZXJzaW9uIG9mIHRoZSBgZ2FtZXBhZC5qc2Agc2NyaXB0XG59O1xuXG4vLyBPdmVycmlkZSBlYWNoIGRlZmF1bHQgc2V0dGluZyB3aXRoIHVzZXItZGVmaW5lZCBzZXR0aW5nLlxuT2JqZWN0LmtleXMoc2V0dGluZ3NfbG9jYWwpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuXHRzZXR0aW5nc1trZXldID0gc2V0dGluZ3NfbG9jYWxba2V5XTtcbn0pO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gc2V0dGluZ3M7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgREVCVUc6IHRydWUsXG4gIFBFRVJKU19LRVk6ICdyb3Z1NXhtcW82OXd3bWknXG59O1xuIl19 diff --git a/dist/js/gamepad-host.min.js b/dist/js/gamepad-host.min.js index e65151f..be6338b 100755 --- a/dist/js/gamepad-host.min.js +++ b/dist/js/gamepad-host.min.js @@ -1 +1 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;"undefined"!=typeof window?t=window:"undefined"!=typeof global?t=global:"undefined"!=typeof self&&(t=self),t.gamepad=e()}}(function(){return function e(t,n,o){function i(c,s){if(!n[c]){if(!t[c]){var l="function"==typeof require&&require;if(!s&&l)return l(c,!0);if(r)return r(c,!0);var u=new Error("Cannot find module '"+c+"'");throw u.code="MODULE_NOT_FOUND",u}var a=n[c]={exports:{}};t[c][0].call(a.exports,function(e){var n=t[c][1][e];return i(n?n:e)},a,a.exports,e,t,n,o)}return n[c].exports}for(var r="function"==typeof require&&require,c=0;c'+l+'

Code

'+c+"

",d=new r({id:"pairing-screen",classes:"slim",title:"Pair your mobile phone",content:u},!0);n.setTimeout(function(){d.open()},150),["https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700","/css/modal.css"].forEach(function(e){s.injectCSS({href:e})}),i.peerConnect(e).then(function(e){console.log("Peer connected"),d.close(),t(e)})}).catch(console.error.bind(console))})},i._updateState=function(e){Object.keys(e||{}).forEach(function(t){!this.state[t]&&e[t]?(i._emit("buttondown",t),i._emit("buttondown."+t,t)):this.state[t]&&!e[t]&&(i._emit("buttonup",t),i._emit("buttonup."+t,t))}.bind(this))},i.hidePairingScreen=function(){r.closeAll()},i._emit=function(e,t){(this.listeners[e]||[]).forEach(function(e){e.apply(e,[t])})},i._bind=function(e,t){return"undefined"==typeof this.listeners[event]&&(this.listeners[event]=[]),this.listeners[event].push(t),this},Gamepad.prototype.unbind=function(e,t){return"undefined"==typeof e?(this.listeners={},void 0):"undefined"==typeof t?(this.listeners[e]=[],void 0):"undefined"==typeof this.listeners[e]?!1:(this.listeners[e].forEach(function(n,o){return n===t?(this.listeners[e].splice(o,1),!0):void 0}),!1)},i.buttons={a:{clicked:i._bind}},i.version=c.VERSION;var a=n.location.origin,d=o.querySelector("[data-galaxy-origin]");d&&(i.galaxyOrigin=d.dataset.galaxyOrigin),t.exports=i}(window,document)},{"./lib/modal":2,"./lib/utils":3,"./settings":4}],2:[function(e,t){function n(e,t){Object.keys(e).forEach(function(t){this[t]=e[t]}.bind(this)),t&&this.inject()}var o=e("./utils");n.closeAll=n.prototype.close=function(){var e=document.querySelector(".md-show");e&&e.classList.remove("md-show"),setTimeout(function(){document.body.classList.remove("galaxy-overlayed")},150)},n.injectOverlay=function(){if(!document.querySelector(".md-overlay")){var e=document.createElement("div");e.className="md-overlay",document.body.appendChild(e)}},n.prototype.html=function(){var e=document.createElement("div");return e.id="modal-"+this.id,e.className="md-modal md-effect-1 "+(this.classes||""),e.style.display="none",e.innerHTML='

'+o.escape(this.title)+'

Close
'+this.content+"
",e},n.prototype.inject=function(){return n.injectOverlay(),this.el=this.html(),this.el.style.display="block",document.body.appendChild(this.el),document.body.classList.add("galaxy-overlayed"),this.el},n.prototype.open=function(){this.el.classList.add("md-show")},t.exports=n},{"./utils":3}],3:[function(e,t){function n(e,t){console[t||"log"]((window.performance.now()/1e3).toFixed(3)+": "+e)}function o(e){return n(e,"error")}function i(e){return n(e,"warn")}function r(e){"performance"in e||(e.performance={now:function(){return+new Date}}),"origin"in e.location&&(e.location.origin=e.location.protocol+"//"+e.location.host)}function c(){return window.location.pathname.indexOf(".html")?window.location.search.substr(1):window.location.pathname.substr(1)}function s(e){return-1!==h.indexOf(e.target.nodeName.toLowerCase())}function l(){return"ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch}function u(e){var t=document.createElement("link");t.href=e.href,t.media="all",t.rel="stylesheet",t.type="text/css",Object.keys(e||{}).forEach(function(n){t[n]=e[n]}),document.querySelector("head").appendChild(t)}function a(e){return e?e.replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):e}function d(){return!(document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement)}function m(){d()?(n("Entering full screen"),document.documentElement.requestFullscreen?document.documentElement.requestFullscreen():document.documentElement.mozRequestFullScreen?document.documentElement.mozRequestFullScreen():document.documentElement.webkitRequestFullscreen?document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT):document.documentElement.msRequestFullscreen&&document.documentElement.msRequestFullscreen()):(n("Exiting full screen"),document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.msExitFullscreen&&document.msExitFullscreen())}function f(){var e=screen.LockOrientation||screen.mozLockOrientation||screen.webkitLockOrientation||screen.msLockOrientation;return e?(e(orientation),void 0):i("Orientation could not be locked")}function p(e){var t=document.createEvent("HTMLEvents");t.initEvent(e,!0,!0),t.eventName=e,(document.body||window).dispatchEvent(t)}var h=["input","keygen","meter","option","output","progress","select","textarea"];t.exports.trace=n,t.exports.error=o,t.exports.warn=i,t.exports.polyfill=r,t.exports.getPeerId=c,t.exports.fieldFocused=s,t.exports.hasTouchEvents=l,t.exports.injectCSS=u,t.exports.escape=a,t.exports.isFullScreen=d,t.exports.toggleFullScreen=m,t.exports.lockOrientation=f,t.exports.triggerEvent=p},{}],4:[function(e,t){var n={};try{n=e("./settings_local.js")}catch(o){}var i={API_URL:"http://localhost:5000",DEBUG:!1,PEERJS_KEY:"",VERSION:"0.0.1"};for(var r in n)i[r]=n[r];t.exports=i},{"./settings_local.js":5}],5:[function(e,t){t.exports={DEBUG:!0,PEERJS_KEY:"rovu5xmqo69wwmi"}},{}]},{},[1])(1)}); \ No newline at end of file +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;"undefined"!=typeof window?t=window:"undefined"!=typeof global?t=global:"undefined"!=typeof self&&(t=self),t.gamepad=e()}}(function(){return function e(t,n,o){function i(s,c){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!c&&l)return l(s,!0);if(r)return r(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var a=n[s]={exports:{}};t[s][0].call(a.exports,function(e){var n=t[s][1][e];return i(n?n:e)},a,a.exports,e,t,n,o)}return n[s].exports}for(var r="function"==typeof require&&require,s=0;s'+l+'

Code

'+s+"

",d=new r({id:"pairing-screen",classes:"slim",title:"Pair your mobile phone",content:u},!0);n.setTimeout(function(){d.open()},150),["https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,700","/css/modal.css"].forEach(function(e){c.injectCSS({href:e})}),i.peerConnect(e).then(function(e){console.log("Peer connected"),d.close(),t(e)})}).catch(console.error.bind(console))})},i._updateState=function(e){Object.keys(e||{}).forEach(function(t){!this.state[t]&&e[t]?(i._emit("buttondown",t),i._emit("buttondown."+t,t)):this.state[t]&&!e[t]&&(i._emit("buttonup",t),i._emit("buttonup."+t,t))}.bind(this))},i.hidePairingScreen=function(){r.closeAll()},i._emit=function(e,t){(this.listeners[e]||[]).forEach(function(e){e.apply(e,[t])})},i._bind=function(e,t){return"undefined"==typeof this.listeners[event]&&(this.listeners[event]=[]),this.listeners[event].push(t),this},i.prototype.unbind=function(e,t){return"undefined"==typeof e?(this.listeners={},void 0):"undefined"==typeof t?(this.listeners[e]=[],void 0):"undefined"==typeof this.listeners[e]?!1:(this.listeners[e].forEach(function(n,o){return n===t?(this.listeners[e].splice(o,1),!0):void 0}),!1)},i.buttons={a:{clicked:i._bind}},i.version=s.VERSION;var a=n.location.origin,d=o.querySelector("[data-galaxy-origin]");d&&(i.galaxyOrigin=d.dataset.galaxyOrigin),t.exports=i}(window,document)},{"./lib/modal":2,"./lib/utils":3,"./settings":4}],2:[function(e,t){t.exports=function(t,n){"use strict";function o(e,t){Object.keys(e).forEach(function(t){this[t]=e[t]}.bind(this)),t&&this.inject()}var i=e("./utils");return o.closeAll=o.prototype.close=function(){var e=n.querySelector(".md-show");e&&e.classList.remove("md-show"),setTimeout(function(){n.body.classList.remove("galaxy-overlayed")},150)},o.injectOverlay=function(){if(!n.querySelector(".md-overlay")){var e=n.createElement("div");e.className="md-overlay",n.body.appendChild(e)}},o.prototype.html=function(){var e=n.createElement("div");return e.id="modal-"+this.id,e.className="md-modal md-effect-1 "+(this.classes||""),e.style.display="none",e.innerHTML='

'+i.escape(this.title)+'

Close
'+this.content+"
",e},o.prototype.inject=function(){return o.injectOverlay(),this.el=this.html(),this.el.style.display="block",n.body.appendChild(this.el),n.body.classList.add("galaxy-overlayed"),this.el},o.prototype.open=function(){this.el.classList.add("md-show")},o}},{"./utils":3}],3:[function(e,t){t.exports=function(e,t){"use strict";function n(t,n){console[n||"log"]((e.performance.now()/1e3).toFixed(3)+": "+t)}function o(e){return n(e,"error")}function i(e){return n(e,"warn")}function r(){"performance"in e||(e.performance={now:function(){return+new Date}}),"origin"in e.location&&(e.location.origin=e.location.protocol+"//"+e.location.host)}function s(){return e.location.pathname.indexOf(".html")?e.location.search.substr(1):e.location.pathname.substr(1)}function c(e){return-1!==h.indexOf(e.target.nodeName.toLowerCase())}function l(){return"ontouchstart"in e||e.DocumentTouch&&t instanceof e.DocumentTouch}function u(e){var n=t.createElement("link");n.href=e.href,n.media="all",n.rel="stylesheet",n.type="text/css",Object.keys(e||{}).forEach(function(t){n[t]=e[t]}),t.querySelector("head").appendChild(n)}function a(e){return e?e.replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):e}function d(){return!(t.fullscreenElement||t.mozFullScreenElement||t.webkitFullscreenElement||t.msFullscreenElement)}function f(){d()?(n("Entering full screen"),t.documentElement.requestFullscreen?t.documentElement.requestFullscreen():t.documentElement.mozRequestFullScreen?t.documentElement.mozRequestFullScreen():t.documentElement.webkitRequestFullscreen?t.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT):t.documentElement.msRequestFullscreen&&t.documentElement.msRequestFullscreen()):(n("Exiting full screen"),t.exitFullscreen?t.exitFullscreen():t.mozCancelFullScreen?t.mozCancelFullScreen():t.webkitExitFullscreen?t.webkitExitFullscreen():t.msExitFullscreen&&t.msExitFullscreen())}function p(t){var n=e.screen.LockOrientation||e.screen.mozLockOrientation||e.screen.webkitLockOrientation||e.screen.msLockOrientation;return n?n(t):i("Orientation could not be locked")}function m(n){var o=t.createEvent("HTMLEvents");o.initEvent(n,!0,!0),o.eventName=n,(t.body||e).dispatchEvent(o)}var h=["input","keygen","meter","option","output","progress","select","textarea"];return{trace:n,error:o,warn:i,polyfill:r,getPeerId:s,fieldFocused:c,hasTouchEvents:l,injectCSS:u,escape:a,isFullScreen:d,toggleFullScreen:f,lockOrientation:p,triggerEvent:m}}},{}],4:[function(e,t){"use strict";var n={};try{n=e("./settings_local.js")}catch(o){}var i={API_URL:"http://localhost:5000",DEBUG:!1,PEERJS_KEY:"",VERSION:"0.0.1"};Object.keys(n).forEach(function(e){i[e]=n[e]}),t.exports=i},{"./settings_local.js":5}],5:[function(e,t){t.exports={DEBUG:!0,PEERJS_KEY:"rovu5xmqo69wwmi"}},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/src/js/client.js b/src/js/client.js index e0711b1..05ab5df 100644 --- a/src/js/client.js +++ b/src/js/client.js @@ -9,7 +9,7 @@ var error = utils.error; var trace = utils.trace; -utils.polyfill(window); +utils.polyfill(); utils.lockOrientation('landscape-primary'); @@ -28,8 +28,8 @@ document.addEventListener('keyup', function (e) { trace('User pressed "F"; entering/exiting fullscreen'); return utils.toggleFullScreen(); case 78: // Pressing NF (really just N) should toggle full-screen mode. - trace('User pressed "NF"; exiting fullscreen and will not automatically ' + - 'open next time'); + trace('User pressed "NF"; exiting fullscreen and will not ' + + 'automatically open next time'); localStorage.disableAutoFullScreen = '1'; return utils.toggleFullScreen(); } @@ -51,7 +51,7 @@ document.addEventListener('click', function (e) { var peerId = utils.getPeerId(); -var peer = new Peer('controller_' + peerId, { +var peer = new window.Peer('controller_' + peerId, { key: settings.PEERJS_KEY, debug: settings.DEBUG ? 3 : 0 }); @@ -78,7 +78,8 @@ conn.on('open', function () { function send(msg) { if (settings.DEBUG) { - console.log('Sent: ' + (typeof msg === 'object' ? JSON.stringify(msg) : msg)); + console.log('Sent: ' + + (typeof msg === 'object' ? JSON.stringify(msg) : msg)); } conn.send(msg); } @@ -115,7 +116,8 @@ function angularShape(canvas, coords) { } function linearFill(shape, color1, color2, coords) { - var bg = shape.createLinearGradient(coords[0], coords[1], coords[2], coords[3]); + var bg = shape.createLinearGradient(coords[0], coords[1], coords[2], + coords[3]); bg.addColorStop(0, color1); bg.addColorStop(1, color2); shape.fillStyle = bg; @@ -186,15 +188,16 @@ var gamepadState = { function bindPress(button, eventName, isPressed) { - document.querySelector('#' + button).addEventListener(eventName, function (e) { - // Handle D-pad presses. - if (e.target && e.target.parentNode === dpad) { - dpad.classList.toggle(this.id); - } + document.querySelector('#' + button) + .addEventListener(eventName, function (e) { + // Handle D-pad presses. + if (e.target && e.target.parentNode === dpad) { + dpad.classList.toggle(this.id); + } - gamepadState[button] = isPressed; - send({type: 'state', data: gamepadState}); - }); + gamepadState[button] = isPressed; + send({type: 'state', data: gamepadState}); + }); } diff --git a/src/js/host.js b/src/js/host.js index 92a1922..57d6497 100644 --- a/src/js/host.js +++ b/src/js/host.js @@ -3,14 +3,14 @@ // var peer = require('./lib/peer'); // var Promise = require('./lib/promise-1.0.0.js'); // jshint ignore:line -var Modal = require('./lib/modal'); +var Modal = require('./lib/modal')(window, document); var settings = require('./settings'); -var utils = require('./lib/utils'); +var utils = require('./lib/utils')(window, document); var error = utils.error; var trace = utils.trace; -utils.polyfill(window); +utils.polyfill(); /** @@ -39,12 +39,12 @@ gamepad.state = {}; * @memberOf gamepad */ gamepad.peerHandshake = function (peerId) { - return new Promise(function (resolve, reject) { + return new Promise(function (resolve) { if (!peerId) { peerId = utils.getPeerId(); // The host ID. } - var peer = new Peer(peerId, { + var peer = new window.Peer(peerId, { key: settings.PEERJS_KEY, debug: settings.DEBUG ? 3 : 0 }); @@ -78,11 +78,13 @@ gamepad.peerConnect = function (peer) { gamepad._updateState(data.data); break; default: - console.warn('WebRTC message received of unknown type: "' + data.type + '"'); + console.warn( + 'WebRTC message received of unknown type: "' + data.type + '"'); break; } - trace('Received: ' + (typeof data === 'object' ? JSON.stringify(data) : '')); + trace('Received: ' + + (typeof data === 'object' ? JSON.stringify(data) : '')); }); conn.on('error', function (err) { @@ -109,16 +111,20 @@ gamepad.pair = function (peerId) { return new Promise(function (resolve) { return gamepad.peerHandshake(peerId).then(function (peer) { - var pairId = peer.id; // This should be the same as `peerId`, but this comes from PeerJS, which is the source of truth. + // `pairId` should be the same as `peerId`, + // but `peer.id` is the source of truth. + var pairId = peer.id; var pairIdEsc = encodeURIComponent(pairId); var pairUrl = galaxyOrigin + '/client.html?' + pairIdEsc; // Update the querystring in the address bar. - window.history.replaceState(null, null, window.location.pathname + '?' + pairIdEsc); + window.history.replaceState(null, null, + window.location.pathname + '?' + pairIdEsc); var content = ( '' ); @@ -219,7 +225,7 @@ gamepad._bind = function (eventName, listener) { * @param {Function} [listener] (Optional) The listener function to remove. * @return {Boolean} Was unbinding the listener successful. */ -Gamepad.prototype.unbind = function (eventName, listener) { +gamepad.prototype.unbind = function (eventName, listener) { // Remove everything for all event types. if (typeof eventName === 'undefined') { this.listeners = {}; diff --git a/src/js/lib/modal.js b/src/js/lib/modal.js index 533701c..a120ce3 100644 --- a/src/js/lib/modal.js +++ b/src/js/lib/modal.js @@ -1,3 +1,6 @@ +module.exports = function (window, document) { +'use strict'; + var utils = require('./utils'); @@ -65,4 +68,6 @@ Modal.prototype.open = function () { }; -module.exports = Modal; +return Modal; + +}; diff --git a/src/js/lib/utils.js b/src/js/lib/utils.js index c61df42..b64c783 100644 --- a/src/js/lib/utils.js +++ b/src/js/lib/utils.js @@ -1,5 +1,9 @@ +module.exports = function (window, document) { +'use strict'; + function trace(text, level) { - console[level || 'log']((window.performance.now() / 1000).toFixed(3) + ': ' + text); + console[level || 'log']( + (window.performance.now() / 1000).toFixed(3) + ': ' + text); } @@ -13,17 +17,18 @@ function warn(text) { } -function polyfill(win) { - if (!('performance' in win)) { - win.performance = { +function polyfill() { + if (!('performance' in window)) { + window.performance = { now: function () { return +new Date(); } }; } - if (('origin' in win.location)) { - win.location.origin = win.location.protocol + '//' + win.location.host; + if (('origin' in window.location)) { + window.location.origin = (window.location.protocol + '//' + + window.location.host); } } @@ -51,7 +56,7 @@ function fieldFocused(e) { function hasTouchEvents() { return ('ontouchstart' in window || - window.DocumentTouch && document instanceof DocumentTouch); + window.DocumentTouch && document instanceof window.DocumentTouch); } function injectCSS(opts) { @@ -92,7 +97,8 @@ function toggleFullScreen() { } else if (document.documentElement.mozRequestFullScreen) { document.documentElement.mozRequestFullScreen(); } else if (document.documentElement.webkitRequestFullscreen) { - document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); + document.documentElement.webkitRequestFullscreen( + Element.ALLOW_KEYBOARD_INPUT); } else if (document.documentElement.msRequestFullscreen) { document.documentElement.msRequestFullscreen(); } @@ -111,16 +117,16 @@ function toggleFullScreen() { } -function lockOrientation() { - var lo = (screen.LockOrientation || - screen.mozLockOrientation || - screen.webkitLockOrientation || - screen.msLockOrientation); +function lockOrientation(orientation) { + var lo = (window.screen.LockOrientation || + window.screen.mozLockOrientation || + window.screen.webkitLockOrientation || + window.screen.msLockOrientation); if (!lo) { return warn('Orientation could not be locked'); } - lo(orientation); + return lo(orientation); } @@ -132,16 +138,20 @@ function triggerEvent(type) { } -module.exports.trace = trace; -module.exports.error = error; -module.exports.warn = warn; -module.exports.polyfill = polyfill; -module.exports.getPeerId = getPeerId; -module.exports.fieldFocused = fieldFocused; -module.exports.hasTouchEvents = hasTouchEvents; -module.exports.injectCSS = injectCSS; -module.exports.escape = escape; -module.exports.isFullScreen = isFullScreen; -module.exports.toggleFullScreen = toggleFullScreen; -module.exports.lockOrientation = lockOrientation; -module.exports.triggerEvent = triggerEvent; +return { + trace: trace, + error: error, + warn: warn, + polyfill: polyfill, + getPeerId: getPeerId, + fieldFocused: fieldFocused, + hasTouchEvents: hasTouchEvents, + injectCSS: injectCSS, + escape: escape, + isFullScreen: isFullScreen, + toggleFullScreen: toggleFullScreen, + lockOrientation: lockOrientation, + triggerEvent: triggerEvent +}; + +}; diff --git a/src/js/settings.js b/src/js/settings.js index 07fc72e..f0a710b 100644 --- a/src/js/settings.js +++ b/src/js/settings.js @@ -1,18 +1,23 @@ +'use strict'; + var settings_local = {}; try { settings_local = require('./settings_local.js'); } catch (e) { } + var settings = { - API_URL: 'http://localhost:5000', // This URL to the Galaxy API. No trailing slash. + API_URL: 'http://localhost:5000', // Galaxy API URL. No trailing slash. DEBUG: false, PEERJS_KEY: '', // Sign up for a key at http://peerjs.com/peerserver VERSION: '0.0.1' // Version of the `gamepad.js` script }; -for (var key in settings_local) { - settings[key] = settings_local[key]; -} +// Override each default setting with user-defined setting. +Object.keys(settings_local).forEach(function (key) { + settings[key] = settings_local[key]; +}); + module.exports = settings;