From 7d08250f467d797535c31bc7e2d64bb4d96faabd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sat, 9 Sep 2017 19:18:34 +0200 Subject: [PATCH 01/54] Import canvas version from old ESPTerm repo branch canvas, 0caadb6f412855052e4a3276a8411cc36166ea4a --- fontello/fontello.zip | Bin 58847 -> 61088 bytes jssrc/soft_keyboard.js | 85 ++ jssrc/term_conn.js | 1 + jssrc/term_input.js | 2 + jssrc/term_screen.js | 1332 +++++++++++++++++------- jssrc/utils.js | 4 +- package-lock.json | 2189 ++++++++++++++++++++++++++++++++++++++++ package.json | 14 + packcss.sh | 5 + packjs.sh | 15 + pages/term.php | 27 +- sass/_fontello.scss | 6 +- sass/app.scss | 2 +- sass/pages/_term.scss | 53 +- yarn.lock | 1510 +++++++++++++++++++++++++++ 15 files changed, 4822 insertions(+), 423 deletions(-) create mode 100644 jssrc/soft_keyboard.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100755 packcss.sh create mode 100755 packjs.sh create mode 100644 yarn.lock diff --git a/fontello/fontello.zip b/fontello/fontello.zip index f0ff528a578922061f6e5bee31d985490b7cd971..65aa70d7525554a3cb858719d810dd17cfd8a618 100644 GIT binary patch delta 59123 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 delta 56831 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%0AWuW7(FnQhq@si;3hQw}I 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

`bps&c;OPn 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%0ALK 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 { + const input = qs('#softkb-input') + let keyboardOpen = false + + let updateInputPosition = function () { + if (!keyboardOpen) return + + let [x, y] = Screen.gridToScreen(Screen.cursor.x, Screen.cursor.y) + input.style.transform = `translate(${x}px, ${y}px)` + } + + input.addEventListener('focus', () => { + keyboardOpen = true + updateInputPosition() + }) + input.addEventListener('blur', () => (keyboardOpen = false)) + Screen.on('cursor-moved', updateInputPosition) + + window.kbOpen = function openSoftKeyboard (open) { + keyboardOpen = open + updateInputPosition() + if (open) input.focus() + else input.blur() + } + + let lastCompositionString = ''; + let compositing = false; + + let sendInputDelta = function (newValue) { + let resend = false; + if (newValue.length > lastCompositionString.length) { + if (newValue.startsWith(lastCompositionString)) { + // characters have been added at the end + Input.sendString(newValue.substr(lastCompositionString.length)) + } else resend = true; + } else if (newValue.length < lastCompositionString.length) { + if (lastCompositionString.startsWith(newValue)) { + // characters have been removed at the end + Input.sendString('\b'.repeat(lastCompositionString.length - + newValue.length)) + } else resend = true; + } else if (newValue !== lastCompositionString) resend = true; + + if (resend) { + // the entire string changed; resend everything + Input.sendString('\b'.repeat(lastCompositionString.length) + + newValue) + } + lastCompositionString = newValue; + } + + input.addEventListener('keydown', e => { + if (e.key === 'Unidentified') return; + + e.preventDefault(); + input.value = ''; + + if (e.key === 'Backspace') Input.sendString('\b') + else if (e.key === 'Enter') Input.sendString('\x0d') + }) + input.addEventListener('input', e => { + e.stopPropagation(); + + if (e.isComposing) { + sendInputDelta(e.data); + } else { + if (e.data) Input.sendString(e.data); + else if (e.inputType === 'deleteContentBackward') { + lastCompositionString + sendInputDelta(''); + } + } + }) + input.addEventListener('compositionstart', e => { + lastCompositionString = ''; + compositing = true; + }); + input.addEventListener('compositionend', e => { + lastCompositionString = ''; + compositing = false; + input.value = ''; + }); + + Screen.on('open-soft-keyboard', () => input.focus()) +}) diff --git a/jssrc/term_conn.js b/jssrc/term_conn.js index d9bbd57..7d32fa3 100644 --- a/jssrc/term_conn.js +++ b/jssrc/term_conn.js @@ -11,6 +11,7 @@ var Conn = (function () { function onOpen(evt) { console.log("CONNECTED"); + heartbeat(); doSend("i"); } diff --git a/jssrc/term_input.js b/jssrc/term_input.js index 2d4277f..6df0535 100644 --- a/jssrc/term_input.js +++ b/jssrc/term_input.js @@ -142,6 +142,8 @@ var Input = (function() { else if (evt.which) str = String.fromCodePoint(evt.which); if (str.length>0 && str.charCodeAt(0) >= 32) { // console.log("Typed ", str); + // prevent space from scrolling + if (e.which === 32) e.preventDefault(); sendStrMsg(str); } }); diff --git a/jssrc/term_screen.js b/jssrc/term_screen.js index a20a5c8..2bb56e1 100644 --- a/jssrc/term_screen.js +++ b/jssrc/term_screen.js @@ -1,378 +1,954 @@ -var Screen = (function () { - var W = 0, H = 0; // dimensions - var inited = false; - - var cursor = { - a: false, // active (blink state) - x: 0, // 0-based coordinates - y: 0, - fg: 7, // colors 0-15 - bg: 0, - attrs: 0, - suppress: false, // do not turn on in blink interval (for safe moving) - forceOn: false, // force on unless hanging: used to keep cursor visible during move - hidden: false, // do not show (DEC opt) - hanging: false, // cursor at column "W+1" - not visible - }; - - var screen = []; - var blinkIval; - var cursorFlashStartIval; - - // Some non-bold Fraktur symbols are outside the contiguous block - var frakturExceptions = { - 'C': '\u212d', - 'H': '\u210c', - 'I': '\u2111', - 'R': '\u211c', - 'Z': '\u2128', - }; - - // for BEL - var audioCtx = null; - try { - audioCtx = new (window.AudioContext || window.audioContext || window.webkitAudioContext)(); - } catch (er) { - console.error("No AudioContext!", er); - } - - /** Get cell under cursor */ - function _curCell() { - return screen[cursor.y*W + cursor.x]; - } - - /** Safely move cursor */ - function cursorSet(y, x) { - // Hide and prevent from showing up during the move - cursor.suppress = true; - _draw(_curCell(), false); - cursor.x = x; - cursor.y = y; - // Show again - cursor.suppress = false; - _draw(_curCell()); - } - - function alpha2fraktur(t) { - // perform substitution - if (t >= 'a' && t <= 'z') { - t = String.fromCodePoint(0x1d51e - 97 + t.charCodeAt(0)); - } - else if (t >= 'A' && t <= 'Z') { - // this set is incomplete, some exceptions are needed - if (frakturExceptions.hasOwnProperty(t)) { - t = frakturExceptions[t]; - } else { - t = String.fromCodePoint(0x1d504 - 65 + t.charCodeAt(0)); - } - } - return t; - } - - /** Update cell on display. inv = invert (for cursor) */ - function _draw(cell, inv) { - if (!cell) return; - if (typeof inv == 'undefined') { - inv = cursor.a && cursor.x == cell.x && cursor.y == cell.y; - } - - var fg, bg, cn, t; - - fg = inv ? cell.bg : cell.fg; - bg = inv ? cell.fg : cell.bg; - - t = cell.t; - if (!t.length) t = ' '; - - cn = 'fg' + fg + ' bg' + bg; - if (cell.attrs & (1<<0)) cn += ' bold'; - if (cell.attrs & (1<<1)) cn += ' faint'; - if (cell.attrs & (1<<2)) cn += ' italic'; - if (cell.attrs & (1<<3)) cn += ' under'; - if (cell.attrs & (1<<4)) cn += ' blink'; - if (cell.attrs & (1<<5)) { - cn += ' fraktur'; - t = alpha2fraktur(t); - } - if (cell.attrs & (1<<6)) cn += ' strike'; - - cell.slot.textContent = t; - cell.elem.className = cn; - } - - /** Show entire screen */ - function _drawAll() { - for (var i = W*H-1; i>=0; i--) { - _draw(screen[i]); - } - } - - function _rebuild(rows, cols) { - W = cols; - H = rows; - - /* Build screen & show */ - var cOuter, cInner, cell, screenDiv = qs('#screen'); - - // Empty the screen node - while (screenDiv.firstChild) screenDiv.removeChild(screenDiv.firstChild); - - screen = []; - - for(var i = 0; i < W*H; i++) { - cOuter = mk('span'); - cInner = mk('span'); - - /* Mouse tracking */ - (function() { - var x = i % W; - var y = Math.floor(i / W); - cOuter.addEventListener('mouseenter', function (evt) { - Input.onMouseMove(x, y); - }); - cOuter.addEventListener('mousedown', function (evt) { - Input.onMouseDown(x, y, evt.button+1); - }); - cOuter.addEventListener('mouseup', function (evt) { - Input.onMouseUp(x, y, evt.button+1); - }); - cOuter.addEventListener('contextmenu', function (evt) { - if (Input.mouseTracksClicks()) { - evt.preventDefault(); - } - }); - cOuter.addEventListener('mousewheel', function (evt) { - Input.onMouseWheel(x, y, evt.deltaY>0?1:-1); - return false; - }); - })(); - - /* End of line */ - if ((i > 0) && (i % W == 0)) { - screenDiv.appendChild(mk('br')); - } - /* The cell */ - cOuter.appendChild(cInner); - screenDiv.appendChild(cOuter); - - cell = { - t: ' ', - fg: 7, - bg: 0, // the colors will be replaced immediately as we receive data (user won't see this) - attrs: 0, - elem: cOuter, - slot: cInner, - x: i % W, - y: Math.floor(i / W), - }; - screen.push(cell); - _draw(cell); - } - } - - /** Init the terminal */ - function _init() { - /* Cursor blinking */ - clearInterval(blinkIval); - blinkIval = setInterval(function () { - cursor.a = !cursor.a; - if (cursor.hidden || cursor.hanging) { - cursor.a = false; - } - - if (!cursor.suppress) { - _draw(_curCell(), cursor.forceOn || cursor.a); - } - }, 500); - - /* blink attribute animation */ - setInterval(function () { - $('#screen').removeClass('blink-hide'); - setTimeout(function () { - $('#screen').addClass('blink-hide'); - }, 800); // 200 ms ON - }, 1000); - - inited = true; - } - - // constants for decoding the update blob - var SEQ_SET_COLOR_ATTR = 1; - var SEQ_REPEAT = 2; - var SEQ_SET_COLOR = 3; - var SEQ_SET_ATTR = 4; - - /** Parse received screen update object (leading S removed already) */ - function _load_content(str) { - var i = 0, ci = 0, j, jc, num, num2, t = ' ', fg, bg, attrs, cell; - - if (!inited) _init(); - - var cursorMoved; - - // Set size - num = parse2B(str, i); i += 2; // height - num2 = parse2B(str, i); i += 2; // width - if (num != H || num2 != W) { - _rebuild(num, num2); - } - // console.log("Size ",num, num2); - - // Cursor position - num = parse2B(str, i); i += 2; // row - num2 = parse2B(str, i); i += 2; // col - cursorMoved = (cursor.x != num2 || cursor.y != num); - cursorSet(num, num2); - // console.log("Cursor at ",num, num2); - - // Attributes - num = parse2B(str, i); i += 2; // fg bg attribs - cursor.hidden = !(num & (1<<0)); // DEC opt "visible" - cursor.hanging = !!(num & (1<<1)); - // console.log("Attributes word ",num.toString(16)+'h'); - - Input.setAlts( - !!(num & (1<<2)), // cursors alt - !!(num & (1<<3)), // numpad alt - !!(num & (1<<4)) // fn keys alt - ); - - var mt_click = !!(num & (1<<5)); - var mt_move = !!(num & (1<<6)); - Input.setMouseMode( - mt_click, - mt_move - ); - $('#screen').toggleClass('noselect', mt_move); - - var show_buttons = !!(num & (1<<7)); - var show_config_links = !!(num & (1<<8)); - $('.x-term-conf-btn').toggleClass('hidden', !show_config_links); - $('#action-buttons').toggleClass('hidden', !show_buttons); - - fg = 7; - bg = 0; - attrs = 0; - - // Here come the content - while(i < str.length && ci> 4; - attrs = (num & 0xFF00)>>8; - } - else if (jc == SEQ_SET_COLOR) { - num = parse2B(str, i); i += 2; - fg = num & 0x0F; - bg = (num & 0xF0) >> 4; - } - else if (jc == SEQ_SET_ATTR) { - num = parse2B(str, i); i += 2; - attrs = num & 0xFF; - } - else if (jc == SEQ_REPEAT) { - num = parse2B(str, i); i += 2; - // console.log("Repeat x ",num); - for (; num>0 && ci 0 ? e(s) : " "; - x.style.opacity = s.length > 0 ? 1 : 0.2; - }) - } - - /** Audible beep for ASCII 7 */ - function _beep() { - var osc, gain; - if (!audioCtx) return; - - // Main beep - osc = audioCtx.createOscillator(); - gain = audioCtx.createGain(); - osc.connect(gain); - gain.connect(audioCtx.destination); - gain.gain.value = 0.5; - osc.frequency.value = 750; - osc.type = 'sine'; - osc.start(); - osc.stop(audioCtx.currentTime+0.05); - - // Surrogate beep (making it sound like 'oops') - osc = audioCtx.createOscillator(); - gain = audioCtx.createGain(); - osc.connect(gain); - gain.connect(audioCtx.destination); - gain.gain.value = 0.2; - osc.frequency.value = 400; - osc.type = 'sine'; - osc.start(audioCtx.currentTime+0.05); - osc.stop(audioCtx.currentTime+0.08); - } - - /** Load screen content from a binary sequence (new) */ - function load(str) { - //console.log(JSON.stringify(str)); - var content = str.substr(1); - switch(str.charAt(0)) { - case 'S': - _load_content(content); - break; - case 'T': - _load_labels(content); - break; - case 'B': - _beep(); - break; - default: - console.warn("Bad data message type, ignoring."); - console.log(str); - } - } - - return { - load: load, // full load (string) - }; -})(); +// Some non-bold Fraktur symbols are outside the contiguous block +const frakturExceptions = { + 'C': '\u212d', + 'H': '\u210c', + 'I': '\u2111', + 'R': '\u211c', + 'Z': '\u2128' +}; + +// constants for decoding the update blob +const SEQ_SET_COLOR_ATTR = 1; +const SEQ_REPEAT = 2; +const SEQ_SET_COLOR = 3; +const SEQ_SET_ATTR = 4; + +const SELECTION_BG = '#b2d7fe'; +const SELECTION_FG = '#333'; + +const themes = [ + [ // Tango + '#111213', '#CC0000', '#4E9A06', '#C4A000', '#3465A4', '#75507B', '#06989A', '#D3D7CF', + '#555753', '#EF2929', '#8AE234', '#FCE94F', '#729FCF', '#AD7FA8', '#34E2E2', '#EEEEEC', + ], + [ // Linux + '#000000', '#aa0000', '#00aa00', '#aa5500', '#0000aa', '#aa00aa', '#00aaaa', '#aaaaaa', + '#555555', '#ff5555', '#55ff55', '#ffff55', '#5555ff', '#ff55ff', '#55ffff', '#ffffff', + ], + [ // xterm + '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', + '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff', + ], + [ // rxvt + '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000cd', '#cd00cd', '#00cdcd', '#faebd7', + '#404040', '#ff0000', '#00ff00', '#ffff00', '#0000ff', '#ff00ff', '#00ffff', '#ffffff', + ], + [ // Ambience + '#2e3436', '#cc0000', '#4e9a06', '#c4a000', '#3465a4', '#75507b', '#06989a', '#d3d7cf', + '#555753', '#ef2929', '#8ae234', '#fce94f', '#729fcf', '#ad7fa8', '#34e2e2', '#eeeeec', + ], + [ // Solarized + '#073642', '#dc322f', '#859900', '#b58900', '#268bd2', '#d33682', '#2aa198', '#eee8d5', + '#002b36', '#cb4b16', '#586e75', '#657b83', '#839496', '#6c71c4', '#93a1a1', '#fdf6e3', + ] +]; + +class TermScreen { + constructor () { + this.canvas = document.createElement('canvas'); + this.ctx = this.canvas.getContext('2d'); + + if ('AudioContext' in window || 'webkitAudioContext' in window) { + this.audioCtx = new (window.AudioContext || window.webkitAudioContext)() + } else { + console.warn('No AudioContext!') + } + + this.cursor = { + x: 0, + y: 0, + fg: 7, + bg: 0, + attrs: 0, + blinkOn: false, + visible: true, + hanging: false, + style: 'block', + blinkInterval: 0, + }; + + this._colors = themes[0]; + + this._window = { + width: 0, + height: 0, + devicePixelRatio: 1, + fontFamily: '"DejaVu Sans Mono", "Liberation Mono", "Inconsolata", "Menlo", monospace', + fontSize: 20, + gridScaleX: 1.0, + gridScaleY: 1.2, + blinkStyleOn: true, + blinkInterval: null, + fitIntoWidth: 0, + fitIntoHeight: 0, + }; + + // properties of this.window that require updating size and redrawing + this.windowState = { + width: 0, + height: 0, + devicePixelRatio: 0, + gridScaleX: 0, + gridScaleY: 0, + fontFamily: '', + fontSize: 0, + fitIntoWidth: 0, + fitIntoHeight: 0, + }; + + // current selection + this.selection = { + // when false, this will prevent selection in favor of mouse events, + // though alt can be held to override it + selectable: true, + + start: [0, 0], + end: [0, 0], + }; + + this.mouseMode = { clicks: false, movement: false }; + + // event listeners + this._listeners = {}; + + const self = this; + this.window = new Proxy(this._window, { + set (target, key, value, receiver) { + target[key] = value; + self.scheduleSizeUpdate(); + self.scheduleDraw(); + return true + } + }); + + this.screen = []; + this.screenFG = []; + this.screenBG = []; + this.screenAttrs = []; + + // used to determine if a cell should be redrawn + this.drawnScreen = []; + this.drawnScreenFG = []; + this.drawnScreenBG = []; + this.drawnScreenAttrs = []; + + this.resetBlink(); + this.resetCursorBlink(); + + let selecting = false; + let selectStart = (x, y) => { + if (selecting) return; + selecting = true; + this.selection.start = this.selection.end = this.screenToGrid(x, y); + this.scheduleDraw(); + }; + let selectMove = (x, y) => { + if (!selecting) return; + this.selection.end = this.screenToGrid(x, y); + this.scheduleDraw(); + }; + let selectEnd = (x, y) => { + if (!selecting) return; + selecting = false; + this.selection.end = this.screenToGrid(x, y); + this.scheduleDraw(); + Object.assign(this.selection, this.getNormalizedSelection()); + }; + + this.canvas.addEventListener('mousedown', e => { + if (this.selection.selectable || e.altKey) { + selectStart(e.offsetX, e.offsetY) + } else { + Input.onMouseDown(...this.screenToGrid(e.offsetX, e.offsetY), + e.button + 1) + } + }); + window.addEventListener('mousemove', e => { + selectMove(e.offsetX, e.offsetY) + }); + window.addEventListener('mouseup', e => { + selectEnd(e.offsetX, e.offsetY) + }); + + let touchPosition = null; + let touchDownTime = 0; + let touchSelectMinTime = 500; + let touchDidMove = false; + let getTouchPositionOffset = touch => { + let rect = this.canvas.getBoundingClientRect(); + return [touch.clientX - rect.left, touch.clientY - rect.top]; + }; + this.canvas.addEventListener('touchstart', e => { + touchPosition = getTouchPositionOffset(e.touches[0]); + touchDidMove = false; + touchDownTime = Date.now(); + }); + this.canvas.addEventListener('touchmove', e => { + touchPosition = getTouchPositionOffset(e.touches[0]); + + if (!selecting && touchDidMove === false) { + if (touchDownTime < Date.now() - touchSelectMinTime) { + selectStart(...touchPosition); + } + } else if (selecting) { + e.preventDefault(); + selectMove(...touchPosition); + } + + touchDidMove = true; + }); + this.canvas.addEventListener('touchend', e => { + if (e.touches[0]) { + touchPosition = getTouchPositionOffset(e.touches[0]); + } + if (selecting) { + e.preventDefault(); + selectEnd(...touchPosition); + + let touchSelectMenu = qs('#touch-select-menu') + touchSelectMenu.classList.add('open'); + let rect = touchSelectMenu.getBoundingClientRect() + + // use middle position for x and one line above for y + let selectionPos = this.gridToScreen( + (this.selection.start[0] + this.selection.end[0]) / 2, + this.selection.start[1] - 1 + ); + selectionPos[0] -= rect.width / 2 + selectionPos[1] -= rect.height / 2 + touchSelectMenu.style.transform = `translate(${selectionPos[0]}px, ${ + selectionPos[1]}px)` + } + + if (!touchDidMove) { + this.emit('tap', Object.assign(e, { + x: touchPosition[0], + y: touchPosition[1], + })) + } + + touchPosition = null; + }); + + this.on('tap', e => { + if (this.selection.start[0] !== this.selection.end[0] || + this.selection.start[1] !== this.selection.end[1]) { + // selection is not empty + // reset selection + this.selection.start = this.selection.end = [0, 0]; + qs('#touch-select-menu').classList.remove('open'); + this.scheduleDraw(); + } else { + e.preventDefault(); + this.emit('open-soft-keyboard'); + } + }) + + $.ready(() => { + let copyButton = qs('#touch-select-copy-btn') + copyButton.addEventListener('click', () => { + this.copySelectionToClipboard(); + }); + }); + + this.canvas.addEventListener('mousemove', e => { + if (!selecting) { + Input.onMouseMove(...this.screenToGrid(e.offsetX, e.offsetY)) + } + }); + this.canvas.addEventListener('mouseup', e => { + if (!selecting) { + Input.onMouseUp(...this.screenToGrid(e.offsetX, e.offsetY), + e.button + 1) + } + }); + this.canvas.addEventListener('wheel', e => { + if (this.mouseMode.clicks) { + Input.onMouseWheel(...this.screenToGrid(e.offsetX, e.offsetY), + e.deltaY > 0 ? 1 : -1); + + // prevent page scrolling + e.preventDefault(); + } + }); + this.canvas.addEventListener('contextmenu', e => { + // prevent mouse keys getting stuck + e.preventDefault(); + }) + + // bind ctrl+shift+c to copy + key('⌃+⇧+c', e => { + e.preventDefault(); + this.copySelectionToClipboard() + }); + } + + on (event, listener) { + if (!this._listeners[event]) this._listeners[event] = []; + this._listeners[event].push({ listener }); + } + + once (event, listener) { + if (!this._listeners[event]) this._listeners[event] = []; + this._listeners[event].push({ listener, once: true }); + } + + off (event, listener) { + let listeners = this._listeners[event]; + if (listeners) { + for (let i in listeners) { + if (listeners[i].listener === listener) { + listeners.splice(i, 1); + break; + } + } + } + } + + emit (event, ...args) { + let listeners = this._listeners[event]; + if (listeners) { + let remove = []; + for (let listener of listeners) { + try { + listener.listener(...args); + if (listener.once) remove.push(listener); + } catch (err) { + console.error(err); + } + } + + // this needs to be done in this roundabout way because for loops + // do not like arrays with changing lengths + for (let listener of remove) { + listeners.splice(listeners.indexOf(listener), 1); + } + } + } + + get colors () { return this._colors } + set colors (theme) { + this._colors = theme; + this.scheduleDraw(); + } + + getColor (i) { + if (i === -1) return SELECTION_FG + if (i === -2) return SELECTION_BG + return this.colors[i] + } + + // schedule a size update in the next tick + scheduleSizeUpdate () { + clearTimeout(this._scheduledSizeUpdate); + this._scheduledSizeUpdate = setTimeout(() => this.updateSize(), 1) + } + + // schedule a draw in the next tick + scheduleDraw (aggregateTime = 1) { + clearTimeout(this._scheduledDraw); + this._scheduledDraw = setTimeout(() => this.draw(), aggregateTime) + } + + getFont (modifiers = {}) { + let fontStyle = modifiers.style || 'normal'; + let fontWeight = modifiers.weight || 'normal'; + return `${fontStyle} normal ${fontWeight} ${this.window.fontSize}px ${this.window.fontFamily}` + } + + getCharSize () { + this.ctx.font = this.getFont(); + + return { + width: Math.floor(this.ctx.measureText(' ').width), + height: this.window.fontSize + } + } + + getCellSize () { + let charSize = this.getCharSize(); + + return { + width: Math.ceil(charSize.width * this.window.gridScaleX), + height: Math.ceil(charSize.height * this.window.gridScaleY) + } + } + + updateSize () { + this._window.devicePixelRatio = window.devicePixelRatio || 1; + + let didChange = false; + for (let key in this.windowState) { + if (this.windowState.hasOwnProperty(key) && this.windowState[key] !== this.window[key]) { + didChange = true; + this.windowState[key] = this.window[key]; + } + } + + if (didChange) { + const { + width, + height, + devicePixelRatio, + gridScaleX, + gridScaleY, + fitIntoWidth, + fitIntoHeight + } = this.window; + const cellSize = this.getCellSize(); + + // real height of the canvas element in pixels + let realWidth = width * cellSize.width + let realHeight = height * cellSize.height + + if (fitIntoWidth && fitIntoHeight) { + if (realWidth > fitIntoWidth || realHeight > fitIntoHeight) { + let terminalAspect = realWidth / realHeight + let fitAspect = fitIntoWidth / fitIntoHeight + + if (terminalAspect < fitAspect) { + // align heights + realHeight = fitIntoHeight + realWidth = realHeight * terminalAspect + } else { + // align widths + realWidth = fitIntoWidth + realHeight = realWidth / terminalAspect + } + } + } else if (fitIntoWidth && realWidth > fitIntoWidth) { + realHeight = fitIntoWidth / (realWidth / realHeight) + realWidth = fitIntoWidth + } else if (fitIntoHeight && realHeight > fitIntoHeight) { + realWidth = fitIntoHeight * (realWidth / realHeight) + realHeight = fitIntoHeight + } + + this.canvas.width = width * devicePixelRatio * cellSize.width; + this.canvas.style.width = `${realWidth}px`; + this.canvas.height = height * devicePixelRatio * cellSize.height; + this.canvas.style.height = `${realHeight}px`; + + // the screen has been cleared (by changing canvas width) + this.drawnScreen = []; + this.drawnScreenFG = []; + this.drawnScreenBG = []; + this.drawnScreenAttrs = []; + + // draw immediately; the canvas shouldn't flash + this.draw(); + } + } + + resetCursorBlink () { + this.cursor.blinkOn = true; + clearInterval(this.cursor.blinkInterval); + this.cursor.blinkInterval = setInterval(() => { + this.cursor.blinkOn = !this.cursor.blinkOn; + this.scheduleDraw(); + }, 500); + } + + resetBlink () { + this.window.blinkStyleOn = true; + clearInterval(this.window.blinkInterval); + let intervals = 0; + this.window.blinkInterval = setInterval(() => { + intervals++; + if (intervals >= 4 && this.window.blinkStyleOn) { + this.window.blinkStyleOn = false; + intervals = 0; + } else if (intervals >= 1 && !this.window.blinkStyleOn) { + this.window.blinkStyleOn = true; + intervals = 0; + } + }, 200); + } + + getNormalizedSelection () { + let { start, end } = this.selection; + // if the start line is after the end line, or if they're both on the same + // line but the start column comes after the end column, swap + if (start[1] > end[1] || (start[1] === end[1] && start[0] > end[0])) { + [start, end] = [end, start]; + } + return { start, end }; + } + + isInSelection (col, line) { + let { start, end } = this.getNormalizedSelection(); + let colAfterStart = start[0] <= col; + let colBeforeEnd = col < end[0]; + let onStartLine = line === start[1]; + let onEndLine = line === end[1]; + + if (onStartLine && onEndLine) return colAfterStart && colBeforeEnd; + else if (onStartLine) return colAfterStart; + else if (onEndLine) return colBeforeEnd; + else return start[1] < line && line < end[1]; + } + + getSelectedText () { + const screenLength = this.window.width * this.window.height; + let lines = []; + let previousLineIndex = -1; + + for (let cell = 0; cell < screenLength; cell++) { + let x = cell % this.window.width; + let y = Math.floor(cell / this.window.width); + + if (this.isInSelection(x, y)) { + if (previousLineIndex !== y) { + previousLineIndex = y; + lines.push(''); + } + lines[lines.length - 1] += this.screen[cell]; + } + } + + return lines.join('\n'); + } + + copySelectionToClipboard () { + let selectedText = this.getSelectedText(); + // don't copy anything if nothing is selected + if (!selectedText) return; + let textarea = document.createElement('textarea'); + document.body.appendChild(textarea); + textarea.value = selectedText; + textarea.select(); + if (document.execCommand('copy')) { + Notify.show('Copied to clipboard'); + } else { + Notify.show('Failed to copy'); + // unsuccessful copy + } + document.body.removeChild(textarea); + } + + screenToGrid (x, y) { + let cellSize = this.getCellSize(); + + return [ + Math.floor((x + cellSize.width / 2) / cellSize.width), + Math.floor(y / cellSize.height), + ]; + } + + gridToScreen (x, y) { + let cellSize = this.getCellSize(); + + return [ x * cellSize.width, y * cellSize.height ]; + } + + drawCell ({ x, y, charSize, cellWidth, cellHeight, text, fg, bg, attrs }) { + const ctx = this.ctx; + ctx.fillStyle = this.getColor(bg); + ctx.fillRect(x * cellWidth, y * cellHeight, + Math.ceil(cellWidth), Math.ceil(cellHeight)); + + if (!text) return; + + let underline = false; + let blink = false; + let strike = false; + if (attrs & 1 << 1) ctx.globalAlpha = 0.5; + if (attrs & 1 << 3) underline = true; + if (attrs & 1 << 4) blink = true; + if (attrs & 1 << 5) text = TermScreen.alphaToFraktur(text); + if (attrs & 1 << 6) strike = true; + + if (!blink || this.window.blinkStyleOn) { + ctx.fillStyle = this.getColor(fg); + ctx.fillText(text, (x + 0.5) * cellWidth, (y + 0.5) * cellHeight); + + if (underline || strike) { + ctx.strokeStyle = this.getColor(fg); + ctx.lineWidth = 1; + ctx.lineCap = 'round'; + ctx.beginPath(); + + if (underline) { + let lineY = Math.round(y * cellHeight + charSize.height) + 0.5; + ctx.moveTo(x * cellWidth, lineY); + ctx.lineTo((x + 1) * cellWidth, lineY); + } + + if (strike) { + let lineY = Math.round((y + 0.5) * cellHeight) + 0.5; + ctx.moveTo(x * cellWidth, lineY); + ctx.lineTo((x + 1) * cellWidth, lineY); + } + + ctx.stroke(); + } + } + + ctx.globalAlpha = 1; + } + + draw () { + const ctx = this.ctx; + const { + width, + height, + devicePixelRatio, + gridScaleX, + gridScaleY + } = this.window; + + const charSize = this.getCharSize(); + const { width: cellWidth, height: cellHeight } = this.getCellSize(); + const screenWidth = width * cellWidth; + const screenHeight = height * cellHeight; + const screenLength = width * height; + + ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0); + + ctx.font = this.getFont(); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + // bits in the attr value that affect the font + const FONT_MASK = 0b101; + + // Map of (attrs & FONT_MASK) -> Array of cell indices + const fontGroups = new Map(); + + // Map of (cell index) -> boolean, whether or not a cell needs to be redrawn + const updateMap = new Map(); + + for (let cell = 0; cell < screenLength; cell++) { + let x = cell % width; + let y = Math.floor(cell / width); + let isCursor = this.cursor.x === x && this.cursor.y === y && + !this.cursor.hanging; + let invertForCursor = isCursor && this.cursor.blinkOn && + this.cursor.style === 'block'; + let inSelection = this.isInSelection(x, y) + + let text = this.screen[cell]; + let fg = invertForCursor ? this.screenBG[cell] : this.screenFG[cell]; + let bg = invertForCursor ? this.screenFG[cell] : this.screenBG[cell]; + let attrs = this.screenAttrs[cell]; + + // HACK: ensure cursor is visible + if (invertForCursor && fg === bg) bg = fg === 0 ? 7 : 0; + + if (inSelection) { + fg = -1 + bg = -2 + } + + let cellDidChange = text !== this.drawnScreen[cell] || + fg !== this.drawnScreenFG[cell] || + bg !== this.drawnScreenBG[cell] || + attrs !== this.drawnScreenAttrs[cell]; + + let font = attrs & FONT_MASK; + if (!fontGroups.has(font)) fontGroups.set(font, []); + + fontGroups.get(font).push([cell, x, y, text, fg, bg, attrs, isCursor]); + updateMap.set(cell, cellDidChange); + } + + for (let font of fontGroups.keys()) { + // set font once because in Firefox, this is a really slow action for some + // reason + let modifiers = {}; + if (font & 1) modifiers.weight = 'bold'; + if (font & 1 << 2) modifiers.style = 'italic'; + ctx.font = this.getFont(modifiers); + + for (let data of fontGroups.get(font)) { + let [cell, x, y, text, fg, bg, attrs, isCursor] = data; + + // check if this cell or any adjacent cells updated + let needsUpdate = false; + let updateCells = [ + cell, + cell - 1, + cell + 1, + cell - width, + cell + width, + // diagonal box drawing characters exist, too + cell - width - 1, + cell - width + 1, + cell + width - 1, + cell + width + 1 + ]; + for (let index of updateCells) { + if (updateMap.has(index) && updateMap.get(index)) { + needsUpdate = true; + break; + } + } + + if (needsUpdate) { + this.drawCell({ + x, y, charSize, cellWidth, cellHeight, text, fg, bg, attrs + }); + + this.drawnScreen[cell] = text; + this.drawnScreenFG[cell] = fg; + this.drawnScreenBG[cell] = bg; + this.drawnScreenAttrs[cell] = attrs; + } + + if (isCursor && this.cursor.blinkOn && this.cursor.style !== 'block') { + ctx.save(); + ctx.beginPath(); + if (this.cursor.style === 'bar') { + // vertical bar + let barWidth = 2; + ctx.rect(x * cellWidth, y * cellHeight, barWidth, cellHeight) + } else if (this.cursor.style === 'line') { + // underline + let lineHeight = 2; + ctx.rect(x * cellWidth, y * cellHeight + charSize.height, + cellWidth, lineHeight) + } + ctx.clip(); + + // swap foreground/background + fg = this.screenBG[cell]; + bg = this.screenFG[cell]; + // HACK: ensure cursor is visible + if (fg === bg) bg = fg === 0 ? 7 : 0; + + this.drawCell({ + x, y, charSize, cellWidth, cellHeight, text, fg, bg, attrs + }); + ctx.restore(); + } + } + } + } + + loadContent (str) { + // current index + let i = 0; + + // window size + this.window.height = parse2B(str, i); + this.window.width = parse2B(str, i + 2); + this.updateSize(); + i += 4; + + // cursor position + let [cursorY, cursorX] = [parse2B(str, i), parse2B(str, i + 2)]; + i += 4; + let cursorMoved = (cursorX !== this.cursor.x || cursorY !== this.cursor.y); + this.cursor.x = cursorX; + this.cursor.y = cursorY; + + if (cursorMoved) { + this.resetCursorBlink(); + this.emit('cursor-moved'); + } + + // attributes + let attributes = parse2B(str, i); + i += 2; + + this.cursor.visible = !!(attributes & 1); + this.cursor.hanging = !!(attributes & 1 << 1); + + Input.setAlts( + !!(attributes & 1 << 2), // cursors alt + !!(attributes & 1 << 3), // numpad alt + !!(attributes & 1 << 4) // fn keys alt + ); + + let trackMouseClicks = !!(attributes & 1 << 5); + let trackMouseMovement = !!(attributes & 1 << 6); + + Input.setMouseMode(trackMouseClicks, trackMouseMovement); + this.selection.selectable = !trackMouseMovement; + $(this.canvas).toggleClass('selectable', !trackMouseMovement); + this.mouseMode = { + clicks: trackMouseClicks, + movement: trackMouseMovement + }; + + let showButtons = !!(attributes & 1 << 7); + let showConfigLinks = !!(attributes & 1 << 8); + + $('.x-term-conf-btn').toggleClass('hidden', !showConfigLinks); + $('#action-buttons').toggleClass('hidden', !showButtons); + + // content + let fg = 7; + let bg = 0; + let attrs = 0; + let cell = 0; // cell index + let lastChar = ' '; + let screenLength = this.window.width * this.window.height; + + this.screen = new Array(screenLength).fill(' '); + this.screenFG = new Array(screenLength).fill(' '); + this.screenBG = new Array(screenLength).fill(' '); + this.screenAttrs = new Array(screenLength).fill(' '); + + let strArray = typeof Array.from !== 'undefined' + ? Array.from(str) + : str.split(''); + + while (i < strArray.length && cell < screenLength) { + let character = strArray[i++]; + let charCode = character.codePointAt(0); + + let data; + switch (charCode) { + case SEQ_SET_COLOR_ATTR: + data = parse3B(strArray[i] + strArray[i + 1] + strArray[i + 2]); + i += 3; + fg = data & 0xF; + bg = data >> 4 & 0xF; + attrs = data >> 8 & 0xFF; + break; + + case SEQ_SET_COLOR: + data = parse2B(strArray[i] + strArray[i + 1]); + i += 2; + fg = data & 0xF; + bg = data >> 4 & 0xF; + break; + + case SEQ_SET_ATTR: + data = parse2B(strArray[i] + strArray[i + 1]); + i += 2; + attrs = data & 0xFF; + break; + + case SEQ_REPEAT: + let count = parse2B(strArray[i] + strArray[i + 1]); + i += 2; + for (let j = 0; j < count; j++) { + this.screen[cell] = lastChar; + this.screenFG[cell] = fg; + this.screenBG[cell] = bg; + this.screenAttrs[cell] = attrs; + + if (++cell > screenLength) break; + } + break; + + default: + // safety replacement + if (charCode < 32) character = '\ufffd'; + // unique cell character + this.screen[cell] = lastChar = character; + this.screenFG[cell] = fg; + this.screenBG[cell] = bg; + this.screenAttrs[cell] = attrs; + cell++; + } + } + + this.scheduleDraw(16); + this.emit('load'); + } + + /** Apply labels to buttons and screen title (leading T removed already) */ + loadLabels (str) { + let pieces = str.split('\x01'); + qs('h1').textContent = pieces[0]; + $('#action-buttons button').forEach((button, i) => { + let label = pieces[i + 1].trim(); + // if empty string, use the "dim" effect and put nbsp instead to + // stretch the button vertically + button.innerHTML = label ? e(label) : ' '; + button.style.opacity = label ? 1 : 0.2; + }) + } + + load (str) { + const content = str.substr(1); + + switch (str[0]) { + case 'S': + this.loadContent(content); + break; + case 'T': + this.loadLabels(content); + break; + case 'B': + this.beep(); + break; + default: + console.warn(`Bad data message type; ignoring.\n${JSON.stringify(content)}`) + } + } + + beep () { + const audioCtx = this.audioCtx; + if (!audioCtx) return; + + let osc, gain; + + // main beep + osc = audioCtx.createOscillator(); + gain = audioCtx.createGain(); + osc.connect(gain); + gain.connect(audioCtx.destination); + gain.gain.value = 0.5; + osc.frequency.value = 750; + osc.type = 'sine'; + osc.start(); + osc.stop(audioCtx.currentTime + 0.05); + + // surrogate beep (making it sound like 'oops') + osc = audioCtx.createOscillator(); + gain = audioCtx.createGain(); + osc.connect(gain); + gain.connect(audioCtx.destination); + gain.gain.value = 0.2; + osc.frequency.value = 400; + osc.type = 'sine'; + osc.start(audioCtx.currentTime + 0.05); + osc.stop(audioCtx.currentTime + 0.08); + } + + static alphaToFraktur (character) { + if ('a' <= character && character <= 'z') { + character = String.fromCodePoint(0x1d51e - 0x61 + character.charCodeAt(0)) + } else if ('A' <= character && character <= 'Z') { + character = frakturExceptions[character] || String.fromCodePoint( + 0x1d504 - 0x41 + character.charCodeAt(0)) + } + return character + } +} + +const Screen = new TermScreen(); + +Screen.once('load', () => { + qs('#screen').appendChild(Screen.canvas); + for (let item of qs('#screen').classList) { + if (item.startsWith('theme-')) { + Screen.colors = themes[item.substr(6)] + } + } +}); + +let fitScreen = false +function fitScreenIfNeeded () { + Screen.window.fitIntoWidth = fitScreen ? window.innerWidth : 0 + Screen.window.fitIntoHeight = fitScreen ? window.innerHeight : 0 +} +fitScreenIfNeeded(); +window.addEventListener('resize', fitScreenIfNeeded) + +window.toggleFitScreen = function () { + fitScreen = !fitScreen; + const resizeButtonIcon = qs('#resize-button-icon') + if (fitScreen) { + resizeButtonIcon.classList.remove('icn-resize-small') + resizeButtonIcon.classList.add('icn-resize-full') + } else { + resizeButtonIcon.classList.remove('icn-resize-full') + resizeButtonIcon.classList.add('icn-resize-small') + } + fitScreenIfNeeded(); +} diff --git a/jssrc/utils.js b/jssrc/utils.js index d95c86c..3bb5574 100755 --- a/jssrc/utils.js +++ b/jssrc/utils.js @@ -128,12 +128,12 @@ function Chr(n) { } /** Decode number from 2B encoding */ -function parse2B(s, i) { +function parse2B(s, i=0) { return (s.charCodeAt(i++) - 1) + (s.charCodeAt(i) - 1) * 127; } /** Decode number from 3B encoding */ -function parse3B(s, i) { +function parse3B(s, i=0) { return (s.charCodeAt(i) - 1) + (s.charCodeAt(i+1) - 1) * 127 + (s.charCodeAt(i+2) - 1) * 127 * 127; } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..67d3093 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2189 @@ +{ + "name": "html_orig", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "dev": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "aproba": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz", + "integrity": "sha512-ZpYajIfO0j2cOFTO955KUMIKNmj6zhX8kVztMAxFsDaMwz+9Z9SV0uou2pC9HJqcfpffOsjnbrDMvkNy+9RXPw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.0", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.0", + "debug": "2.6.8", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.7", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-helper-evaluate-path": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.2.0.tgz", + "integrity": "sha512-0EK9TUKMxHL549hWDPkQoS7R0Ozg1CDLheVBHYds2B2qoAvmr9ejY3zOXFsrICK73TN7bPhU14PBeKc8jcBTwg==", + "dev": true + }, + "babel-helper-flip-expressions": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.2.0.tgz", + "integrity": "sha512-rAsPA1pWBc7e2E6HepkP2e1sXugT+Oq/VCqhyuHJ8aJ2d/ifwnJfd4Qxjm21qlW43AN8tqaeByagKK6wECFMSw==", + "dev": true + }, + "babel-helper-is-nodes-equiv": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", + "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=", + "dev": true + }, + "babel-helper-is-void-0": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.2.0.tgz", + "integrity": "sha512-Axj1AYuD0E3Dl7nT3KxROP7VekEofz3XtEljzURf3fABalLpr8PamtgLFt+zuxtaCxRf9iuZmbAMMYWri5Bazw==", + "dev": true + }, + "babel-helper-mark-eval-scopes": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.2.0.tgz", + "integrity": "sha512-KJuwrOUcHbvbh6he4xRXZFLaivK9DF9o3CrvpWnK1Wp0B+1ANYABXBMgwrnNFIDK/AvicxQ9CNr8wsgivlp4Aw==", + "dev": true + }, + "babel-helper-remove-or-void": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.2.0.tgz", + "integrity": "sha512-1Z41upf/XR+PwY7Nd+F15Jo5BiQi5205ZXUuKed3yoyQgDkMyoM7vAdjEJS/T+M6jy32sXjskMUgms4zeiVtRA==", + "dev": true + }, + "babel-helper-to-multiple-sequence-expressions": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.2.0.tgz", + "integrity": "sha512-ij9lpfdP3+Zc/7kNwa+NXbTrUlsYEWPwt/ugmQO0qflzLrveTIkbfOqQztvitk81aG5NblYDQXDlRohzu3oa8Q==", + "dev": true + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-minify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-minify/-/babel-minify-0.2.0.tgz", + "integrity": "sha512-4IrZciOMJ3Vj/EHb1hSqEFj03alx0HbwkQUu0LXf6dEP9bx0AcwPL2eSi1L1I2FDhvpDuo/7lbJPvK73M2VdJw==", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-preset-minify": "0.2.0", + "fs-readdir-recursive": "1.0.0", + "mkdirp": "0.5.1", + "util.promisify": "1.0.0", + "yargs-parser": "5.0.0" + } + }, + "babel-plugin-minify-builtins": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.2.0.tgz", + "integrity": "sha512-4i+8ntaS8gwVUcOz5y+zE+55OVOl2nTbmHV51D4wAIiKcRI8U5K//ip1GHfhsgk/NJrrHK7h97Oy5jpqt0Iixg==", + "dev": true, + "requires": { + "babel-helper-evaluate-path": "0.2.0" + } + }, + "babel-plugin-minify-constant-folding": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.2.0.tgz", + "integrity": "sha512-B3ffQBEUQ8ydlIkYv2MkZtTCbV7FAkWAV7NkyhcXlGpD10PaCxNGQ/B9oguXGowR1m16Q5nGhvNn8Pkn1MO6Hw==", + "dev": true, + "requires": { + "babel-helper-evaluate-path": "0.2.0" + } + }, + "babel-plugin-minify-dead-code-elimination": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.2.0.tgz", + "integrity": "sha512-zE7y3pRyzA4zK5nBou0kTcwUTSQ/AiFrynt1cIEYN7vcO2gS9ZFZoI0aO9JYLUdct5fsC1vfB35408yrzTyVfg==", + "dev": true, + "requires": { + "babel-helper-evaluate-path": "0.2.0", + "babel-helper-mark-eval-scopes": "0.2.0", + "babel-helper-remove-or-void": "0.2.0", + "lodash.some": "4.6.0" + } + }, + "babel-plugin-minify-flip-comparisons": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.2.0.tgz", + "integrity": "sha512-QOqXSEmD/LhT3LpM1WCyzAGcQZYYKJF7oOHvS6QbpomHenydrV53DMdPX2mK01icBExKZcJAHF209wvDBa+CSg==", + "dev": true, + "requires": { + "babel-helper-is-void-0": "0.2.0" + } + }, + "babel-plugin-minify-guarded-expressions": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.2.0.tgz", + "integrity": "sha512-5+NSPdRQ9mnrHaA+zFj+D5OzmSiv90EX5zGH6cWQgR/OUqmCHSDqgTRPFvOctgpo8MJyO7Rt7ajs2UfLnlAwYg==", + "dev": true, + "requires": { + "babel-helper-flip-expressions": "0.2.0" + } + }, + "babel-plugin-minify-infinity": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.2.0.tgz", + "integrity": "sha512-U694vrla1lN6vDHWGrR832t3a/A2eh+kyl019LxEE2+sS4VTydyOPRsAOIYAdJegWRA4cMX1lm9azAN0cLIr8g==", + "dev": true + }, + "babel-plugin-minify-mangle-names": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.2.0.tgz", + "integrity": "sha512-Gixuak1/CO7VCdjn15/8Bxe/QsAtDG4zPbnsNoe1mIJGCIH/kcmSjFhMlGJtXDQZd6EKzeMfA5WmX9+jvGRefw==", + "dev": true, + "requires": { + "babel-helper-mark-eval-scopes": "0.2.0" + } + }, + "babel-plugin-minify-numeric-literals": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.2.0.tgz", + "integrity": "sha512-VcLpb+r1YS7+RIOXdRsFVLLqoh22177USpHf+JM/g1nZbzdqENmfd5v534MLAbRErhbz6SyK+NQViVzVtBxu8g==", + "dev": true + }, + "babel-plugin-minify-replace": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.2.0.tgz", + "integrity": "sha512-SEW6zoSVxh3OH6E1LCgyhhTWMnCv+JIRu5h5IlJDA11tU4ZeSF7uPQcO4vN/o52+FssRB26dmzJ/8D+z0QPg5Q==", + "dev": true + }, + "babel-plugin-minify-simplify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.2.0.tgz", + "integrity": "sha512-Mj3Mwy2zVosMfXDWXZrQH5/uMAyfJdmDQ1NVqit+ArbHC3LlXVzptuyC1JxTyai/wgFvjLaichm/7vSUshkWqw==", + "dev": true, + "requires": { + "babel-helper-flip-expressions": "0.2.0", + "babel-helper-is-nodes-equiv": "0.0.1", + "babel-helper-to-multiple-sequence-expressions": "0.2.0" + } + }, + "babel-plugin-minify-type-constructors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.2.0.tgz", + "integrity": "sha512-NiOvvA9Pq6bki6nP4BayXwT5GZadw7DJFDDzHmkpnOQpENWe8RtHtKZM44MG1R6EQ5XxgbLdsdhswIzTkFlO5g==", + "dev": true, + "requires": { + "babel-helper-is-void-0": "0.2.0" + } + }, + "babel-plugin-transform-inline-consecutive-adds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.2.0.tgz", + "integrity": "sha512-GlhOuLOQ28ua9prg0hT33HslCrEmz9xWXy9ZNZSACppCyRxxRW+haYtRgm7uYXCcd0q8ggCWD2pfWEJp5iiZfQ==", + "dev": true + }, + "babel-plugin-transform-member-expression-literals": { + "version": "6.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.5.tgz", + "integrity": "sha512-Ux3ligf+ukzWaCbBYOstDuFBhRgMiJHlpJBKV4P47qtzVkd0lg1ddPj9fqIJqAM0n+CvxipyrZrnNnw3CdtQCg==", + "dev": true + }, + "babel-plugin-transform-merge-sibling-variables": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.6.tgz", + "integrity": "sha512-o5Jioq553HtEAUN5uty7ELJMenXIxHI3PIs1yLqYWYQwP6mg6IPVAJ+U7i4zr9XGF/kb2RGsdehglGTV+vngqA==", + "dev": true + }, + "babel-plugin-transform-minify-booleans": { + "version": "6.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.3.tgz", + "integrity": "sha512-bPbUhkeN2Nc0KH0/A19GwQGj8w+CvdJzyu8t59VoEDgsNMQ9Bopzi5DrVkrSsVjbYUaZpzq/DYLrH+wD5K2Tig==", + "dev": true + }, + "babel-plugin-transform-property-literals": { + "version": "6.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.5.tgz", + "integrity": "sha512-MmiQsQ5AcIaRZMJD0zY5C4H3xuHm06/nWgtOsz7AXV44VEIXIlPiJ39IFYJ4Qx67/fEm8zJAedzR8t+B7d10Bg==", + "dev": true, + "requires": { + "esutils": "2.0.2" + } + }, + "babel-plugin-transform-regexp-constructors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.2.0.tgz", + "integrity": "sha512-7IsQ6aQx6LAaOqy97/PthTf+5Nx9grZww3r6E62IdWe76Yr8KsuwVjxzqSPQvESJqTE3EMADQ9S0RtwWDGNG9Q==", + "dev": true + }, + "babel-plugin-transform-remove-console": { + "version": "6.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.5.tgz", + "integrity": "sha512-uuCKvtweCyIvvC8fi92EcWRtO2Kt5KMNMRK6BhpDXdeb3sxvGM7453RSmgeu4DlKns3OlvY9Ep5Q9m5a7RQAgg==", + "dev": true + }, + "babel-plugin-transform-remove-debugger": { + "version": "6.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.5.tgz", + "integrity": "sha512-InDQDdHPOLJKM+G6oXrEesf+P29QFBmcTXID+TAvZziVz+38xe2VO/Bn3FcRcRtnOOycbgsJkUNp9jIK+ist6g==", + "dev": true + }, + "babel-plugin-transform-remove-undefined": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.2.0.tgz", + "integrity": "sha512-O8v57tPMHkp89kA4ZfQEYds/pzgvz/QYerBJjIuL5/Jc7RnvMVRA5gJY9zFKP7WayW8WOSBV4vh8Y8FJRio+ow==", + "dev": true, + "requires": { + "babel-helper-evaluate-path": "0.2.0" + } + }, + "babel-plugin-transform-simplify-comparison-operators": { + "version": "6.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.5.tgz", + "integrity": "sha512-B3HlBZb+Uq86nRj5yNPO6pJ3noEdqHvzYkEYoUWtrsWTv48ZIRatYlumoOiif/v8llF13YjYjx9zhyznDx+N9g==", + "dev": true + }, + "babel-plugin-transform-undefined-to-void": { + "version": "6.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.3.tgz", + "integrity": "sha512-goYwp8dMrzHD6x9GjZ2M85Mk2vxf1h85CnUgAjfftUnlJvzF4uj5MrbReHBTbjQ96C8CuRzvhYZ3tv8H3Sc1ZA==", + "dev": true + }, + "babel-preset-minify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz", + "integrity": "sha512-mR8Q44RmMzm18bM2Lqd9uiPopzk5GDCtVuquNbLFmX6lOKnqWoenaNBxnWW0UhBFC75lEHTIgNGCbnsRI0pJVw==", + "dev": true, + "requires": { + "babel-plugin-minify-builtins": "0.2.0", + "babel-plugin-minify-constant-folding": "0.2.0", + "babel-plugin-minify-dead-code-elimination": "0.2.0", + "babel-plugin-minify-flip-comparisons": "0.2.0", + "babel-plugin-minify-guarded-expressions": "0.2.0", + "babel-plugin-minify-infinity": "0.2.0", + "babel-plugin-minify-mangle-names": "0.2.0", + "babel-plugin-minify-numeric-literals": "0.2.0", + "babel-plugin-minify-replace": "0.2.0", + "babel-plugin-minify-simplify": "0.2.0", + "babel-plugin-minify-type-constructors": "0.2.0", + "babel-plugin-transform-inline-consecutive-adds": "0.2.0", + "babel-plugin-transform-member-expression-literals": "6.8.5", + "babel-plugin-transform-merge-sibling-variables": "6.8.6", + "babel-plugin-transform-minify-booleans": "6.8.3", + "babel-plugin-transform-property-literals": "6.8.5", + "babel-plugin-transform-regexp-constructors": "0.2.0", + "babel-plugin-transform-remove-console": "6.8.5", + "babel-plugin-transform-remove-debugger": "6.8.5", + "babel-plugin-transform-remove-undefined": "0.2.0", + "babel-plugin-transform-simplify-comparison-operators": "6.8.5", + "babel-plugin-transform-undefined-to-void": "6.8.3", + "lodash.isplainobject": "4.0.6" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.17" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.8", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.8.2.tgz", + "integrity": "sha512-dvhwFL3yjQxNNsOWx6exMlaDrRHCRGMQlnx5lsXDCZ/J7G/frgIIl94zhZSp/galVAYp7VzPi1OrAHta89/yGQ==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "fs-readdir-recursive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", + "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "1.1.2", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "dev": true, + "requires": { + "globule": "1.2.0" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "dev": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.4", + "minimatch": "3.0.4" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-base64": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", + "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", + "dev": true + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", + "dev": true + }, + "node-gyp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", + "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "dev": true, + "requires": { + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.4", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "node-sass": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.3.tgz", + "integrity": "sha1-0JydEXlkEjnRuX/8YjH9zsU+FWg=", + "dev": true, + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.2", + "get-stdin": "4.0.1", + "glob": "7.1.2", + "in-publish": "2.0.0", + "lodash.assign": "4.2.0", + "lodash.clonedeep": "4.5.0", + "lodash.mergewith": "4.6.0", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.7.0", + "node-gyp": "3.6.2", + "npmlog": "4.1.2", + "request": "2.81.0", + "sass-graph": "2.2.4", + "stdout-stream": "1.4.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.1.0" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.8.2" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "private": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.4", + "scss-tokenizer": "0.2.3", + "yargs": "7.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "2.1.9", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.17.tgz", + "integrity": "sha512-30c1Ch8FSjV0FwC253iftbbj0dU/OXoSg1LAEGZJUlGgjTNj6cu+DVqJWWIZJY5RXLWV4eFtR+4ouo0VIOYOTg==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stdout-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", + "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "object.getownpropertydescriptors": "2.0.3" + } + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0d2916a --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "html_orig", + "version": "1.0.0", + "description": "ESPTerm HTML", + "license": "UNLICENSED", + "devDependencies": { + "babel-minify": "^0.2.0", + "node-sass": "^4.5.3" + }, + "scripts": { + "minify": "babel-minify $@", + "sass": "node-sass $@" + } +} diff --git a/packcss.sh b/packcss.sh new file mode 100755 index 0000000..c166465 --- /dev/null +++ b/packcss.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +echo "Building css..." + +npm run sass -- --output-style compressed sass/app.scss > css/app.css diff --git a/packjs.sh b/packjs.sh new file mode 100755 index 0000000..737eb63 --- /dev/null +++ b/packjs.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +echo "Packing js..." + +cat jssrc/chibi.js \ + jssrc/keymaster.js \ + jssrc/utils.js \ + jssrc/modal.js \ + jssrc/notif.js \ + jssrc/appcommon.js \ + jssrc/lang.js \ + jssrc/wifi.js \ + jssrc/term_* \ + jssrc/term.js \ + jssrc/soft_keyboard.js | npm run --silent minify > js/app.js diff --git a/pages/term.php b/pages/term.php index ea84d53..d2baca1 100644 --- a/pages/term.php +++ b/pages/term.php @@ -41,7 +41,12 @@

-
+
+ +
+ +
+
+ +
+
@@ -179,6 +197,7 @@ +