(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("devtools/client/shared/vendor/react"), require("Services"), require("devtools/client/shared/vendor/react-dom"), require("devtools/shared/flags")); else if(typeof define === 'function' && define.amd) define(["devtools/client/shared/vendor/react", "Services", "devtools/client/shared/vendor/react-dom", "devtools/shared/flags"], factory); else { var a = typeof exports === 'object' ? factory(require("devtools/client/shared/vendor/react"), require("Services"), require("devtools/client/shared/vendor/react-dom"), require("devtools/shared/flags")) : factory(root["devtools/client/shared/vendor/react"], root["Services"], root["devtools/client/shared/vendor/react-dom"], root["devtools/shared/flags"]); for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; } })(this, function(__WEBPACK_EXTERNAL_MODULE_2__, __WEBPACK_EXTERNAL_MODULE_29__, __WEBPACK_EXTERNAL_MODULE_31__, __WEBPACK_EXTERNAL_MODULE_121__) { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "/assets/build"; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__(744); /***/ }, /* 1 */, /* 2 */ /***/ function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_2__; /***/ }, /* 3 */, /* 4 */, /* 5 */, /* 6 */ /***/ function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(7), getRawTag = __webpack_require__(10), objectToString = __webpack_require__(11); /** `Object#toString` result references. */ var nullTag = '[object Null]', undefinedTag = '[object Undefined]'; /** Built-in value references. */ var symToStringTag = Symbol ? Symbol.toStringTag : undefined; /** * The base implementation of `getTag` without fallbacks for buggy environments. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ function baseGetTag(value) { if (value == null) { return value === undefined ? undefinedTag : nullTag; } return (symToStringTag && symToStringTag in Object(value)) ? getRawTag(value) : objectToString(value); } module.exports = baseGetTag; /***/ }, /* 7 */ /***/ function(module, exports, __webpack_require__) { var root = __webpack_require__(8); /** Built-in value references. */ var Symbol = root.Symbol; module.exports = Symbol; /***/ }, /* 8 */ /***/ function(module, exports, __webpack_require__) { var freeGlobal = __webpack_require__(9); /** Detect free variable `self`. */ var freeSelf = typeof self == 'object' && self && self.Object === Object && self; /** Used as a reference to the global object. */ var root = freeGlobal || freeSelf || Function('return this')(); module.exports = root; /***/ }, /* 9 */ /***/ function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */ var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; module.exports = freeGlobal; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 10 */ /***/ function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(7); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** Built-in value references. */ var symToStringTag = Symbol ? Symbol.toStringTag : undefined; /** * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. * * @private * @param {*} value The value to query. * @returns {string} Returns the raw `toStringTag`. */ function getRawTag(value) { var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; try { value[symToStringTag] = undefined; var unmasked = true; } catch (e) {} var result = nativeObjectToString.call(value); if (unmasked) { if (isOwn) { value[symToStringTag] = tag; } else { delete value[symToStringTag]; } } return result; } module.exports = getRawTag; /***/ }, /* 11 */ /***/ function(module, exports) { /** Used for built-in method references. */ var objectProto = Object.prototype; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** * Converts `value` to a string using `Object.prototype.toString`. * * @private * @param {*} value The value to convert. * @returns {string} Returns the converted string. */ function objectToString(value) { return nativeObjectToString.call(value); } module.exports = objectToString; /***/ }, /* 12 */, /* 13 */ /***/ function(module, exports) { /** * Creates a unary function that invokes `func` with its argument transformed. * * @private * @param {Function} func The function to wrap. * @param {Function} transform The argument transform. * @returns {Function} Returns the new function. */ function overArg(func, transform) { return function(arg) { return func(transform(arg)); }; } module.exports = overArg; /***/ }, /* 14 */ /***/ function(module, exports) { /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */ function isObjectLike(value) { return value != null && typeof value == 'object'; } module.exports = isObjectLike; /***/ }, /* 15 */, /* 16 */, /* 17 */, /* 18 */, /* 19 */, /* 20 */, /* 21 */, /* 22 */, /* 23 */, /* 24 */, /* 25 */, /* 26 */ /***/ function(module, exports, __webpack_require__) { const { KeyShortcuts } = __webpack_require__(27); const { DebuggerTransport } = __webpack_require__(41); const { DebuggerClient } = __webpack_require__(53); const PrefsHelper = __webpack_require__(57).PrefsHelper; const { TargetFactory } = __webpack_require__(58); const DevToolsUtils = __webpack_require__(42); const AppConstants = __webpack_require__(44); const EventEmitter = __webpack_require__(34); const WebsocketTransport = __webpack_require__(59); const Menu = __webpack_require__(60); const MenuItem = __webpack_require__(61); const Tree = __webpack_require__(62); const sourceUtils = __webpack_require__(63); const frame = __webpack_require__(64); module.exports = { KeyShortcuts, PrefsHelper, DebuggerClient, DebuggerTransport, TargetFactory, DevToolsUtils, AppConstants, EventEmitter, WebsocketTransport, Menu, MenuItem, Tree, sourceUtils, frame }; /***/ }, /* 27 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ const { Services: { appinfo }} = __webpack_require__(28); const EventEmitter = __webpack_require__(34); const isOSX = appinfo.OS === "Darwin"; "use strict"; // List of electron keys mapped to DOM API (DOM_VK_*) key code const ElectronKeysMapping = { "F1": "DOM_VK_F1", "F2": "DOM_VK_F2", "F3": "DOM_VK_F3", "F4": "DOM_VK_F4", "F5": "DOM_VK_F5", "F6": "DOM_VK_F6", "F7": "DOM_VK_F7", "F8": "DOM_VK_F8", "F9": "DOM_VK_F9", "F10": "DOM_VK_F10", "F11": "DOM_VK_F11", "F12": "DOM_VK_F12", "F13": "DOM_VK_F13", "F14": "DOM_VK_F14", "F15": "DOM_VK_F15", "F16": "DOM_VK_F16", "F17": "DOM_VK_F17", "F18": "DOM_VK_F18", "F19": "DOM_VK_F19", "F20": "DOM_VK_F20", "F21": "DOM_VK_F21", "F22": "DOM_VK_F22", "F23": "DOM_VK_F23", "F24": "DOM_VK_F24", "Space": "DOM_VK_SPACE", "Backspace": "DOM_VK_BACK_SPACE", "Delete": "DOM_VK_DELETE", "Insert": "DOM_VK_INSERT", "Return": "DOM_VK_RETURN", "Enter": "DOM_VK_RETURN", "Up": "DOM_VK_UP", "Down": "DOM_VK_DOWN", "Left": "DOM_VK_LEFT", "Right": "DOM_VK_RIGHT", "Home": "DOM_VK_HOME", "End": "DOM_VK_END", "PageUp": "DOM_VK_PAGE_UP", "PageDown": "DOM_VK_PAGE_DOWN", "Escape": "DOM_VK_ESCAPE", "Esc": "DOM_VK_ESCAPE", "Tab": "DOM_VK_TAB", "VolumeUp": "DOM_VK_VOLUME_UP", "VolumeDown": "DOM_VK_VOLUME_DOWN", "VolumeMute": "DOM_VK_VOLUME_MUTE", "PrintScreen": "DOM_VK_PRINTSCREEN", }; /** * Helper to listen for keyboard events decribed in .properties file. * * let shortcuts = new KeyShortcuts({ * window * }); * shortcuts.on("Ctrl+F", event => { * // `event` is the KeyboardEvent which relates to the key shortcuts * }); * * @param DOMWindow window * The window object of the document to listen events from. * @param DOMElement target * Optional DOM Element on which we should listen events from. * If omitted, we listen for all events fired on `window`. */ function KeyShortcuts({ window, target }) { this.window = window; this.target = target || window; this.keys = new Map(); this.eventEmitter = new EventEmitter(); this.target.addEventListener("keydown", this); } /* * Parse an electron-like key string and return a normalized object which * allow efficient match on DOM key event. The normalized object matches DOM * API. * * @param DOMWindow window * Any DOM Window object, just to fetch its `KeyboardEvent` object * @param String str * The shortcut string to parse, following this document: * https://github.com/electron/electron/blob/master/docs/api/accelerator.md */ KeyShortcuts.parseElectronKey = function(window, str) { let modifiers = str.split("+"); let key = modifiers.pop(); let shortcut = { ctrl: false, meta: false, alt: false, shift: false, // Set for character keys key: undefined, // Set for non-character keys keyCode: undefined, }; for (let mod of modifiers) { if (mod === "Alt") { shortcut.alt = true; } else if (["Command", "Cmd"].includes(mod)) { shortcut.meta = true; } else if (["CommandOrControl", "CmdOrCtrl"].includes(mod)) { if (isOSX) { shortcut.meta = true; } else { shortcut.ctrl = true; } } else if (["Control", "Ctrl"].includes(mod)) { shortcut.ctrl = true; } else if (mod === "Shift") { shortcut.shift = true; } else { console.error("Unsupported modifier:", mod, "from key:", str); return null; } } // Plus is a special case. It's a character key and shouldn't be matched // against a keycode as it is only accessible via Shift/Capslock if (key === "Plus") { key = "+"; } if (typeof key === "string" && key.length === 1) { // Match any single character shortcut.key = key.toLowerCase(); } else if (key in ElectronKeysMapping) { // Maps the others manually to DOM API DOM_VK_* key = ElectronKeysMapping[key]; shortcut.keyCode = window.KeyboardEvent[key]; // Used only to stringify the shortcut shortcut.keyCodeString = key; shortcut.key = key; } else { console.error("Unsupported key:", key); return null; } return shortcut; }; KeyShortcuts.stringify = function(shortcut) { let list = []; if (shortcut.alt) { list.push("Alt"); } if (shortcut.ctrl) { list.push("Ctrl"); } if (shortcut.meta) { list.push("Cmd"); } if (shortcut.shift) { list.push("Shift"); } let key; if (shortcut.key) { key = shortcut.key.toUpperCase(); } else { key = shortcut.keyCodeString; } list.push(key); return list.join("+"); }; KeyShortcuts.prototype = { destroy() { this.target.removeEventListener("keydown", this); this.keys.clear(); }, doesEventMatchShortcut(event, shortcut) { if (shortcut.meta != event.metaKey) { return false; } if (shortcut.ctrl != event.ctrlKey) { return false; } if (shortcut.alt != event.altKey) { return false; } // Shift is a special modifier, it may implicitely be required if the // expected key is a special character accessible via shift. if (shortcut.shift != event.shiftKey && event.key && event.key.match(/[a-zA-Z]/)) { return false; } if (shortcut.keyCode) { return event.keyCode == shortcut.keyCode; } else if (event.key in ElectronKeysMapping) { return ElectronKeysMapping[event.key] === shortcut.key; } // get the key from the keyCode if key is not provided. let key = event.key || String.fromCharCode(event.keyCode); // For character keys, we match if the final character is the expected one. // But for digits we also accept indirect match to please azerty keyboard, // which requires Shift to be pressed to get digits. return key.toLowerCase() == shortcut.key || (shortcut.key.match(/^[0-9]$/) && event.keyCode == shortcut.key.charCodeAt(0)); }, handleEvent(event) { for (let [key, shortcut] of this.keys) { if (this.doesEventMatchShortcut(event, shortcut)) { this.eventEmitter.emit(key, event); } } }, on(key, listener) { if (typeof listener !== "function") { throw new Error("KeyShortcuts.on() expects a function as " + "second argument"); } if (!this.keys.has(key)) { let shortcut = KeyShortcuts.parseElectronKey(this.window, key); // The key string is wrong and we were unable to compute the key shortcut if (!shortcut) { return; } this.keys.set(key, shortcut); } this.eventEmitter.on(key, listener); }, off(key, listener) { this.eventEmitter.off(key, listener); }, }; exports.KeyShortcuts = KeyShortcuts; /***/ }, /* 28 */ /***/ function(module, exports, __webpack_require__) { const Services = __webpack_require__(29); const SplitBox = __webpack_require__(30); // const SplitBoxCSS = require("./client/shared/components/splitter/SplitBox.css") const sprintf = __webpack_require__(33).sprintf; module.exports = { Services, SplitBox, // SplitBoxCSS, sprintf }; /***/ }, /* 29 */ /***/ function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_29__; /***/ }, /* 30 */ /***/ function(module, exports, __webpack_require__) { const React = __webpack_require__(2); const ReactDOM = __webpack_require__(31); const Draggable = React.createFactory(__webpack_require__(32)); const { DOM: dom, PropTypes } = React; /** * This component represents a Splitter. The splitter supports vertical * as well as horizontal mode. */ const SplitBox = React.createClass({ propTypes: { // Custom class name. You can use more names separated by a space. className: PropTypes.string, // Initial size of controlled panel. initialSize: PropTypes.any, // Optional initial width of controlled panel. initialWidth: PropTypes.number, // Optional initial height of controlled panel. initialHeight: PropTypes.number, // Left/top panel startPanel: PropTypes.any, // Left/top panel collapse state. startPanelCollapsed: PropTypes.bool, // Min panel size. minSize: PropTypes.any, // Max panel size. maxSize: PropTypes.any, // Right/bottom panel endPanel: PropTypes.any, // Right/bottom panel collapse state. endPanelCollapsed: PropTypes.bool, // True if the right/bottom panel should be controlled. endPanelControl: PropTypes.bool, // Size of the splitter handle bar. splitterSize: PropTypes.number, // True if the splitter bar is vertical (default is vertical). vert: PropTypes.bool, // Optional style properties passed into the splitbox style: PropTypes.object }, displayName: "SplitBox", getDefaultProps() { return { splitterSize: 5, vert: true, endPanelControl: false, endPanelCollapsed: false, startPanelCollapsed: false }; }, /** * The state stores the current orientation (vertical or horizontal) * and the current size (width/height). All these values can change * during the component's life time. */ getInitialState() { return { vert: this.props.vert, width: this.props.initialWidth || this.props.initialSize, height: this.props.initialHeight || this.props.initialSize }; }, componentWillReceiveProps(nextProps) { if (this.props.vert !== nextProps.vert) { this.setState({ vert: nextProps.vert }); } }, // Dragging Events /** * Set 'resizing' cursor on entire document during splitter dragging. * This avoids cursor-flickering that happens when the mouse leaves * the splitter bar area (happens frequently). */ onStartMove() { const splitBox = ReactDOM.findDOMNode(this); const doc = splitBox.ownerDocument; let defaultCursor = doc.documentElement.style.cursor; doc.documentElement.style.cursor = (this.state.vert ? "ew-resize" : "ns-resize"); splitBox.classList.add("dragging"); this.setState({ defaultCursor: defaultCursor }); }, onStopMove() { const splitBox = ReactDOM.findDOMNode(this); const doc = splitBox.ownerDocument; doc.documentElement.style.cursor = this.state.defaultCursor; splitBox.classList.remove("dragging"); }, screenX() { // NOTE: in practice the window might have a border which calls for comparing window.outerWidth and window.innerWidth return window.screenX; }, screenY() { // NOTE: in practice the window might have a border which calls for comparing window.outerHeight and window.innerHeight return window.screenY; }, /** * Adjust size of the controlled panel. Depending on the current * orientation we either remember the width or height of * the splitter box. */ onMove(x, y) { const node = ReactDOM.findDOMNode(this); const doc = node.ownerDocument; const win = doc.defaultView; let size; let { endPanelControl } = this.props; if (this.state.vert) { // Switch the control flag in case of RTL. Note that RTL // has impact on vertical splitter only. let dir = win.getComputedStyle(doc.documentElement).direction; if (dir == "rtl") { endPanelControl = !endPanelControl; } let innerOffset = x - this.screenX(); size = endPanelControl ? (node.offsetLeft + node.offsetWidth) - innerOffset : innerOffset - node.offsetLeft; this.setState({ width: size }); } else { let innerOffset = y - this.screenY(); size = endPanelControl ? (node.offsetTop + node.offsetHeight) - innerOffset : innerOffset - node.offsetTop; this.setState({ height: size }); } }, // Rendering preparePanelStyles() { const vert = this.state.vert; const { minSize, maxSize, startPanelCollapsed, endPanelControl, endPanelCollapsed } = this.props; let leftPanelStyle, rightPanelStyle; // Set proper size for panels depending on the current state. if (vert) { let startWidth = endPanelControl ? null : this.state.width, endWidth = endPanelControl ? this.state.width : null; leftPanelStyle = { maxWidth: endPanelControl ? null : maxSize, minWidth: endPanelControl ? null : minSize, width: startPanelCollapsed ? 0 : startWidth }; rightPanelStyle = { maxWidth: endPanelControl ? maxSize : null, minWidth: endPanelControl ? minSize : null, width: endPanelCollapsed ? 0 : endWidth }; } else { let startHeight = endPanelControl ? null : this.state.height, endHeight = endPanelControl ? this.state.height : null; leftPanelStyle = { maxHeight: endPanelControl ? null : maxSize, minHeight: endPanelControl ? null : minSize, height: endPanelCollapsed ? maxSize : startHeight }; rightPanelStyle = { maxHeight: endPanelControl ? maxSize : null, minHeight: endPanelControl ? minSize : null, height: startPanelCollapsed ? maxSize : endHeight }; } return { leftPanelStyle, rightPanelStyle }; }, render() { const vert = this.state.vert; const { startPanelCollapsed, startPanel, endPanel, endPanelControl, splitterSize, endPanelCollapsed } = this.props; let style = Object.assign({}, this.props.style); // Calculate class names list. let classNames = ["split-box"]; classNames.push(vert ? "vert" : "horz"); if (this.props.className) { classNames = classNames.concat(this.props.className.split(" ")); } const { leftPanelStyle, rightPanelStyle } = this.preparePanelStyles(); // Calculate splitter size let splitterStyle = { flex: `0 0 ${splitterSize}px` }; return ( dom.div({ className: classNames.join(" "), style: style }, !startPanelCollapsed ? dom.div({ className: endPanelControl ? "uncontrolled" : "controlled", style: leftPanelStyle }, startPanel ) : null, Draggable({ className: "splitter", style: splitterStyle, onStart: this.onStartMove, onStop: this.onStopMove, onMove: this.onMove }), !endPanelCollapsed ? dom.div({ className: endPanelControl ? "controlled" : "uncontrolled", style: rightPanelStyle }, endPanel ) : null ) ); } }); module.exports = SplitBox; /***/ }, /* 31 */ /***/ function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_31__; /***/ }, /* 32 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ const React = __webpack_require__(2); const ReactDOM = __webpack_require__(31); const { DOM: dom, PropTypes } = React; const Draggable = React.createClass({ displayName: "Draggable", propTypes: { onMove: PropTypes.func.isRequired, onStart: PropTypes.func, onStop: PropTypes.func, style: PropTypes.object, className: PropTypes.string }, startDragging(ev) { ev.preventDefault(); const doc = ReactDOM.findDOMNode(this).ownerDocument; doc.addEventListener("mousemove", this.onMove); doc.addEventListener("mouseup", this.onUp); this.props.onStart && this.props.onStart(); }, onMove(ev) { ev.preventDefault(); // Use screen coordinates so, moving mouse over iframes // doesn't mangle (relative) coordinates. this.props.onMove(ev.screenX, ev.screenY); }, onUp(ev) { ev.preventDefault(); const doc = ReactDOM.findDOMNode(this).ownerDocument; doc.removeEventListener("mousemove", this.onMove); doc.removeEventListener("mouseup", this.onUp); this.props.onStop && this.props.onStop(); }, render() { return dom.div({ style: this.props.style, className: this.props.className, onMouseDown: this.startDragging }); } }); module.exports = Draggable; /***/ }, /* 33 */ /***/ function(module, exports, __webpack_require__) { /** * Copyright (c) 2007-2016, Alexandru Marasteanu * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of this software nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* globals window, exports, define */ (function(window) { 'use strict' var re = { not_string: /[^s]/, not_bool: /[^t]/, not_type: /[^T]/, not_primitive: /[^v]/, number: /[diefg]/, numeric_arg: /bcdiefguxX/, json: /[j]/, not_json: /[^j]/, text: /^[^\x25]+/, modulo: /^\x25{2}/, placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijosStTuvxX])/, key: /^([a-z_][a-z_\d]*)/i, key_access: /^\.([a-z_][a-z_\d]*)/i, index_access: /^\[(\d+)\]/, sign: /^[\+\-]/ } function sprintf() { var key = arguments[0], cache = sprintf.cache if (!(cache[key] && cache.hasOwnProperty(key))) { cache[key] = sprintf.parse(key) } return sprintf.format.call(null, cache[key], arguments) } sprintf.format = function(parse_tree, argv) { var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length, is_positive = true, sign = '' for (i = 0; i < tree_length; i++) { node_type = get_type(parse_tree[i]) if (node_type === 'string') { output[output.length] = parse_tree[i] } else if (node_type === 'array') { match = parse_tree[i] // convenience purposes only if (match[2]) { // keyword argument arg = argv[cursor] for (k = 0; k < match[2].length; k++) { if (!arg.hasOwnProperty(match[2][k])) { throw new Error(sprintf('[sprintf] property "%s" does not exist', match[2][k])) } arg = arg[match[2][k]] } } else if (match[1]) { // positional argument (explicit) arg = argv[match[1]] } else { // positional argument (implicit) arg = argv[cursor++] } if (re.not_type.test(match[8]) && re.not_primitive.test(match[8]) && get_type(arg) == 'function') { arg = arg() } if (re.numeric_arg.test(match[8]) && (get_type(arg) != 'number' && isNaN(arg))) { throw new TypeError(sprintf("[sprintf] expecting number but found %s", get_type(arg))) } if (re.number.test(match[8])) { is_positive = arg >= 0 } switch (match[8]) { case 'b': arg = parseInt(arg, 10).toString(2) break case 'c': arg = String.fromCharCode(parseInt(arg, 10)) break case 'd': case 'i': arg = parseInt(arg, 10) break case 'j': arg = JSON.stringify(arg, null, match[6] ? parseInt(match[6]) : 0) break case 'e': arg = match[7] ? parseFloat(arg).toExponential(match[7]) : parseFloat(arg).toExponential() break case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg) break case 'g': arg = match[7] ? parseFloat(arg).toPrecision(match[7]) : parseFloat(arg) break case 'o': arg = arg.toString(8) break case 's': case 'S': arg = String(arg) arg = (match[7] ? arg.substring(0, match[7]) : arg) break case 't': arg = String(!!arg) arg = (match[7] ? arg.substring(0, match[7]) : arg) break case 'T': arg = get_type(arg) arg = (match[7] ? arg.substring(0, match[7]) : arg) break case 'u': arg = parseInt(arg, 10) >>> 0 break case 'v': arg = arg.valueOf() arg = (match[7] ? arg.substring(0, match[7]) : arg) break case 'x': arg = parseInt(arg, 10).toString(16) break case 'X': arg = parseInt(arg, 10).toString(16).toUpperCase() break } if (re.json.test(match[8])) { output[output.length] = arg } else { if (re.number.test(match[8]) && (!is_positive || match[3])) { sign = is_positive ? '+' : '-' arg = arg.toString().replace(re.sign, '') } else { sign = '' } pad_character = match[4] ? match[4] === '0' ? '0' : match[4].charAt(1) : ' ' pad_length = match[6] - (sign + arg).length pad = match[6] ? (pad_length > 0 ? str_repeat(pad_character, pad_length) : '') : '' output[output.length] = match[5] ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg) } } } return output.join('') } sprintf.cache = {} sprintf.parse = function(fmt) { var _fmt = fmt, match = [], parse_tree = [], arg_names = 0 while (_fmt) { if ((match = re.text.exec(_fmt)) !== null) { parse_tree[parse_tree.length] = match[0] } else if ((match = re.modulo.exec(_fmt)) !== null) { parse_tree[parse_tree.length] = '%' } else if ((match = re.placeholder.exec(_fmt)) !== null) { if (match[2]) { arg_names |= 1 var field_list = [], replacement_field = match[2], field_match = [] if ((field_match = re.key.exec(replacement_field)) !== null) { field_list[field_list.length] = field_match[1] while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { if ((field_match = re.key_access.exec(replacement_field)) !== null) { field_list[field_list.length] = field_match[1] } else if ((field_match = re.index_access.exec(replacement_field)) !== null) { field_list[field_list.length] = field_match[1] } else { throw new SyntaxError("[sprintf] failed to parse named argument key") } } } else { throw new SyntaxError("[sprintf] failed to parse named argument key") } match[2] = field_list } else { arg_names |= 2 } if (arg_names === 3) { throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported") } parse_tree[parse_tree.length] = match } else { throw new SyntaxError("[sprintf] unexpected placeholder") } _fmt = _fmt.substring(match[0].length) } return parse_tree } var vsprintf = function(fmt, argv, _argv) { _argv = (argv || []).slice(0) _argv.splice(0, 0, fmt) return sprintf.apply(null, _argv) } /** * helpers */ function get_type(variable) { if (typeof variable === 'number') { return 'number' } else if (typeof variable === 'string') { return 'string' } else { return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase() } } var preformattedPadding = { '0': ['', '0', '00', '000', '0000', '00000', '000000', '0000000'], ' ': ['', ' ', ' ', ' ', ' ', ' ', ' ', ' '], '_': ['', '_', '__', '___', '____', '_____', '______', '_______'], } function str_repeat(input, multiplier) { if (multiplier >= 0 && multiplier <= 7 && preformattedPadding[input]) { return preformattedPadding[input][multiplier] } return Array(multiplier + 1).join(input) } /** * export to either browser or node.js */ if (true) { exports.sprintf = sprintf exports.vsprintf = vsprintf } else { window.sprintf = sprintf window.vsprintf = vsprintf if (typeof define === 'function' && define.amd) { define(function() { return { sprintf: sprintf, vsprintf: vsprintf } }) } } })(typeof window === 'undefined' ? this : window); /***/ }, /* 34 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** * EventEmitter. */ var EventEmitter = function EventEmitter() {}; module.exports = EventEmitter; const { Cu } = __webpack_require__(35); const promise = __webpack_require__(40); /** * Decorate an object with event emitter functionality. * * @param Object aObjectToDecorate * Bind all public methods of EventEmitter to * the aObjectToDecorate object. */ EventEmitter.decorate = function EventEmitter_decorate (aObjectToDecorate) { let emitter = new EventEmitter(); aObjectToDecorate.on = emitter.on.bind(emitter); aObjectToDecorate.off = emitter.off.bind(emitter); aObjectToDecorate.once = emitter.once.bind(emitter); aObjectToDecorate.emit = emitter.emit.bind(emitter); }; EventEmitter.prototype = { /** * Connect a listener. * * @param string aEvent * The event name to which we're connecting. * @param function aListener * Called when the event is fired. */ on: function EventEmitter_on(aEvent, aListener) { if (!this._eventEmitterListeners) this._eventEmitterListeners = new Map(); if (!this._eventEmitterListeners.has(aEvent)) { this._eventEmitterListeners.set(aEvent, []); } this._eventEmitterListeners.get(aEvent).push(aListener); }, /** * Listen for the next time an event is fired. * * @param string aEvent * The event name to which we're connecting. * @param function aListener * (Optional) Called when the event is fired. Will be called at most * one time. * @return promise * A promise which is resolved when the event next happens. The * resolution value of the promise is the first event argument. If * you need access to second or subsequent event arguments (it's rare * that this is needed) then use aListener */ once: function EventEmitter_once(aEvent, aListener) { let deferred = promise.defer(); let handler = (aEvent, aFirstArg, ...aRest) => { this.off(aEvent, handler); if (aListener) { aListener.apply(null, [aEvent, aFirstArg, ...aRest]); } deferred.resolve(aFirstArg); }; handler._originalListener = aListener; this.on(aEvent, handler); return deferred.promise; }, /** * Remove a previously-registered event listener. Works for events * registered with either on or once. * * @param string aEvent * The event name whose listener we're disconnecting. * @param function aListener * The listener to remove. */ off: function EventEmitter_off(aEvent, aListener) { if (!this._eventEmitterListeners) return; let listeners = this._eventEmitterListeners.get(aEvent); if (listeners) { this._eventEmitterListeners.set(aEvent, listeners.filter(l => { return l !== aListener && l._originalListener !== aListener; })); } }, /** * Emit an event. All arguments to this method will * be sent to listener functions. */ emit: function EventEmitter_emit(aEvent) { if (!this._eventEmitterListeners || !this._eventEmitterListeners.has(aEvent)) { return; } let originalListeners = this._eventEmitterListeners.get(aEvent); for (let listener of this._eventEmitterListeners.get(aEvent)) { // If the object was destroyed during event emission, stop // emitting. if (!this._eventEmitterListeners) { break; } // If listeners were removed during emission, make sure the // event handler we're going to fire wasn't removed. if (originalListeners === this._eventEmitterListeners.get(aEvent) || this._eventEmitterListeners.get(aEvent).some(l => l === listener)) { try { listener.apply(null, arguments); } catch (ex) { // Prevent a bad listener from interfering with the others. let msg = ex + ": " + ex.stack; //console.error(msg); console.log(msg); } } } }, }; /***/ }, /* 35 */ /***/ function(module, exports, __webpack_require__) { /* * A sham for https://developer.mozilla.org/en-US/Add-ons/SDK/Low-Level_APIs/chrome */ var { inDOMUtils } = __webpack_require__(36); var ourServices = { inIDOMUtils: inDOMUtils, nsIClipboardHelper: { copyString: () => {} }, nsIXULChromeRegistry: { isLocaleRTL: () => {return false;} }, nsIDOMParser: { }, }; module.exports = { Cc: name => { if(typeof console !== "undefined") { console.log('Cc sham for', name); } return { getService: (name) => ourServices[name], createInstance: (iface) => ourServices[iface], }; }, CC: (name, iface, method) => { if(typeof console !== "undefined") { console.log('CC sham for', name, iface, method); } return { }; }, Ci: { nsIThread: { "DISPATCH_NORMAL":0, "DISPATCH_SYNC":1 }, nsIDOMNode: typeof HTMLElement !== "undefined" ? HTMLElement : null, nsIFocusManager: { MOVEFOCUS_BACKWARD: 2, MOVEFOCUS_FORWARD: 1, }, nsIDOMKeyEvent: { }, nsIDOMCSSRule: {"UNKNOWN_RULE":0,"STYLE_RULE":1,"CHARSET_RULE":2,"IMPORT_RULE":3,"MEDIA_RULE":4,"FONT_FACE_RULE":5,"PAGE_RULE":6,"KEYFRAMES_RULE":7,"KEYFRAME_RULE":8,"MOZ_KEYFRAMES_RULE":7,"MOZ_KEYFRAME_RULE":8,"NAMESPACE_RULE":10,"COUNTER_STYLE_RULE":11,"SUPPORTS_RULE":12,"FONT_FEATURE_VALUES_RULE":14}, inIDOMUtils: "inIDOMUtils", nsIClipboardHelper: "nsIClipboardHelper", nsIXULChromeRegistry: "nsIXULChromeRegistry", }, Cu: { reportError: msg => { (typeof console !== "undefined") ? console.error(msg) : dump(msg) }, callFunctionWithAsyncStack: fn => fn(), }, Cr: {}, components: { isSuccessCode: () => (returnCode & 0x80000000) === 0, } }; /***/ }, /* 36 */ /***/ function(module, exports, __webpack_require__) { // A sham for inDOMUtils. "use strict"; var { CSSLexer } = __webpack_require__(37); var { cssColors } = __webpack_require__(38); var { cssProperties } = __webpack_require__(39); var cssRGBMap; // From inIDOMUtils.idl. var EXCLUDE_SHORTHANDS = (1 << 0); var INCLUDE_ALIASES = (1 << 1); var TYPE_LENGTH = 0; var TYPE_PERCENTAGE = 1; var TYPE_COLOR = 2; var TYPE_URL = 3; var TYPE_ANGLE = 4; var TYPE_FREQUENCY = 5; var TYPE_TIME = 6; var TYPE_GRADIENT = 7; var TYPE_TIMING_FUNCTION = 8; var TYPE_IMAGE_RECT = 9; var TYPE_NUMBER = 10; function getCSSLexer(text) { return new CSSLexer(text); } function rgbToColorName(r, g, b) { if (!cssRGBMap) { cssRGBMap = new Map(); for (let name in cssColors) { cssRGBMap.set(JSON.stringify(cssColors[name]), name); } } let value = cssRGBMap.get(JSON.stringify([r, g, b])); if (!value) { throw new Error("no such color"); } return value; } // Taken from dom/tests/mochitest/ajax/mochikit/MochiKit/Color.js function _hslValue(n1, n2, hue) { if (hue > 6.0) { hue -= 6.0; } else if (hue < 0.0) { hue += 6.0; } var val; if (hue < 1.0) { val = n1 + (n2 - n1) * hue; } else if (hue < 3.0) { val = n2; } else if (hue < 4.0) { val = n1 + (n2 - n1) * (4.0 - hue); } else { val = n1; } return val; } // Taken from dom/tests/mochitest/ajax/mochikit/MochiKit/Color.js // and then modified. function hslToRGB([hue, saturation, lightness]) { var red; var green; var blue; if (saturation === 0) { red = lightness; green = lightness; blue = lightness; } else { var m2; if (lightness <= 0.5) { m2 = lightness * (1.0 + saturation); } else { m2 = lightness + saturation - (lightness * saturation); } var m1 = (2.0 * lightness) - m2; var f = _hslValue; var h6 = hue * 6.0; red = f(m1, m2, h6 + 2); green = f(m1, m2, h6); blue = f(m1, m2, h6 - 2); } return [red, green, blue]; } function colorToRGBA(name) { name = name.trim().toLowerCase(); if (name in cssColors) { return cssColors[name]; } if (name === "transparent") { return [0, 0, 0, 0]; } let lexer = getCSSLexer(name); let getToken = function() { while (true) { let token = lexer.nextToken(); if (!token || token.tokenType !== "comment" || token.tokenType !== "whitespace") { return token; } } }; let requireComma = function(token) { if (token.tokenType !== "symbol" || token.text !== ",") { return null; } return getToken(); }; let func = getToken(); if (!func || func.tokenType !== "function") { return null; } let alpha = false; if (func.text === "rgb" || func.text === "hsl") { // Nothing. } else if (func.text === "rgba" || func.text === "hsla") { alpha = true; } else { return null; } let vals = []; for (let i = 0; i < 3; ++i) { let token = getToken(); if (i > 0) { token = requireComma(token); } if (token.tokenType !== "number" || !token.isInteger) { return null; } let num = token.number; if (num < 0) { num = 0; } else if (num > 255) { num = 255; } vals.push(num); } if (func.text === "hsl" || func.text === "hsla") { vals = hslToRGB(vals); } if (alpha) { let token = requireComma(getToken()); if (token.tokenType !== "number") { return null; } let num = token.number; if (num < 0) { num = 0; } else if (num > 1) { num = 1; } vals.push(num); } else { vals.push(1); } let parenToken = getToken(); if (!parenToken || parenToken.tokenType !== "symbol" || parenToken.text !== ")") { return null; } if (getToken() !== null) { return null; } return vals; } function isValidCSSColor(name) { return colorToRGBA(name) !== null; } function isVariable(name) { return name.startsWith("--"); } function cssPropertyIsShorthand(name) { if (isVariable(name)) { return false; } if (!(name in cssProperties)) { throw Error("unknown property " + name); } return !!cssProperties[name].subproperties; } function getSubpropertiesForCSSProperty(name) { if (isVariable(name)) { return [name]; } if (!(name in cssProperties)) { throw Error("unknown property " + name); } if ("subproperties" in cssProperties[name]) { return cssProperties[name].subproperties.slice(); } return [name]; } function getCSSValuesForProperty(name) { if (isVariable(name)) { return ["initial", "inherit", "unset"]; } if (!(name in cssProperties)) { throw Error("unknown property " + name); } return cssProperties[name].values.slice(); } function getCSSPropertyNames(flags) { let names = Object.keys(cssProperties); if ((flags & EXCLUDE_SHORTHANDS) !== 0) { names = names.filter((name) => cssProperties[name].subproperties); } if ((flags & INCLUDE_ALIASES) === 0) { names = names.filter((name) => !cssProperties[name].alias); } return names; } function cssPropertySupportsType(name, type) { if (isVariable(name)) { return false; } if (!(name in cssProperties)) { throw Error("unknown property " + name); } return (cssProperties[name].supports & (1 << type)) !== 0; } function isInheritedProperty(name) { if (isVariable(name)) { return true; } if (!(name in cssProperties)) { return false; } return cssProperties[name].inherited; } function cssPropertyIsValid(name, value) { if (isVariable(name)) { return true; } if (!(name in cssProperties)) { return false; } let elt = document.createElement("div"); elt.style = name + ":" + value; return elt.style.length > 0; } exports.inDOMUtils = { getCSSLexer, rgbToColorName, colorToRGBA, isValidCSSColor, cssPropertyIsShorthand, getSubpropertiesForCSSProperty, getCSSValuesForProperty, getCSSPropertyNames, cssPropertySupportsType, isInheritedProperty, cssPropertyIsValid, // Constants. EXCLUDE_SHORTHANDS, INCLUDE_ALIASES, TYPE_LENGTH, TYPE_PERCENTAGE, TYPE_COLOR, TYPE_URL, TYPE_ANGLE, TYPE_FREQUENCY, TYPE_TIME, TYPE_GRADIENT, TYPE_TIMING_FUNCTION, TYPE_IMAGE_RECT, TYPE_NUMBER, }; /***/ }, /* 37 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;"use strict"; (function (root, factory) { // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, // Rhino, and plain browser loading. if (true) { !(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else if (typeof exports !== 'undefined') { factory(exports); } else { factory(root); } }(this, function (exports) { function between(num, first, last) { return num >= first && num <= last; } function digit(code) { return between(code, 0x30,0x39); } function hexdigit(code) { return digit(code) || between(code, 0x41,0x46) || between(code, 0x61,0x66); } function uppercaseletter(code) { return between(code, 0x41,0x5a); } function lowercaseletter(code) { return between(code, 0x61,0x7a); } function letter(code) { return uppercaseletter(code) || lowercaseletter(code); } function nonascii(code) { return code >= 0x80; } function namestartchar(code) { return letter(code) || nonascii(code) || code == 0x5f; } function namechar(code) { return namestartchar(code) || digit(code) || code == 0x2d; } function nonprintable(code) { return between(code, 0,8) || code == 0xb || between(code, 0xe,0x1f) || code == 0x7f; } function newline(code) { return code == 0xa; } function whitespace(code) { return newline(code) || code == 9 || code == 0x20; } var maximumallowedcodepoint = 0x10ffff; var InvalidCharacterError = function(message) { this.message = message; }; InvalidCharacterError.prototype = new Error; InvalidCharacterError.prototype.name = 'InvalidCharacterError'; function stringFromCode(code) { if(code <= 0xffff) return String.fromCharCode(code); // Otherwise, encode astral char as surrogate pair. code -= Math.pow(2, 20); var lead = Math.floor(code/Math.pow(2, 10)) + 0xd800; var trail = code % Math.pow(2, 10) + 0xdc00; return String.fromCharCode(lead) + String.fromCharCode(trail); } function* tokenize(str, options) { if (options === undefined) { options = {}; } if (options.loc === undefined) { options.loc = false; } if (options.offsets === undefined) { options.offsets = false; } if (options.keepComments === undefined) { options.keepComments = false; } if (options.startOffset === undefined) { options.startOffset = 0; } var i = options.startOffset - 1; var code; // Line number information. var line = 0; var column = 0; // The only use of lastLineLength is in reconsume(). var lastLineLength = 0; var incrLineno = function() { line += 1; lastLineLength = column; column = 0; }; var locStart = {line:line, column:column}; var offsetStart = i; var codepoint = function(i) { if(i >= str.length) { return -1; } return str.charCodeAt(i); }; var next = function(num) { if(num === undefined) num = 1; if(num > 3) throw "Spec Error: no more than three codepoints of lookahead."; var rcode; for (var offset = i + 1; num-- > 0; ++offset) { rcode = codepoint(offset); if (rcode === 0xd && codepoint(offset+1) === 0xa) { ++offset; rcode = 0xa; } else if (rcode === 0xd || rcode === 0xc) { rcode = 0xa; } else if (rcode === 0x0) { rcode = 0xfffd; } } return rcode; }; var consume = function(num) { if(num === undefined) num = 1; while(num-- > 0) { ++i; code = codepoint(i); if (code === 0xd && codepoint(i+1) === 0xa) { ++i; code = 0xa; } else if (code === 0xd || code === 0xc) { code = 0xa; } else if (code === 0x0) { code = 0xfffd; } if(newline(code)) incrLineno(); else column++; } return true; }; var reconsume = function() { i -= 1; // This is ok even in the \r\n case. if (newline(code)) { line -= 1; column = lastLineLength; } else { column -= 1; } return true; }; var eof = function(codepoint) { if(codepoint === undefined) codepoint = code; return codepoint == -1; }; var donothing = function() {}; var parseerror = function() { console.log("Parse error at index " + i + ", processing codepoint 0x" + code.toString(16) + ".");return true; }; var consumeAToken = function() { consume(); if (!options.keepComments) { while(code == 0x2f && next() == 0x2a) { consumeAComment(); consume(); } } locStart.line = line; locStart.column = column; offsetStart = i; if(whitespace(code)) { while(whitespace(next())) consume(); return new WhitespaceToken; } else if(code == 0x2f && next() == 0x2a) return consumeAComment(); else if(code == 0x22) return consumeAStringToken(); else if(code == 0x23) { if(namechar(next()) || areAValidEscape(next(1), next(2))) { var token = new HashToken(); if(wouldStartAnIdentifier(next(1), next(2), next(3))) { token.type = "id"; token.tokenType = "id"; } token.value = consumeAName(); token.text = token.value; return token; } else { return new DelimToken(code); } } else if(code == 0x24) { if(next() == 0x3d) { consume(); return new SuffixMatchToken(); } else { return new DelimToken(code); } } else if(code == 0x27) return consumeAStringToken(); else if(code == 0x28) return new OpenParenToken(); else if(code == 0x29) return new CloseParenToken(); else if(code == 0x2a) { if(next() == 0x3d) { consume(); return new SubstringMatchToken(); } else { return new DelimToken(code); } } else if(code == 0x2b) { if(startsWithANumber()) { reconsume(); return consumeANumericToken(); } else { return new DelimToken(code); } } else if(code == 0x2c) return new CommaToken(); else if(code == 0x2d) { if(startsWithANumber()) { reconsume(); return consumeANumericToken(); } else if(next(1) == 0x2d && next(2) == 0x3e) { consume(2); return new CDCToken(); } else if(startsWithAnIdentifier()) { reconsume(); return consumeAnIdentlikeToken(); } else { return new DelimToken(code); } } else if(code == 0x2e) { if(startsWithANumber()) { reconsume(); return consumeANumericToken(); } else { return new DelimToken(code); } } else if(code == 0x3a) return new ColonToken; else if(code == 0x3b) return new SemicolonToken; else if(code == 0x3c) { if(next(1) == 0x21 && next(2) == 0x2d && next(3) == 0x2d) { consume(3); return new CDOToken(); } else { return new DelimToken(code); } } else if(code == 0x40) { if(wouldStartAnIdentifier(next(1), next(2), next(3))) { return new AtKeywordToken(consumeAName()); } else { return new DelimToken(code); } } else if(code == 0x5b) return new OpenSquareToken(); else if(code == 0x5c) { if(startsWithAValidEscape()) { reconsume(); return consumeAnIdentlikeToken(); } else { parseerror(); return new DelimToken(code); } } else if(code == 0x5d) return new CloseSquareToken(); else if(code == 0x5e) { if(next() == 0x3d) { consume(); return new PrefixMatchToken(); } else { return new DelimToken(code); } } else if(code == 0x7b) return new OpenCurlyToken(); else if(code == 0x7c) { if(next() == 0x3d) { consume(); return new DashMatchToken(); // } else if(next() == 0x7c) { // consume(); // return new ColumnToken(); } else { return new DelimToken(code); } } else if(code == 0x7d) return new CloseCurlyToken(); else if(code == 0x7e) { if(next() == 0x3d) { consume(); return new IncludeMatchToken(); } else { return new DelimToken(code); } } else if(digit(code)) { reconsume(); return consumeANumericToken(); } else if(namestartchar(code)) { reconsume(); return consumeAnIdentlikeToken(); } else if(eof()) return new EOFToken(); else return new DelimToken(code); }; var consumeAComment = function() { consume(); var comment = ""; while(true) { consume(); if(code == 0x2a && next() == 0x2f) { consume(); break; } else if(eof()) { break; } comment += stringFromCode(code); } return new CommentToken(comment); }; var consumeANumericToken = function() { var num = consumeANumber(); var token; if(wouldStartAnIdentifier(next(1), next(2), next(3))) { token = new DimensionToken(); token.value = num.value; token.repr = num.repr; token.type = num.type; token.unit = consumeAName(); token.text = token.unit; } else if(next() == 0x25) { consume(); token = new PercentageToken(); token.value = num.value; token.repr = num.repr; } else { var token = new NumberToken(); token.value = num.value; token.repr = num.repr; token.type = num.type; } token.number = token.value; token.isInteger = token.type === "integer"; // FIXME hasSign return token; }; var consumeAnIdentlikeToken = function() { var str = consumeAName(); if(str.toLowerCase() == "url" && next() == 0x28) { consume(); while(whitespace(next(1)) && whitespace(next(2))) consume(); if((next() == 0x22 || next() == 0x27) || (whitespace(next()) && (next(2) == 0x22 || next(2) == 0x27))) { while(whitespace(next())) consume(); consume(); let str = consumeAStringToken(); while(whitespace(next())) consume(); // The closing paren. consume(); return new URLToken(str.text); } else { return consumeAURLToken(); } } else if(next() == 0x28) { consume(); return new FunctionToken(str); } else { return new IdentToken(str); } }; var consumeAStringToken = function(endingCodePoint) { if(endingCodePoint === undefined) endingCodePoint = code; var string = ""; while(consume()) { if(code == endingCodePoint || eof()) { return new StringToken(string); } else if(newline(code)) { reconsume(); return new BadStringToken(string); } else if(code == 0x5c) { if(eof(next())) { donothing(); } else if(newline(next())) { consume(); } else { string += stringFromCode(consumeEscape()); } } else { string += stringFromCode(code); } } }; var consumeAURLToken = function() { var token = new URLToken(""); while(whitespace(next())) consume(); if(eof(next())) return token; while(consume()) { if(code == 0x29 || eof()) { break; } else if(whitespace(code)) { while(whitespace(next())) consume(); if(next() == 0x29 || eof(next())) { consume(); break; } else { consumeTheRemnantsOfABadURL(); return new BadURLToken(); } } else if(code == 0x22 || code == 0x27 || code == 0x28 || nonprintable(code)) { parseerror(); consumeTheRemnantsOfABadURL(); return new BadURLToken(); } else if(code == 0x5c) { if(startsWithAValidEscape()) { token.value += stringFromCode(consumeEscape()); } else { parseerror(); consumeTheRemnantsOfABadURL(); return new BadURLToken(); } } else { token.value += stringFromCode(code); } } token.text = token.value; return token; }; var consumeEscape = function() { // Assume the the current character is the \ // and the next code point is not a newline. consume(); if(hexdigit(code)) { // Consume 1-6 hex digits var digits = [code]; for(var total = 0; total < 5; total++) { if(hexdigit(next())) { consume(); digits.push(code); } else { break; } } if(whitespace(next())) consume(); var value = parseInt(digits.map(function(x){return String.fromCharCode(x);}).join(''), 16); if( value > maximumallowedcodepoint ) value = 0xfffd; return value; } else if(eof()) { return 0xfffd; } else { return code; } }; var areAValidEscape = function(c1, c2) { if(c1 != 0x5c) return false; if(newline(c2)) return false; return true; }; var startsWithAValidEscape = function() { return areAValidEscape(code, next()); }; var wouldStartAnIdentifier = function(c1, c2, c3) { if(c1 == 0x2d) { return namestartchar(c2) || c2 == 0x2d || areAValidEscape(c2, c3); } else if(namestartchar(c1)) { return true; } else if(c1 == 0x5c) { return areAValidEscape(c1, c2); } else { return false; } }; var startsWithAnIdentifier = function() { return wouldStartAnIdentifier(code, next(1), next(2)); }; var wouldStartANumber = function(c1, c2, c3) { if(c1 == 0x2b || c1 == 0x2d) { if(digit(c2)) return true; if(c2 == 0x2e && digit(c3)) return true; return false; } else if(c1 == 0x2e) { if(digit(c2)) return true; return false; } else if(digit(c1)) { return true; } else { return false; } }; var startsWithANumber = function() { return wouldStartANumber(code, next(1), next(2)); }; var consumeAName = function() { var result = ""; while(consume()) { if(namechar(code)) { result += stringFromCode(code); } else if(startsWithAValidEscape()) { result += stringFromCode(consumeEscape()); } else { reconsume(); return result; } } }; var consumeANumber = function() { var repr = []; var type = "integer"; if(next() == 0x2b || next() == 0x2d) { consume(); repr += stringFromCode(code); } while(digit(next())) { consume(); repr += stringFromCode(code); } if(next(1) == 0x2e && digit(next(2))) { consume(); repr += stringFromCode(code); consume(); repr += stringFromCode(code); type = "number"; while(digit(next())) { consume(); repr += stringFromCode(code); } } var c1 = next(1), c2 = next(2), c3 = next(3); if((c1 == 0x45 || c1 == 0x65) && digit(c2)) { consume(); repr += stringFromCode(code); consume(); repr += stringFromCode(code); type = "number"; while(digit(next())) { consume(); repr += stringFromCode(code); } } else if((c1 == 0x45 || c1 == 0x65) && (c2 == 0x2b || c2 == 0x2d) && digit(c3)) { consume(); repr += stringFromCode(code); consume(); repr += stringFromCode(code); consume(); repr += stringFromCode(code); type = "number"; while(digit(next())) { consume(); repr += stringFromCode(code); } } var value = convertAStringToANumber(repr); return {type:type, value:value, repr:repr}; }; var convertAStringToANumber = function(string) { // CSS's number rules are identical to JS, afaik. return +string; }; var consumeTheRemnantsOfABadURL = function() { while(consume()) { if(code == 0x2d || eof()) { return; } else if(startsWithAValidEscape()) { consumeEscape(); donothing(); } else { donothing(); } } }; var iterationCount = 0; while(!eof(next())) { var token = consumeAToken(); if (options.loc) { token.loc = {}; token.loc.start = {line:locStart.line, column:locStart.column}; token.loc.end = {line:line, column:column}; } if (options.offsets) { token.startOffset = offsetStart; token.endOffset = i + 1; } yield token; iterationCount++; if(iterationCount > str.length*2) return "I'm infinite-looping!"; } } function CSSParserToken() { throw "Abstract Base Class"; } CSSParserToken.prototype.toJSON = function() { return {token: this.tokenType}; }; CSSParserToken.prototype.toString = function() { return this.tokenType; }; CSSParserToken.prototype.toSource = function() { return ''+this; }; function BadStringToken(text) { this.text = text; return this; } BadStringToken.prototype = Object.create(CSSParserToken.prototype); BadStringToken.prototype.tokenType = "bad_string"; function BadURLToken() { return this; } BadURLToken.prototype = Object.create(CSSParserToken.prototype); BadURLToken.prototype.tokenType = "bad_url"; function WhitespaceToken() { return this; } WhitespaceToken.prototype = Object.create(CSSParserToken.prototype); WhitespaceToken.prototype.tokenType = "whitespace"; WhitespaceToken.prototype.toString = function() { return "WS"; }; WhitespaceToken.prototype.toSource = function() { return " "; }; function CDOToken() { return this; } CDOToken.prototype = Object.create(CSSParserToken.prototype); CDOToken.prototype.tokenType = "htmlcomment"; CDOToken.prototype.toSource = function() { return ""; }; function ColonToken() { return this; } ColonToken.prototype = Object.create(CSSParserToken.prototype); ColonToken.prototype.tokenType = "symbol"; ColonToken.prototype.text = ":"; function SemicolonToken() { return this; } SemicolonToken.prototype = Object.create(CSSParserToken.prototype); SemicolonToken.prototype.tokenType = "symbol"; SemicolonToken.prototype.text = ";"; function CommaToken() { return this; } CommaToken.prototype = Object.create(CSSParserToken.prototype); CommaToken.prototype.tokenType = "symbol"; CommaToken.prototype.text = ","; function GroupingToken() { throw "Abstract Base Class"; } GroupingToken.prototype = Object.create(CSSParserToken.prototype); function OpenCurlyToken() { this.value = "{"; this.mirror = "}"; return this; } OpenCurlyToken.prototype = Object.create(GroupingToken.prototype); OpenCurlyToken.prototype.tokenType = "symbol"; OpenCurlyToken.prototype.text = "{"; function CloseCurlyToken() { this.value = "}"; this.mirror = "{"; return this; } CloseCurlyToken.prototype = Object.create(GroupingToken.prototype); CloseCurlyToken.prototype.tokenType = "symbol"; CloseCurlyToken.prototype.text = "}"; function OpenSquareToken() { this.value = "["; this.mirror = "]"; return this; } OpenSquareToken.prototype = Object.create(GroupingToken.prototype); OpenSquareToken.prototype.tokenType = "symbol"; OpenSquareToken.prototype.text = "["; function CloseSquareToken() { this.value = "]"; this.mirror = "["; return this; } CloseSquareToken.prototype = Object.create(GroupingToken.prototype); CloseSquareToken.prototype.tokenType = "symbol"; CloseSquareToken.prototype.text = "]"; function OpenParenToken() { this.value = "("; this.mirror = ")"; return this; } OpenParenToken.prototype = Object.create(GroupingToken.prototype); OpenParenToken.prototype.tokenType = "symbol"; OpenParenToken.prototype.text = "("; function CloseParenToken() { this.value = ")"; this.mirror = "("; return this; } CloseParenToken.prototype = Object.create(GroupingToken.prototype); CloseParenToken.prototype.tokenType = "symbol"; CloseParenToken.prototype.text = ")"; function IncludeMatchToken() { return this; } IncludeMatchToken.prototype = Object.create(CSSParserToken.prototype); IncludeMatchToken.prototype.tokenType = "includes"; function DashMatchToken() { return this; } DashMatchToken.prototype = Object.create(CSSParserToken.prototype); DashMatchToken.prototype.tokenType = "dashmatch"; function PrefixMatchToken() { return this; } PrefixMatchToken.prototype = Object.create(CSSParserToken.prototype); PrefixMatchToken.prototype.tokenType = "beginsmatch"; function SuffixMatchToken() { return this; } SuffixMatchToken.prototype = Object.create(CSSParserToken.prototype); SuffixMatchToken.prototype.tokenType = "endsmatch"; function SubstringMatchToken() { return this; } SubstringMatchToken.prototype = Object.create(CSSParserToken.prototype); SubstringMatchToken.prototype.tokenType = "containsmatch"; function ColumnToken() { return this; } ColumnToken.prototype = Object.create(CSSParserToken.prototype); ColumnToken.prototype.tokenType = "||"; function EOFToken() { return this; } EOFToken.prototype = Object.create(CSSParserToken.prototype); EOFToken.prototype.tokenType = "EOF"; EOFToken.prototype.toSource = function() { return ""; }; function DelimToken(code) { this.value = stringFromCode(code); this.text = this.value; return this; } DelimToken.prototype = Object.create(CSSParserToken.prototype); DelimToken.prototype.tokenType = "symbol"; DelimToken.prototype.toString = function() { return "DELIM("+this.value+")"; }; DelimToken.prototype.toJSON = function() { var json = this.constructor.prototype.constructor.prototype.toJSON.call(this); json.value = this.value; return json; }; DelimToken.prototype.toSource = function() { if(this.value == "\\") return "\\\n"; else return this.value; }; function StringValuedToken() { throw "Abstract Base Class"; } StringValuedToken.prototype = Object.create(CSSParserToken.prototype); StringValuedToken.prototype.ASCIIMatch = function(str) { return this.value.toLowerCase() == str.toLowerCase(); }; StringValuedToken.prototype.toJSON = function() { var json = this.constructor.prototype.constructor.prototype.toJSON.call(this); json.value = this.value; return json; }; function IdentToken(val) { this.value = val; this.text = val; } IdentToken.prototype = Object.create(StringValuedToken.prototype); IdentToken.prototype.tokenType = "ident"; IdentToken.prototype.toString = function() { return "IDENT("+this.value+")"; }; IdentToken.prototype.toSource = function() { return escapeIdent(this.value); }; function FunctionToken(val) { this.value = val; this.text = val; this.mirror = ")"; } FunctionToken.prototype = Object.create(StringValuedToken.prototype); FunctionToken.prototype.tokenType = "function"; FunctionToken.prototype.toString = function() { return "FUNCTION("+this.value+")"; }; FunctionToken.prototype.toSource = function() { return escapeIdent(this.value) + "("; }; function AtKeywordToken(val) { this.value = val; this.text = val; } AtKeywordToken.prototype = Object.create(StringValuedToken.prototype); AtKeywordToken.prototype.tokenType = "at"; AtKeywordToken.prototype.toString = function() { return "AT("+this.value+")"; }; AtKeywordToken.prototype.toSource = function() { return "@" + escapeIdent(this.value); }; function HashToken(val) { this.value = val; this.text = val; this.type = "unrestricted"; } HashToken.prototype = Object.create(StringValuedToken.prototype); HashToken.prototype.tokenType = "hash"; HashToken.prototype.toString = function() { return "HASH("+this.value+")"; }; HashToken.prototype.toJSON = function() { var json = this.constructor.prototype.constructor.prototype.toJSON.call(this); json.value = this.value; json.type = this.type; return json; }; HashToken.prototype.toSource = function() { if(this.type == "id") { return "#" + escapeIdent(this.value); } else { return "#" + escapeHash(this.value); } }; function StringToken(val) { this.value = val; this.text = val; } StringToken.prototype = Object.create(StringValuedToken.prototype); StringToken.prototype.tokenType = "string"; StringToken.prototype.toString = function() { return '"' + escapeString(this.value) + '"'; }; function CommentToken(val) { this.value = val; } CommentToken.prototype = Object.create(StringValuedToken.prototype); CommentToken.prototype.tokenType = "comment"; CommentToken.prototype.toString = function() { return '/*' + this.value + '*/'; } CommentToken.prototype.toSource = CommentToken.prototype.toString; function URLToken(val) { this.value = val; this.text = val; } URLToken.prototype = Object.create(StringValuedToken.prototype); URLToken.prototype.tokenType = "url"; URLToken.prototype.toString = function() { return "URL("+this.value+")"; }; URLToken.prototype.toSource = function() { return 'url("' + escapeString(this.value) + '")'; }; function NumberToken() { this.value = null; this.type = "integer"; this.repr = ""; } NumberToken.prototype = Object.create(CSSParserToken.prototype); NumberToken.prototype.tokenType = "number"; NumberToken.prototype.toString = function() { if(this.type == "integer") return "INT("+this.value+")"; return "NUMBER("+this.value+")"; }; NumberToken.prototype.toJSON = function() { var json = this.constructor.prototype.constructor.prototype.toJSON.call(this); json.value = this.value; json.type = this.type; json.repr = this.repr; return json; }; NumberToken.prototype.toSource = function() { return this.repr; }; function PercentageToken() { this.value = null; this.repr = ""; } PercentageToken.prototype = Object.create(CSSParserToken.prototype); PercentageToken.prototype.tokenType = "percentage"; PercentageToken.prototype.toString = function() { return "PERCENTAGE("+this.value+")"; }; PercentageToken.prototype.toJSON = function() { var json = this.constructor.prototype.constructor.prototype.toJSON.call(this); json.value = this.value; json.repr = this.repr; return json; }; PercentageToken.prototype.toSource = function() { return this.repr + "%"; }; function DimensionToken() { this.value = null; this.type = "integer"; this.repr = ""; this.unit = ""; } DimensionToken.prototype = Object.create(CSSParserToken.prototype); DimensionToken.prototype.tokenType = "dimension"; DimensionToken.prototype.toString = function() { return "DIM("+this.value+","+this.unit+")"; }; DimensionToken.prototype.toJSON = function() { var json = this.constructor.prototype.constructor.prototype.toJSON.call(this); json.value = this.value; json.type = this.type; json.repr = this.repr; json.unit = this.unit; return json; }; DimensionToken.prototype.toSource = function() { var source = this.repr; var unit = escapeIdent(this.unit); if(unit[0].toLowerCase() == "e" && (unit[1] == "-" || between(unit.charCodeAt(1), 0x30, 0x39))) { // Unit is ambiguous with scinot // Remove the leading "e", replace with escape. unit = "\\65 " + unit.slice(1, unit.length); } return source+unit; }; function escapeIdent(string) { string = ''+string; var result = ''; var firstcode = string.charCodeAt(0); for(var i = 0; i < string.length; i++) { var code = string.charCodeAt(i); if(code === 0x0) { throw new InvalidCharacterError('Invalid character: the input contains U+0000.'); } if( between(code, 0x1, 0x1f) || code == 0x7f || (i === 0 && between(code, 0x30, 0x39)) || (i == 1 && between(code, 0x30, 0x39) && firstcode == 0x2d) ) { result += '\\' + code.toString(16) + ' '; } else if( code >= 0x80 || code == 0x2d || code == 0x5f || between(code, 0x30, 0x39) || between(code, 0x41, 0x5a) || between(code, 0x61, 0x7a) ) { result += string[i]; } else { result += '\\' + string[i]; } } return result; } function escapeHash(string) { // Escapes the contents of "unrestricted"-type hash tokens. // Won't preserve the ID-ness of "id"-type hash tokens; // use escapeIdent() for that. string = ''+string; var result = ''; for(var i = 0; i < string.length; i++) { var code = string.charCodeAt(i); if(code === 0x0) { throw new InvalidCharacterError('Invalid character: the input contains U+0000.'); } if( code >= 0x80 || code == 0x2d || code == 0x5f || between(code, 0x30, 0x39) || between(code, 0x41, 0x5a) || between(code, 0x61, 0x7a) ) { result += string[i]; } else { result += '\\' + code.toString(16) + ' '; } } return result; } function escapeString(string) { string = ''+string; var result = ''; for(var i = 0; i < string.length; i++) { var code = string.charCodeAt(i); if(code === 0x0) { throw new InvalidCharacterError('Invalid character: the input contains U+0000.'); } if(between(code, 0x1, 0x1f) || code == 0x7f) { result += '\\' + code.toString(16) + ' '; } else if(code == 0x22 || code == 0x5c) { result += '\\' + string[i]; } else { result += string[i]; } } return result; } // Exportation. exports.tokenize = tokenize; exports.IdentToken = IdentToken; exports.FunctionToken = FunctionToken; exports.AtKeywordToken = AtKeywordToken; exports.HashToken = HashToken; exports.StringToken = StringToken; exports.BadStringToken = BadStringToken; exports.URLToken = URLToken; exports.BadURLToken = BadURLToken; exports.DelimToken = DelimToken; exports.NumberToken = NumberToken; exports.PercentageToken = PercentageToken; exports.DimensionToken = DimensionToken; exports.IncludeMatchToken = IncludeMatchToken; exports.DashMatchToken = DashMatchToken; exports.PrefixMatchToken = PrefixMatchToken; exports.SuffixMatchToken = SuffixMatchToken; exports.SubstringMatchToken = SubstringMatchToken; exports.ColumnToken = ColumnToken; exports.WhitespaceToken = WhitespaceToken; exports.CDOToken = CDOToken; exports.CDCToken = CDCToken; exports.ColonToken = ColonToken; exports.SemicolonToken = SemicolonToken; exports.CommaToken = CommaToken; exports.OpenParenToken = OpenParenToken; exports.CloseParenToken = CloseParenToken; exports.OpenSquareToken = OpenSquareToken; exports.CloseSquareToken = CloseSquareToken; exports.OpenCurlyToken = OpenCurlyToken; exports.CloseCurlyToken = CloseCurlyToken; exports.EOFToken = EOFToken; exports.CSSParserToken = CSSParserToken; exports.GroupingToken = GroupingToken; function TokenStream(tokens) { // Assume that tokens is a iterator. this.tokens = tokens; this.token = undefined; this.stored = []; } TokenStream.prototype.consume = function(num) { if(num === undefined) num = 1; while (num-- > 0) { if (this.stored.length > 0) { this.token = this.stored.shift(); } else { var n = this.tokens.next(); while (!n.done && n.value instanceof CommentToken) { n = this.tokens.next(); } if (n.done) { this.token = new EOFToken(); break; } this.token = n.value; } } //console.log(this.i, this.token); return true; }; TokenStream.prototype.next = function() { if (this.stored.length === 0) { var n = this.tokens.next(); while (!n.done && n.value instanceof CommentToken) { n = this.tokens.next(); } if (n.done) return new EOFToken(); this.stored.push(n.value); } return this.stored[0]; }; TokenStream.prototype.reconsume = function() { this.stored.unshift(this.token); }; function parseerror(s, msg) { console.log("Parse error at token " + s.i + ": " + s.token + ".\n" + msg); return true; } function donothing(){ return true; } function consumeAListOfRules(s, topLevel) { var rules = []; var rule; while(s.consume()) { if(s.token instanceof WhitespaceToken) { continue; } else if(s.token instanceof EOFToken) { return rules; } else if(s.token instanceof CDOToken || s.token instanceof CDCToken) { if(topLevel == "top-level") continue; s.reconsume(); if(rule = consumeAQualifiedRule(s)) rules.push(rule); } else if(s.token instanceof AtKeywordToken) { s.reconsume(); if(rule = consumeAnAtRule(s)) rules.push(rule); } else { s.reconsume(); if(rule = consumeAQualifiedRule(s)) rules.push(rule); } } } function consumeAnAtRule(s) { s.consume(); var rule = new AtRule(s.token.value); while(s.consume()) { if(s.token instanceof SemicolonToken || s.token instanceof EOFToken) { return rule; } else if(s.token instanceof OpenCurlyToken) { rule.value = consumeASimpleBlock(s); return rule; } else { s.reconsume(); rule.prelude.push(consumeAComponentValue(s)); } } } function consumeAQualifiedRule(s) { var rule = new QualifiedRule(); while(s.consume()) { if(s.token instanceof EOFToken) { parseerror(s, "Hit EOF when trying to parse the prelude of a qualified rule."); return; } else if(s.token instanceof OpenCurlyToken) { rule.value = consumeASimpleBlock(s); return rule; } else { s.reconsume(); rule.prelude.push(consumeAComponentValue(s)); } } } function consumeAListOfDeclarations(s) { var decls = []; while(s.consume()) { if(s.token instanceof WhitespaceToken || s.token instanceof SemicolonToken) { donothing(); } else if(s.token instanceof EOFToken) { return decls; } else if(s.token instanceof AtKeywordToken) { s.reconsume(); decls.push(consumeAnAtRule(s)); } else if(s.token instanceof IdentToken) { var temp = [s.token]; while(!(s.next() instanceof SemicolonToken || s.next() instanceof EOFToken)) temp.push(consumeAComponentValue(s)); var decl; if(decl = consumeADeclaration(new TokenStream(temp))) decls.push(decl); } else { parseerror(s); s.reconsume(); while(!(s.next() instanceof SemicolonToken || s.next() instanceof EOFToken)) consumeAComponentValue(s); } } } function consumeADeclaration(s) { // Assumes that the next input token will be an ident token. s.consume(); var decl = new Declaration(s.token.value); while(s.next() instanceof WhitespaceToken) s.consume(); if(!(s.next() instanceof ColonToken)) { parseerror(s); return; } else { s.consume(); } while(!(s.next() instanceof EOFToken)) { decl.value.push(consumeAComponentValue(s)); } var foundImportant = false; for(var i = decl.value.length - 1; i >= 0; i--) { if(decl.value[i] instanceof WhitespaceToken) { continue; } else if(decl.value[i] instanceof IdentToken && decl.value[i].ASCIIMatch("important")) { foundImportant = true; } else if(foundImportant && decl.value[i] instanceof DelimToken && decl.value[i].value == "!") { decl.value.splice(i, decl.value.length); decl.important = true; break; } else { break; } } return decl; } function consumeAComponentValue(s) { s.consume(); if(s.token instanceof OpenCurlyToken || s.token instanceof OpenSquareToken || s.token instanceof OpenParenToken) return consumeASimpleBlock(s); if(s.token instanceof FunctionToken) return consumeAFunction(s); return s.token; } function consumeASimpleBlock(s) { var mirror = s.token.mirror; var block = new SimpleBlock(s.token.value); block.startToken = s.token; while(s.consume()) { if(s.token instanceof EOFToken || (s.token instanceof GroupingToken && s.token.value == mirror)) return block; else { s.reconsume(); block.value.push(consumeAComponentValue(s)); } } } function consumeAFunction(s) { var func = new Func(s.token.value); while(s.consume()) { if(s.token instanceof EOFToken || s.token instanceof CloseParenToken) return func; else { s.reconsume(); func.value.push(consumeAComponentValue(s)); } } } function normalizeInput(input) { if(typeof input == "string") return new TokenStream(tokenize(input)); if(input instanceof TokenStream) return input; if(typeof (input.next) == "function") return new TokenStream(input); if(input.length !== undefined) return new TokenStream(input[Symbol.iterator]()); else throw SyntaxError(input); } function parseAStylesheet(s) { s = normalizeInput(s); var sheet = new Stylesheet(); sheet.value = consumeAListOfRules(s, "top-level"); return sheet; } function parseAListOfRules(s) { s = normalizeInput(s); return consumeAListOfRules(s); } function parseARule(s) { s = normalizeInput(s); while(s.next() instanceof WhitespaceToken) s.consume(); if(s.next() instanceof EOFToken) throw SyntaxError(); var rule; var startToken = s.next(); if(startToken instanceof AtKeywordToken) { rule = consumeAnAtRule(s); } else { rule = consumeAQualifiedRule(s); if(!rule) throw SyntaxError(); } rule.startToken = startToken; rule.endToken = s.token; return rule; } function parseADeclaration(s) { s = normalizeInput(s); while(s.next() instanceof WhitespaceToken) s.consume(); if(!(s.next() instanceof IdentToken)) throw SyntaxError(); var decl = consumeADeclaration(s); if(decl) return decl; else throw SyntaxError(); } function parseAListOfDeclarations(s) { s = normalizeInput(s); return consumeAListOfDeclarations(s); } function parseAComponentValue(s) { s = normalizeInput(s); while(s.next() instanceof WhitespaceToken) s.consume(); if(s.next() instanceof EOFToken) throw SyntaxError(); var val = consumeAComponentValue(s); if(!val) throw SyntaxError(); while(s.next() instanceof WhitespaceToken) s.consume(); if(s.next() instanceof EOFToken) return val; throw SyntaxError(); } function parseAListOfComponentValues(s) { s = normalizeInput(s); var vals = []; while(true) { var val = consumeAComponentValue(s); if(val instanceof EOFToken) return vals; else vals.push(val); } } function parseACommaSeparatedListOfComponentValues(s) { s = normalizeInput(s); var listOfCVLs = []; while(true) { var vals = []; while(true) { var val = consumeAComponentValue(s); if(val instanceof EOFToken) { listOfCVLs.push(vals); return listOfCVLs; } else if(val instanceof CommaToken) { listOfCVLs.push(vals); break; } else { vals.push(val); } } } } function CSSParserRule() { throw "Abstract Base Class"; } CSSParserRule.prototype.toString = function(indent) { return JSON.stringify(this,null,indent); }; CSSParserRule.prototype.toJSON = function() { return {type:this.type, value:this.value}; }; function Stylesheet() { this.value = []; return this; } Stylesheet.prototype = Object.create(CSSParserRule.prototype); Stylesheet.prototype.type = "STYLESHEET"; function AtRule(name) { this.name = name; this.prelude = []; this.value = null; return this; } AtRule.prototype = Object.create(CSSParserRule.prototype); AtRule.prototype.type = "AT-RULE"; AtRule.prototype.toJSON = function() { var json = this.constructor.prototype.constructor.prototype.toJSON.call(this); json.name = this.name; json.prelude = this.prelude; return json; }; function QualifiedRule() { this.prelude = []; this.value = []; return this; } QualifiedRule.prototype = Object.create(CSSParserRule.prototype); QualifiedRule.prototype.type = "QUALIFIED-RULE"; QualifiedRule.prototype.toJSON = function() { var json = this.constructor.prototype.constructor.prototype.toJSON.call(this); json.prelude = this.prelude; return json; }; function Declaration(name) { this.name = name; this.value = []; this.important = false; return this; } Declaration.prototype = Object.create(CSSParserRule.prototype); Declaration.prototype.type = "DECLARATION"; Declaration.prototype.toJSON = function() { var json = this.constructor.prototype.constructor.prototype.toJSON.call(this); json.name = this.name; json.important = this.important; return json; }; function SimpleBlock(type) { this.name = type; this.value = []; return this; } SimpleBlock.prototype = Object.create(CSSParserRule.prototype); SimpleBlock.prototype.type = "BLOCK"; SimpleBlock.prototype.toJSON = function() { var json = this.constructor.prototype.constructor.prototype.toJSON.call(this); json.name = this.name; return json; }; function Func(name) { this.name = name; this.value = []; return this; } Func.prototype = Object.create(CSSParserRule.prototype); Func.prototype.type = "FUNCTION"; Func.prototype.toJSON = function() { var json = this.constructor.prototype.constructor.prototype.toJSON.call(this); json.name = this.name; return json; }; function CSSLexer(text) { this.stream = tokenize(text, { loc: true, offsets: true, keepComments: true }); this.lineNumber = 0; this.columnNumber = 0; return this; } CSSLexer.prototype.performEOFFixup = function(input, preserveBackslash) { // Just lie for now. return ""; }; CSSLexer.prototype.nextToken = function() { if (!this.stream) { return null; } let v = this.stream.next(); if (v.done || v.value.tokenType === "EOF") { this.stream = null; return null; } this.lineNumber = v.value.loc.start.line; this.columnNumber = v.value.loc.start.column; return v.value; }; // Exportation. exports.CSSParserRule = CSSParserRule; exports.Stylesheet = Stylesheet; exports.AtRule = AtRule; exports.QualifiedRule = QualifiedRule; exports.Declaration = Declaration; exports.SimpleBlock = SimpleBlock; exports.Func = Func; exports.parseAStylesheet = parseAStylesheet; exports.parseAListOfRules = parseAListOfRules; exports.parseARule = parseARule; exports.parseADeclaration = parseADeclaration; exports.parseAListOfDeclarations = parseAListOfDeclarations; exports.parseAComponentValue = parseAComponentValue; exports.parseAListOfComponentValues = parseAListOfComponentValues; exports.parseACommaSeparatedListOfComponentValues = parseACommaSeparatedListOfComponentValues; exports.CSSLexer = CSSLexer; })); /***/ }, /* 38 */ /***/ function(module, exports) { // auto-generated from nsColorNameList.h var cssColors = { aliceblue: [240, 248, 255], antiquewhite: [250, 235, 215], aqua: [0, 255, 255], aquamarine: [127, 255, 212], azure: [240, 255, 255], beige: [245, 245, 220], bisque: [255, 228, 196], black: [0, 0, 0], blanchedalmond: [255, 235, 205], blue: [0, 0, 255], blueviolet: [138, 43, 226], brown: [165, 42, 42], burlywood: [222, 184, 135], cadetblue: [95, 158, 160], chartreuse: [127, 255, 0], chocolate: [210, 105, 30], coral: [255, 127, 80], cornflowerblue: [100, 149, 237], cornsilk: [255, 248, 220], crimson: [220, 20, 60], cyan: [0, 255, 255], darkblue: [0, 0, 139], darkcyan: [0, 139, 139], darkgoldenrod: [184, 134, 11], darkgray: [169, 169, 169], darkgreen: [0, 100, 0], darkgrey: [169, 169, 169], darkkhaki: [189, 183, 107], darkmagenta: [139, 0, 139], darkolivegreen: [85, 107, 47], darkorange: [255, 140, 0], darkorchid: [153, 50, 204], darkred: [139, 0, 0], darksalmon: [233, 150, 122], darkseagreen: [143, 188, 143], darkslateblue: [72, 61, 139], darkslategray: [47, 79, 79], darkslategrey: [47, 79, 79], darkturquoise: [0, 206, 209], darkviolet: [148, 0, 211], deeppink: [255, 20, 147], deepskyblue: [0, 191, 255], dimgray: [105, 105, 105], dimgrey: [105, 105, 105], dodgerblue: [30, 144, 255], firebrick: [178, 34, 34], floralwhite: [255, 250, 240], forestgreen: [34, 139, 34], fuchsia: [255, 0, 255], gainsboro: [220, 220, 220], ghostwhite: [248, 248, 255], gold: [255, 215, 0], goldenrod: [218, 165, 32], gray: [128, 128, 128], grey: [128, 128, 128], green: [0, 128, 0], greenyellow: [173, 255, 47], honeydew: [240, 255, 240], hotpink: [255, 105, 180], indianred: [205, 92, 92], indigo: [75, 0, 130], ivory: [255, 255, 240], khaki: [240, 230, 140], lavender: [230, 230, 250], lavenderblush: [255, 240, 245], lawngreen: [124, 252, 0], lemonchiffon: [255, 250, 205], lightblue: [173, 216, 230], lightcoral: [240, 128, 128], lightcyan: [224, 255, 255], lightgoldenrodyellow: [250, 250, 210], lightgray: [211, 211, 211], lightgreen: [144, 238, 144], lightgrey: [211, 211, 211], lightpink: [255, 182, 193], lightsalmon: [255, 160, 122], lightseagreen: [32, 178, 170], lightskyblue: [135, 206, 250], lightslategray: [119, 136, 153], lightslategrey: [119, 136, 153], lightsteelblue: [176, 196, 222], lightyellow: [255, 255, 224], lime: [0, 255, 0], limegreen: [50, 205, 50], linen: [250, 240, 230], magenta: [255, 0, 255], maroon: [128, 0, 0], mediumaquamarine: [102, 205, 170], mediumblue: [0, 0, 205], mediumorchid: [186, 85, 211], mediumpurple: [147, 112, 219], mediumseagreen: [60, 179, 113], mediumslateblue: [123, 104, 238], mediumspringgreen: [0, 250, 154], mediumturquoise: [72, 209, 204], mediumvioletred: [199, 21, 133], midnightblue: [25, 25, 112], mintcream: [245, 255, 250], mistyrose: [255, 228, 225], moccasin: [255, 228, 181], navajowhite: [255, 222, 173], navy: [0, 0, 128], oldlace: [253, 245, 230], olive: [128, 128, 0], olivedrab: [107, 142, 35], orange: [255, 165, 0], orangered: [255, 69, 0], orchid: [218, 112, 214], palegoldenrod: [238, 232, 170], palegreen: [152, 251, 152], paleturquoise: [175, 238, 238], palevioletred: [219, 112, 147], papayawhip: [255, 239, 213], peachpuff: [255, 218, 185], peru: [205, 133, 63], pink: [255, 192, 203], plum: [221, 160, 221], powderblue: [176, 224, 230], purple: [128, 0, 128], rebeccapurple: [102, 51, 153], red: [255, 0, 0], rosybrown: [188, 143, 143], royalblue: [65, 105, 225], saddlebrown: [139, 69, 19], salmon: [250, 128, 114], sandybrown: [244, 164, 96], seagreen: [46, 139, 87], seashell: [255, 245, 238], sienna: [160, 82, 45], silver: [192, 192, 192], skyblue: [135, 206, 235], slateblue: [106, 90, 205], slategray: [112, 128, 144], slategrey: [112, 128, 144], snow: [255, 250, 250], springgreen: [0, 255, 127], steelblue: [70, 130, 180], tan: [210, 180, 140], teal: [0, 128, 128], thistle: [216, 191, 216], tomato: [255, 99, 71], turquoise: [64, 224, 208], violet: [238, 130, 238], wheat: [245, 222, 179], white: [255, 255, 255], whitesmoke: [245, 245, 245], yellow: [255, 255, 0], yellowgreen: [154, 205, 50], }; module.exports = { cssColors }; /***/ }, /* 39 */ /***/ function(module, exports) { // auto-generated by means you would rather not know var cssProperties = { "-moz-appearance": { inherited: false, supports: 0, values: ["-moz-gtk-info-bar", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "caret", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "dialog", "dualbutton", "groupbox", "inherit", "initial", "listbox", "listitem", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "none", "number-input", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "resizer", "resizerpanel", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "scrollbar", "scrollbar-small", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "searchfield", "separator", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "statusbar", "statusbarpanel", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "tabpanel", "tabpanels", "textfield", "textfield-multiline", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "unset", "window", ], }, "-moz-outline-radius-topleft": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-moz-outline-radius-topright": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-moz-outline-radius-bottomright": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-moz-outline-radius-bottomleft": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-moz-tab-size": { inherited: true, supports: 1024, values: ["inherit", "initial", "unset", ], }, "animation-delay": { inherited: false, supports: 64, values: ["inherit", "initial", "unset", ], }, "animation-direction": { inherited: false, supports: 0, values: ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset", ], }, "animation-duration": { inherited: false, supports: 64, values: ["inherit", "initial", "unset", ], }, "animation-fill-mode": { inherited: false, supports: 0, values: ["backwards", "both", "forwards", "inherit", "initial", "none", "unset", ], }, "animation-iteration-count": { inherited: false, supports: 1024, values: ["infinite", "inherit", "initial", "unset", ], }, "animation-name": { inherited: false, supports: 0, values: ["inherit", "initial", "none", "unset", ], }, "animation-play-state": { inherited: false, supports: 0, values: ["inherit", "initial", "paused", "running", "unset", ], }, "animation-timing-function": { inherited: false, supports: 256, values: ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset", ], }, "background-attachment": { inherited: false, supports: 0, values: ["fixed", "inherit", "initial", "local", "scroll", "unset", ], }, "background-clip": { inherited: false, supports: 0, values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ], }, "background-color": { inherited: false, supports: 4, values: ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "background-image": { inherited: false, supports: 648, values: ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url", ], }, "background-blend-mode": { inherited: false, supports: 0, values: ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset", ], }, "background-origin": { inherited: false, supports: 0, values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ], }, "background-position": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "background-repeat": { inherited: false, supports: 0, values: ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "unset", ], }, "background-size": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-moz-binding": { inherited: false, supports: 8, values: ["inherit", "initial", "none", "unset", "url", ], }, "block-size": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "border-block-end-color": { inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-block-end-style": { inherited: false, supports: 0, values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "border-block-end-width": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "border-block-start-color": { inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-block-start-style": { inherited: false, supports: 0, values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "border-block-start-width": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "border-bottom-color": { inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "-moz-border-bottom-colors": { inherited: false, supports: 4, values: ["inherit", "initial", "unset", ], }, "border-bottom-style": { inherited: false, supports: 0, values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "border-bottom-width": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "border-collapse": { inherited: true, supports: 0, values: ["collapse", "inherit", "initial", "separate", "unset", ], }, "border-image-source": { inherited: false, supports: 648, values: ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url", ], }, "border-image-slice": { inherited: false, supports: 1026, values: ["inherit", "initial", "unset", ], }, "border-image-width": { inherited: false, supports: 1027, values: ["inherit", "initial", "unset", ], }, "border-image-outset": { inherited: false, supports: 1025, values: ["inherit", "initial", "unset", ], }, "border-image-repeat": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "border-inline-end-color": { inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-inline-end-style": { inherited: false, supports: 0, values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "border-inline-end-width": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "border-inline-start-color": { inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-inline-start-style": { inherited: false, supports: 0, values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "border-inline-start-width": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "border-left-color": { inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "-moz-border-left-colors": { inherited: false, supports: 4, values: ["inherit", "initial", "unset", ], }, "border-left-style": { inherited: false, supports: 0, values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "border-left-width": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "border-right-color": { inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "-moz-border-right-colors": { inherited: false, supports: 4, values: ["inherit", "initial", "unset", ], }, "border-right-style": { inherited: false, supports: 0, values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "border-right-width": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "border-spacing": { inherited: true, supports: 1, values: ["inherit", "initial", "unset", ], }, "border-top-color": { inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "-moz-border-top-colors": { inherited: false, supports: 4, values: ["inherit", "initial", "unset", ], }, "border-top-style": { inherited: false, supports: 0, values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "border-top-width": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "border-top-left-radius": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "border-top-right-radius": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "border-bottom-right-radius": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "border-bottom-left-radius": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "bottom": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "box-decoration-break": { inherited: false, supports: 0, values: ["clone", "inherit", "initial", "slice", "unset", ], }, "box-shadow": { inherited: false, supports: 5, values: ["inherit", "initial", "unset", ], }, "box-sizing": { inherited: false, supports: 0, values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ], }, "caption-side": { inherited: true, supports: 0, values: ["bottom", "bottom-outside", "inherit", "initial", "left", "right", "top", "top-outside", "unset", ], }, "clear": { inherited: false, supports: 0, values: ["both", "inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset", ], }, "clip": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "color": { inherited: true, supports: 4, values: ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "-moz-column-count": { inherited: false, supports: 1024, values: ["auto", "inherit", "initial", "unset", ], }, "-moz-column-fill": { inherited: false, supports: 0, values: ["auto", "balance", "inherit", "initial", "unset", ], }, "-moz-column-width": { inherited: false, supports: 1, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "-moz-column-gap": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "normal", "unset", ], }, "-moz-column-rule-color": { inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "-moz-column-rule-style": { inherited: false, supports: 0, values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "-moz-column-rule-width": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "contain": { inherited: false, supports: 0, values: ["inherit", "initial", "layout", "none", "paint", "strict", "style", "unset", ], }, "content": { inherited: false, supports: 8, values: ["inherit", "initial", "unset", ], }, "-moz-control-character-visibility": { inherited: true, supports: 0, values: ["hidden", "inherit", "initial", "unset", "visible", ], }, "counter-increment": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "counter-reset": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "cursor": { inherited: true, supports: 8, values: ["inherit", "initial", "unset", ], }, "direction": { inherited: true, supports: 0, values: ["inherit", "initial", "ltr", "rtl", "unset", ], }, "display": { inherited: false, supports: 0, values: ["-moz-box", "-moz-deck", "-moz-grid", "-moz-grid-group", "-moz-grid-line", "-moz-groupbox", "-moz-inline-box", "-moz-inline-grid", "-moz-inline-stack", "-moz-popup", "-moz-stack", "block", "contents", "flex", "grid", "inherit", "initial", "inline", "inline-block", "inline-flex", "inline-grid", "inline-table", "list-item", "none", "ruby", "ruby-base", "ruby-base-container", "ruby-text", "ruby-text-container", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "unset", ], }, "empty-cells": { inherited: true, supports: 0, values: ["hide", "inherit", "initial", "show", "unset", ], }, "align-content": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "align-items": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "align-self": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "flex-basis": { inherited: false, supports: 3, values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ], }, "flex-direction": { inherited: false, supports: 0, values: ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset", ], }, "flex-grow": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "flex-shrink": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "flex-wrap": { inherited: false, supports: 0, values: ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse", ], }, "order": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "justify-content": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "justify-items": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "justify-self": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "float": { inherited: false, supports: 0, values: ["inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset", ], }, "-moz-float-edge": { inherited: false, supports: 0, values: ["content-box", "inherit", "initial", "margin-box", "unset", ], }, "font-family": { inherited: true, supports: 0, values: ["inherit", "initial", "unset", ], }, "font-feature-settings": { inherited: true, supports: 0, values: ["inherit", "initial", "unset", ], }, "font-kerning": { inherited: true, supports: 0, values: ["auto", "inherit", "initial", "none", "normal", "unset", ], }, "font-language-override": { inherited: true, supports: 0, values: ["inherit", "initial", "normal", "unset", ], }, "font-size": { inherited: true, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "large", "larger", "medium", "small", "smaller", "unset", "x-large", "x-small", "xx-large", "xx-small", ], }, "font-size-adjust": { inherited: true, supports: 1024, values: ["inherit", "initial", "none", "unset", ], }, "font-stretch": { inherited: true, supports: 0, values: ["condensed", "expanded", "extra-condensed", "extra-expanded", "inherit", "initial", "normal", "semi-condensed", "semi-expanded", "ultra-condensed", "ultra-expanded", "unset", ], }, "font-style": { inherited: true, supports: 0, values: ["inherit", "initial", "italic", "normal", "oblique", "unset", ], }, "font-synthesis": { inherited: true, supports: 0, values: ["inherit", "initial", "unset", ], }, "font-variant-alternates": { inherited: true, supports: 0, values: ["inherit", "initial", "unset", ], }, "font-variant-caps": { inherited: true, supports: 0, values: ["all-petite-caps", "all-small-caps", "inherit", "initial", "normal", "petite-caps", "small-caps", "titling-caps", "unicase", "unset", ], }, "font-variant-east-asian": { inherited: true, supports: 0, values: ["inherit", "initial", "unset", ], }, "font-variant-ligatures": { inherited: true, supports: 0, values: ["inherit", "initial", "unset", ], }, "font-variant-numeric": { inherited: true, supports: 0, values: ["inherit", "initial", "unset", ], }, "font-variant-position": { inherited: true, supports: 0, values: ["inherit", "initial", "normal", "sub", "super", "unset", ], }, "font-weight": { inherited: true, supports: 1024, values: ["inherit", "initial", "unset", ], }, "-moz-force-broken-image-icon": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "grid-auto-flow": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "grid-auto-columns": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "grid-auto-rows": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "grid-template-areas": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "grid-template-columns": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "grid-template-rows": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "grid-column-start": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "grid-column-end": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "grid-row-start": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "grid-row-end": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "grid-column-gap": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "grid-row-gap": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "height": { inherited: false, supports: 3, values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ], }, "image-orientation": { inherited: true, supports: 16, values: ["inherit", "initial", "unset", ], }, "-moz-image-region": { inherited: true, supports: 0, values: ["inherit", "initial", "unset", ], }, "ime-mode": { inherited: false, supports: 0, values: ["active", "auto", "disabled", "inactive", "inherit", "initial", "normal", "unset", ], }, "inline-size": { inherited: false, supports: 3, values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ], }, "left": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "letter-spacing": { inherited: true, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "normal", "unset", ], }, "line-height": { inherited: true, supports: 1027, values: ["-moz-block-height", "inherit", "initial", "normal", "unset", ], }, "list-style-image": { inherited: true, supports: 8, values: ["inherit", "initial", "none", "unset", "url", ], }, "list-style-position": { inherited: true, supports: 0, values: ["inherit", "initial", "inside", "outside", "unset", ], }, "list-style-type": { inherited: true, supports: 0, values: ["inherit", "initial", "unset", ], }, "margin-block-end": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "margin-block-start": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "margin-bottom": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "margin-inline-end": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "margin-inline-start": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "margin-left": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "margin-right": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "margin-top": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "marker-offset": { inherited: false, supports: 1, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "max-block-size": { inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "none", "unset", ], }, "max-height": { inherited: false, supports: 3, values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset", ], }, "max-inline-size": { inherited: false, supports: 3, values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset", ], }, "max-width": { inherited: false, supports: 3, values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset", ], }, "min-height": { inherited: false, supports: 3, values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ], }, "min-block-size": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "min-inline-size": { inherited: false, supports: 3, values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ], }, "min-width": { inherited: false, supports: 3, values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ], }, "mix-blend-mode": { inherited: false, supports: 0, values: ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset", ], }, "isolation": { inherited: false, supports: 0, values: ["auto", "inherit", "initial", "isolate", "unset", ], }, "object-fit": { inherited: false, supports: 0, values: ["contain", "cover", "fill", "inherit", "initial", "none", "scale-down", "unset", ], }, "object-position": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "offset-block-end": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "offset-block-start": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "offset-inline-end": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "offset-inline-start": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "opacity": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "-moz-orient": { inherited: false, supports: 0, values: ["block", "horizontal", "inherit", "initial", "inline", "unset", "vertical", ], }, "outline-color": { inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "outline-style": { inherited: false, supports: 0, values: ["auto", "dashed", "dotted", "double", "groove", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "outline-width": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "outline-offset": { inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "overflow-x": { inherited: false, supports: 0, values: ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible", ], }, "overflow-y": { inherited: false, supports: 0, values: ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible", ], }, "padding-block-end": { inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "padding-block-start": { inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "padding-bottom": { inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "padding-inline-end": { inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "padding-inline-start": { inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "padding-left": { inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "padding-right": { inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "padding-top": { inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "page-break-after": { inherited: false, supports: 0, values: ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset", ], }, "page-break-before": { inherited: false, supports: 0, values: ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset", ], }, "page-break-inside": { inherited: false, supports: 0, values: ["auto", "avoid", "inherit", "initial", "unset", ], }, "paint-order": { inherited: true, supports: 0, values: ["inherit", "initial", "unset", ], }, "pointer-events": { inherited: true, supports: 0, values: ["all", "auto", "fill", "inherit", "initial", "none", "painted", "stroke", "unset", "visible", "visiblefill", "visiblepainted", "visiblestroke", ], }, "position": { inherited: false, supports: 0, values: ["absolute", "fixed", "inherit", "initial", "relative", "static", "sticky", "unset", ], }, "quotes": { inherited: true, supports: 0, values: ["inherit", "initial", "unset", ], }, "resize": { inherited: false, supports: 0, values: ["both", "horizontal", "inherit", "initial", "none", "unset", "vertical", ], }, "right": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "ruby-align": { inherited: true, supports: 0, values: ["center", "inherit", "initial", "space-around", "space-between", "start", "unset", ], }, "ruby-position": { inherited: true, supports: 0, values: ["inherit", "initial", "over", "under", "unset", ], }, "scroll-behavior": { inherited: false, supports: 0, values: ["auto", "inherit", "initial", "smooth", "unset", ], }, "scroll-snap-coordinate": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "scroll-snap-destination": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "scroll-snap-points-x": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "scroll-snap-points-y": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "scroll-snap-type-x": { inherited: false, supports: 0, values: ["inherit", "initial", "mandatory", "none", "proximity", "unset", ], }, "scroll-snap-type-y": { inherited: false, supports: 0, values: ["inherit", "initial", "mandatory", "none", "proximity", "unset", ], }, "table-layout": { inherited: false, supports: 0, values: ["auto", "fixed", "inherit", "initial", "unset", ], }, "text-align": { inherited: true, supports: 0, values: ["-moz-center", "-moz-left", "-moz-right", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset", ], }, "-moz-text-align-last": { inherited: true, supports: 0, values: ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset", ], }, "text-decoration-color": { inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "text-decoration-line": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "text-decoration-style": { inherited: false, supports: 0, values: ["-moz-none", "dashed", "dotted", "double", "inherit", "initial", "solid", "unset", "wavy", ], }, "text-indent": { inherited: true, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "text-orientation": { inherited: true, supports: 0, values: ["inherit", "initial", "mixed", "sideways", "sideways-right", "unset", "upright", ], }, "text-overflow": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "text-shadow": { inherited: true, supports: 5, values: ["inherit", "initial", "unset", ], }, "-moz-text-size-adjust": { inherited: true, supports: 0, values: ["auto", "inherit", "initial", "none", "unset", ], }, "text-transform": { inherited: true, supports: 0, values: ["capitalize", "full-width", "inherit", "initial", "lowercase", "none", "unset", "uppercase", ], }, "transform": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "transform-box": { inherited: false, supports: 0, values: ["border-box", "fill-box", "inherit", "initial", "unset", "view-box", ], }, "transform-origin": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "perspective-origin": { inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "perspective": { inherited: false, supports: 1, values: ["inherit", "initial", "none", "unset", ], }, "transform-style": { inherited: false, supports: 0, values: ["flat", "inherit", "initial", "preserve-3d", "unset", ], }, "backface-visibility": { inherited: false, supports: 0, values: ["hidden", "inherit", "initial", "unset", "visible", ], }, "top": { inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "transition-delay": { inherited: false, supports: 64, values: ["inherit", "initial", "unset", ], }, "transition-duration": { inherited: false, supports: 64, values: ["inherit", "initial", "unset", ], }, "transition-property": { inherited: false, supports: 0, values: ["all", "inherit", "initial", "none", "unset", ], }, "transition-timing-function": { inherited: false, supports: 256, values: ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset", ], }, "unicode-bidi": { inherited: false, supports: 0, values: ["-moz-isolate", "-moz-isolate-override", "-moz-plaintext", "bidi-override", "embed", "inherit", "initial", "normal", "unset", ], }, "-moz-user-focus": { inherited: true, supports: 0, values: ["ignore", "inherit", "initial", "none", "normal", "select-after", "select-all", "select-before", "select-menu", "select-same", "unset", ], }, "-moz-user-input": { inherited: true, supports: 0, values: ["auto", "disabled", "enabled", "inherit", "initial", "none", "unset", ], }, "-moz-user-modify": { inherited: true, supports: 0, values: ["inherit", "initial", "read-only", "read-write", "unset", "write-only", ], }, "-moz-user-select": { inherited: false, supports: 0, values: ["-moz-all", "-moz-none", "-moz-text", "all", "auto", "element", "elements", "inherit", "initial", "none", "text", "toggle", "tri-state", "unset", ], }, "vertical-align": { inherited: false, supports: 3, values: ["-moz-calc", "-moz-middle-with-baseline", "baseline", "bottom", "calc", "inherit", "initial", "middle", "sub", "super", "text-bottom", "text-top", "top", "unset", ], }, "visibility": { inherited: true, supports: 0, values: ["collapse", "hidden", "inherit", "initial", "unset", "visible", ], }, "white-space": { inherited: true, supports: 0, values: ["-moz-pre-space", "inherit", "initial", "normal", "nowrap", "pre", "pre-line", "pre-wrap", "unset", ], }, "width": { inherited: false, supports: 3, values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ], }, "-moz-window-dragging": { inherited: true, supports: 0, values: ["drag", "inherit", "initial", "no-drag", "unset", ], }, "word-break": { inherited: true, supports: 0, values: ["break-all", "inherit", "initial", "keep-all", "normal", "unset", ], }, "word-spacing": { inherited: true, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "normal", "unset", ], }, "word-wrap": { inherited: true, supports: 0, values: ["break-word", "inherit", "initial", "normal", "unset", ], }, "hyphens": { inherited: true, supports: 0, values: ["auto", "inherit", "initial", "manual", "none", "unset", ], }, "writing-mode": { inherited: true, supports: 0, values: ["horizontal-tb", "inherit", "initial", "lr", "lr-tb", "rl", "rl-tb", "sideways-lr", "sideways-rl", "tb", "tb-rl", "unset", "vertical-lr", "vertical-rl", ], }, "z-index": { inherited: false, supports: 1024, values: ["auto", "inherit", "initial", "unset", ], }, "-moz-box-align": { inherited: false, supports: 0, values: ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset", ], }, "-moz-box-direction": { inherited: false, supports: 0, values: ["inherit", "initial", "normal", "reverse", "unset", ], }, "-moz-box-flex": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "-moz-box-orient": { inherited: false, supports: 0, values: ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical", ], }, "-moz-box-pack": { inherited: false, supports: 0, values: ["center", "end", "inherit", "initial", "justify", "start", "unset", ], }, "-moz-box-ordinal-group": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "-moz-stack-sizing": { inherited: false, supports: 0, values: ["ignore", "inherit", "initial", "stretch-to-fit", "unset", ], }, "clip-path": { inherited: false, supports: 8, values: ["inherit", "initial", "unset", ], }, "clip-rule": { inherited: true, supports: 0, values: ["evenodd", "inherit", "initial", "nonzero", "unset", ], }, "color-interpolation": { inherited: true, supports: 0, values: ["auto", "inherit", "initial", "linearrgb", "srgb", "unset", ], }, "color-interpolation-filters": { inherited: true, supports: 0, values: ["auto", "inherit", "initial", "linearrgb", "srgb", "unset", ], }, "dominant-baseline": { inherited: false, supports: 0, values: ["alphabetic", "auto", "central", "hanging", "ideographic", "inherit", "initial", "mathematical", "middle", "no-change", "reset-size", "text-after-edge", "text-before-edge", "unset", "use-script", ], }, "fill": { inherited: true, supports: 12, values: ["inherit", "initial", "unset", ], }, "fill-opacity": { inherited: true, supports: 1024, values: ["inherit", "initial", "unset", ], }, "fill-rule": { inherited: true, supports: 0, values: ["evenodd", "inherit", "initial", "nonzero", "unset", ], }, "filter": { inherited: false, supports: 8, values: ["inherit", "initial", "unset", ], }, "flood-color": { inherited: false, supports: 4, values: ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "flood-opacity": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "image-rendering": { inherited: true, supports: 0, values: ["-moz-crisp-edges", "auto", "inherit", "initial", "optimizequality", "optimizespeed", "unset", ], }, "lighting-color": { inherited: false, supports: 4, values: ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "marker-end": { inherited: true, supports: 8, values: ["inherit", "initial", "none", "unset", "url", ], }, "marker-mid": { inherited: true, supports: 8, values: ["inherit", "initial", "none", "unset", "url", ], }, "marker-start": { inherited: true, supports: 8, values: ["inherit", "initial", "none", "unset", "url", ], }, "mask": { inherited: false, supports: 8, values: ["inherit", "initial", "none", "unset", "url", ], }, "mask-type": { inherited: false, supports: 0, values: ["alpha", "inherit", "initial", "luminance", "unset", ], }, "shape-rendering": { inherited: true, supports: 0, values: ["auto", "crispedges", "geometricprecision", "inherit", "initial", "optimizespeed", "unset", ], }, "stop-color": { inherited: false, supports: 4, values: ["aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "stop-opacity": { inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "stroke": { inherited: true, supports: 12, values: ["inherit", "initial", "unset", ], }, "stroke-dasharray": { inherited: true, supports: 1027, values: ["inherit", "initial", "unset", ], }, "stroke-dashoffset": { inherited: true, supports: 1027, values: ["inherit", "initial", "unset", ], }, "stroke-linecap": { inherited: true, supports: 0, values: ["butt", "inherit", "initial", "round", "square", "unset", ], }, "stroke-linejoin": { inherited: true, supports: 0, values: ["bevel", "inherit", "initial", "miter", "round", "unset", ], }, "stroke-miterlimit": { inherited: true, supports: 1024, values: ["inherit", "initial", "unset", ], }, "stroke-opacity": { inherited: true, supports: 1024, values: ["inherit", "initial", "unset", ], }, "stroke-width": { inherited: true, supports: 1027, values: ["inherit", "initial", "unset", ], }, "text-anchor": { inherited: true, supports: 0, values: ["end", "inherit", "initial", "middle", "start", "unset", ], }, "text-rendering": { inherited: true, supports: 0, values: ["auto", "geometricprecision", "inherit", "initial", "optimizelegibility", "optimizespeed", "unset", ], }, "vector-effect": { inherited: false, supports: 0, values: ["inherit", "initial", "non-scaling-stroke", "none", "unset", ], }, "will-change": { inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "-moz-outline-radius": { subproperties: ["-moz-outline-radius-topleft", "-moz-outline-radius-topright", "-moz-outline-radius-bottomright", "-moz-outline-radius-bottomleft", ], inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "all": { subproperties: ["-moz-appearance", "-moz-outline-radius-topleft", "-moz-outline-radius-topright", "-moz-outline-radius-bottomright", "-moz-outline-radius-bottomleft", "-moz-tab-size", "-x-system-font", "animation-delay", "animation-direction", "animation-duration", "animation-fill-mode", "animation-iteration-count", "animation-name", "animation-play-state", "animation-timing-function", "background-attachment", "background-clip", "background-color", "background-image", "background-blend-mode", "background-origin", "background-position", "background-repeat", "background-size", "-moz-binding", "block-size", "border-block-end-color", "border-block-end-style", "border-block-end-width", "border-block-start-color", "border-block-start-style", "border-block-start-width", "border-bottom-color", "-moz-border-bottom-colors", "border-bottom-style", "border-bottom-width", "border-collapse", "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat", "border-inline-end-color", "border-inline-end-style", "border-inline-end-width", "border-inline-start-color", "border-inline-start-style", "border-inline-start-width", "border-left-color", "-moz-border-left-colors", "border-left-style", "border-left-width", "border-right-color", "-moz-border-right-colors", "border-right-style", "border-right-width", "border-spacing", "border-top-color", "-moz-border-top-colors", "border-top-style", "border-top-width", "border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius", "bottom", "box-decoration-break", "box-shadow", "box-sizing", "caption-side", "clear", "clip", "color", "-moz-column-count", "-moz-column-fill", "-moz-column-width", "-moz-column-gap", "-moz-column-rule-color", "-moz-column-rule-style", "-moz-column-rule-width", "contain", "content", "-moz-control-character-visibility", "counter-increment", "counter-reset", "cursor", "display", "empty-cells", "align-content", "align-items", "align-self", "flex-basis", "flex-direction", "flex-grow", "flex-shrink", "flex-wrap", "order", "justify-content", "justify-items", "justify-self", "float", "-moz-float-edge", "font-family", "font-feature-settings", "font-kerning", "font-language-override", "font-size", "font-size-adjust", "-moz-osx-font-smoothing", "font-stretch", "font-style", "font-synthesis", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-weight", "-moz-force-broken-image-icon", "grid-auto-flow", "grid-auto-columns", "grid-auto-rows", "grid-template-areas", "grid-template-columns", "grid-template-rows", "grid-column-start", "grid-column-end", "grid-row-start", "grid-row-end", "grid-column-gap", "grid-row-gap", "height", "image-orientation", "-moz-image-region", "ime-mode", "inline-size", "left", "letter-spacing", "line-height", "list-style-image", "list-style-position", "list-style-type", "margin-block-end", "margin-block-start", "margin-bottom", "margin-inline-end", "margin-inline-start", "margin-left", "margin-right", "margin-top", "marker-offset", "max-block-size", "max-height", "max-inline-size", "max-width", "-moz-min-font-size-ratio", "min-height", "min-block-size", "min-inline-size", "min-width", "mix-blend-mode", "isolation", "object-fit", "object-position", "offset-block-end", "offset-block-start", "offset-inline-end", "offset-inline-start", "opacity", "-moz-orient", "outline-color", "outline-style", "outline-width", "outline-offset", "overflow-clip-box", "overflow-x", "overflow-y", "padding-block-end", "padding-block-start", "padding-bottom", "padding-inline-end", "padding-inline-start", "padding-left", "padding-right", "padding-top", "page-break-after", "page-break-before", "page-break-inside", "paint-order", "pointer-events", "position", "quotes", "resize", "right", "ruby-align", "ruby-position", "scroll-behavior", "scroll-snap-coordinate", "scroll-snap-destination", "scroll-snap-points-x", "scroll-snap-points-y", "scroll-snap-type-x", "scroll-snap-type-y", "table-layout", "text-align", "-moz-text-align-last", "text-combine-upright", "text-decoration-color", "text-decoration-line", "text-decoration-style", "text-indent", "text-orientation", "text-overflow", "text-shadow", "-moz-text-size-adjust", "text-transform", "transform", "transform-box", "transform-origin", "perspective-origin", "perspective", "transform-style", "backface-visibility", "top", "-moz-top-layer", "touch-action", "transition-delay", "transition-duration", "transition-property", "transition-timing-function", "-moz-user-focus", "-moz-user-input", "-moz-user-modify", "-moz-user-select", "vertical-align", "visibility", "white-space", "width", "-moz-window-dragging", "-moz-window-shadow", "word-break", "word-spacing", "word-wrap", "hyphens", "writing-mode", "z-index", "-moz-box-align", "-moz-box-direction", "-moz-box-flex", "-moz-box-orient", "-moz-box-pack", "-moz-box-ordinal-group", "-moz-stack-sizing", "clip-path", "clip-rule", "color-interpolation", "color-interpolation-filters", "dominant-baseline", "fill", "fill-opacity", "fill-rule", "filter", "flood-color", "flood-opacity", "image-rendering", "lighting-color", "marker-end", "marker-mid", "marker-start", "mask", "mask-type", "shape-rendering", "stop-color", "stop-opacity", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-anchor", "text-rendering", "vector-effect", "will-change", ], inherited: false, supports: 2015, values: ["-moz-all", "-moz-available", "-moz-block-height", "-moz-box", "-moz-calc", "-moz-center", "-moz-crisp-edges", "-moz-deck", "-moz-element", "-moz-fit-content", "-moz-grid", "-moz-grid-group", "-moz-grid-line", "-moz-groupbox", "-moz-gtk-info-bar", "-moz-hidden-unscrollable", "-moz-image-rect", "-moz-inline-box", "-moz-inline-grid", "-moz-inline-stack", "-moz-left", "-moz-linear-gradient", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-max-content", "-moz-middle-with-baseline", "-moz-min-content", "-moz-none", "-moz-popup", "-moz-pre-space", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "-moz-right", "-moz-stack", "-moz-text", "-moz-use-text-color", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "absolute", "active", "aliceblue", "all", "all-petite-caps", "all-small-caps", "alpha", "alphabetic", "alternate", "alternate-reverse", "always", "antiquewhite", "aqua", "aquamarine", "auto", "avoid", "azure", "backwards", "balance", "baseline", "beige", "bevel", "bisque", "black", "blanchedalmond", "block", "block-axis", "blue", "blueviolet", "border-box", "both", "bottom", "bottom-outside", "break-all", "break-word", "brown", "burlywood", "butt", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "cadetblue", "calc", "capitalize", "caret", "center", "central", "chartreuse", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "chocolate", "clone", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse", "condensed", "contain", "content-box", "contents", "coral", "cornflowerblue", "cornsilk", "cover", "crimson", "crispedges", "cubic-bezier", "currentColor", "cyan", "darkblue", "darkcyan", "darken", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dialog", "difference", "dimgray", "dimgrey", "disabled", "dodgerblue", "dotted", "double", "drag", "dualbutton", "ease", "ease-in", "ease-in-out", "ease-out", "element", "elements", "enabled", "end", "evenodd", "exclusion", "expanded", "extra-condensed", "extra-expanded", "fill", "fill-box", "firebrick", "fixed", "flat", "flex", "floralwhite", "forestgreen", "forwards", "fuchsia", "full-width", "gainsboro", "geometricprecision", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "grid", "groove", "groupbox", "hanging", "hard-light", "hidden", "hide", "honeydew", "horizontal", "horizontal-tb", "hotpink", "hsl", "hsla", "hue", "ideographic", "ignore", "inactive", "indianred", "indigo", "infinite", "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-end", "inline-flex", "inline-grid", "inline-start", "inline-table", "inset", "inside", "isolate", "italic", "ivory", "justify", "keep-all", "khaki", "large", "larger", "lavender", "lavenderblush", "lawngreen", "layout", "left", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lighten", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linear", "linear-gradient", "linearrgb", "linen", "list-item", "listbox", "listitem", "local", "lowercase", "lr", "lr-tb", "luminance", "luminosity", "magenta", "mandatory", "manual", "margin-box", "maroon", "mathematical", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "middle", "midnightblue", "mintcream", "mistyrose", "miter", "mixed", "moccasin", "multiply", "navajowhite", "navy", "no-change", "no-drag", "no-repeat", "non-scaling-stroke", "none", "nonzero", "normal", "nowrap", "number-input", "oblique", "oldlace", "olive", "olivedrab", "optimizelegibility", "optimizequality", "optimizespeed", "orange", "orangered", "orchid", "outset", "outside", "over", "overlay", "padding-box", "paint", "painted", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "paused", "peachpuff", "peru", "petite-caps", "pink", "plum", "powderblue", "pre", "pre-line", "pre-wrap", "preserve-3d", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "proximity", "purple", "radial-gradient", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "read-only", "read-write", "rebeccapurple", "red", "relative", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "reset-size", "resizer", "resizerpanel", "reverse", "rgb", "rgba", "ridge", "right", "rl", "rl-tb", "rosybrown", "round", "row", "row-reverse", "royalblue", "ruby", "ruby-base", "ruby-base-container", "ruby-text", "ruby-text-container", "running", "saddlebrown", "salmon", "sandybrown", "saturation", "scale-down", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "screen", "scroll", "scrollbar", "scrollbar-small", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "seagreen", "searchfield", "seashell", "select-after", "select-all", "select-before", "select-menu", "select-same", "semi-condensed", "semi-expanded", "separate", "separator", "show", "sideways", "sideways-lr", "sideways-right", "sideways-rl", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "slice", "small", "small-caps", "smaller", "smooth", "snow", "soft-light", "solid", "space-around", "space-between", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "springgreen", "square", "srgb", "start", "static", "statusbar", "statusbarpanel", "steelblue", "step-end", "step-start", "steps", "sticky", "stretch", "stretch-to-fit", "strict", "stroke", "style", "sub", "super", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "tabpanel", "tabpanels", "tan", "tb", "tb-rl", "teal", "text", "text-after-edge", "text-before-edge", "text-bottom", "text-top", "textfield", "textfield-multiline", "thick", "thin", "thistle", "titling-caps", "toggle", "tomato", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "top", "top-outside", "transparent", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "tri-state", "turquoise", "ultra-condensed", "ultra-expanded", "under", "unicase", "unset", "uppercase", "upright", "url", "use-script", "vertical", "vertical-lr", "vertical-rl", "view-box", "violet", "visible", "visiblefill", "visiblepainted", "visiblestroke", "wavy", "wheat", "white", "whitesmoke", "window", "wrap", "wrap-reverse", "write-only", "x-large", "x-small", "xx-large", "xx-small", "yellow", "yellowgreen", ], }, "animation": { subproperties: ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name", ], inherited: false, supports: 1344, values: ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset", ], }, "background": { subproperties: ["background-color", "background-image", "background-repeat", "background-attachment", "background-position", "background-clip", "background-origin", "background-size", ], inherited: false, supports: 655, values: ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "border-box", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "content-box", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "fixed", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linear-gradient", "linen", "local", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "no-repeat", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "padding-box", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "radial-gradient", "rebeccapurple", "red", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "scroll", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "url", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border": { subproperties: ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width", "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", "-moz-border-top-colors", "-moz-border-right-colors", "-moz-border-bottom-colors", "-moz-border-left-colors", "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linear-gradient", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "radial-gradient", "rebeccapurple", "red", "repeating-linear-gradient", "repeating-radial-gradient", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "url", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-block-end": { subproperties: ["border-block-end-width", "border-block-end-style", "border-block-end-color", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-block-start": { subproperties: ["border-block-start-width", "border-block-start-style", "border-block-start-color", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-bottom": { subproperties: ["border-bottom-width", "border-bottom-style", "border-bottom-color", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-color": { subproperties: ["border-top-color", "border-right-color", "border-bottom-color", "border-left-color", ], inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-image": { subproperties: ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat", ], inherited: false, supports: 1675, values: ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url", ], }, "border-inline-end": { subproperties: ["border-inline-end-width", "border-inline-end-style", "border-inline-end-color", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-inline-start": { subproperties: ["border-inline-start-width", "border-inline-start-style", "border-inline-start-color", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-left": { subproperties: ["border-left-width", "border-left-style", "border-left-color", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-right": { subproperties: ["border-right-width", "border-right-style", "border-right-color", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-style": { subproperties: ["border-top-style", "border-right-style", "border-bottom-style", "border-left-style", ], inherited: false, supports: 0, values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "border-top": { subproperties: ["border-top-width", "border-top-style", "border-top-color", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "border-width": { subproperties: ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width", ], inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "border-radius": { subproperties: ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius", ], inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-moz-columns": { subproperties: ["-moz-column-count", "-moz-column-width", ], inherited: false, supports: 1025, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "-moz-column-rule": { subproperties: ["-moz-column-rule-width", "-moz-column-rule-style", "-moz-column-rule-color", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "flex": { subproperties: ["flex-grow", "flex-shrink", "flex-basis", ], inherited: false, supports: 1027, values: ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset", ], }, "flex-flow": { subproperties: ["flex-direction", "flex-wrap", ], inherited: false, supports: 0, values: ["column", "column-reverse", "inherit", "initial", "nowrap", "row", "row-reverse", "unset", "wrap", "wrap-reverse", ], }, "font": { subproperties: ["font-family", "font-style", "font-weight", "font-size", "line-height", "font-size-adjust", "font-stretch", "-x-system-font", "font-feature-settings", "font-language-override", "font-kerning", "font-synthesis", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", ], inherited: true, supports: 1027, values: ["-moz-block-height", "-moz-calc", "all-petite-caps", "all-small-caps", "auto", "calc", "condensed", "expanded", "extra-condensed", "extra-expanded", "inherit", "initial", "italic", "large", "larger", "medium", "none", "normal", "oblique", "petite-caps", "semi-condensed", "semi-expanded", "small", "small-caps", "smaller", "sub", "super", "titling-caps", "ultra-condensed", "ultra-expanded", "unicase", "unset", "x-large", "x-small", "xx-large", "xx-small", ], }, "font-variant": { subproperties: ["font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", ], inherited: true, supports: 0, values: ["all-petite-caps", "all-small-caps", "inherit", "initial", "normal", "petite-caps", "small-caps", "sub", "super", "titling-caps", "unicase", "unset", ], }, "grid-template": { subproperties: ["grid-template-areas", "grid-template-columns", "grid-template-rows", ], inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "grid": { subproperties: ["grid-template-areas", "grid-template-columns", "grid-template-rows", "grid-auto-flow", "grid-auto-columns", "grid-auto-rows", "grid-column-gap", "grid-row-gap", ], inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "grid-column": { subproperties: ["grid-column-start", "grid-column-end", ], inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "grid-row": { subproperties: ["grid-row-start", "grid-row-end", ], inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "grid-area": { subproperties: ["grid-row-start", "grid-column-start", "grid-row-end", "grid-column-end", ], inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "grid-gap": { subproperties: ["grid-column-gap", "grid-row-gap", ], inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "list-style": { subproperties: ["list-style-type", "list-style-image", "list-style-position", ], inherited: true, supports: 8, values: ["inherit", "initial", "inside", "none", "outside", "unset", "url", ], }, "margin": { subproperties: ["margin-top", "margin-right", "margin-bottom", "margin-left", ], inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "outline": { subproperties: ["outline-width", "outline-style", "outline-color", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "auto", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "overflow": { subproperties: ["overflow-x", "overflow-y", ], inherited: false, supports: 0, values: ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible", ], }, "padding": { subproperties: ["padding-top", "padding-right", "padding-bottom", "padding-left", ], inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "scroll-snap-type": { subproperties: ["scroll-snap-type-x", "scroll-snap-type-y", ], inherited: false, supports: 0, values: ["inherit", "initial", "mandatory", "none", "proximity", "unset", ], }, "text-decoration": { subproperties: ["text-decoration-color", "text-decoration-line", "text-decoration-style", ], inherited: false, supports: 4, values: ["-moz-none", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wavy", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "transition": { subproperties: ["transition-property", "transition-duration", "transition-timing-function", "transition-delay", ], inherited: false, supports: 320, values: ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset", ], }, "marker": { subproperties: ["marker-start", "marker-mid", "marker-end", ], inherited: true, supports: 8, values: ["inherit", "initial", "none", "unset", "url", ], }, "-moz-transform": { alias: true, subproperties: ["transform", ], inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "-moz-transform-origin": { alias: true, inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-moz-perspective-origin": { alias: true, inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-moz-perspective": { alias: true, inherited: false, supports: 1, values: ["inherit", "initial", "none", "unset", ], }, "-moz-transform-style": { alias: true, inherited: false, supports: 0, values: ["flat", "inherit", "initial", "preserve-3d", "unset", ], }, "-moz-backface-visibility": { alias: true, inherited: false, supports: 0, values: ["hidden", "inherit", "initial", "unset", "visible", ], }, "-moz-border-image": { alias: true, subproperties: ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat", ], inherited: false, supports: 1675, values: ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url", ], }, "-moz-transition": { alias: true, subproperties: ["transition-property", "transition-duration", "transition-timing-function", "transition-delay", ], inherited: false, supports: 320, values: ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset", ], }, "-moz-transition-delay": { alias: true, inherited: false, supports: 64, values: ["inherit", "initial", "unset", ], }, "-moz-transition-duration": { alias: true, inherited: false, supports: 64, values: ["inherit", "initial", "unset", ], }, "-moz-transition-property": { alias: true, inherited: false, supports: 0, values: ["all", "inherit", "initial", "none", "unset", ], }, "-moz-transition-timing-function": { alias: true, inherited: false, supports: 256, values: ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset", ], }, "-moz-animation": { alias: true, subproperties: ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name", ], inherited: false, supports: 1344, values: ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset", ], }, "-moz-animation-delay": { alias: true, inherited: false, supports: 64, values: ["inherit", "initial", "unset", ], }, "-moz-animation-direction": { alias: true, inherited: false, supports: 0, values: ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset", ], }, "-moz-animation-duration": { alias: true, inherited: false, supports: 64, values: ["inherit", "initial", "unset", ], }, "-moz-animation-fill-mode": { alias: true, inherited: false, supports: 0, values: ["backwards", "both", "forwards", "inherit", "initial", "none", "unset", ], }, "-moz-animation-iteration-count": { alias: true, inherited: false, supports: 1024, values: ["infinite", "inherit", "initial", "unset", ], }, "-moz-animation-name": { alias: true, inherited: false, supports: 0, values: ["inherit", "initial", "none", "unset", ], }, "-moz-animation-play-state": { alias: true, inherited: false, supports: 0, values: ["inherit", "initial", "paused", "running", "unset", ], }, "-moz-animation-timing-function": { alias: true, inherited: false, supports: 256, values: ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset", ], }, "-moz-box-sizing": { alias: true, inherited: false, supports: 0, values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ], }, "-moz-font-feature-settings": { alias: true, inherited: true, supports: 0, values: ["inherit", "initial", "unset", ], }, "-moz-font-language-override": { alias: true, inherited: true, supports: 0, values: ["inherit", "initial", "normal", "unset", ], }, "-moz-padding-end": { alias: true, inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "-moz-padding-start": { alias: true, inherited: false, supports: 3, values: ["-moz-calc", "calc", "inherit", "initial", "unset", ], }, "-moz-margin-end": { alias: true, inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "-moz-margin-start": { alias: true, inherited: false, supports: 3, values: ["-moz-calc", "auto", "calc", "inherit", "initial", "unset", ], }, "-moz-border-end": { alias: true, subproperties: ["border-inline-end-width", "border-inline-end-style", "border-inline-end-color", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "-moz-border-end-color": { alias: true, inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "-moz-border-end-style": { alias: true, inherited: false, supports: 0, values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "-moz-border-end-width": { alias: true, inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "-moz-border-start": { alias: true, subproperties: ["border-inline-start-width", "border-inline-start-style", "border-inline-start-color", ], inherited: false, supports: 5, values: ["-moz-calc", "-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "inset", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "medium", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "none", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "outset", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "ridge", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "solid", "springgreen", "steelblue", "tan", "teal", "thick", "thin", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "-moz-border-start-color": { alias: true, inherited: false, supports: 4, values: ["-moz-use-text-color", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "initial", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rgb", "rgba", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "transparent", "turquoise", "unset", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", ], }, "-moz-border-start-style": { alias: true, inherited: false, supports: 0, values: ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset", ], }, "-moz-border-start-width": { alias: true, inherited: false, supports: 1, values: ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset", ], }, "-moz-hyphens": { alias: true, inherited: true, supports: 0, values: ["auto", "inherit", "initial", "manual", "none", "unset", ], }, "-webkit-animation": { alias: true, subproperties: ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name", ], inherited: false, supports: 1344, values: ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset", ], }, "-webkit-animation-delay": { alias: true, inherited: false, supports: 64, values: ["inherit", "initial", "unset", ], }, "-webkit-animation-direction": { alias: true, inherited: false, supports: 0, values: ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset", ], }, "-webkit-animation-duration": { alias: true, inherited: false, supports: 64, values: ["inherit", "initial", "unset", ], }, "-webkit-animation-fill-mode": { alias: true, inherited: false, supports: 0, values: ["backwards", "both", "forwards", "inherit", "initial", "none", "unset", ], }, "-webkit-animation-iteration-count": { alias: true, inherited: false, supports: 1024, values: ["infinite", "inherit", "initial", "unset", ], }, "-webkit-animation-name": { alias: true, inherited: false, supports: 0, values: ["inherit", "initial", "none", "unset", ], }, "-webkit-animation-play-state": { alias: true, inherited: false, supports: 0, values: ["inherit", "initial", "paused", "running", "unset", ], }, "-webkit-animation-timing-function": { alias: true, inherited: false, supports: 256, values: ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset", ], }, "-webkit-text-size-adjust": { alias: true, inherited: true, supports: 0, values: ["auto", "inherit", "initial", "none", "unset", ], }, "-webkit-transform": { alias: true, inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "-webkit-transform-origin": { alias: true, inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-webkit-transform-style": { alias: true, inherited: false, supports: 0, values: ["flat", "inherit", "initial", "preserve-3d", "unset", ], }, "-webkit-backface-visibility": { alias: true, inherited: false, supports: 0, values: ["hidden", "inherit", "initial", "unset", "visible", ], }, "-webkit-perspective": { alias: true, inherited: false, supports: 1, values: ["inherit", "initial", "none", "unset", ], }, "-webkit-perspective-origin": { alias: true, inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-webkit-transition": { alias: true, subproperties: ["transition-property", "transition-duration", "transition-timing-function", "transition-delay", ], inherited: false, supports: 320, values: ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset", ], }, "-webkit-transition-delay": { alias: true, inherited: false, supports: 64, values: ["inherit", "initial", "unset", ], }, "-webkit-transition-duration": { alias: true, inherited: false, supports: 64, values: ["inherit", "initial", "unset", ], }, "-webkit-transition-property": { alias: true, inherited: false, supports: 0, values: ["all", "inherit", "initial", "none", "unset", ], }, "-webkit-transition-timing-function": { alias: true, inherited: false, supports: 256, values: ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset", ], }, "-webkit-border-radius": { alias: true, subproperties: ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius", ], inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-webkit-border-top-left-radius": { alias: true, inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-webkit-border-top-right-radius": { alias: true, inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-webkit-border-bottom-left-radius": { alias: true, inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-webkit-border-bottom-right-radius": { alias: true, inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-webkit-appearance": { alias: true, inherited: false, supports: 0, values: ["-moz-gtk-info-bar", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "caret", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "dialog", "dualbutton", "groupbox", "inherit", "initial", "listbox", "listitem", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "none", "number-input", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "resizer", "resizerpanel", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "scrollbar", "scrollbar-small", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "searchfield", "separator", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "statusbar", "statusbarpanel", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "tabpanel", "tabpanels", "textfield", "textfield-multiline", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "unset", "window", ], }, "-webkit-background-clip": { alias: true, inherited: false, supports: 0, values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ], }, "-webkit-background-origin": { alias: true, inherited: false, supports: 0, values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ], }, "-webkit-background-size": { alias: true, inherited: false, supports: 3, values: ["inherit", "initial", "unset", ], }, "-webkit-border-image": { alias: true, subproperties: ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat", ], inherited: false, supports: 1675, values: ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url", ], }, "-webkit-border-image-outset": { alias: true, inherited: false, supports: 1025, values: ["inherit", "initial", "unset", ], }, "-webkit-border-image-repeat": { alias: true, inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "-webkit-border-image-slice": { alias: true, inherited: false, supports: 1026, values: ["inherit", "initial", "unset", ], }, "-webkit-border-image-source": { alias: true, inherited: false, supports: 648, values: ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url", ], }, "-webkit-border-image-width": { alias: true, inherited: false, supports: 1027, values: ["inherit", "initial", "unset", ], }, "-webkit-box-shadow": { alias: true, inherited: false, supports: 5, values: ["inherit", "initial", "unset", ], }, "-webkit-box-sizing": { alias: true, inherited: false, supports: 0, values: ["border-box", "content-box", "inherit", "initial", "padding-box", "unset", ], }, "-webkit-box-flex": { alias: true, inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "-webkit-box-ordinal-group": { alias: true, inherited: false, supports: 1024, values: ["inherit", "initial", "unset", ], }, "-webkit-box-align": { alias: true, inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "-webkit-box-pack": { alias: true, inherited: false, supports: 0, values: ["inherit", "initial", "unset", ], }, "-webkit-user-select": { alias: true, inherited: false, supports: 0, values: ["-moz-all", "-moz-none", "-moz-text", "all", "auto", "element", "elements", "inherit", "initial", "none", "text", "toggle", "tri-state", "unset", ], }, }; module.exports = { cssProperties }; /***/ }, /* 40 */ /***/ function(module, exports) { /* * A sham for https://dxr.mozilla.org/mozilla-central/source/toolkit/modules/Promise.jsm */ /** * Promise.jsm is mostly the Promise web API with a `defer` method. Just drop this in here, * and use the native web API (although building with webpack/babel, it may replace this * with it's own version if we want to target environments that do not have `Promise`. */ let p = typeof window != "undefined" ? window.Promise : Promise; p.defer = function defer() { var resolve, reject; var promise = new Promise(function() { resolve = arguments[0]; reject = arguments[1]; }); return { resolve: resolve, reject: reject, promise: promise }; } module.exports = p; /***/ }, /* 41 */ /***/ function(module, exports, __webpack_require__) { /* eslint-env browser */ /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // TODO: Get rid of this code once the marionette server loads transport.js as // an SDK module (see bug 1000814) "use strict"; const DevToolsUtils = __webpack_require__(42); const { dumpn, dumpv } = DevToolsUtils; const StreamUtils = __webpack_require__(48); const { Packet, JSONPacket, BulkPacket } = __webpack_require__(49); const promise = __webpack_require__(40); const EventEmitter = __webpack_require__(34); const utf8 = __webpack_require__(52); const PACKET_HEADER_MAX = 200; /** * An adapter that handles data transfers between the debugger client and * server. It can work with both nsIPipe and nsIServerSocket transports so * long as the properly created input and output streams are specified. * (However, for intra-process connections, LocalDebuggerTransport, below, * is more efficient than using an nsIPipe pair with DebuggerTransport.) * * @param input nsIAsyncInputStream * The input stream. * @param output nsIAsyncOutputStream * The output stream. * * Given a DebuggerTransport instance dt: * 1) Set dt.hooks to a packet handler object (described below). * 2) Call dt.ready() to begin watching for input packets. * 3) Call dt.send() / dt.startBulkSend() to send packets. * 4) Call dt.close() to close the connection, and disengage from the event * loop. * * A packet handler is an object with the following methods: * * - onPacket(packet) - called when we have received a complete packet. * |packet| is the parsed form of the packet --- a JavaScript value, not * a JSON-syntax string. * * - onBulkPacket(packet) - called when we have switched to bulk packet * receiving mode. |packet| is an object containing: * * actor: Name of actor that will receive the packet * * type: Name of actor's method that should be called on receipt * * length: Size of the data to be read * * stream: This input stream should only be used directly if you can ensure * that you will read exactly |length| bytes and will not close the * stream when reading is complete * * done: If you use the stream directly (instead of |copyTo| below), you * must signal completion by resolving / rejecting this deferred. * If it's rejected, the transport will be closed. If an Error is * supplied as a rejection value, it will be logged via |dumpn|. * If you do use |copyTo|, resolving is taken care of for you when * copying completes. * * copyTo: A helper function for getting your data out of the stream that * meets the stream handling requirements above, and has the * following signature: * @param output nsIAsyncOutputStream * The stream to copy to. * @return Promise * The promise is resolved when copying completes or rejected if any * (unexpected) errors occur. * This object also emits "progress" events for each chunk that is * copied. See stream-utils.js. * * - onClosed(reason) - called when the connection is closed. |reason| is * an optional nsresult or object, typically passed when the transport is * closed due to some error in a underlying stream. * * See ./packets.js and the Remote Debugging Protocol specification for more * details on the format of these packets. */ function DebuggerTransport(socket) { EventEmitter.decorate(this); this._socket = socket; // The current incoming (possibly partial) header, which will determine which // type of Packet |_incoming| below will become. this._incomingHeader = ""; // The current incoming Packet object this._incoming = null; // A queue of outgoing Packet objects this._outgoing = []; this.hooks = null; this.active = false; this._incomingEnabled = true; this._outgoingEnabled = true; this.close = this.close.bind(this); } DebuggerTransport.prototype = { /** * Transmit an object as a JSON packet. * * This method returns immediately, without waiting for the entire * packet to be transmitted, registering event handlers as needed to * transmit the entire packet. Packets are transmitted in the order * they are passed to this method. */ send: function(object) { this.emit("send", object); let packet = new JSONPacket(this); packet.object = object; this._outgoing.push(packet); this._flushOutgoing(); }, /** * Transmit streaming data via a bulk packet. * * This method initiates the bulk send process by queuing up the header data. * The caller receives eventual access to a stream for writing. * * N.B.: Do *not* attempt to close the stream handed to you, as it will * continue to be used by this transport afterwards. Most users should * instead use the provided |copyFrom| function instead. * * @param header Object * This is modeled after the format of JSON packets above, but does not * actually contain the data, but is instead just a routing header: * * actor: Name of actor that will receive the packet * * type: Name of actor's method that should be called on receipt * * length: Size of the data to be sent * @return Promise * The promise will be resolved when you are allowed to write to the * stream with an object containing: * * stream: This output stream should only be used directly if * you can ensure that you will write exactly |length| * bytes and will not close the stream when writing is * complete * * done: If you use the stream directly (instead of |copyFrom| * below), you must signal completion by resolving / * rejecting this deferred. If it's rejected, the * transport will be closed. If an Error is supplied as * a rejection value, it will be logged via |dumpn|. If * you do use |copyFrom|, resolving is taken care of for * you when copying completes. * * copyFrom: A helper function for getting your data onto the * stream that meets the stream handling requirements * above, and has the following signature: * @param input nsIAsyncInputStream * The stream to copy from. * @return Promise * The promise is resolved when copying completes or * rejected if any (unexpected) errors occur. * This object also emits "progress" events for each chunk * that is copied. See stream-utils.js. */ startBulkSend: function(header) { this.emit("startBulkSend", header); let packet = new BulkPacket(this); packet.header = header; this._outgoing.push(packet); this._flushOutgoing(); return packet.streamReadyForWriting; }, /** * Close the transport. * @param reason nsresult / object (optional) * The status code or error message that corresponds to the reason for * closing the transport (likely because a stream closed or failed). */ close: function(reason) { this.emit("onClosed", reason); this.active = false; this._socket.close(); this._destroyIncoming(); this._destroyAllOutgoing(); if (this.hooks) { this.hooks.onClosed(reason); this.hooks = null; } if (reason) { dumpn("Transport closed: " + DevToolsUtils.safeErrorString(reason)); } else { dumpn("Transport closed."); } }, /** * The currently outgoing packet (at the top of the queue). */ get _currentOutgoing() { return this._outgoing[0]; }, /** * Flush data to the outgoing stream. Waits until the output stream notifies * us that it is ready to be written to (via onOutputStreamReady). */ _flushOutgoing: function() { if (!this._outgoingEnabled || this._outgoing.length === 0) { return; } // If the top of the packet queue has nothing more to send, remove it. if (this._currentOutgoing.done) { this._finishCurrentOutgoing(); } if (this._outgoing.length > 0) { setTimeout(this.onOutputStreamReady.bind(this), 0); } }, /** * Pause this transport's attempts to write to the output stream. This is * used when we've temporarily handed off our output stream for writing bulk * data. */ pauseOutgoing: function() { this._outgoingEnabled = false; }, /** * Resume this transport's attempts to write to the output stream. */ resumeOutgoing: function() { this._outgoingEnabled = true; this._flushOutgoing(); }, // nsIOutputStreamCallback /** * This is called when the output stream is ready for more data to be written. * The current outgoing packet will attempt to write some amount of data, but * may not complete. */ onOutputStreamReady: DevToolsUtils.makeInfallible(function() { if (!this._outgoingEnabled || this._outgoing.length === 0) { return; } try { this._currentOutgoing.write({ write: data => { let count = data.length; this._socket.send(data); return count; } }); } catch(e) { if (e.result != Cr.NS_BASE_STREAM_WOULD_BLOCK) { this.close(e.result); return; } else { throw e; } } this._flushOutgoing(); }, "DebuggerTransport.prototype.onOutputStreamReady"), /** * Remove the current outgoing packet from the queue upon completion. */ _finishCurrentOutgoing: function() { if (this._currentOutgoing) { this._currentOutgoing.destroy(); this._outgoing.shift(); } }, /** * Clear the entire outgoing queue. */ _destroyAllOutgoing: function() { for (let packet of this._outgoing) { packet.destroy(); } this._outgoing = []; }, /** * Initialize the input stream for reading. Once this method has been called, * we watch for packets on the input stream, and pass them to the appropriate * handlers via this.hooks. */ ready: function() { this.active = true; this._waitForIncoming(); }, /** * Asks the input stream to notify us (via onInputStreamReady) when it is * ready for reading. */ _waitForIncoming: function() { if (this._incomingEnabled && !this._socket.onmessage) { this._socket.onmessage = this.onInputStreamReady.bind(this); } }, /** * Pause this transport's attempts to read from the input stream. This is * used when we've temporarily handed off our input stream for reading bulk * data. */ pauseIncoming: function() { this._incomingEnabled = false; }, /** * Resume this transport's attempts to read from the input stream. */ resumeIncoming: function() { this._incomingEnabled = true; this._flushIncoming(); this._waitForIncoming(); }, // nsIInputStreamCallback /** * Called when the stream is either readable or closed. */ onInputStreamReady: DevToolsUtils.makeInfallible(function(event) { let data = event.data; // TODO: ws-tcp-proxy decodes utf-8, but the transport expects to see the // encoded bytes. Simplest step is to re-encode for now. data = utf8.encode(data); let stream = { available() { return data.length; }, readBytes(count) { let result = data.slice(0, count); data = data.slice(count); return result; }, }; try { while (data && this._incomingEnabled && this._processIncoming(stream, stream.available())) {} this._waitForIncoming(); } catch(e) { if (e.result != Cr.NS_BASE_STREAM_WOULD_BLOCK) { this.close(e.result); } else { throw e; } } }, "DebuggerTransport.prototype.onInputStreamReady"), /** * Process the incoming data. Will create a new currently incoming Packet if * needed. Tells the incoming Packet to read as much data as it can, but * reading may not complete. The Packet signals that its data is ready for * delivery by calling one of this transport's _on*Ready methods (see * ./packets.js and the _on*Ready methods below). * @return boolean * Whether incoming stream processing should continue for any * remaining data. */ _processIncoming: function(stream, count) { dumpv("Data available: " + count); if (!count) { dumpv("Nothing to read, skipping"); return false; } try { if (!this._incoming) { dumpv("Creating a new packet from incoming"); if (!this._readHeader(stream)) { return false; // Not enough data to read packet type } // Attempt to create a new Packet by trying to parse each possible // header pattern. this._incoming = Packet.fromHeader(this._incomingHeader, this); if (!this._incoming) { throw new Error("No packet types for header: " + this._incomingHeader); } } if (!this._incoming.done) { // We have an incomplete packet, keep reading it. dumpv("Existing packet incomplete, keep reading"); this._incoming.read(stream); } } catch(e) { let msg = "Error reading incoming packet: (" + e + " - " + e.stack + ")"; dumpn(msg); // Now in an invalid state, shut down the transport. this.close(); return false; } if (!this._incoming.done) { // Still not complete, we'll wait for more data. dumpv("Packet not done, wait for more"); return true; } // Ready for next packet this._flushIncoming(); return true; }, /** * Read as far as we can into the incoming data, attempting to build up a * complete packet header (which terminates with ":"). We'll only read up to * PACKET_HEADER_MAX characters. * @return boolean * True if we now have a complete header. */ _readHeader: function(stream) { let amountToRead = PACKET_HEADER_MAX - this._incomingHeader.length; this._incomingHeader += StreamUtils.delimitedRead(stream, ":", amountToRead); if (dumpv.wantVerbose) { dumpv("Header read: " + this._incomingHeader); } if (this._incomingHeader.endsWith(":")) { if (dumpv.wantVerbose) { dumpv("Found packet header successfully: " + this._incomingHeader); } return true; } if (this._incomingHeader.length >= PACKET_HEADER_MAX) { throw new Error("Failed to parse packet header!"); } // Not enough data yet. return false; }, /** * If the incoming packet is done, log it as needed and clear the buffer. */ _flushIncoming: function() { if (!this._incoming.done) { return; } if (dumpn.wantLogging) { dumpn("Got: " + this._incoming); } this._destroyIncoming(); }, /** * Handler triggered by an incoming JSONPacket completing it's |read| method. * Delivers the packet to this.hooks.onPacket. */ _onJSONObjectReady: function(object) { DevToolsUtils.executeSoon(DevToolsUtils.makeInfallible(() => { // Ensure the transport is still alive by the time this runs. if (this.active) { this.emit("onPacket", object); this.hooks.onPacket(object); } }, "DebuggerTransport instance's this.hooks.onPacket")); }, /** * Handler triggered by an incoming BulkPacket entering the |read| phase for * the stream portion of the packet. Delivers info about the incoming * streaming data to this.hooks.onBulkPacket. See the main comment on the * transport at the top of this file for more details. */ _onBulkReadReady: function(...args) { DevToolsUtils.executeSoon(DevToolsUtils.makeInfallible(() => { // Ensure the transport is still alive by the time this runs. if (this.active) { this.emit("onBulkPacket", ...args); this.hooks.onBulkPacket(...args); } }, "DebuggerTransport instance's this.hooks.onBulkPacket")); }, /** * Remove all handlers and references related to the current incoming packet, * either because it is now complete or because the transport is closing. */ _destroyIncoming: function() { if (this._incoming) { this._incoming.destroy(); } this._incomingHeader = ""; this._incoming = null; } }; exports.DebuggerTransport = DebuggerTransport; /** * An adapter that handles data transfers between the debugger client and * server when they both run in the same process. It presents the same API as * DebuggerTransport, but instead of transmitting serialized messages across a * connection it merely calls the packet dispatcher of the other side. * * @param other LocalDebuggerTransport * The other endpoint for this debugger connection. * * @see DebuggerTransport */ function LocalDebuggerTransport(other) { EventEmitter.decorate(this); this.other = other; this.hooks = null; /* * A packet number, shared between this and this.other. This isn't used * by the protocol at all, but it makes the packet traces a lot easier to * follow. */ this._serial = this.other ? this.other._serial : { count: 0 }; this.close = this.close.bind(this); } LocalDebuggerTransport.prototype = { /** * Transmit a message by directly calling the onPacket handler of the other * endpoint. */ send: function(packet) { this.emit("send", packet); let serial = this._serial.count++; if (dumpn.wantLogging) { /* Check 'from' first, as 'echo' packets have both. */ if (packet.from) { dumpn("Packet " + serial + " sent from " + uneval(packet.from)); } else if (packet.to) { dumpn("Packet " + serial + " sent to " + uneval(packet.to)); } } this._deepFreeze(packet); let other = this.other; if (other) { DevToolsUtils.executeSoon(DevToolsUtils.makeInfallible(() => { // Avoid the cost of JSON.stringify() when logging is disabled. if (dumpn.wantLogging) { dumpn("Received packet " + serial + ": " + JSON.stringify(packet, null, 2)); } if (other.hooks) { other.emit("onPacket", packet); other.hooks.onPacket(packet); } }, "LocalDebuggerTransport instance's this.other.hooks.onPacket")); } }, /** * Send a streaming bulk packet directly to the onBulkPacket handler of the * other endpoint. * * This case is much simpler than the full DebuggerTransport, since there is * no primary stream we have to worry about managing while we hand it off to * others temporarily. Instead, we can just make a single use pipe and be * done with it. */ startBulkSend: function({actor, type, length}) { this.emit("startBulkSend", {actor, type, length}); let serial = this._serial.count++; dumpn("Sent bulk packet " + serial + " for actor " + actor); if (!this.other) { return; } let pipe = new Pipe(true, true, 0, 0, null); DevToolsUtils.executeSoon(DevToolsUtils.makeInfallible(() => { dumpn("Received bulk packet " + serial); if (!this.other.hooks) { return; } // Receiver let deferred = promise.defer(); let packet = { actor: actor, type: type, length: length, copyTo: (output) => { let copying = StreamUtils.copyStream(pipe.inputStream, output, length); deferred.resolve(copying); return copying; }, stream: pipe.inputStream, done: deferred }; this.other.emit("onBulkPacket", packet); this.other.hooks.onBulkPacket(packet); // Await the result of reading from the stream deferred.promise.then(() => pipe.inputStream.close(), this.close); }, "LocalDebuggerTransport instance's this.other.hooks.onBulkPacket")); // Sender let sendDeferred = promise.defer(); // The remote transport is not capable of resolving immediately here, so we // shouldn't be able to either. DevToolsUtils.executeSoon(() => { let copyDeferred = promise.defer(); sendDeferred.resolve({ copyFrom: (input) => { let copying = StreamUtils.copyStream(input, pipe.outputStream, length); copyDeferred.resolve(copying); return copying; }, stream: pipe.outputStream, done: copyDeferred }); // Await the result of writing to the stream copyDeferred.promise.then(() => pipe.outputStream.close(), this.close); }); return sendDeferred.promise; }, /** * Close the transport. */ close: function() { this.emit("close"); if (this.other) { // Remove the reference to the other endpoint before calling close(), to // avoid infinite recursion. let other = this.other; this.other = null; other.close(); } if (this.hooks) { try { this.hooks.onClosed(); } catch(ex) { console.error(ex); } this.hooks = null; } }, /** * An empty method for emulating the DebuggerTransport API. */ ready: function() {}, /** * Helper function that makes an object fully immutable. */ _deepFreeze: function(object) { Object.freeze(object); for (let prop in object) { // Freeze the properties that are objects, not on the prototype, and not // already frozen. Note that this might leave an unfrozen reference // somewhere in the object if there is an already frozen object containing // an unfrozen object. if (object.hasOwnProperty(prop) && typeof object === "object" && !Object.isFrozen(object)) { this._deepFreeze(o[prop]); } } } }; exports.LocalDebuggerTransport = LocalDebuggerTransport; /** * A transport for the debugging protocol that uses nsIMessageSenders to * exchange packets with servers running in child processes. * * In the parent process, |sender| should be the nsIMessageSender for the * child process. In a child process, |sender| should be the child process * message manager, which sends packets to the parent. * * |prefix| is a string included in the message names, to distinguish * multiple servers running in the same child process. * * This transport exchanges messages named 'debug::packet', where * is |prefix|, whose data is the protocol packet. */ function ChildDebuggerTransport(sender, prefix) { EventEmitter.decorate(this); this._sender = sender.QueryInterface(Ci.nsIMessageSender); this._messageName = "debug:" + prefix + ":packet"; } /* * To avoid confusion, we use 'message' to mean something that * nsIMessageSender conveys, and 'packet' to mean a remote debugging * protocol packet. */ ChildDebuggerTransport.prototype = { constructor: ChildDebuggerTransport, hooks: null, ready: function () { this._sender.addMessageListener(this._messageName, this); }, close: function () { this._sender.removeMessageListener(this._messageName, this); this.emit("onClosed"); this.hooks.onClosed(); }, receiveMessage: function ({data}) { this.emit("onPacket", data); this.hooks.onPacket(data); }, send: function (packet) { this.emit("send", packet); this._sender.sendAsyncMessage(this._messageName, packet); }, startBulkSend: function() { throw new Error("Can't send bulk data to child processes."); } }; exports.ChildDebuggerTransport = ChildDebuggerTransport; // WorkerDebuggerTransport is defined differently depending on whether we are // on the main thread or a worker thread. In the former case, we are required // by the devtools loader, and isWorker will be false. Otherwise, we are // required by the worker loader, and isWorker will be true. // // Each worker debugger supports only a single connection to the main thread. // However, its theoretically possible for multiple servers to connect to the // same worker. Consequently, each transport has a connection id, to allow // messages from multiple connections to be multiplexed on a single channel. if (typeof WorkerGlobalScope === 'undefined') { // i.e. not in a worker (function () { // Main thread /** * A transport that uses a WorkerDebugger to send packets from the main * thread to a worker thread. */ function WorkerDebuggerTransport(dbg, id) { this._dbg = dbg; this._id = id; this.onMessage = this._onMessage.bind(this); } WorkerDebuggerTransport.prototype = { constructor: WorkerDebuggerTransport, ready: function () { this._dbg.addListener(this); }, close: function () { this._dbg.removeListener(this); if (this.hooks) { this.hooks.onClosed(); } }, send: function (packet) { this._dbg.postMessage(JSON.stringify({ type: "message", id: this._id, message: packet })); }, startBulkSend: function () { throw new Error("Can't send bulk data from worker threads!"); }, _onMessage: function (message) { let packet = JSON.parse(message); if (packet.type !== "message" || packet.id !== this._id) { return; } if (this.hooks) { this.hooks.onPacket(packet.message); } } }; exports.WorkerDebuggerTransport = WorkerDebuggerTransport; }).call(this); } else { (function () { // Worker thread /* * A transport that uses a WorkerDebuggerGlobalScope to send packets from a * worker thread to the main thread. */ function WorkerDebuggerTransport(scope, id) { this._scope = scope; this._id = id; this._onMessage = this._onMessage.bind(this); } WorkerDebuggerTransport.prototype = { constructor: WorkerDebuggerTransport, ready: function () { this._scope.addEventListener("message", this._onMessage); }, close: function () { this._scope.removeEventListener("message", this._onMessage); if (this.hooks) { this.hooks.onClosed(); } }, send: function (packet) { this._scope.postMessage(JSON.stringify({ type: "message", id: this._id, message: packet })); }, startBulkSend: function () { throw new Error("Can't send bulk data from worker threads!"); }, _onMessage: function (event) { let packet = JSON.parse(event.data); if (packet.type !== "message" || packet.id !== this._id) { return; } if (this.hooks) { this.hooks.onPacket(packet.message); } } }; exports.WorkerDebuggerTransport = WorkerDebuggerTransport; }).call(this); } /***/ }, /* 42 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* General utilities used throughout devtools. */ var { Ci, Cu, Cc, components } = __webpack_require__(35); const { Services } = __webpack_require__(28); var promise = __webpack_require__(40); const { FileUtils } = __webpack_require__(43); /** * Turn the error |aError| into a string, without fail. */ exports.safeErrorString = function safeErrorString(aError) { try { let errorString = aError.toString(); if (typeof errorString == "string") { // Attempt to attach a stack to |errorString|. If it throws an error, or // isn't a string, don't use it. try { if (aError.stack) { let stack = aError.stack.toString(); if (typeof stack == "string") { errorString += "\nStack: " + stack; } } } catch (ee) { } // Append additional line and column number information to the output, // since it might not be part of the stringified error. if (typeof aError.lineNumber == "number" && typeof aError.columnNumber == "number") { errorString += "Line: " + aError.lineNumber + ", column: " + aError.columnNumber; } return errorString; } } catch (ee) { } // We failed to find a good error description, so do the next best thing. return Object.prototype.toString.call(aError); }; /** * Report that |aWho| threw an exception, |aException|. */ exports.reportException = function reportException(aWho, aException) { let msg = aWho + " threw an exception: " + exports.safeErrorString(aException); console.log(msg); // if (Cu && console.error) { // /* // * Note that the xpcshell test harness registers an observer for // * console messages, so when we're running tests, this will cause // * the test to quit. // */ // console.error(msg); // } }; /** * Given a handler function that may throw, return an infallible handler * function that calls the fallible handler, and logs any exceptions it * throws. * * @param aHandler function * A handler function, which may throw. * @param aName string * A name for aHandler, for use in error messages. If omitted, we use * aHandler.name. * * (SpiderMonkey does generate good names for anonymous functions, but we * don't have a way to get at them from JavaScript at the moment.) */ exports.makeInfallible = function makeInfallible(aHandler, aName) { if (!aName) aName = aHandler.name; return function(/* arguments */) { // try { return aHandler.apply(this, arguments); // } catch (ex) { // let who = "Handler function"; // if (aName) { // who += " " + aName; // } // return exports.reportException(who, ex); // } }; }; /** * Waits for the next tick in the event loop to execute a callback. */ exports.executeSoon = function executeSoon(aFn) { setTimeout(aFn, 0); }; /** * Waits for the next tick in the event loop. * * @return Promise * A promise that is resolved after the next tick in the event loop. */ exports.waitForTick = function waitForTick() { let deferred = promise.defer(); exports.executeSoon(deferred.resolve); return deferred.promise; }; /** * Waits for the specified amount of time to pass. * * @param number aDelay * The amount of time to wait, in milliseconds. * @return Promise * A promise that is resolved after the specified amount of time passes. */ exports.waitForTime = function waitForTime(aDelay) { let deferred = promise.defer(); setTimeout(deferred.resolve, aDelay); return deferred.promise; }; /** * Like Array.prototype.forEach, but doesn't cause jankiness when iterating over * very large arrays by yielding to the browser and continuing execution on the * next tick. * * @param Array aArray * The array being iterated over. * @param Function aFn * The function called on each item in the array. If a promise is * returned by this function, iterating over the array will be paused * until the respective promise is resolved. * @returns Promise * A promise that is resolved once the whole array has been iterated * over, and all promises returned by the aFn callback are resolved. */ exports.yieldingEach = function yieldingEach(aArray, aFn) { const deferred = promise.defer(); let i = 0; let len = aArray.length; let outstanding = [deferred.promise]; (function loop() { const start = Date.now(); while (i < len) { // Don't block the main thread for longer than 16 ms at a time. To // maintain 60fps, you have to render every frame in at least 16ms; we // aren't including time spent in non-JS here, but this is Good // Enough(tm). if (Date.now() - start > 16) { exports.executeSoon(loop); return; } try { outstanding.push(aFn(aArray[i], i++)); } catch (e) { deferred.reject(e); return; } } deferred.resolve(); }()); return promise.all(outstanding); }; /** * Like XPCOMUtils.defineLazyGetter, but with a |this| sensitive getter that * allows the lazy getter to be defined on a prototype and work correctly with * instances. * * @param Object aObject * The prototype object to define the lazy getter on. * @param String aKey * The key to define the lazy getter on. * @param Function aCallback * The callback that will be called to determine the value. Will be * called with the |this| value of the current instance. */ exports.defineLazyPrototypeGetter = function defineLazyPrototypeGetter(aObject, aKey, aCallback) { Object.defineProperty(aObject, aKey, { configurable: true, get: function() { const value = aCallback.call(this); Object.defineProperty(this, aKey, { configurable: true, writable: true, value: value }); return value; } }); }; /** * Safely get the property value from a Debugger.Object for a given key. Walks * the prototype chain until the property is found. * * @param Debugger.Object aObject * The Debugger.Object to get the value from. * @param String aKey * The key to look for. * @return Any */ exports.getProperty = function getProperty(aObj, aKey) { let root = aObj; try { do { const desc = aObj.getOwnPropertyDescriptor(aKey); if (desc) { if ("value" in desc) { return desc.value; } // Call the getter if it's safe. return exports.hasSafeGetter(desc) ? desc.get.call(root).return : undefined; } aObj = aObj.proto; } while (aObj); } catch (e) { // If anything goes wrong report the error and return undefined. exports.reportException("getProperty", e); } return undefined; }; /** * Determines if a descriptor has a getter which doesn't call into JavaScript. * * @param Object aDesc * The descriptor to check for a safe getter. * @return Boolean * Whether a safe getter was found. */ exports.hasSafeGetter = function hasSafeGetter(aDesc) { // Scripted functions that are CCWs will not appear scripted until after // unwrapping. try { let fn = aDesc.get.unwrap(); return fn && fn.callable && fn.class == "Function" && fn.script === undefined; } catch (e) { // Avoid exception 'Object in compartment marked as invisible to Debugger' return false; } }; /** * Check if it is safe to read properties and execute methods from the given JS * object. Safety is defined as being protected from unintended code execution * from content scripts (or cross-compartment code). * * See bugs 945920 and 946752 for discussion. * * @type Object aObj * The object to check. * @return Boolean * True if it is safe to read properties from aObj, or false otherwise. */ exports.isSafeJSObject = function isSafeJSObject(aObj) { // If we are running on a worker thread, Cu is not available. In this case, // we always return false, just to be on the safe side. if (isWorker) { return false; } if (Cu.getGlobalForObject(aObj) == Cu.getGlobalForObject(exports.isSafeJSObject)) { return true; // aObj is not a cross-compartment wrapper. } let principal = Cu.getObjectPrincipal(aObj); if (Services.scriptSecurityManager.isSystemPrincipal(principal)) { return true; // allow chrome objects } return Cu.isXrayWrapper(aObj); }; exports.dumpn = function dumpn(str) { if (exports.dumpn.wantLogging) { console.log("DBG-SERVER: " + str + "\n"); } }; // We want wantLogging to be writable. The exports object is frozen by the // loader, so define it on dumpn instead. exports.dumpn.wantLogging = false; /** * A verbose logger for low-level tracing. */ exports.dumpv = function(msg) { if (exports.dumpv.wantVerbose) { exports.dumpn(msg); } }; // We want wantLogging to be writable. The exports object is frozen by the // loader, so define it on dumpn instead. exports.dumpv.wantVerbose = false; /** * Utility function for updating an object with the properties of * other objects. * * @param aTarget Object * The object being updated. * @param aNewAttrs Object * The rest params are objects to update aTarget with. You * can pass as many as you like. */ exports.update = function update(aTarget, ...aArgs) { for (let attrs of aArgs) { for (let key in attrs) { let desc = Object.getOwnPropertyDescriptor(attrs, key); if (desc) { Object.defineProperty(aTarget, key, desc); } } } return aTarget; }; /** * Utility function for getting the values from an object as an array * * @param aObject Object * The object to iterate over */ exports.values = function values(aObject) { return Object.keys(aObject).map(k => aObject[k]); }; /** * Defines a getter on a specified object that will be created upon first use. * * @param aObject * The object to define the lazy getter on. * @param aName * The name of the getter to define on aObject. * @param aLambda * A function that returns what the getter should return. This will * only ever be called once. */ exports.defineLazyGetter = function defineLazyGetter(aObject, aName, aLambda) { Object.defineProperty(aObject, aName, { get: function() { delete aObject[aName]; return aObject[aName] = aLambda.apply(aObject); }, configurable: true, enumerable: true }); }; // DEPRECATED: use DevToolsUtils.assert(condition, message) instead! let haveLoggedDeprecationMessage = false; exports.dbg_assert = function dbg_assert(cond, e) { if (!haveLoggedDeprecationMessage) { haveLoggedDeprecationMessage = true; const deprecationMessage = "DevToolsUtils.dbg_assert is deprecated! Use DevToolsUtils.assert instead!" + Error().stack; console.log(deprecationMessage); if (typeof console === "object" && console && console.warn) { console.warn(deprecationMessage); } } if (!cond) { return e; } }; const { AppConstants } = __webpack_require__(44); /** * No operation. The empty function. */ exports.noop = function() { }; function reallyAssert(condition, message) { if (!condition) { const err = new Error("Assertion failure: " + message); exports.reportException("DevToolsUtils.assert", err); throw err; } } /** * DevToolsUtils.assert(condition, message) * * @param Boolean condition * @param String message * * Assertions are enabled when any of the following are true: * - This is a DEBUG_JS_MODULES build * - This is a DEBUG build * - DevToolsUtils.testing is set to true * * If assertions are enabled, then `condition` is checked and if false-y, the * assertion failure is logged and then an error is thrown. * * If assertions are not enabled, then this function is a no-op. * * This is an improvement over `dbg_assert`, which doesn't actually cause any * fatal behavior, and is therefore much easier to accidentally ignore. */ Object.defineProperty(exports, "assert", { get: () => (AppConstants.DEBUG || AppConstants.DEBUG_JS_MODULES || this.testing) ? reallyAssert : exports.noop, }); /** * Defines a getter on a specified object for a module. The module will not * be imported until first use. * * @param aObject * The object to define the lazy getter on. * @param aName * The name of the getter to define on aObject for the module. * @param aResource * The URL used to obtain the module. * @param aSymbol * The name of the symbol exported by the module. * This parameter is optional and defaults to aName. */ exports.defineLazyModuleGetter = function defineLazyModuleGetter(aObject, aName, aResource, aSymbol) { this.defineLazyGetter(aObject, aName, function XPCU_moduleLambda() { var temp = {}; Cu.import(aResource, temp); return temp[aSymbol || aName]; }); }; const { NetUtil } = __webpack_require__(45); const { TextDecoder, OS } = __webpack_require__(46); const NetworkHelper = __webpack_require__(47); /** * Performs a request to load the desired URL and returns a promise. * * @param aURL String * The URL we will request. * @param aOptions Object * An object with the following optional properties: * - loadFromCache: if false, will bypass the cache and * always load fresh from the network (default: true) * - policy: the nsIContentPolicy type to apply when fetching the URL * - window: the window to get the loadGroup from * - charset: the charset to use if the channel doesn't provide one * @returns Promise that resolves with an object with the following members on * success: * - content: the document at that URL, as a string, * - contentType: the content type of the document * * If an error occurs, the promise is rejected with that error. * * XXX: It may be better to use nsITraceableChannel to get to the sources * without relying on caching when we can (not for eval, etc.): * http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/ */ function mainThreadFetch(aURL, aOptions = { loadFromCache: true, policy: Ci.nsIContentPolicy.TYPE_OTHER, window: null, charset: null }) { // Create a channel. let url = aURL.split(" -> ").pop(); let channel; try { channel = newChannelForURL(url, aOptions); } catch (ex) { return promise.reject(ex); } // Set the channel options. channel.loadFlags = aOptions.loadFromCache ? channel.LOAD_FROM_CACHE : channel.LOAD_BYPASS_CACHE; if (aOptions.window) { // Respect private browsing. channel.loadGroup = aOptions.window.QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIWebNavigation) .QueryInterface(Ci.nsIDocumentLoader) .loadGroup; } let deferred = promise.defer(); let onResponse = (stream, status, request) => { if (!components.isSuccessCode(status)) { deferred.reject(new Error(`Failed to fetch ${url}. Code ${status}.`)); return; } try { // We cannot use NetUtil to do the charset conversion as if charset // information is not available and our default guess is wrong the method // might fail and we lose the stream data. This means we can't fall back // to using the locale default encoding (bug 1181345). // Read and decode the data according to the locale default encoding. let available = stream.available(); let source = NetUtil.readInputStreamToString(stream, available); stream.close(); // If the channel or the caller has correct charset information, the // content will be decoded correctly. If we have to fall back to UTF-8 and // the guess is wrong, the conversion fails and convertToUnicode returns // the input unmodified. Essentially we try to decode the data as UTF-8 // and if that fails, we use the locale specific default encoding. This is // the best we can do if the source does not provide charset info. let charset = channel.contentCharset || aOptions.charset || "UTF-8"; let unicodeSource = NetworkHelper.convertToUnicode(source, charset); deferred.resolve({ content: unicodeSource, contentType: request.contentType }); } catch (ex) { let uri = request.originalURI; if (ex.name === "NS_BASE_STREAM_CLOSED" && uri instanceof Ci.nsIFileURL) { // Empty files cause NS_BASE_STREAM_CLOSED exception. Use OS.File to // differentiate between empty files and other errors (bug 1170864). // This can be removed when bug 982654 is fixed. uri.QueryInterface(Ci.nsIFileURL); let result = OS.File.read(uri.file.path).then(bytes => { // Convert the bytearray to a String. let decoder = new TextDecoder(); let content = decoder.decode(bytes); // We can't detect the contentType without opening a channel // and that failed already. This is the best we can do here. return { content, contentType: "text/plain" }; }); deferred.resolve(result); } else { deferred.reject(ex); } } }; // Open the channel try { NetUtil.asyncFetch(channel, onResponse); } catch (ex) { return promise.reject(ex); } return deferred.promise; } /** * Opens a channel for given URL. Tries a bit harder than NetUtil.newChannel. * * @param {String} url - The URL to open a channel for. * @param {Object} options - The options object passed to @method fetch. * @return {nsIChannel} - The newly created channel. Throws on failure. */ function newChannelForURL(url, { policy }) { let channelOptions = { contentPolicyType: policy, loadUsingSystemPrincipal: true, uri: url }; try { return NetUtil.newChannel(channelOptions); } catch (e) { // In the xpcshell tests, the script url is the absolute path of the test // file, which will make a malformed URI error be thrown. Add the file // scheme to see if it helps. channelOptions.uri = "file://" + url; return NetUtil.newChannel(channelOptions); } } // Fetch is defined differently depending on whether we are on the main thread // or a worker thread. if (typeof WorkerGlobalScope === "undefined") { // i.e. not in a worker exports.fetch = mainThreadFetch; } else { // Services is not available in worker threads, nor is there any other way // to fetch a URL. We need to enlist the help from the main thread here, by // issuing an rpc request, to fetch the URL on our behalf. exports.fetch = function(url, options) { return rpc("fetch", url, options); }; } /** * Returns a promise that is resolved or rejected when all promises have settled * (resolved or rejected). * * This differs from Promise.all, which will reject immediately after the first * rejection, instead of waiting for the remaining promises to settle. * * @param values * Iterable of promises that may be pending, resolved, or rejected. When * when all promises have settled (resolved or rejected), the returned * promise will be resolved or rejected as well. * * @return A new promise that is fulfilled when all values have settled * (resolved or rejected). Its resolution value will be an array of all * resolved values in the given order, or undefined if values is an * empty array. The reject reason will be forwarded from the first * promise in the list of given promises to be rejected. */ exports.settleAll = values => { if (values === null || typeof (values[Symbol.iterator]) != "function") { throw new Error("settleAll() expects an iterable."); } let deferred = promise.defer(); values = Array.isArray(values) ? values : [...values]; let countdown = values.length; let resolutionValues = new Array(countdown); let rejectionValue; let rejectionOccurred = false; if (!countdown) { deferred.resolve(resolutionValues); return deferred.promise; } function checkForCompletion() { if (--countdown > 0) { return; } if (!rejectionOccurred) { deferred.resolve(resolutionValues); } else { deferred.reject(rejectionValue); } } for (let i = 0; i < values.length; i++) { let index = i; let value = values[i]; let resolver = result => { resolutionValues[index] = result; checkForCompletion(); }; let rejecter = error => { if (!rejectionOccurred) { rejectionValue = error; rejectionOccurred = true; } checkForCompletion(); }; if (value && typeof (value.then) == "function") { value.then(resolver, rejecter); } else { // Given value is not a promise, forward it as a resolution value. resolver(value); } } return deferred.promise; }; /** * When the testing flag is set, various behaviors may be altered from * production mode, typically to enable easier testing or enhanced debugging. */ var testing = false; Object.defineProperty(exports, "testing", { get: function() { return testing; }, set: function(state) { testing = state; } }); /** * Open the file at the given path for reading. * * @param {String} filePath * * @returns Promise */ exports.openFileStream = function(filePath) { return new Promise((resolve, reject) => { const uri = NetUtil.newURI(new FileUtils.File(filePath)); NetUtil.asyncFetch( { uri, loadUsingSystemPrincipal: true }, (stream, result) => { if (!components.isSuccessCode(result)) { reject(new Error(`Could not open "${filePath}": result = ${result}`)); return; } resolve(stream); } ); }); }; exports.isGenerator = function(fn) { if (typeof fn !== "function") { return false; } let proto = Object.getPrototypeOf(fn); if (!proto) { return false; } let ctor = proto.constructor; if (!ctor) { return false; } return ctor.name == "GeneratorFunction"; }; exports.isPromise = function(p) { return p && typeof p.then === "function"; }; /** * Return true if `thing` is a SavedFrame, false otherwise. */ exports.isSavedFrame = function(thing) { return Object.prototype.toString.call(thing) === "[object SavedFrame]"; }; /***/ }, /* 43 */ /***/ function(module, exports) { /* * A sham for https://dxr.mozilla.org/mozilla-central/source/toolkit/modules/FileUtils.jsm */ /***/ }, /* 44 */ /***/ function(module, exports) { /* * A sham for https://dxr.mozilla.org/mozilla-central/source/toolkit/modules/AppConstants.jsm */ module.exports = { AppConstants: {} }; /***/ }, /* 45 */ /***/ function(module, exports) { /* * A sham for https://dxr.mozilla.org/mozilla-central/source/netwerk/base/NetUtil.jsm */ /***/ }, /* 46 */ /***/ function(module, exports) { /* * A sham for https://dxr.mozilla.org/mozilla-central/source/toolkit/components/osfile/osfile.jsm */ /***/ }, /* 47 */ /***/ function(module, exports, __webpack_require__) { /* vim:set ts=2 sw=2 sts=2 et: */ /* * Software License Agreement (BSD License) * * Copyright (c) 2007, Parakey Inc. * All rights reserved. * * Redistribution and use of this software in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other * materials provided with the distribution. * * * Neither the name of Parakey Inc. nor the names of its * contributors may be used to endorse or promote products * derived from this software without specific prior * written permission of Parakey Inc. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Creator: * Joe Hewitt * Contributors * John J. Barton (IBM Almaden) * Jan Odvarko (Mozilla Corp.) * Max Stepanov (Aptana Inc.) * Rob Campbell (Mozilla Corp.) * Hans Hillen (Paciello Group, Mozilla) * Curtis Bartley (Mozilla Corp.) * Mike Collins (IBM Almaden) * Kevin Decker * Mike Ratcliffe (Comartis AG) * Hernan Rodríguez Colmeiro * Austin Andrews * Christoph Dorn * Steven Roussey (AppCenter Inc, Network54) * Mihai Sucan (Mozilla Corp.) */ "use strict"; const {components, Cc, Ci, Cu} = __webpack_require__(35); const { NetUtil } = __webpack_require__(45); const DevToolsUtils = __webpack_require__(42); // The cache used in the `nsIURL` function. const gNSURLStore = new Map(); /** * Helper object for networking stuff. * * Most of the following functions have been taken from the Firebug source. They * have been modified to match the Firefox coding rules. */ var NetworkHelper = { /** * Converts aText with a given aCharset to unicode. * * @param string aText * Text to convert. * @param string aCharset * Charset to convert the text to. * @returns string * Converted text. */ convertToUnicode: function NH_convertToUnicode(aText, aCharset) { let conv = Cc("@mozilla.org/intl/scriptableunicodeconverter"). createInstance(Ci.nsIScriptableUnicodeConverter); try { conv.charset = aCharset || "UTF-8"; return conv.ConvertToUnicode(aText); } catch (ex) { return aText; } }, /** * Reads all available bytes from aStream and converts them to aCharset. * * @param nsIInputStream aStream * @param string aCharset * @returns string * UTF-16 encoded string based on the content of aStream and aCharset. */ readAndConvertFromStream: function NH_readAndConvertFromStream(aStream, aCharset) { let text = null; try { text = NetUtil.readInputStreamToString(aStream, aStream.available()) return this.convertToUnicode(text, aCharset); } catch (err) { return text; } }, /** * Reads the posted text from aRequest. * * @param nsIHttpChannel aRequest * @param string aCharset * The content document charset, used when reading the POSTed data. * @returns string or null * Returns the posted string if it was possible to read from aRequest * otherwise null. */ readPostTextFromRequest: function NH_readPostTextFromRequest(aRequest, aCharset) { if (aRequest instanceof Ci.nsIUploadChannel) { let iStream = aRequest.uploadStream; let isSeekableStream = false; if (iStream instanceof Ci.nsISeekableStream) { isSeekableStream = true; } let prevOffset; if (isSeekableStream) { prevOffset = iStream.tell(); iStream.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0); } // Read data from the stream. let text = this.readAndConvertFromStream(iStream, aCharset); // Seek locks the file, so seek to the beginning only if necko hasn't // read it yet, since necko doesn't seek to 0 before reading (at lest // not till 459384 is fixed). if (isSeekableStream && prevOffset == 0) { iStream.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0); } return text; } return null; }, /** * Reads the posted text from the page's cache. * * @param nsIDocShell aDocShell * @param string aCharset * @returns string or null * Returns the posted string if it was possible to read from * aDocShell otherwise null. */ readPostTextFromPage: function NH_readPostTextFromPage(aDocShell, aCharset) { let webNav = aDocShell.QueryInterface(Ci.nsIWebNavigation); return this.readPostTextFromPageViaWebNav(webNav, aCharset); }, /** * Reads the posted text from the page's cache, given an nsIWebNavigation * object. * * @param nsIWebNavigation aWebNav * @param string aCharset * @returns string or null * Returns the posted string if it was possible to read from * aWebNav, otherwise null. */ readPostTextFromPageViaWebNav: function NH_readPostTextFromPageViaWebNav(aWebNav, aCharset) { if (aWebNav instanceof Ci.nsIWebPageDescriptor) { let descriptor = aWebNav.currentDescriptor; if (descriptor instanceof Ci.nsISHEntry && descriptor.postData && descriptor instanceof Ci.nsISeekableStream) { descriptor.seek(NS_SEEK_SET, 0); return this.readAndConvertFromStream(descriptor, aCharset); } } return null; }, /** * Gets the web appId that is associated with aRequest. * * @param nsIHttpChannel aRequest * @returns number|null * The appId for the given request, if available. */ getAppIdForRequest: function NH_getAppIdForRequest(aRequest) { try { return this.getRequestLoadContext(aRequest).appId; } catch (ex) { // request loadContent is not always available. } return null; }, /** * Gets the topFrameElement that is associated with aRequest. This * works in single-process and multiprocess contexts. It may cross * the content/chrome boundary. * * @param nsIHttpChannel aRequest * @returns nsIDOMElement|null * The top frame element for the given request. */ getTopFrameForRequest: function NH_getTopFrameForRequest(aRequest) { try { return this.getRequestLoadContext(aRequest).topFrameElement; } catch (ex) { // request loadContent is not always available. } return null; }, /** * Gets the nsIDOMWindow that is associated with aRequest. * * @param nsIHttpChannel aRequest * @returns nsIDOMWindow or null */ getWindowForRequest: function NH_getWindowForRequest(aRequest) { try { return this.getRequestLoadContext(aRequest).associatedWindow; } catch (ex) { // TODO: bug 802246 - getWindowForRequest() throws on b2g: there is no // associatedWindow property. } return null; }, /** * Gets the nsILoadContext that is associated with aRequest. * * @param nsIHttpChannel aRequest * @returns nsILoadContext or null */ getRequestLoadContext: function NH_getRequestLoadContext(aRequest) { try { return aRequest.notificationCallbacks.getInterface(Ci.nsILoadContext); } catch (ex) { } try { return aRequest.loadGroup.notificationCallbacks.getInterface(Ci.nsILoadContext); } catch (ex) { } return null; }, /** * Determines whether the request has been made for the top level document. * * @param nsIHttpChannel aRequest * @returns Boolean True if the request represents the top level document. */ isTopLevelLoad: function(aRequest) { if (aRequest instanceof Ci.nsIChannel) { let loadInfo = aRequest.loadInfo; if (loadInfo && loadInfo.parentOuterWindowID == loadInfo.outerWindowID) { return (aRequest.loadFlags & Ci.nsIChannel.LOAD_DOCUMENT_URI); } } return false; }, /** * Loads the content of aUrl from the cache. * * @param string aUrl * URL to load the cached content for. * @param string aCharset * Assumed charset of the cached content. Used if there is no charset * on the channel directly. * @param function aCallback * Callback that is called with the loaded cached content if available * or null if something failed while getting the cached content. */ loadFromCache: function NH_loadFromCache(aUrl, aCharset, aCallback) { let channel = NetUtil.newChannel({uri: aUrl, loadUsingSystemPrincipal: true}); // Ensure that we only read from the cache and not the server. channel.loadFlags = Ci.nsIRequest.LOAD_FROM_CACHE | Ci.nsICachingChannel.LOAD_ONLY_FROM_CACHE | Ci.nsICachingChannel.LOAD_BYPASS_LOCAL_CACHE_IF_BUSY; NetUtil.asyncFetch( channel, (aInputStream, aStatusCode, aRequest) => { if (!components.isSuccessCode(aStatusCode)) { aCallback(null); return; } // Try to get the encoding from the channel. If there is none, then use // the passed assumed aCharset. let aChannel = aRequest.QueryInterface(Ci.nsIChannel); let contentCharset = aChannel.contentCharset || aCharset; // Read the content of the stream using contentCharset as encoding. aCallback(this.readAndConvertFromStream(aInputStream, contentCharset)); }); }, /** * Parse a raw Cookie header value. * * @param string aHeader * The raw Cookie header value. * @return array * Array holding an object for each cookie. Each object holds the * following properties: name and value. */ parseCookieHeader: function NH_parseCookieHeader(aHeader) { let cookies = aHeader.split(";"); let result = []; cookies.forEach(function(aCookie) { let equal = aCookie.indexOf("="); let name = aCookie.substr(0, equal); let value = aCookie.substr(equal + 1); result.push({name: unescape(name.trim()), value: unescape(value.trim())}); }); return result; }, /** * Parse a raw Set-Cookie header value. * * @param string aHeader * The raw Set-Cookie header value. * @return array * Array holding an object for each cookie. Each object holds the * following properties: name, value, secure (boolean), httpOnly * (boolean), path, domain and expires (ISO date string). */ parseSetCookieHeader: function NH_parseSetCookieHeader(aHeader) { let rawCookies = aHeader.split(/\r\n|\n|\r/); let cookies = []; rawCookies.forEach(function(aCookie) { let equal = aCookie.indexOf("="); let name = unescape(aCookie.substr(0, equal).trim()); let parts = aCookie.substr(equal + 1).split(";"); let value = unescape(parts.shift().trim()); let cookie = {name: name, value: value}; parts.forEach(function(aPart) { let part = aPart.trim(); if (part.toLowerCase() == "secure") { cookie.secure = true; } else if (part.toLowerCase() == "httponly") { cookie.httpOnly = true; } else if (part.indexOf("=") > -1) { let pair = part.split("="); pair[0] = pair[0].toLowerCase(); if (pair[0] == "path" || pair[0] == "domain") { cookie[pair[0]] = pair[1]; } else if (pair[0] == "expires") { try { pair[1] = pair[1].replace(/-/g, ' '); cookie.expires = new Date(pair[1]).toISOString(); } catch (ex) { } } } }); cookies.push(cookie); }); return cookies; }, // This is a list of all the mime category maps jviereck could find in the // firebug code base. mimeCategoryMap: { "text/plain": "txt", "text/html": "html", "text/xml": "xml", "text/xsl": "txt", "text/xul": "txt", "text/css": "css", "text/sgml": "txt", "text/rtf": "txt", "text/x-setext": "txt", "text/richtext": "txt", "text/javascript": "js", "text/jscript": "txt", "text/tab-separated-values": "txt", "text/rdf": "txt", "text/xif": "txt", "text/ecmascript": "js", "text/vnd.curl": "txt", "text/x-json": "json", "text/x-js": "txt", "text/js": "txt", "text/vbscript": "txt", "view-source": "txt", "view-fragment": "txt", "application/xml": "xml", "application/xhtml+xml": "xml", "application/atom+xml": "xml", "application/rss+xml": "xml", "application/vnd.mozilla.maybe.feed": "xml", "application/vnd.mozilla.xul+xml": "xml", "application/javascript": "js", "application/x-javascript": "js", "application/x-httpd-php": "txt", "application/rdf+xml": "xml", "application/ecmascript": "js", "application/http-index-format": "txt", "application/json": "json", "application/x-js": "txt", "multipart/mixed": "txt", "multipart/x-mixed-replace": "txt", "image/svg+xml": "svg", "application/octet-stream": "bin", "image/jpeg": "image", "image/jpg": "image", "image/gif": "image", "image/png": "image", "image/bmp": "image", "application/x-shockwave-flash": "flash", "video/x-flv": "flash", "audio/mpeg3": "media", "audio/x-mpeg-3": "media", "video/mpeg": "media", "video/x-mpeg": "media", "audio/ogg": "media", "application/ogg": "media", "application/x-ogg": "media", "application/x-midi": "media", "audio/midi": "media", "audio/x-mid": "media", "audio/x-midi": "media", "music/crescendo": "media", "audio/wav": "media", "audio/x-wav": "media", "text/json": "json", "application/x-json": "json", "application/json-rpc": "json", "application/x-web-app-manifest+json": "json", "application/manifest+json": "json" }, /** * Check if the given MIME type is a text-only MIME type. * * @param string aMimeType * @return boolean */ isTextMimeType: function NH_isTextMimeType(aMimeType) { if (aMimeType.indexOf("text/") == 0) { return true; } // XML and JSON often come with custom MIME types, so in addition to the // standard "application/xml" and "application/json", we also look for // variants like "application/x-bigcorp+xml". For JSON we allow "+json" and // "-json" as suffixes. if (/^application\/\w+(?:[\.-]\w+)*(?:\+xml|[-+]json)$/.test(aMimeType)) { return true; } let category = this.mimeCategoryMap[aMimeType] || null; switch (category) { case "txt": case "js": case "json": case "css": case "html": case "svg": case "xml": return true; default: return false; } }, /** * Takes a securityInfo object of nsIRequest, the nsIRequest itself and * extracts security information from them. * * @param object securityInfo * The securityInfo object of a request. If null channel is assumed * to be insecure. * @param object httpActivity * The httpActivity object for the request with at least members * { private, hostname }. * * @return object * Returns an object containing following members: * - state: The security of the connection used to fetch this * request. Has one of following string values: * * "insecure": the connection was not secure (only http) * * "weak": the connection has minor security issues * * "broken": secure connection failed (e.g. expired cert) * * "secure": the connection was properly secured. * If state == broken: * - errorMessage: full error message from nsITransportSecurityInfo. * If state == secure: * - protocolVersion: one of TLSv1, TLSv1.1, TLSv1.2. * - cipherSuite: the cipher suite used in this connection. * - cert: information about certificate used in this connection. * See parseCertificateInfo for the contents. * - hsts: true if host uses Strict Transport Security, false otherwise * - hpkp: true if host uses Public Key Pinning, false otherwise * If state == weak: Same as state == secure and * - weaknessReasons: list of reasons that cause the request to be * considered weak. See getReasonsForWeakness. */ parseSecurityInfo: function NH_parseSecurityInfo(securityInfo, httpActivity) { const info = { state: "insecure", }; // The request did not contain any security info. if (!securityInfo) { return info; } /** * Different scenarios to consider here and how they are handled: * - request is HTTP, the connection is not secure * => securityInfo is null * => state === "insecure" * * - request is HTTPS, the connection is secure * => .securityState has STATE_IS_SECURE flag * => state === "secure" * * - request is HTTPS, the connection has security issues * => .securityState has STATE_IS_INSECURE flag * => .errorCode is an NSS error code. * => state === "broken" * * - request is HTTPS, the connection was terminated before the security * could be validated * => .securityState has STATE_IS_INSECURE flag * => .errorCode is NOT an NSS error code. * => .errorMessage is not available. * => state === "insecure" * * - request is HTTPS but it uses a weak cipher or old protocol, see * https://hg.mozilla.org/mozilla-central/annotate/def6ed9d1c1a/ * security/manager/ssl/nsNSSCallbacks.cpp#l1233 * - request is mixed content (which makes no sense whatsoever) * => .securityState has STATE_IS_BROKEN flag * => .errorCode is NOT an NSS error code * => .errorMessage is not available * => state === "weak" */ securityInfo.QueryInterface(Ci.nsITransportSecurityInfo); securityInfo.QueryInterface(Ci.nsISSLStatusProvider); const wpl = Ci.nsIWebProgressListener; const NSSErrorsService = Cc['@mozilla.org/nss_errors_service;1'] .getService(Ci.nsINSSErrorsService); const SSLStatus = securityInfo.SSLStatus; if (!NSSErrorsService.isNSSErrorCode(securityInfo.errorCode)) { const state = securityInfo.securityState; let uri = null; if (httpActivity.channel && httpActivity.channel.URI) { uri = httpActivity.channel.URI; } if (uri && !uri.schemeIs("https") && !uri.schemeIs("wss")) { // it is not enough to look at the transport security info - schemes other than // https and wss are subject to downgrade/etc at the scheme level and should // always be considered insecure info.state = "insecure"; } else if (state & wpl.STATE_IS_SECURE) { // The connection is secure if the scheme is sufficient info.state = "secure"; } else if (state & wpl.STATE_IS_BROKEN) { // The connection is not secure, there was no error but there's some // minor security issues. info.state = "weak"; info.weaknessReasons = this.getReasonsForWeakness(state); } else if (state & wpl.STATE_IS_INSECURE) { // This was most likely an https request that was aborted before // validation. Return info as info.state = insecure. return info; } else { DevToolsUtils.reportException("NetworkHelper.parseSecurityInfo", "Security state " + state + " has no known STATE_IS_* flags."); return info; } // Cipher suite. info.cipherSuite = SSLStatus.cipherName; // Protocol version. info.protocolVersion = this.formatSecurityProtocol(SSLStatus.protocolVersion); // Certificate. info.cert = this.parseCertificateInfo(SSLStatus.serverCert); // HSTS and HPKP if available. if (httpActivity.hostname) { const sss = Cc("@mozilla.org/ssservice;1") .getService(Ci.nsISiteSecurityService); // SiteSecurityService uses different storage if the channel is // private. Thus we must give isSecureHost correct flags or we // might get incorrect results. let flags = (httpActivity.private) ? Ci.nsISocketProvider.NO_PERMANENT_STORAGE : 0; let host = httpActivity.hostname; info.hsts = sss.isSecureHost(sss.HEADER_HSTS, host, flags); info.hpkp = sss.isSecureHost(sss.HEADER_HPKP, host, flags); } else { DevToolsUtils.reportException("NetworkHelper.parseSecurityInfo", "Could not get HSTS/HPKP status as hostname is not available."); info.hsts = false; info.hpkp = false; } } else { // The connection failed. info.state = "broken"; info.errorMessage = securityInfo.errorMessage; } return info; }, /** * Takes an nsIX509Cert and returns an object with certificate information. * * @param nsIX509Cert cert * The certificate to extract the information from. * @return object * An object with following format: * { * subject: { commonName, organization, organizationalUnit }, * issuer: { commonName, organization, organizationUnit }, * validity: { start, end }, * fingerprint: { sha1, sha256 } * } */ parseCertificateInfo: function NH_parseCertifificateInfo(cert) { let info = {}; if (cert) { info.subject = { commonName: cert.commonName, organization: cert.organization, organizationalUnit: cert.organizationalUnit, }; info.issuer = { commonName: cert.issuerCommonName, organization: cert.issuerOrganization, organizationUnit: cert.issuerOrganizationUnit, }; info.validity = { start: cert.validity.notBeforeLocalDay, end: cert.validity.notAfterLocalDay, }; info.fingerprint = { sha1: cert.sha1Fingerprint, sha256: cert.sha256Fingerprint, }; } else { DevToolsUtils.reportException("NetworkHelper.parseCertificateInfo", "Secure connection established without certificate."); } return info; }, /** * Takes protocolVersion of SSLStatus object and returns human readable * description. * * @param Number version * One of nsISSLStatus version constants. * @return string * One of TLSv1, TLSv1.1, TLSv1.2 if @param version is valid, * Unknown otherwise. */ formatSecurityProtocol: function NH_formatSecurityProtocol(version) { switch (version) { case Ci.nsISSLStatus.TLS_VERSION_1: return "TLSv1"; case Ci.nsISSLStatus.TLS_VERSION_1_1: return "TLSv1.1"; case Ci.nsISSLStatus.TLS_VERSION_1_2: return "TLSv1.2"; default: DevToolsUtils.reportException("NetworkHelper.formatSecurityProtocol", "protocolVersion " + version + " is unknown."); return "Unknown"; } }, /** * Takes the securityState bitfield and returns reasons for weak connection * as an array of strings. * * @param Number state * nsITransportSecurityInfo.securityState. * * @return Array[String] * List of weakness reasons. A subset of { cipher } where * * cipher: The cipher suite is consireded to be weak (RC4). */ getReasonsForWeakness: function NH_getReasonsForWeakness(state) { const wpl = Ci.nsIWebProgressListener; // If there's non-fatal security issues the request has STATE_IS_BROKEN // flag set. See http://hg.mozilla.org/mozilla-central/file/44344099d119 // /security/manager/ssl/nsNSSCallbacks.cpp#l1233 let reasons = []; if (state & wpl.STATE_IS_BROKEN) { let isCipher = state & wpl.STATE_USES_WEAK_CRYPTO; if (isCipher) { reasons.push("cipher"); } if (!isCipher) { DevToolsUtils.reportException("NetworkHelper.getReasonsForWeakness", "STATE_IS_BROKEN without a known reason. Full state was: " + state); } } return reasons; }, /** * Parse a url's query string into its components * * @param string aQueryString * The query part of a url * @return array * Array of query params {name, value} */ parseQueryString: function(aQueryString) { // Make sure there's at least one param available. // Be careful here, params don't necessarily need to have values, so // no need to verify the existence of a "=". if (!aQueryString) { return; } // Turn the params string into an array containing { name: value } tuples. let paramsArray = aQueryString.replace(/^[?&]/, "").split("&").map(e => { let param = e.split("="); return { name: param[0] ? NetworkHelper.convertToUnicode(unescape(param[0])) : "", value: param[1] ? NetworkHelper.convertToUnicode(unescape(param[1])) : "" }}); return paramsArray; }, /** * Helper for getting an nsIURL instance out of a string. */ nsIURL: function(aUrl, aStore = gNSURLStore) { if (aStore.has(aUrl)) { return aStore.get(aUrl); } var uri = Services.io.newURI(aUrl).QueryInterface(Ci.nsIURL); aStore.set(aUrl, uri); return uri; } }; for (let prop of Object.getOwnPropertyNames(NetworkHelper)) { exports[prop] = NetworkHelper[prop]; } /***/ }, /* 48 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ const { Ci, Cc, Cr, CC } = __webpack_require__(35); const { Services } = __webpack_require__(28); const { dumpv } = __webpack_require__(42); const EventEmitter = __webpack_require__(34); const promise = __webpack_require__(40); const IOUtil = Cc("@mozilla.org/io-util;1").getService(Ci.nsIIOUtil); const ScriptableInputStream = CC("@mozilla.org/scriptableinputstream;1", "nsIScriptableInputStream", "init"); const BUFFER_SIZE = 0x8000; /** * This helper function (and its companion object) are used by bulk senders and * receivers to read and write data in and out of other streams. Functions that * make use of this tool are passed to callers when it is time to read or write * bulk data. It is highly recommended to use these copier functions instead of * the stream directly because the copier enforces the agreed upon length. * Since bulk mode reuses an existing stream, the sender and receiver must write * and read exactly the agreed upon amount of data, or else the entire transport * will be left in a invalid state. Additionally, other methods of stream * copying (such as NetUtil.asyncCopy) close the streams involved, which would * terminate the debugging transport, and so it is avoided here. * * Overall, this *works*, but clearly the optimal solution would be able to just * use the streams directly. If it were possible to fully implement * nsIInputStream / nsIOutputStream in JS, wrapper streams could be created to * enforce the length and avoid closing, and consumers could use familiar stream * utilities like NetUtil.asyncCopy. * * The function takes two async streams and copies a precise number of bytes * from one to the other. Copying begins immediately, but may complete at some * future time depending on data size. Use the returned promise to know when * it's complete. * * @param input nsIAsyncInputStream * The stream to copy from. * @param output nsIAsyncOutputStream * The stream to copy to. * @param length Integer * The amount of data that needs to be copied. * @return Promise * The promise is resolved when copying completes or rejected if any * (unexpected) errors occur. */ function copyStream(input, output, length) { let copier = new StreamCopier(input, output, length); return copier.copy(); } function StreamCopier(input, output, length) { EventEmitter.decorate(this); this._id = StreamCopier._nextId++; this.input = input; // Save off the base output stream, since we know it's async as we've required this.baseAsyncOutput = output; if (IOUtil.outputStreamIsBuffered(output)) { this.output = output; } else { this.output = Cc("@mozilla.org/network/buffered-output-stream;1") .createInstance(Ci.nsIBufferedOutputStream); this.output.init(output, BUFFER_SIZE); } this._length = length; this._amountLeft = length; this._deferred = promise.defer(); this._copy = this._copy.bind(this); this._flush = this._flush.bind(this); this._destroy = this._destroy.bind(this); // Copy promise's then method up to this object. // Allows the copier to offer a promise interface for the simple succeed or // fail scenarios, but also emit events (due to the EventEmitter) for other // states, like progress. this.then = this._deferred.promise.then.bind(this._deferred.promise); this.then(this._destroy, this._destroy); // Stream ready callback starts as |_copy|, but may switch to |_flush| at end // if flushing would block the output stream. this._streamReadyCallback = this._copy; } StreamCopier._nextId = 0; StreamCopier.prototype = { copy: function() { // Dispatch to the next tick so that it's possible to attach a progress // event listener, even for extremely fast copies (like when testing). Services.tm.currentThread.dispatch(() => { try { this._copy(); } catch (e) { this._deferred.reject(e); } }, 0); return this; }, _copy: function() { let bytesAvailable = this.input.available(); let amountToCopy = Math.min(bytesAvailable, this._amountLeft); this._debug("Trying to copy: " + amountToCopy); let bytesCopied; try { bytesCopied = this.output.writeFrom(this.input, amountToCopy); } catch (e) { if (e.result == Cr.NS_BASE_STREAM_WOULD_BLOCK) { this._debug("Base stream would block, will retry"); this._debug("Waiting for output stream"); this.baseAsyncOutput.asyncWait(this, 0, 0, Services.tm.currentThread); return; } else { throw e; } } this._amountLeft -= bytesCopied; this._debug("Copied: " + bytesCopied + ", Left: " + this._amountLeft); this._emitProgress(); if (this._amountLeft === 0) { this._debug("Copy done!"); this._flush(); return; } this._debug("Waiting for input stream"); this.input.asyncWait(this, 0, 0, Services.tm.currentThread); }, _emitProgress: function() { this.emit("progress", { bytesSent: this._length - this._amountLeft, totalBytes: this._length }); }, _flush: function() { try { this.output.flush(); } catch (e) { if (e.result == Cr.NS_BASE_STREAM_WOULD_BLOCK || e.result == Cr.NS_ERROR_FAILURE) { this._debug("Flush would block, will retry"); this._streamReadyCallback = this._flush; this._debug("Waiting for output stream"); this.baseAsyncOutput.asyncWait(this, 0, 0, Services.tm.currentThread); return; } else { throw e; } } this._deferred.resolve(); }, _destroy: function() { this._destroy = null; this._copy = null; this._flush = null; this.input = null; this.output = null; }, // nsIInputStreamCallback onInputStreamReady: function() { this._streamReadyCallback(); }, // nsIOutputStreamCallback onOutputStreamReady: function() { this._streamReadyCallback(); }, _debug: function(msg) { // Prefix logs with the copier ID, which makes logs much easier to // understand when several copiers are running simultaneously dumpv("Copier: " + this._id + " " + msg); } }; /** * Read from a stream, one byte at a time, up to the next |delimiter| * character, but stopping if we've read |count| without finding it. Reading * also terminates early if there are less than |count| bytes available on the * stream. In that case, we only read as many bytes as the stream currently has * to offer. * TODO: This implementation could be removed if bug 984651 is fixed, which * provides a native version of the same idea. * @param stream nsIInputStream * The input stream to read from. * @param delimiter string * The character we're trying to find. * @param count integer * The max number of characters to read while searching. * @return string * The data collected. If the delimiter was found, this string will * end with it. */ function delimitedRead(stream, delimiter, count) { dumpv("Starting delimited read for " + delimiter + " up to " + count + " bytes"); let scriptableStream; if (stream.readBytes) { scriptableStream = stream; } else { scriptableStream = new ScriptableInputStream(stream); } let data = ""; // Don't exceed what's available on the stream count = Math.min(count, stream.available()); if (count <= 0) { return data; } let char; while (char !== delimiter && count > 0) { char = scriptableStream.readBytes(1); count--; data += char; } return data; } module.exports = { copyStream: copyStream, delimitedRead: delimitedRead }; /***/ }, /* 49 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; /** * Packets contain read / write functionality for the different packet types * supported by the debugging protocol, so that a transport can focus on * delivery and queue management without worrying too much about the specific * packet types. * * They are intended to be "one use only", so a new packet should be * instantiated for each incoming or outgoing packet. * * A complete Packet type should expose at least the following: * * read(stream, scriptableStream) * Called when the input stream has data to read * * write(stream) * Called when the output stream is ready to write * * get done() * Returns true once the packet is done being read / written * * destroy() * Called to clean up at the end of use */ const { Cc, Ci, Cu } = __webpack_require__(35); const DevToolsUtils = __webpack_require__(42); const { dumpn, dumpv } = DevToolsUtils; const StreamUtils = __webpack_require__(48); const promise = __webpack_require__(40); /*DevToolsUtils.defineLazyGetter(this, "unicodeConverter", () => { const unicodeConverter = Cc("@mozilla.org/intl/scriptableunicodeconverter") .createInstance(Ci.nsIScriptableUnicodeConverter); unicodeConverter.charset = "UTF-8"; return unicodeConverter; });*/ const utf8 = __webpack_require__(50); // The transport's previous check ensured the header length did not exceed 20 // characters. Here, we opt for the somewhat smaller, but still large limit of // 1 TiB. const PACKET_LENGTH_MAX = Math.pow(2, 40); /** * A generic Packet processing object (extended by two subtypes below). */ function Packet(transport) { this._transport = transport; this._length = 0; } /** * Attempt to initialize a new Packet based on the incoming packet header we've * received so far. We try each of the types in succession, trying JSON packets * first since they are much more common. * @param header string * The packet header string to attempt parsing. * @param transport DebuggerTransport * The transport instance that will own the packet. * @return Packet * The parsed packet of the matching type, or null if no types matched. */ Packet.fromHeader = function(header, transport) { return JSONPacket.fromHeader(header, transport) || BulkPacket.fromHeader(header, transport); }; Packet.prototype = { get length() { return this._length; }, set length(length) { if (length > PACKET_LENGTH_MAX) { throw Error("Packet length " + length + " exceeds the max length of " + PACKET_LENGTH_MAX); } this._length = length; }, destroy: function() { this._transport = null; } }; exports.Packet = Packet; /** * With a JSON packet (the typical packet type sent via the transport), data is * transferred as a JSON packet serialized into a string, with the string length * prepended to the packet, followed by a colon ([length]:[packet]). The * contents of the JSON packet are specified in the Remote Debugging Protocol * specification. * @param transport DebuggerTransport * The transport instance that will own the packet. */ function JSONPacket(transport) { Packet.call(this, transport); this._data = ""; this._done = false; } /** * Attempt to initialize a new JSONPacket based on the incoming packet header * we've received so far. * @param header string * The packet header string to attempt parsing. * @param transport DebuggerTransport * The transport instance that will own the packet. * @return JSONPacket * The parsed packet, or null if it's not a match. */ JSONPacket.fromHeader = function(header, transport) { let match = this.HEADER_PATTERN.exec(header); if (!match) { return null; } dumpv("Header matches JSON packet"); let packet = new JSONPacket(transport); packet.length = +match[1]; return packet; }; JSONPacket.HEADER_PATTERN = /^(\d+):$/; JSONPacket.prototype = Object.create(Packet.prototype); Object.defineProperty(JSONPacket.prototype, "object", { /** * Gets the object (not the serialized string) being read or written. */ get: function() { return this._object; }, /** * Sets the object to be sent when write() is called. */ set: function(object) { this._object = object; let data = JSON.stringify(object); this._data = data; this.length = this._data.length; } }); JSONPacket.prototype.read = function(stream, scriptableStream) { dumpv("Reading JSON packet"); // Read in more packet data. this._readData(stream, scriptableStream); if (!this.done) { // Don't have a complete packet yet. return; } let json = this._data; try { json = utf8.decode(json); this._object = JSON.parse(json); } catch(e) { let msg = "Error parsing incoming packet: " + json + " (" + e + " - " + e.stack + ")"; if (console.error) { console.error(msg); } dumpn(msg); return; } this._transport._onJSONObjectReady(this._object); } JSONPacket.prototype._readData = function(stream, scriptableStream) { if (!scriptableStream) { scriptableStream = stream; } if (dumpv.wantVerbose) { dumpv("Reading JSON data: _l: " + this.length + " dL: " + this._data.length + " sA: " + stream.available()); } let bytesToRead = Math.min(this.length - this._data.length, stream.available()); this._data += scriptableStream.readBytes(bytesToRead); this._done = this._data.length === this.length; } JSONPacket.prototype.write = function(stream) { dumpv("Writing JSON packet"); if (this._outgoing === undefined) { // Format the serialized packet to a buffer this._outgoing = this.length + ":" + this._data; } let written = stream.write(this._outgoing, this._outgoing.length); this._outgoing = this._outgoing.slice(written); this._done = !this._outgoing.length; } Object.defineProperty(JSONPacket.prototype, "done", { get: function() { return this._done; } }); JSONPacket.prototype.toString = function() { return JSON.stringify(this._object, null, 2); } exports.JSONPacket = JSONPacket; /** * With a bulk packet, data is transferred by temporarily handing over the * transport's input or output stream to the application layer for writing data * directly. This can be much faster for large data sets, and avoids various * stages of copies and data duplication inherent in the JSON packet type. The * bulk packet looks like: * * bulk [actor] [type] [length]:[data] * * The interpretation of the data portion depends on the kind of actor and the * packet's type. See the Remote Debugging Protocol Stream Transport spec for * more details. * @param transport DebuggerTransport * The transport instance that will own the packet. */ function BulkPacket(transport) { Packet.call(this, transport); this._done = false; this._readyForWriting = promise.defer(); } /** * Attempt to initialize a new BulkPacket based on the incoming packet header * we've received so far. * @param header string * The packet header string to attempt parsing. * @param transport DebuggerTransport * The transport instance that will own the packet. * @return BulkPacket * The parsed packet, or null if it's not a match. */ BulkPacket.fromHeader = function(header, transport) { let match = this.HEADER_PATTERN.exec(header); if (!match) { return null; } dumpv("Header matches bulk packet"); let packet = new BulkPacket(transport); packet.header = { actor: match[1], type: match[2], length: +match[3] }; return packet; }; BulkPacket.HEADER_PATTERN = /^bulk ([^: ]+) ([^: ]+) (\d+):$/; BulkPacket.prototype = Object.create(Packet.prototype); BulkPacket.prototype.read = function(stream) { dumpv("Reading bulk packet, handing off input stream"); // Temporarily pause monitoring of the input stream this._transport.pauseIncoming(); let deferred = promise.defer(); this._transport._onBulkReadReady({ actor: this.actor, type: this.type, length: this.length, copyTo: (output) => { dumpv("CT length: " + this.length); let copying = StreamUtils.copyStream(stream, output, this.length); deferred.resolve(copying); return copying; }, stream: stream, done: deferred }); // Await the result of reading from the stream deferred.promise.then(() => { dumpv("onReadDone called, ending bulk mode"); this._done = true; this._transport.resumeIncoming(); }, this._transport.close); // Ensure this is only done once this.read = () => { throw new Error("Tried to read() a BulkPacket's stream multiple times."); }; } BulkPacket.prototype.write = function(stream) { dumpv("Writing bulk packet"); if (this._outgoingHeader === undefined) { dumpv("Serializing bulk packet header"); // Format the serialized packet header to a buffer this._outgoingHeader = "bulk " + this.actor + " " + this.type + " " + this.length + ":"; } // Write the header, or whatever's left of it to write. if (this._outgoingHeader.length) { dumpv("Writing bulk packet header"); let written = stream.write(this._outgoingHeader, this._outgoingHeader.length); this._outgoingHeader = this._outgoingHeader.slice(written); return; } dumpv("Handing off output stream"); // Temporarily pause the monitoring of the output stream this._transport.pauseOutgoing(); let deferred = promise.defer(); this._readyForWriting.resolve({ copyFrom: (input) => { dumpv("CF length: " + this.length); let copying = StreamUtils.copyStream(input, stream, this.length); deferred.resolve(copying); return copying; }, stream: stream, done: deferred }); // Await the result of writing to the stream deferred.promise.then(() => { dumpv("onWriteDone called, ending bulk mode"); this._done = true; this._transport.resumeOutgoing(); }, this._transport.close); // Ensure this is only done once this.write = () => { throw new Error("Tried to write() a BulkPacket's stream multiple times."); }; } Object.defineProperty(BulkPacket.prototype, "streamReadyForWriting", { get: function() { return this._readyForWriting.promise; } }); Object.defineProperty(BulkPacket.prototype, "header", { get: function() { return { actor: this.actor, type: this.type, length: this.length }; }, set: function(header) { this.actor = header.actor; this.type = header.type; this.length = header.length; }, }); Object.defineProperty(BulkPacket.prototype, "done", { get: function() { return this._done; }, }); BulkPacket.prototype.toString = function() { return "Bulk: " + JSON.stringify(this.header, null, 2); } exports.BulkPacket = BulkPacket; /** * RawPacket is used to test the transport's error handling of malformed * packets, by writing data directly onto the stream. * @param transport DebuggerTransport * The transport instance that will own the packet. * @param data string * The raw string to send out onto the stream. */ function RawPacket(transport, data) { Packet.call(this, transport); this._data = data; this.length = data.length; this._done = false; } RawPacket.prototype = Object.create(Packet.prototype); RawPacket.prototype.read = function(stream) { // This hasn't yet been needed for testing. throw Error("Not implmented."); } RawPacket.prototype.write = function(stream) { let written = stream.write(this._data, this._data.length); this._data = this._data.slice(written); this._done = !this._data.length; } Object.defineProperty(RawPacket.prototype, "done", { get: function() { return this._done; } }); exports.RawPacket = RawPacket; /***/ }, /* 50 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(module, global) {/*! https://mths.be/utf8js v2.0.0 by @mathias */ ;(function(root) { // Detect free variables `exports` var freeExports = typeof exports == 'object' && exports; // Detect free variable `module` var freeModule = typeof module == 'object' && module && module.exports == freeExports && module; // Detect free variable `global`, from Node.js or Browserified code, // and use it as `root` var freeGlobal = typeof global == 'object' && global; if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { root = freeGlobal; } /*--------------------------------------------------------------------------*/ var stringFromCharCode = String.fromCharCode; // Taken from https://mths.be/punycode function ucs2decode(string) { var output = []; var counter = 0; var length = string.length; var value; var extra; while (counter < length) { value = string.charCodeAt(counter++); if (value >= 0xD800 && value <= 0xDBFF && counter < length) { // high surrogate, and there is a next character extra = string.charCodeAt(counter++); if ((extra & 0xFC00) == 0xDC00) { // low surrogate output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); } else { // unmatched surrogate; only append this code unit, in case the next // code unit is the high surrogate of a surrogate pair output.push(value); counter--; } } else { output.push(value); } } return output; } // Taken from https://mths.be/punycode function ucs2encode(array) { var length = array.length; var index = -1; var value; var output = ''; while (++index < length) { value = array[index]; if (value > 0xFFFF) { value -= 0x10000; output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); value = 0xDC00 | value & 0x3FF; } output += stringFromCharCode(value); } return output; } function checkScalarValue(codePoint) { if (codePoint >= 0xD800 && codePoint <= 0xDFFF) { throw Error( 'Lone surrogate U+' + codePoint.toString(16).toUpperCase() + ' is not a scalar value' ); } } /*--------------------------------------------------------------------------*/ function createByte(codePoint, shift) { return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80); } function encodeCodePoint(codePoint) { if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence return stringFromCharCode(codePoint); } var symbol = ''; if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0); } else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence checkScalarValue(codePoint); symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0); symbol += createByte(codePoint, 6); } else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0); symbol += createByte(codePoint, 12); symbol += createByte(codePoint, 6); } symbol += stringFromCharCode((codePoint & 0x3F) | 0x80); return symbol; } function utf8encode(string) { var codePoints = ucs2decode(string); var length = codePoints.length; var index = -1; var codePoint; var byteString = ''; while (++index < length) { codePoint = codePoints[index]; byteString += encodeCodePoint(codePoint); } return byteString; } /*--------------------------------------------------------------------------*/ function readContinuationByte() { if (byteIndex >= byteCount) { throw Error('Invalid byte index'); } var continuationByte = byteArray[byteIndex] & 0xFF; byteIndex++; if ((continuationByte & 0xC0) == 0x80) { return continuationByte & 0x3F; } // If we end up here, it’s not a continuation byte throw Error('Invalid continuation byte'); } function decodeSymbol() { var byte1; var byte2; var byte3; var byte4; var codePoint; if (byteIndex > byteCount) { throw Error('Invalid byte index'); } if (byteIndex == byteCount) { return false; } // Read first byte byte1 = byteArray[byteIndex] & 0xFF; byteIndex++; // 1-byte sequence (no continuation bytes) if ((byte1 & 0x80) == 0) { return byte1; } // 2-byte sequence if ((byte1 & 0xE0) == 0xC0) { var byte2 = readContinuationByte(); codePoint = ((byte1 & 0x1F) << 6) | byte2; if (codePoint >= 0x80) { return codePoint; } else { throw Error('Invalid continuation byte'); } } // 3-byte sequence (may include unpaired surrogates) if ((byte1 & 0xF0) == 0xE0) { byte2 = readContinuationByte(); byte3 = readContinuationByte(); codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3; if (codePoint >= 0x0800) { checkScalarValue(codePoint); return codePoint; } else { throw Error('Invalid continuation byte'); } } // 4-byte sequence if ((byte1 & 0xF8) == 0xF0) { byte2 = readContinuationByte(); byte3 = readContinuationByte(); byte4 = readContinuationByte(); codePoint = ((byte1 & 0x0F) << 0x12) | (byte2 << 0x0C) | (byte3 << 0x06) | byte4; if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) { return codePoint; } } throw Error('Invalid UTF-8 detected'); } var byteArray; var byteCount; var byteIndex; function utf8decode(byteString) { byteArray = ucs2decode(byteString); byteCount = byteArray.length; byteIndex = 0; var codePoints = []; var tmp; while ((tmp = decodeSymbol()) !== false) { codePoints.push(tmp); } return ucs2encode(codePoints); } /*--------------------------------------------------------------------------*/ var utf8 = { 'version': '2.0.0', 'encode': utf8encode, 'decode': utf8decode }; // Some AMD build optimizers, like r.js, check for specific condition patterns // like the following: if ( true ) { !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { return utf8; }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else if (freeExports && !freeExports.nodeType) { if (freeModule) { // in Node.js or RingoJS v0.8.0+ freeModule.exports = utf8; } else { // in Narwhal or RingoJS v0.7.0- var object = {}; var hasOwnProperty = object.hasOwnProperty; for (var key in utf8) { hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]); } } } else { // in Rhino or a web browser root.utf8 = utf8; } }(this)); /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(51)(module), (function() { return this; }()))) /***/ }, /* 51 */ /***/ function(module, exports) { module.exports = function(module) { if(!module.webpackPolyfill) { module.deprecate = function() {}; module.paths = []; // module.parent = undefined by default module.children = []; module.webpackPolyfill = 1; } return module; } /***/ }, /* 52 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(module, global) {/*! https://mths.be/utf8js v2.0.0 by @mathias */ ;(function(root) { // Detect free variables `exports` var freeExports = typeof exports == 'object' && exports; // Detect free variable `module` var freeModule = typeof module == 'object' && module && module.exports == freeExports && module; // Detect free variable `global`, from Node.js or Browserified code, // and use it as `root` var freeGlobal = typeof global == 'object' && global; if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { root = freeGlobal; } /*--------------------------------------------------------------------------*/ var stringFromCharCode = String.fromCharCode; // Taken from https://mths.be/punycode function ucs2decode(string) { var output = []; var counter = 0; var length = string.length; var value; var extra; while (counter < length) { value = string.charCodeAt(counter++); if (value >= 0xD800 && value <= 0xDBFF && counter < length) { // high surrogate, and there is a next character extra = string.charCodeAt(counter++); if ((extra & 0xFC00) == 0xDC00) { // low surrogate output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); } else { // unmatched surrogate; only append this code unit, in case the next // code unit is the high surrogate of a surrogate pair output.push(value); counter--; } } else { output.push(value); } } return output; } // Taken from https://mths.be/punycode function ucs2encode(array) { var length = array.length; var index = -1; var value; var output = ''; while (++index < length) { value = array[index]; if (value > 0xFFFF) { value -= 0x10000; output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); value = 0xDC00 | value & 0x3FF; } output += stringFromCharCode(value); } return output; } function checkScalarValue(codePoint) { if (codePoint >= 0xD800 && codePoint <= 0xDFFF) { throw Error( 'Lone surrogate U+' + codePoint.toString(16).toUpperCase() + ' is not a scalar value' ); } } /*--------------------------------------------------------------------------*/ function createByte(codePoint, shift) { return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80); } function encodeCodePoint(codePoint) { if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence return stringFromCharCode(codePoint); } var symbol = ''; if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0); } else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence checkScalarValue(codePoint); symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0); symbol += createByte(codePoint, 6); } else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0); symbol += createByte(codePoint, 12); symbol += createByte(codePoint, 6); } symbol += stringFromCharCode((codePoint & 0x3F) | 0x80); return symbol; } function utf8encode(string) { var codePoints = ucs2decode(string); var length = codePoints.length; var index = -1; var codePoint; var byteString = ''; while (++index < length) { codePoint = codePoints[index]; byteString += encodeCodePoint(codePoint); } return byteString; } /*--------------------------------------------------------------------------*/ function readContinuationByte() { if (byteIndex >= byteCount) { throw Error('Invalid byte index'); } var continuationByte = byteArray[byteIndex] & 0xFF; byteIndex++; if ((continuationByte & 0xC0) == 0x80) { return continuationByte & 0x3F; } // If we end up here, it’s not a continuation byte throw Error('Invalid continuation byte'); } function decodeSymbol() { var byte1; var byte2; var byte3; var byte4; var codePoint; if (byteIndex > byteCount) { throw Error('Invalid byte index'); } if (byteIndex == byteCount) { return false; } // Read first byte byte1 = byteArray[byteIndex] & 0xFF; byteIndex++; // 1-byte sequence (no continuation bytes) if ((byte1 & 0x80) == 0) { return byte1; } // 2-byte sequence if ((byte1 & 0xE0) == 0xC0) { var byte2 = readContinuationByte(); codePoint = ((byte1 & 0x1F) << 6) | byte2; if (codePoint >= 0x80) { return codePoint; } else { throw Error('Invalid continuation byte'); } } // 3-byte sequence (may include unpaired surrogates) if ((byte1 & 0xF0) == 0xE0) { byte2 = readContinuationByte(); byte3 = readContinuationByte(); codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3; if (codePoint >= 0x0800) { checkScalarValue(codePoint); return codePoint; } else { throw Error('Invalid continuation byte'); } } // 4-byte sequence if ((byte1 & 0xF8) == 0xF0) { byte2 = readContinuationByte(); byte3 = readContinuationByte(); byte4 = readContinuationByte(); codePoint = ((byte1 & 0x0F) << 0x12) | (byte2 << 0x0C) | (byte3 << 0x06) | byte4; if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) { return codePoint; } } throw Error('Invalid UTF-8 detected'); } var byteArray; var byteCount; var byteIndex; function utf8decode(byteString) { byteArray = ucs2decode(byteString); byteCount = byteArray.length; byteIndex = 0; var codePoints = []; var tmp; while ((tmp = decodeSymbol()) !== false) { codePoints.push(tmp); } return ucs2encode(codePoints); } /*--------------------------------------------------------------------------*/ var utf8 = { 'version': '2.0.0', 'encode': utf8encode, 'decode': utf8decode }; // Some AMD build optimizers, like r.js, check for specific condition patterns // like the following: if ( true ) { !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { return utf8; }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else if (freeExports && !freeExports.nodeType) { if (freeModule) { // in Node.js or RingoJS v0.8.0+ freeModule.exports = utf8; } else { // in Narwhal or RingoJS v0.7.0- var object = {}; var hasOwnProperty = object.hasOwnProperty; for (var key in utf8) { hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]); } } } else { // in Rhino or a web browser root.utf8 = utf8; } }(this)); /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(51)(module), (function() { return this; }()))) /***/ }, /* 53 */ /***/ function(module, exports, __webpack_require__) { /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ const { Ci, Cu, components } = __webpack_require__(35); const { Services } = __webpack_require__(28); const DevToolsUtils = __webpack_require__(42); // WARNING I swapped the sync one for the async one here // const promise = require("resource://devtools/shared/deprecated-sync-thenables.js", {}).Promise; const promise = __webpack_require__(40); const events = __webpack_require__(54); const { WebConsoleClient } = __webpack_require__(56); /* const { DebuggerSocket } = require("../shared/security/socket");*/ /* const Authentication = require("../shared/security/auth");*/ const noop = () => {}; /** * TODO: Get rid of this API in favor of EventTarget (bug 1042642) * * Add simple event notification to a prototype object. Any object that has * some use for event notifications or the observer pattern in general can be * augmented with the necessary facilities by passing its prototype to this * function. * * @param aProto object * The prototype object that will be modified. */ function eventSource(aProto) { /** * Add a listener to the event source for a given event. * * @param aName string * The event to listen for. * @param aListener function * Called when the event is fired. If the same listener * is added more than once, it will be called once per * addListener call. */ aProto.addListener = function(aName, aListener) { if (typeof aListener != "function") { throw TypeError("Listeners must be functions."); } if (!this._listeners) { this._listeners = {}; } this._getListeners(aName).push(aListener); }; /** * Add a listener to the event source for a given event. The * listener will be removed after it is called for the first time. * * @param aName string * The event to listen for. * @param aListener function * Called when the event is fired. */ aProto.addOneTimeListener = function(aName, aListener) { let l = (...args) => { this.removeListener(aName, l); aListener.apply(null, args); }; this.addListener(aName, l); }; /** * Remove a listener from the event source previously added with * addListener(). * * @param aName string * The event name used during addListener to add the listener. * @param aListener function * The callback to remove. If addListener was called multiple * times, all instances will be removed. */ aProto.removeListener = function(aName, aListener) { if (!this._listeners || (aListener && !this._listeners[aName])) { return; } if (!aListener) { this._listeners[aName] = []; } else { this._listeners[aName] = this._listeners[aName].filter(function(l) { return l != aListener; }); } }; /** * Returns the listeners for the specified event name. If none are defined it * initializes an empty list and returns that. * * @param aName string * The event name. */ aProto._getListeners = function(aName) { if (aName in this._listeners) { return this._listeners[aName]; } this._listeners[aName] = []; return this._listeners[aName]; }; /** * Notify listeners of an event. * * @param aName string * The event to fire. * @param arguments * All arguments will be passed along to the listeners, * including the name argument. */ aProto.emit = function() { if (!this._listeners) { return; } let name = arguments[0]; let listeners = this._getListeners(name).slice(0); for (let listener of listeners) { try { listener.apply(null, arguments); } catch (e) { // Prevent a bad listener from interfering with the others. DevToolsUtils.reportException("notify event '" + name + "'", e); } } }; } /** * Set of protocol messages that affect thread state, and the * state the actor is in after each message. */ const ThreadStateTypes = { "paused": "paused", "resumed": "attached", "detached": "detached" }; /** * Set of protocol messages that are sent by the server without a prior request * by the client. */ const UnsolicitedNotifications = { "consoleAPICall": "consoleAPICall", "eventNotification": "eventNotification", "fileActivity": "fileActivity", "lastPrivateContextExited": "lastPrivateContextExited", "logMessage": "logMessage", "networkEvent": "networkEvent", "networkEventUpdate": "networkEventUpdate", "newGlobal": "newGlobal", "newScript": "newScript", "tabDetached": "tabDetached", "tabListChanged": "tabListChanged", "reflowActivity": "reflowActivity", "addonListChanged": "addonListChanged", "workerListChanged": "workerListChanged", "serviceWorkerRegistrationListChanged": "serviceWorkerRegistrationList", "tabNavigated": "tabNavigated", "frameUpdate": "frameUpdate", "pageError": "pageError", "documentLoad": "documentLoad", "enteredFrame": "enteredFrame", "exitedFrame": "exitedFrame", "appOpen": "appOpen", "appClose": "appClose", "appInstall": "appInstall", "appUninstall": "appUninstall", "evaluationResult": "evaluationResult", "newSource": "newSource", "updatedSource": "updatedSource", }; /** * Set of pause types that are sent by the server and not as an immediate * response to a client request. */ const UnsolicitedPauses = { "resumeLimit": "resumeLimit", "debuggerStatement": "debuggerStatement", "breakpoint": "breakpoint", "DOMEvent": "DOMEvent", "watchpoint": "watchpoint", "exception": "exception" }; /** * Creates a client for the remote debugging protocol server. This client * provides the means to communicate with the server and exchange the messages * required by the protocol in a traditional JavaScript API. */ const DebuggerClient = exports.DebuggerClient = function(aTransport) { this._transport = aTransport; this._transport.hooks = this; // Map actor ID to client instance for each actor type. this._clients = new Map(); this._pendingRequests = new Map(); this._activeRequests = new Map(); this._eventsEnabled = true; this.traits = {}; this.request = this.request.bind(this); this.localTransport = this._transport.onOutputStreamReady === undefined; /* * As the first thing on the connection, expect a greeting packet from * the connection's root actor. */ this.mainRoot = null; this.expectReply("root", (aPacket) => { this.mainRoot = new RootClient(this, aPacket); this.emit("connected", aPacket.applicationType, aPacket.traits); }); }; /** * A declarative helper for defining methods that send requests to the server. * * @param aPacketSkeleton * The form of the packet to send. Can specify fields to be filled from * the parameters by using the |args| function. * @param telemetry * The unique suffix of the telemetry histogram id. * @param before * The function to call before sending the packet. Is passed the packet, * and the return value is used as the new packet. The |this| context is * the instance of the client object we are defining a method for. * @param after * The function to call after the response is received. It is passed the * response, and the return value is considered the new response that * will be passed to the callback. The |this| context is the instance of * the client object we are defining a method for. * @return Request * The `Request` object that is a Promise object and resolves once * we receive the response. (See request method for more details) */ DebuggerClient.requester = function(aPacketSkeleton, config = {}) { let { telemetry, before, after } = config; return DevToolsUtils.makeInfallible(function(...args) { let histogram, startTime; if (telemetry) { let transportType = this._transport.onOutputStreamReady === undefined ? "LOCAL_" : "REMOTE_"; let histogramId = "DEVTOOLS_DEBUGGER_RDP_" + transportType + telemetry + "_MS"; histogram = Services.telemetry.getHistogramById(histogramId); startTime = +new Date(); } let outgoingPacket = { to: aPacketSkeleton.to || this.actor }; let maxPosition = -1; for (let k of Object.keys(aPacketSkeleton)) { if (aPacketSkeleton[k] instanceof DebuggerClient.Argument) { let { position } = aPacketSkeleton[k]; outgoingPacket[k] = aPacketSkeleton[k].getArgument(args); maxPosition = Math.max(position, maxPosition); } else { outgoingPacket[k] = aPacketSkeleton[k]; } } if (before) { outgoingPacket = before.call(this, outgoingPacket); } return this.request(outgoingPacket, DevToolsUtils.makeInfallible((aResponse) => { if (after) { let { from } = aResponse; aResponse = after.call(this, aResponse); if (!aResponse.from) { aResponse.from = from; } } // The callback is always the last parameter. let thisCallback = args[maxPosition + 1]; if (thisCallback) { thisCallback(aResponse); } if (histogram) { histogram.add(+new Date() - startTime); } }, "DebuggerClient.requester request callback")); }, "DebuggerClient.requester"); }; function args(aPos) { return new DebuggerClient.Argument(aPos); } DebuggerClient.Argument = function(aPosition) { this.position = aPosition; }; DebuggerClient.Argument.prototype.getArgument = function(aParams) { if (!(this.position in aParams)) { throw new Error("Bad index into params: " + this.position); } return aParams[this.position]; }; // Expose these to save callers the trouble of importing DebuggerSocket DebuggerClient.socketConnect = function(options) { // Defined here instead of just copying the function to allow lazy-load return DebuggerSocket.connect(options); }; DevToolsUtils.defineLazyGetter(DebuggerClient, "Authenticators", () => { return Authentication.Authenticators; }); DevToolsUtils.defineLazyGetter(DebuggerClient, "AuthenticationResult", () => { return Authentication.AuthenticationResult; }); DebuggerClient.prototype = { /** * Connect to the server and start exchanging protocol messages. * * @param aOnConnected function * If specified, will be called when the greeting packet is * received from the debugging server. * * @return Promise * Resolves once connected with an array whose first element * is the application type, by default "browser", and the second * element is the traits object (help figure out the features * and behaviors of the server we connect to. See RootActor). */ connect: function(aOnConnected) { return Promise.race([ new Promise((resolve, reject) => { this.emit("connect"); // Also emit the event on the |DebuggerClient| object (not on the instance), // so it's possible to track all instances. events.emit(DebuggerClient, "connect", this); this.addOneTimeListener("connected", (aName, aApplicationType, aTraits) => { this.traits = aTraits; if (aOnConnected) { aOnConnected(aApplicationType, aTraits); } resolve([aApplicationType, aTraits]); }); this._transport.ready(); }), new Promise((resolve, reject) => { setTimeout(() => reject(new Error("Connect timeout error")), 6000); }) ]); }, /** * Shut down communication with the debugging server. * * @param aOnClosed function * If specified, will be called when the debugging connection * has been closed. */ close: function(aOnClosed) { // Disable detach event notifications, because event handlers will be in a // cleared scope by the time they run. this._eventsEnabled = false; let cleanup = () => { this._transport.close(); this._transport = null; }; // If the connection is already closed, // there is no need to detach client // as we won't be able to send any message. if (this._closed) { cleanup(); if (aOnClosed) { aOnClosed(); } return; } if (aOnClosed) { this.addOneTimeListener("closed", function(aEvent) { aOnClosed(); }); } // Call each client's `detach` method by calling // lastly registered ones first to give a chance // to detach child clients first. let clients = [...this._clients.values()]; this._clients.clear(); const detachClients = () => { let client = clients.pop(); if (!client) { // All clients detached. cleanup(); return; } if (client.detach) { client.detach(detachClients); return; } detachClients(); }; detachClients(); }, /* * This function exists only to preserve DebuggerClient's interface; * new code should say 'client.mainRoot.listTabs()'. */ listTabs: function(aOnResponse) { return this.mainRoot.listTabs(aOnResponse); }, /* * This function exists only to preserve DebuggerClient's interface; * new code should say 'client.mainRoot.listAddons()'. */ listAddons: function(aOnResponse) { return this.mainRoot.listAddons(aOnResponse); }, getTab: function(aFilter) { return this.mainRoot.getTab(aFilter); }, /** * Attach to a tab actor. * * @param string aTabActor * The actor ID for the tab to attach. * @param function aOnResponse * Called with the response packet and a TabClient * (which will be undefined on error). */ attachTab: function(aTabActor, aOnResponse = noop) { if (this._clients.has(aTabActor)) { let cachedTab = this._clients.get(aTabActor); let cachedResponse = { cacheDisabled: cachedTab.cacheDisabled, javascriptEnabled: cachedTab.javascriptEnabled, traits: cachedTab.traits, }; DevToolsUtils.executeSoon(() => aOnResponse(cachedResponse, cachedTab)); return promise.resolve([cachedResponse, cachedTab]); } let packet = { to: aTabActor, type: "attach" }; return this.request(packet).then(aResponse => { let tabClient; if (!aResponse.error) { tabClient = new TabClient(this, aResponse); this.registerClient(tabClient); } aOnResponse(aResponse, tabClient); return [aResponse, tabClient]; }); }, attachWorker: function DC_attachWorker(aWorkerActor, aOnResponse = noop) { let workerClient = this._clients.get(aWorkerActor); if (workerClient !== undefined) { let response = { from: workerClient.actor, type: "attached", url: workerClient.url }; DevToolsUtils.executeSoon(() => aOnResponse(response, workerClient)); return promise.resolve([response, workerClient]); } return this.request({ to: aWorkerActor, type: "attach" }).then(aResponse => { if (aResponse.error) { aOnResponse(aResponse, null); return [aResponse, null]; } let workerClient = new WorkerClient(this, aResponse); this.registerClient(workerClient); aOnResponse(aResponse, workerClient); return [aResponse, workerClient]; }); }, /** * Attach to an addon actor. * * @param string aAddonActor * The actor ID for the addon to attach. * @param function aOnResponse * Called with the response packet and a AddonClient * (which will be undefined on error). */ attachAddon: function DC_attachAddon(aAddonActor, aOnResponse = noop) { let packet = { to: aAddonActor, type: "attach" }; return this.request(packet).then(aResponse => { let addonClient; if (!aResponse.error) { addonClient = new AddonClient(this, aAddonActor); this.registerClient(addonClient); this.activeAddon = addonClient; } aOnResponse(aResponse, addonClient); return [aResponse, addonClient]; }); }, /** * Attach to a Web Console actor. * * @param string aConsoleActor * The ID for the console actor to attach to. * @param array aListeners * The console listeners you want to start. * @param function aOnResponse * Called with the response packet and a WebConsoleClient * instance (which will be undefined on error). */ attachConsole: function(aConsoleActor, aListeners, aOnResponse = noop) { let packet = { to: aConsoleActor, type: "startListeners", listeners: aListeners, }; return this.request(packet).then(aResponse => { let consoleClient; if (!aResponse.error) { if (this._clients.has(aConsoleActor)) { consoleClient = this._clients.get(aConsoleActor); } else { consoleClient = new WebConsoleClient(this, aResponse); this.registerClient(consoleClient); } } aOnResponse(aResponse, consoleClient); return [aResponse, consoleClient]; }); }, /** * Attach to a global-scoped thread actor for chrome debugging. * * @param string aThreadActor * The actor ID for the thread to attach. * @param function aOnResponse * Called with the response packet and a ThreadClient * (which will be undefined on error). * @param object aOptions * Configuration options. * - useSourceMaps: whether to use source maps or not. */ attachThread: function(aThreadActor, aOnResponse = noop, aOptions = {}) { if (this._clients.has(aThreadActor)) { let client = this._clients.get(aThreadActor); DevToolsUtils.executeSoon(() => aOnResponse({}, client)); return promise.resolve([{}, client]); } let packet = { to: aThreadActor, type: "attach", options: aOptions }; return this.request(packet).then(aResponse => { if (!aResponse.error) { var threadClient = new ThreadClient(this, aThreadActor); this.registerClient(threadClient); } aOnResponse(aResponse, threadClient); return [aResponse, threadClient]; }); }, /** * Attach to a trace actor. * * @param string aTraceActor * The actor ID for the tracer to attach. * @param function aOnResponse * Called with the response packet and a TraceClient * (which will be undefined on error). */ attachTracer: function(aTraceActor, aOnResponse = noop) { if (this._clients.has(aTraceActor)) { let client = this._clients.get(aTraceActor); DevToolsUtils.executeSoon(() => aOnResponse({}, client)); return promise.resolve([{}, client]); } let packet = { to: aTraceActor, type: "attach" }; return this.request(packet).then(aResponse => { if (!aResponse.error) { var traceClient = new TraceClient(this, aTraceActor); this.registerClient(traceClient); } aOnResponse(aResponse, traceClient); return [aResponse, traceClient]; }); }, /** * Fetch the ChromeActor for the main process or ChildProcessActor for a * a given child process ID. * * @param number aId * The ID for the process to attach (returned by `listProcesses`). * Connected to the main process if omitted, or is 0. */ getProcess: function(aId) { let packet = { to: "root", type: "getProcess" }; if (typeof (aId) == "number") { packet.id = aId; } return this.request(packet); }, /** * Release an object actor. * * @param string aActor * The actor ID to send the request to. * @param aOnResponse function * If specified, will be called with the response packet when * debugging server responds. */ release: DebuggerClient.requester({ to: args(0), type: "release" }, { telemetry: "RELEASE" }), /** * Send a request to the debugging server. * * @param aRequest object * A JSON packet to send to the debugging server. * @param aOnResponse function * If specified, will be called with the JSON response packet when * debugging server responds. * @return Request * This object emits a number of events to allow you to respond to * different parts of the request lifecycle. * It is also a Promise object, with a `then` method, that is resolved * whenever a JSON or a Bulk response is received; and is rejected * if the response is an error. * Note: This return value can be ignored if you are using JSON alone, * because the callback provided in |aOnResponse| will be bound to the * "json-reply" event automatically. * * Events emitted: * * json-reply: The server replied with a JSON packet, which is * passed as event data. * * bulk-reply: The server replied with bulk data, which you can read * using the event data object containing: * * actor: Name of actor that received the packet * * type: Name of actor's method that was called on receipt * * length: Size of the data to be read * * stream: This input stream should only be used directly if you * can ensure that you will read exactly |length| bytes * and will not close the stream when reading is complete * * done: If you use the stream directly (instead of |copyTo| * below), you must signal completion by resolving / * rejecting this deferred. If it's rejected, the * transport will be closed. If an Error is supplied as a * rejection value, it will be logged via |dumpn|. If you * do use |copyTo|, resolving is taken care of for you * when copying completes. * * copyTo: A helper function for getting your data out of the * stream that meets the stream handling requirements * above, and has the following signature: * @param output nsIAsyncOutputStream * The stream to copy to. * @return Promise * The promise is resolved when copying completes or * rejected if any (unexpected) errors occur. * This object also emits "progress" events for each chunk * that is copied. See stream-utils.js. */ request: function(aRequest, aOnResponse) { if (!this.mainRoot) { throw Error("Have not yet received a hello packet from the server."); } let type = aRequest.type || ""; if (!aRequest.to) { throw Error("'" + type + "' request packet has no destination."); } if (this._closed) { let msg = "'" + type + "' request packet to " + "'" + aRequest.to + "' " + "can't be sent as the connection is closed."; let resp = { error: "connectionClosed", message: msg }; if (aOnResponse) { aOnResponse(resp); } return promise.reject(resp); } let request = new Request(aRequest); request.format = "json"; request.stack = components.stack; if (aOnResponse) { request.on("json-reply", aOnResponse); } this._sendOrQueueRequest(request); // Implement a Promise like API on the returned object // that resolves/rejects on request response let deferred = promise.defer(); function listenerJson(resp) { request.off("json-reply", listenerJson); request.off("bulk-reply", listenerBulk); if (resp.error) { deferred.reject(resp); } else { deferred.resolve(resp); } } function listenerBulk(resp) { request.off("json-reply", listenerJson); request.off("bulk-reply", listenerBulk); deferred.resolve(resp); } request.on("json-reply", listenerJson); request.on("bulk-reply", listenerBulk); request.then = deferred.promise.then.bind(deferred.promise); return request; }, /** * Transmit streaming data via a bulk request. * * This method initiates the bulk send process by queuing up the header data. * The caller receives eventual access to a stream for writing. * * Since this opens up more options for how the server might respond (it could * send back either JSON or bulk data), and the returned Request object emits * events for different stages of the request process that you may want to * react to. * * @param request Object * This is modeled after the format of JSON packets above, but does not * actually contain the data, but is instead just a routing header: * * actor: Name of actor that will receive the packet * * type: Name of actor's method that should be called on receipt * * length: Size of the data to be sent * @return Request * This object emits a number of events to allow you to respond to * different parts of the request lifecycle. * * Events emitted: * * bulk-send-ready: Ready to send bulk data to the server, using the * event data object containing: * * stream: This output stream should only be used directly if * you can ensure that you will write exactly |length| * bytes and will not close the stream when writing is * complete * * done: If you use the stream directly (instead of |copyFrom| * below), you must signal completion by resolving / * rejecting this deferred. If it's rejected, the * transport will be closed. If an Error is supplied as * a rejection value, it will be logged via |dumpn|. If * you do use |copyFrom|, resolving is taken care of for * you when copying completes. * * copyFrom: A helper function for getting your data onto the * stream that meets the stream handling requirements * above, and has the following signature: * @param input nsIAsyncInputStream * The stream to copy from. * @return Promise * The promise is resolved when copying completes or * rejected if any (unexpected) errors occur. * This object also emits "progress" events for each chunk * that is copied. See stream-utils.js. * * json-reply: The server replied with a JSON packet, which is * passed as event data. * * bulk-reply: The server replied with bulk data, which you can read * using the event data object containing: * * actor: Name of actor that received the packet * * type: Name of actor's method that was called on receipt * * length: Size of the data to be read * * stream: This input stream should only be used directly if you * can ensure that you will read exactly |length| bytes * and will not close the stream when reading is complete * * done: If you use the stream directly (instead of |copyTo| * below), you must signal completion by resolving / * rejecting this deferred. If it's rejected, the * transport will be closed. If an Error is supplied as a * rejection value, it will be logged via |dumpn|. If you * do use |copyTo|, resolving is taken care of for you * when copying completes. * * copyTo: A helper function for getting your data out of the * stream that meets the stream handling requirements * above, and has the following signature: * @param output nsIAsyncOutputStream * The stream to copy to. * @return Promise * The promise is resolved when copying completes or * rejected if any (unexpected) errors occur. * This object also emits "progress" events for each chunk * that is copied. See stream-utils.js. */ startBulkRequest: function(request) { if (!this.traits.bulk) { throw Error("Server doesn't support bulk transfers"); } if (!this.mainRoot) { throw Error("Have not yet received a hello packet from the server."); } if (!request.type) { throw Error("Bulk packet is missing the required 'type' field."); } if (!request.actor) { throw Error("'" + request.type + "' bulk packet has no destination."); } if (!request.length) { throw Error("'" + request.type + "' bulk packet has no length."); } request = new Request(request); request.format = "bulk"; this._sendOrQueueRequest(request); return request; }, /** * If a new request can be sent immediately, do so. Otherwise, queue it. */ _sendOrQueueRequest(request) { let actor = request.actor; if (!this._activeRequests.has(actor)) { this._sendRequest(request); } else { this._queueRequest(request); } }, /** * Send a request. * @throws Error if there is already an active request in flight for the same * actor. */ _sendRequest(request) { let actor = request.actor; this.expectReply(actor, request); if (request.format === "json") { this._transport.send(request.request); return false; } this._transport.startBulkSend(request.request).then((...args) => { request.emit("bulk-send-ready", ...args); }); }, /** * Queue a request to be sent later. Queues are only drained when an in * flight request to a given actor completes. */ _queueRequest(request) { let actor = request.actor; let queue = this._pendingRequests.get(actor) || []; queue.push(request); this._pendingRequests.set(actor, queue); }, /** * Attempt the next request to a given actor (if any). */ _attemptNextRequest(actor) { if (this._activeRequests.has(actor)) { return; } let queue = this._pendingRequests.get(actor); if (!queue) { return; } let request = queue.shift(); if (queue.length === 0) { this._pendingRequests.delete(actor); } this._sendRequest(request); }, /** * Arrange to hand the next reply from |aActor| to the handler bound to * |aRequest|. * * DebuggerClient.prototype.request / startBulkRequest usually takes care of * establishing the handler for a given request, but in rare cases (well, * greetings from new root actors, is the only case at the moment) we must be * prepared for a "reply" that doesn't correspond to any request we sent. */ expectReply: function(aActor, aRequest) { if (this._activeRequests.has(aActor)) { throw Error("clashing handlers for next reply from " + uneval(aActor)); } // If a handler is passed directly (as it is with the handler for the root // actor greeting), create a dummy request to bind this to. if (typeof aRequest === "function") { let handler = aRequest; aRequest = new Request(); aRequest.on("json-reply", handler); } this._activeRequests.set(aActor, aRequest); }, // Transport hooks. /** * Called by DebuggerTransport to dispatch incoming packets as appropriate. * * @param aPacket object * The incoming packet. */ onPacket: function(aPacket) { if (!aPacket.from) { DevToolsUtils.reportException( "onPacket", new Error("Server did not specify an actor, dropping packet: " + JSON.stringify(aPacket))); return; } // If we have a registered Front for this actor, let it handle the packet // and skip all the rest of this unpleasantness. let front = this.getActor(aPacket.from); if (front) { front.onPacket(aPacket); return; } if (this._clients.has(aPacket.from) && aPacket.type) { let client = this._clients.get(aPacket.from); let type = aPacket.type; if (client.events.indexOf(type) != -1) { client.emit(type, aPacket); // we ignore the rest, as the client is expected to handle this packet. return; } } let activeRequest; // See if we have a handler function waiting for a reply from this // actor. (Don't count unsolicited notifications or pauses as // replies.) if (this._activeRequests.has(aPacket.from) && !(aPacket.type in UnsolicitedNotifications) && !(aPacket.type == ThreadStateTypes.paused && aPacket.why.type in UnsolicitedPauses)) { activeRequest = this._activeRequests.get(aPacket.from); this._activeRequests.delete(aPacket.from); } // If there is a subsequent request for the same actor, hand it off to the // transport. Delivery of packets on the other end is always async, even // in the local transport case. this._attemptNextRequest(aPacket.from); // Packets that indicate thread state changes get special treatment. if (aPacket.type in ThreadStateTypes && this._clients.has(aPacket.from) && typeof this._clients.get(aPacket.from)._onThreadState == "function") { this._clients.get(aPacket.from)._onThreadState(aPacket); } // TODO: Bug 1151156 - Remove once Gecko 40 is on b2g-stable. if (!this.traits.noNeedToFakeResumptionOnNavigation) { // On navigation the server resumes, so the client must resume as well. // We achieve that by generating a fake resumption packet that triggers // the client's thread state change listeners. if (aPacket.type == UnsolicitedNotifications.tabNavigated && this._clients.has(aPacket.from) && this._clients.get(aPacket.from).thread) { let thread = this._clients.get(aPacket.from).thread; let resumption = { from: thread._actor, type: "resumed" }; thread._onThreadState(resumption); } } // Only try to notify listeners on events, not responses to requests // that lack a packet type. if (aPacket.type) { this.emit(aPacket.type, aPacket); } if (activeRequest) { let emitReply = () => activeRequest.emit("json-reply", aPacket); if (activeRequest.stack) { Cu.callFunctionWithAsyncStack(emitReply, activeRequest.stack, "DevTools RDP"); } else { emitReply(); } } }, /** * Called by the DebuggerTransport to dispatch incoming bulk packets as * appropriate. * * @param packet object * The incoming packet, which contains: * * actor: Name of actor that will receive the packet * * type: Name of actor's method that should be called on receipt * * length: Size of the data to be read * * stream: This input stream should only be used directly if you can * ensure that you will read exactly |length| bytes and will * not close the stream when reading is complete * * done: If you use the stream directly (instead of |copyTo| * below), you must signal completion by resolving / * rejecting this deferred. If it's rejected, the transport * will be closed. If an Error is supplied as a rejection * value, it will be logged via |dumpn|. If you do use * |copyTo|, resolving is taken care of for you when copying * completes. * * copyTo: A helper function for getting your data out of the stream * that meets the stream handling requirements above, and has * the following signature: * @param output nsIAsyncOutputStream * The stream to copy to. * @return Promise * The promise is resolved when copying completes or rejected * if any (unexpected) errors occur. * This object also emits "progress" events for each chunk * that is copied. See stream-utils.js. */ onBulkPacket: function(packet) { let { actor, type, length } = packet; if (!actor) { DevToolsUtils.reportException( "onBulkPacket", new Error("Server did not specify an actor, dropping bulk packet: " + JSON.stringify(packet))); return; } // See if we have a handler function waiting for a reply from this // actor. if (!this._activeRequests.has(actor)) { return; } let activeRequest = this._activeRequests.get(actor); this._activeRequests.delete(actor); // If there is a subsequent request for the same actor, hand it off to the // transport. Delivery of packets on the other end is always async, even // in the local transport case. this._attemptNextRequest(actor); activeRequest.emit("bulk-reply", packet); }, /** * Called by DebuggerTransport when the underlying stream is closed. * * @param aStatus nsresult * The status code that corresponds to the reason for closing * the stream. */ onClosed: function(aStatus) { this._closed = true; this.emit("closed"); // Reject all pending and active requests let reject = function(type, request, actor) { // Server can send packets on its own and client only pass a callback // to expectReply, so that there is no request object. let msg; if (request.request) { msg = "'" + request.request.type + "' " + type + " request packet" + " to '" + actor + "' " + "can't be sent as the connection just closed."; } else { msg = "server side packet from '" + actor + "' can't be received " + "as the connection just closed."; } let packet = { error: "connectionClosed", message: msg }; request.emit("json-reply", packet); }; let pendingRequests = new Map(this._pendingRequests); this._pendingRequests.clear(); pendingRequests.forEach((list, actor) => { list.forEach(request => reject("pending", request, actor)); }); let activeRequests = new Map(this._activeRequests); this._activeRequests.clear(); activeRequests.forEach(reject.bind(null, "active")); // The |_pools| array on the client-side currently is used only by // protocol.js to store active fronts, mirroring the actor pools found in // the server. So, read all usages of "pool" as "protocol.js front". // // In the normal case where we shutdown cleanly, the toolbox tells each tool // to close, and they each call |destroy| on any fronts they were using. // When |destroy| or |cleanup| is called on a protocol.js front, it also // removes itself from the |_pools| array. Once the toolbox has shutdown, // the connection is closed, and we reach here. All fronts (should have // been) |destroy|ed, so |_pools| should empty. // // If the connection instead aborts unexpectedly, we may end up here with // all fronts used during the life of the connection. So, we call |cleanup| // on them clear their state, reject pending requests, and remove themselves // from |_pools|. This saves the toolbox from hanging indefinitely, in case // it waits for some server response before shutdown that will now never // arrive. for (let pool of this._pools) { pool.cleanup(); } }, registerClient: function(client) { let actorID = client.actor; if (!actorID) { throw new Error("DebuggerServer.registerClient expects " + "a client instance with an `actor` attribute."); } if (!Array.isArray(client.events)) { throw new Error("DebuggerServer.registerClient expects " + "a client instance with an `events` attribute " + "that is an array."); } if (client.events.length > 0 && typeof (client.emit) != "function") { throw new Error("DebuggerServer.registerClient expects " + "a client instance with non-empty `events` array to" + "have an `emit` function."); } if (this._clients.has(actorID)) { throw new Error("DebuggerServer.registerClient already registered " + "a client for this actor."); } this._clients.set(actorID, client); }, unregisterClient: function(client) { let actorID = client.actor; if (!actorID) { throw new Error("DebuggerServer.unregisterClient expects " + "a Client instance with a `actor` attribute."); } this._clients.delete(actorID); }, /** * Actor lifetime management, echos the server's actor pools. */ __pools: null, get _pools() { if (this.__pools) { return this.__pools; } this.__pools = new Set(); return this.__pools; }, addActorPool: function(pool) { this._pools.add(pool); }, removeActorPool: function(pool) { this._pools.delete(pool); }, getActor: function(actorID) { let pool = this.poolFor(actorID); return pool ? pool.get(actorID) : null; }, poolFor: function(actorID) { for (let pool of this._pools) { if (pool.has(actorID)) return pool; } return null; }, /** * Currently attached addon. */ activeAddon: null }; eventSource(DebuggerClient.prototype); function Request(request) { this.request = request; } Request.prototype = { on: function(type, listener) { events.on(this, type, listener); }, off: function(type, listener) { events.off(this, type, listener); }, once: function(type, listener) { events.once(this, type, listener); }, emit: function(type, ...args) { events.emit(this, type, ...args); }, get actor() { return this.request.to || this.request.actor; } }; /** * Creates a tab client for the remote debugging protocol server. This client * is a front to the tab actor created in the server side, hiding the protocol * details in a traditional JavaScript API. * * @param aClient DebuggerClient * The debugger client parent. * @param aForm object * The protocol form for this tab. */ function TabClient(aClient, aForm) { this.client = aClient; this._actor = aForm.from; this._threadActor = aForm.threadActor; this.javascriptEnabled = aForm.javascriptEnabled; this.cacheDisabled = aForm.cacheDisabled; this.thread = null; this.request = this.client.request; this.traits = aForm.traits || {}; this.events = ["workerListChanged"]; } TabClient.prototype = { get actor() { return this._actor; }, get _transport() { return this.client._transport; }, /** * Attach to a thread actor. * * @param object aOptions * Configuration options. * - useSourceMaps: whether to use source maps or not. * @param function aOnResponse * Called with the response packet and a ThreadClient * (which will be undefined on error). */ attachThread: function(aOptions = {}, aOnResponse = noop) { if (this.thread) { DevToolsUtils.executeSoon(() => aOnResponse({}, this.thread)); return promise.resolve([{}, this.thread]); } let packet = { to: this._threadActor, type: "attach", options: aOptions }; return this.request(packet).then(aResponse => { if (!aResponse.error) { this.thread = new ThreadClient(this, this._threadActor); this.client.registerClient(this.thread); } aOnResponse(aResponse, this.thread); return [aResponse, this.thread]; }); }, /** * Detach the client from the tab actor. * * @param function aOnResponse * Called with the response packet. */ detach: DebuggerClient.requester({ type: "detach" }, { before: function(aPacket) { if (this.thread) { this.thread.detach(); } return aPacket; }, after: function(aResponse) { this.client.unregisterClient(this); return aResponse; }, telemetry: "TABDETACH" }), /** * Bring the window to the front. */ focus: DebuggerClient.requester({ type: "focus" }, {}), /** * Reload the page in this tab. * * @param [optional] object options * An object with a `force` property indicating whether or not * this reload should skip the cache */ reload: function(options = { force: false }) { return this._reload(options); }, _reload: DebuggerClient.requester({ type: "reload", options: args(0) }, { telemetry: "RELOAD" }), /** * Navigate to another URL. * * @param string url * The URL to navigate to. */ navigateTo: DebuggerClient.requester({ type: "navigateTo", url: args(0) }, { telemetry: "NAVIGATETO" }), /** * Reconfigure the tab actor. * * @param object aOptions * A dictionary object of the new options to use in the tab actor. * @param function aOnResponse * Called with the response packet. */ reconfigure: DebuggerClient.requester({ type: "reconfigure", options: args(0) }, { telemetry: "RECONFIGURETAB" }), listWorkers: DebuggerClient.requester({ type: "listWorkers" }, { telemetry: "LISTWORKERS" }), attachWorker: function(aWorkerActor, aOnResponse) { this.client.attachWorker(aWorkerActor, aOnResponse); }, /** * Resolve a location ({ url, line, column }) to its current * source mapping location. * * @param {String} arg[0].url * @param {Number} arg[0].line * @param {Number?} arg[0].column */ resolveLocation: DebuggerClient.requester({ type: "resolveLocation", location: args(0) }), }; eventSource(TabClient.prototype); function WorkerClient(aClient, aForm) { this.client = aClient; this._actor = aForm.from; this._isClosed = false; this._url = aForm.url; this._onClose = this._onClose.bind(this); this.addListener("close", this._onClose); this.traits = {}; } WorkerClient.prototype = { get _transport() { return this.client._transport; }, get request() { return this.client.request; }, get actor() { return this._actor; }, get url() { return this._url; }, get isClosed() { return this._isClosed; }, detach: DebuggerClient.requester({ type: "detach" }, { after: function(aResponse) { if (this.thread) { this.client.unregisterClient(this.thread); } this.client.unregisterClient(this); return aResponse; }, telemetry: "WORKERDETACH" }), attachThread: function(aOptions = {}, aOnResponse = noop) { if (this.thread) { let response = [{ type: "connected", threadActor: this.thread._actor, consoleActor: this.consoleActor, }, this.thread]; DevToolsUtils.executeSoon(() => aOnResponse(response)); return response; } // The connect call on server doesn't attach the thread as of version 44. return this.request({ to: this._actor, type: "connect", options: aOptions, }).then(connectReponse => { if (connectReponse.error) { aOnResponse(connectReponse, null); return [connectResponse, null]; } return this.request({ to: connectReponse.threadActor, type: "attach", options: aOptions }).then(attachResponse => { if (attachResponse.error) { aOnResponse(attachResponse, null); } this.thread = new ThreadClient(this, connectReponse.threadActor); this.consoleActor = connectReponse.consoleActor; this.client.registerClient(this.thread); aOnResponse(connectReponse, this.thread); return [connectResponse, this.thread]; }); }); }, _onClose: function() { this.removeListener("close", this._onClose); if (this.thread) { this.client.unregisterClient(this.thread); } this.client.unregisterClient(this); this._isClosed = true; }, reconfigure: function() { return Promise.resolve(); }, events: ["close"] }; eventSource(WorkerClient.prototype); function AddonClient(aClient, aActor) { this._client = aClient; this._actor = aActor; this.request = this._client.request; this.events = []; } AddonClient.prototype = { get actor() { return this._actor; }, get _transport() { return this._client._transport; }, /** * Detach the client from the addon actor. * * @param function aOnResponse * Called with the response packet. */ detach: DebuggerClient.requester({ type: "detach" }, { after: function(aResponse) { if (this._client.activeAddon === this) { this._client.activeAddon = null; } this._client.unregisterClient(this); return aResponse; }, telemetry: "ADDONDETACH" }) }; /** * A RootClient object represents a root actor on the server. Each * DebuggerClient keeps a RootClient instance representing the root actor * for the initial connection; DebuggerClient's 'listTabs' and * 'listChildProcesses' methods forward to that root actor. * * @param aClient object * The client connection to which this actor belongs. * @param aGreeting string * The greeting packet from the root actor we're to represent. * * Properties of a RootClient instance: * * @property actor string * The name of this child's root actor. * @property applicationType string * The application type, as given in the root actor's greeting packet. * @property traits object * The traits object, as given in the root actor's greeting packet. */ function RootClient(aClient, aGreeting) { this._client = aClient; this.actor = aGreeting.from; this.applicationType = aGreeting.applicationType; this.traits = aGreeting.traits; } exports.RootClient = RootClient; RootClient.prototype = { constructor: RootClient, /** * List the open tabs. * * @param function aOnResponse * Called with the response packet. */ listTabs: DebuggerClient.requester({ type: "listTabs" }, { telemetry: "LISTTABS" }), /** * List the installed addons. * * @param function aOnResponse * Called with the response packet. */ listAddons: DebuggerClient.requester({ type: "listAddons" }, { telemetry: "LISTADDONS" }), /** * List the registered workers. * * @param function aOnResponse * Called with the response packet. */ listWorkers: DebuggerClient.requester({ type: "listWorkers" }, { telemetry: "LISTWORKERS" }), /** * List the registered service workers. * * @param function aOnResponse * Called with the response packet. */ listServiceWorkerRegistrations: DebuggerClient.requester({ type: "listServiceWorkerRegistrations" }, { telemetry: "LISTSERVICEWORKERREGISTRATIONS" }), /** * List the running processes. * * @param function aOnResponse * Called with the response packet. */ listProcesses: DebuggerClient.requester({ type: "listProcesses" }, { telemetry: "LISTPROCESSES" }), /** * Fetch the TabActor for the currently selected tab, or for a specific * tab given as first parameter. * * @param [optional] object aFilter * A dictionary object with following optional attributes: * - outerWindowID: used to match tabs in parent process * - tabId: used to match tabs in child processes * - tab: a reference to xul:tab element * If nothing is specified, returns the actor for the currently * selected tab. */ getTab: function(aFilter) { let packet = { to: this.actor, type: "getTab" }; if (aFilter) { if (typeof (aFilter.outerWindowID) == "number") { packet.outerWindowID = aFilter.outerWindowID; } else if (typeof (aFilter.tabId) == "number") { packet.tabId = aFilter.tabId; } else if ("tab" in aFilter) { let browser = aFilter.tab.linkedBrowser; if (browser.frameLoader.tabParent) { // Tabs in child process packet.tabId = browser.frameLoader.tabParent.tabId; } else { // Tabs in parent process let windowUtils = browser.contentWindow .QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIDOMWindowUtils); packet.outerWindowID = windowUtils.outerWindowID; } } else { // Throw if a filter object have been passed but without // any clearly idenfified filter. throw new Error("Unsupported argument given to getTab request"); } } return this.request(packet); }, /** * Description of protocol's actors and methods. * * @param function aOnResponse * Called with the response packet. */ protocolDescription: DebuggerClient.requester({ type: "protocolDescription" }, { telemetry: "PROTOCOLDESCRIPTION" }), /* * Methods constructed by DebuggerClient.requester require these forwards * on their 'this'. */ get _transport() { return this._client._transport; }, get request() { return this._client.request; } }; /** * Creates a thread client for the remote debugging protocol server. This client * is a front to the thread actor created in the server side, hiding the * protocol details in a traditional JavaScript API. * * @param aClient DebuggerClient|TabClient * The parent of the thread (tab for tab-scoped debuggers, DebuggerClient * for chrome debuggers). * @param aActor string * The actor ID for this thread. */ function ThreadClient(aClient, aActor) { this._parent = aClient; this.client = aClient instanceof DebuggerClient ? aClient : aClient.client; this._actor = aActor; this._frameCache = []; this._scriptCache = {}; this._pauseGrips = {}; this._threadGrips = {}; this.request = this.client.request; } ThreadClient.prototype = { _state: "paused", get state() { return this._state; }, get paused() { return this._state === "paused"; }, _pauseOnExceptions: false, _ignoreCaughtExceptions: false, _pauseOnDOMEvents: null, _actor: null, get actor() { return this._actor; }, get _transport() { return this.client._transport; }, _assertPaused: function(aCommand) { if (!this.paused) { throw Error(aCommand + " command sent while not paused. Currently " + this._state); } }, /** * Resume a paused thread. If the optional aLimit parameter is present, then * the thread will also pause when that limit is reached. * * @param [optional] object aLimit * An object with a type property set to the appropriate limit (next, * step, or finish) per the remote debugging protocol specification. * Use null to specify no limit. * @param function aOnResponse * Called with the response packet. */ _doResume: DebuggerClient.requester({ type: "resume", resumeLimit: args(0) }, { before: function(aPacket) { this._assertPaused("resume"); // Put the client in a tentative "resuming" state so we can prevent // further requests that should only be sent in the paused state. this._state = "resuming"; if (this._pauseOnExceptions) { aPacket.pauseOnExceptions = this._pauseOnExceptions; } if (this._ignoreCaughtExceptions) { aPacket.ignoreCaughtExceptions = this._ignoreCaughtExceptions; } if (this._pauseOnDOMEvents) { aPacket.pauseOnDOMEvents = this._pauseOnDOMEvents; } return aPacket; }, after: function(aResponse) { if (aResponse.error) { // There was an error resuming, back to paused state. this._state = "paused"; } return aResponse; }, telemetry: "RESUME" }), /** * Reconfigure the thread actor. * * @param object aOptions * A dictionary object of the new options to use in the thread actor. * @param function aOnResponse * Called with the response packet. */ reconfigure: DebuggerClient.requester({ type: "reconfigure", options: args(0) }, { telemetry: "RECONFIGURETHREAD" }), /** * Resume a paused thread. */ resume: function(aOnResponse) { return this._doResume(null, aOnResponse); }, /** * Resume then pause without stepping. * * @param function aOnResponse * Called with the response packet. */ resumeThenPause: function(aOnResponse) { return this._doResume({ type: "break" }, aOnResponse); }, /** * Step over a function call. * * @param function aOnResponse * Called with the response packet. */ stepOver: function(aOnResponse) { return this._doResume({ type: "next" }, aOnResponse); }, /** * Step into a function call. * * @param function aOnResponse * Called with the response packet. */ stepIn: function(aOnResponse) { return this._doResume({ type: "step" }, aOnResponse); }, /** * Step out of a function call. * * @param function aOnResponse * Called with the response packet. */ stepOut: function(aOnResponse) { return this._doResume({ type: "finish" }, aOnResponse); }, /** * Immediately interrupt a running thread. * * @param function aOnResponse * Called with the response packet. */ interrupt: function(aOnResponse) { return this._doInterrupt(null, aOnResponse); }, /** * Pause execution right before the next JavaScript bytecode is executed. * * @param function aOnResponse * Called with the response packet. */ breakOnNext: function(aOnResponse) { return this._doInterrupt("onNext", aOnResponse); }, /** * Interrupt a running thread. * * @param function aOnResponse * Called with the response packet. */ _doInterrupt: DebuggerClient.requester({ type: "interrupt", when: args(0) }, { telemetry: "INTERRUPT" }), /** * Enable or disable pausing when an exception is thrown. * * @param boolean aFlag * Enables pausing if true, disables otherwise. * @param function aOnResponse * Called with the response packet. */ pauseOnExceptions: function(aPauseOnExceptions, aIgnoreCaughtExceptions, aOnResponse = noop) { this._pauseOnExceptions = aPauseOnExceptions; this._ignoreCaughtExceptions = aIgnoreCaughtExceptions; // Otherwise send the flag using a standard resume request. if (!this.paused) { return this.interrupt(aResponse => { if (aResponse.error) { // Can't continue if pausing failed. aOnResponse(aResponse); return aResponse; } return this.resume(aOnResponse); }); } aOnResponse(); return promise.resolve(); }, /** * Enable pausing when the specified DOM events are triggered. Disabling * pausing on an event can be realized by calling this method with the updated * array of events that doesn't contain it. * * @param array|string events * An array of strings, representing the DOM event types to pause on, * or "*" to pause on all DOM events. Pass an empty array to * completely disable pausing on DOM events. * @param function onResponse * Called with the response packet in a future turn of the event loop. */ pauseOnDOMEvents: function(events, onResponse = noop) { this._pauseOnDOMEvents = events; // If the debuggee is paused, the value of the array will be communicated in // the next resumption. Otherwise we have to force a pause in order to send // the array. if (this.paused) { DevToolsUtils.executeSoon(() => onResponse({})); return {}; } return this.interrupt(response => { // Can't continue if pausing failed. if (response.error) { onResponse(response); return response; } return this.resume(onResponse); }); }, /** * Send a clientEvaluate packet to the debuggee. Response * will be a resume packet. * * @param string aFrame * The actor ID of the frame where the evaluation should take place. * @param string aExpression * The expression that will be evaluated in the scope of the frame * above. * @param function aOnResponse * Called with the response packet. */ eval: DebuggerClient.requester({ type: "clientEvaluate", frame: args(0), expression: args(1) }, { before: function(aPacket) { this._assertPaused("eval"); // Put the client in a tentative "resuming" state so we can prevent // further requests that should only be sent in the paused state. this._state = "resuming"; return aPacket; }, after: function(aResponse) { if (aResponse.error) { // There was an error resuming, back to paused state. this._state = "paused"; } return aResponse; }, telemetry: "CLIENTEVALUATE" }), /** * Detach from the thread actor. * * @param function aOnResponse * Called with the response packet. */ detach: DebuggerClient.requester({ type: "detach" }, { after: function(aResponse) { this.client.unregisterClient(this); this._parent.thread = null; return aResponse; }, telemetry: "THREADDETACH" }), /** * Release multiple thread-lifetime object actors. If any pause-lifetime * actors are included in the request, a |notReleasable| error will return, * but all the thread-lifetime ones will have been released. * * @param array actors * An array with actor IDs to release. */ releaseMany: DebuggerClient.requester({ type: "releaseMany", actors: args(0), }, { telemetry: "RELEASEMANY" }), /** * Promote multiple pause-lifetime object actors to thread-lifetime ones. * * @param array actors * An array with actor IDs to promote. */ threadGrips: DebuggerClient.requester({ type: "threadGrips", actors: args(0) }, { telemetry: "THREADGRIPS" }), /** * Return the event listeners defined on the page. * * @param aOnResponse Function * Called with the thread's response. */ eventListeners: DebuggerClient.requester({ type: "eventListeners" }, { telemetry: "EVENTLISTENERS" }), /** * Request the loaded sources for the current thread. * * @param aOnResponse Function * Called with the thread's response. */ getSources: DebuggerClient.requester({ type: "sources" }, { telemetry: "SOURCES" }), /** * Clear the thread's source script cache. A scriptscleared event * will be sent. */ _clearScripts: function() { if (Object.keys(this._scriptCache).length > 0) { this._scriptCache = {}; this.emit("scriptscleared"); } }, /** * Request frames from the callstack for the current thread. * * @param aStart integer * The number of the youngest stack frame to return (the youngest * frame is 0). * @param aCount integer * The maximum number of frames to return, or null to return all * frames. * @param aOnResponse function * Called with the thread's response. */ getFrames: DebuggerClient.requester({ type: "frames", start: args(0), count: args(1) }, { telemetry: "FRAMES" }), /** * An array of cached frames. Clients can observe the framesadded and * framescleared event to keep up to date on changes to this cache, * and can fill it using the fillFrames method. */ get cachedFrames() { return this._frameCache; }, /** * true if there are more stack frames available on the server. */ get moreFrames() { return this.paused && (!this._frameCache || this._frameCache.length == 0 || !this._frameCache[this._frameCache.length - 1].oldest); }, /** * Ensure that at least aTotal stack frames have been loaded in the * ThreadClient's stack frame cache. A framesadded event will be * sent when the stack frame cache is updated. * * @param aTotal number * The minimum number of stack frames to be included. * @param aCallback function * Optional callback function called when frames have been loaded * @returns true if a framesadded notification should be expected. */ fillFrames: function(aTotal, aCallback = noop) { this._assertPaused("fillFrames"); if (this._frameCache.length >= aTotal) { return false; } let numFrames = this._frameCache.length; this.getFrames(numFrames, aTotal - numFrames, (aResponse) => { if (aResponse.error) { aCallback(aResponse); return; } let threadGrips = DevToolsUtils.values(this._threadGrips); for (let i in aResponse.frames) { let frame = aResponse.frames[i]; if (!frame.where.source) { // Older servers use urls instead, so we need to resolve // them to source actors for (let grip of threadGrips) { if (grip instanceof SourceClient && grip.url === frame.url) { frame.where.source = grip._form; } } } this._frameCache[frame.depth] = frame; } // If we got as many frames as we asked for, there might be more // frames available. this.emit("framesadded"); aCallback(aResponse); }); return true; }, /** * Clear the thread's stack frame cache. A framescleared event * will be sent. */ _clearFrames: function() { if (this._frameCache.length > 0) { this._frameCache = []; this.emit("framescleared"); } }, /** * Return a ObjectClient object for the given object grip. * * @param aGrip object * A pause-lifetime object grip returned by the protocol. */ pauseGrip: function(aGrip) { if (aGrip.actor in this._pauseGrips) { return this._pauseGrips[aGrip.actor]; } let client = new ObjectClient(this.client, aGrip); this._pauseGrips[aGrip.actor] = client; return client; }, /** * Get or create a long string client, checking the grip client cache if it * already exists. * * @param aGrip Object * The long string grip returned by the protocol. * @param aGripCacheName String * The property name of the grip client cache to check for existing * clients in. */ _longString: function(aGrip, aGripCacheName) { if (aGrip.actor in this[aGripCacheName]) { return this[aGripCacheName][aGrip.actor]; } let client = new LongStringClient(this.client, aGrip); this[aGripCacheName][aGrip.actor] = client; return client; }, /** * Return an instance of LongStringClient for the given long string grip that * is scoped to the current pause. * * @param aGrip Object * The long string grip returned by the protocol. */ pauseLongString: function(aGrip) { return this._longString(aGrip, "_pauseGrips"); }, /** * Return an instance of LongStringClient for the given long string grip that * is scoped to the thread lifetime. * * @param aGrip Object * The long string grip returned by the protocol. */ threadLongString: function(aGrip) { return this._longString(aGrip, "_threadGrips"); }, /** * Clear and invalidate all the grip clients from the given cache. * * @param aGripCacheName * The property name of the grip cache we want to clear. */ _clearObjectClients: function(aGripCacheName) { for (let id in this[aGripCacheName]) { this[aGripCacheName][id].valid = false; } this[aGripCacheName] = {}; }, /** * Invalidate pause-lifetime grip clients and clear the list of current grip * clients. */ _clearPauseGrips: function() { this._clearObjectClients("_pauseGrips"); }, /** * Invalidate thread-lifetime grip clients and clear the list of current grip * clients. */ _clearThreadGrips: function() { this._clearObjectClients("_threadGrips"); }, /** * Handle thread state change by doing necessary cleanup and notifying all * registered listeners. */ _onThreadState: function(aPacket) { this._state = ThreadStateTypes[aPacket.type]; // The debugger UI may not be initialized yet so we want to keep // the packet around so it knows what to pause state to display // when it's initialized this._lastPausePacket = aPacket.type === "resumed" ? null : aPacket; this._clearFrames(); this._clearPauseGrips(); aPacket.type === ThreadStateTypes.detached && this._clearThreadGrips(); this.client._eventsEnabled && this.emit(aPacket.type, aPacket); }, getLastPausePacket: function() { return this._lastPausePacket; }, /** * Return an EnvironmentClient instance for the given environment actor form. */ environment: function(aForm) { return new EnvironmentClient(this.client, aForm); }, /** * Return an instance of SourceClient for the given source actor form. */ source: function(aForm) { if (aForm.actor in this._threadGrips) { return this._threadGrips[aForm.actor]; } return this._threadGrips[aForm.actor] = new SourceClient(this, aForm); }, /** * Request the prototype and own properties of mutlipleObjects. * * @param aOnResponse function * Called with the request's response. * @param actors [string] * List of actor ID of the queried objects. */ getPrototypesAndProperties: DebuggerClient.requester({ type: "prototypesAndProperties", actors: args(0) }, { telemetry: "PROTOTYPESANDPROPERTIES" }), events: ["newSource"] }; eventSource(ThreadClient.prototype); /** * Creates a tracing profiler client for the remote debugging protocol * server. This client is a front to the trace actor created on the * server side, hiding the protocol details in a traditional * JavaScript API. * * @param aClient DebuggerClient * The debugger client parent. * @param aActor string * The actor ID for this thread. */ function TraceClient(aClient, aActor) { this._client = aClient; this._actor = aActor; this._activeTraces = new Set(); this._waitingPackets = new Map(); this._expectedPacket = 0; this.request = this._client.request; this.events = []; } TraceClient.prototype = { get actor() { return this._actor; }, get tracing() { return this._activeTraces.size > 0; }, get _transport() { return this._client._transport; }, /** * Detach from the trace actor. */ detach: DebuggerClient.requester({ type: "detach" }, { after: function(aResponse) { this._client.unregisterClient(this); return aResponse; }, telemetry: "TRACERDETACH" }), /** * Start a new trace. * * @param aTrace [string] * An array of trace types to be recorded by the new trace. * * @param aName string * The name of the new trace. * * @param aOnResponse function * Called with the request's response. */ startTrace: DebuggerClient.requester({ type: "startTrace", name: args(1), trace: args(0) }, { after: function(aResponse) { if (aResponse.error) { return aResponse; } if (!this.tracing) { this._waitingPackets.clear(); this._expectedPacket = 0; } this._activeTraces.add(aResponse.name); return aResponse; }, telemetry: "STARTTRACE" }), /** * End a trace. If a name is provided, stop the named * trace. Otherwise, stop the most recently started trace. * * @param aName string * The name of the trace to stop. * * @param aOnResponse function * Called with the request's response. */ stopTrace: DebuggerClient.requester({ type: "stopTrace", name: args(0) }, { after: function(aResponse) { if (aResponse.error) { return aResponse; } this._activeTraces.delete(aResponse.name); return aResponse; }, telemetry: "STOPTRACE" }) }; /** * Grip clients are used to retrieve information about the relevant object. * * @param aClient DebuggerClient * The debugger client parent. * @param aGrip object * A pause-lifetime object grip returned by the protocol. */ function ObjectClient(aClient, aGrip) { this._grip = aGrip; this._client = aClient; this.request = this._client.request; } exports.ObjectClient = ObjectClient; ObjectClient.prototype = { get actor() { return this._grip.actor; }, get _transport() { return this._client._transport; }, valid: true, get isFrozen() { return this._grip.frozen; }, get isSealed() { return this._grip.sealed; }, get isExtensible() { return this._grip.extensible; }, getDefinitionSite: DebuggerClient.requester({ type: "definitionSite" }, { before: function(aPacket) { if (this._grip.class != "Function") { throw new Error("getDefinitionSite is only valid for function grips."); } return aPacket; } }), /** * Request the names of a function's formal parameters. * * @param aOnResponse function * Called with an object of the form: * { parameterNames:[, ...] } * where each is the name of a parameter. */ getParameterNames: DebuggerClient.requester({ type: "parameterNames" }, { before: function(aPacket) { if (this._grip.class !== "Function") { throw new Error("getParameterNames is only valid for function grips."); } return aPacket; }, telemetry: "PARAMETERNAMES" }), /** * Request the names of the properties defined on the object and not its * prototype. * * @param aOnResponse function Called with the request's response. */ getOwnPropertyNames: DebuggerClient.requester({ type: "ownPropertyNames" }, { telemetry: "OWNPROPERTYNAMES" }), /** * Request the prototype and own properties of the object. * * @param aOnResponse function Called with the request's response. */ getPrototypeAndProperties: DebuggerClient.requester({ type: "prototypeAndProperties" }, { telemetry: "PROTOTYPEANDPROPERTIES" }), /** * Request a PropertyIteratorClient instance to ease listing * properties for this object. * * @param options Object * A dictionary object with various boolean attributes: * - ignoreSafeGetters Boolean * If true, do not iterate over safe getters. * - ignoreIndexedProperties Boolean * If true, filters out Array items. * e.g. properties names between `0` and `object.length`. * - ignoreNonIndexedProperties Boolean * If true, filters out items that aren't array items * e.g. properties names that are not a number between `0` * and `object.length`. * - sort Boolean * If true, the iterator will sort the properties by name * before dispatching them. * @param aOnResponse function Called with the client instance. */ enumProperties: DebuggerClient.requester({ type: "enumProperties", options: args(0) }, { after: function(aResponse) { if (aResponse.iterator) { return { iterator: new PropertyIteratorClient(this._client, aResponse.iterator) }; } return aResponse; }, telemetry: "ENUMPROPERTIES" }), /** * Request a PropertyIteratorClient instance to enumerate entries in a * Map/Set-like object. * * @param aOnResponse function Called with the request's response. */ enumEntries: DebuggerClient.requester({ type: "enumEntries" }, { before: function(packet) { if (!["Map", "WeakMap", "Set", "WeakSet"].includes(this._grip.class)) { throw new Error("enumEntries is only valid for Map/Set-like grips."); } return packet; }, after: function(response) { if (response.iterator) { return { iterator: new PropertyIteratorClient(this._client, response.iterator) }; } return response; } }), /** * Request the property descriptor of the object's specified property. * * @param aName string The name of the requested property. * @param aOnResponse function Called with the request's response. */ getProperty: DebuggerClient.requester({ type: "property", name: args(0) }, { telemetry: "PROPERTY" }), /** * Request the prototype of the object. * * @param aOnResponse function Called with the request's response. */ getPrototype: DebuggerClient.requester({ type: "prototype" }, { telemetry: "PROTOTYPE" }), /** * Request the display string of the object. * * @param aOnResponse function Called with the request's response. */ getDisplayString: DebuggerClient.requester({ type: "displayString" }, { telemetry: "DISPLAYSTRING" }), /** * Request the scope of the object. * * @param aOnResponse function Called with the request's response. */ getScope: DebuggerClient.requester({ type: "scope" }, { before: function(aPacket) { if (this._grip.class !== "Function") { throw new Error("scope is only valid for function grips."); } return aPacket; }, telemetry: "SCOPE" }), /** * Request the promises directly depending on the current promise. */ getDependentPromises: DebuggerClient.requester({ type: "dependentPromises" }, { before: function(aPacket) { if (this._grip.class !== "Promise") { throw new Error("getDependentPromises is only valid for promise " + "grips."); } return aPacket; } }), /** * Request the stack to the promise's allocation point. */ getPromiseAllocationStack: DebuggerClient.requester({ type: "allocationStack" }, { before: function(aPacket) { if (this._grip.class !== "Promise") { throw new Error("getAllocationStack is only valid for promise grips."); } return aPacket; } }), /** * Request the stack to the promise's fulfillment point. */ getPromiseFulfillmentStack: DebuggerClient.requester({ type: "fulfillmentStack" }, { before: function(packet) { if (this._grip.class !== "Promise") { throw new Error("getPromiseFulfillmentStack is only valid for " + "promise grips."); } return packet; } }), /** * Request the stack to the promise's rejection point. */ getPromiseRejectionStack: DebuggerClient.requester({ type: "rejectionStack" }, { before: function(packet) { if (this._grip.class !== "Promise") { throw new Error("getPromiseRejectionStack is only valid for " + "promise grips."); } return packet; } }) }; /** * A PropertyIteratorClient provides a way to access to property names and * values of an object efficiently, slice by slice. * Note that the properties can be sorted in the backend, * this is controled while creating the PropertyIteratorClient * from ObjectClient.enumProperties. * * @param aClient DebuggerClient * The debugger client parent. * @param aGrip Object * A PropertyIteratorActor grip returned by the protocol via * TabActor.enumProperties request. */ function PropertyIteratorClient(aClient, aGrip) { this._grip = aGrip; this._client = aClient; this.request = this._client.request; } PropertyIteratorClient.prototype = { get actor() { return this._grip.actor; }, /** * Get the total number of properties available in the iterator. */ get count() { return this._grip.count; }, /** * Get one or more property names that correspond to the positions in the * indexes parameter. * * @param indexes Array * An array of property indexes. * @param aCallback Function * The function called when we receive the property names. */ names: DebuggerClient.requester({ type: "names", indexes: args(0) }, {}), /** * Get a set of following property value(s). * * @param start Number * The index of the first property to fetch. * @param count Number * The number of properties to fetch. * @param aCallback Function * The function called when we receive the property values. */ slice: DebuggerClient.requester({ type: "slice", start: args(0), count: args(1) }, {}), /** * Get all the property values. * * @param aCallback Function * The function called when we receive the property values. */ all: DebuggerClient.requester({ type: "all" }, {}), }; /** * A LongStringClient provides a way to access "very long" strings from the * debugger server. * * @param aClient DebuggerClient * The debugger client parent. * @param aGrip Object * A pause-lifetime long string grip returned by the protocol. */ function LongStringClient(aClient, aGrip) { this._grip = aGrip; this._client = aClient; this.request = this._client.request; } exports.LongStringClient = LongStringClient; LongStringClient.prototype = { get actor() { return this._grip.actor; }, get length() { return this._grip.length; }, get initial() { return this._grip.initial; }, get _transport() { return this._client._transport; }, valid: true, /** * Get the substring of this LongString from aStart to aEnd. * * @param aStart Number * The starting index. * @param aEnd Number * The ending index. * @param aCallback Function * The function called when we receive the substring. */ substring: DebuggerClient.requester({ type: "substring", start: args(0), end: args(1) }, { telemetry: "SUBSTRING" }), }; /** * A SourceClient provides a way to access the source text of a script. * * @param aClient ThreadClient * The thread client parent. * @param aForm Object * The form sent across the remote debugging protocol. */ function SourceClient(aClient, aForm) { this._form = aForm; this._isBlackBoxed = aForm.isBlackBoxed; this._isPrettyPrinted = aForm.isPrettyPrinted; this._activeThread = aClient; this._client = aClient.client; } SourceClient.prototype = { get _transport() { return this._client._transport; }, get isBlackBoxed() { return this._isBlackBoxed; }, get isPrettyPrinted() { return this._isPrettyPrinted; }, get actor() { return this._form.actor; }, get request() { return this._client.request; }, get url() { return this._form.url; }, /** * Black box this SourceClient's source. * * @param aCallback Function * The callback function called when we receive the response from the server. */ blackBox: DebuggerClient.requester({ type: "blackbox" }, { telemetry: "BLACKBOX", after: function(aResponse) { if (!aResponse.error) { this._isBlackBoxed = true; if (this._activeThread) { this._activeThread.emit("blackboxchange", this); } } return aResponse; } }), /** * Un-black box this SourceClient's source. * * @param aCallback Function * The callback function called when we receive the response from the server. */ unblackBox: DebuggerClient.requester({ type: "unblackbox" }, { telemetry: "UNBLACKBOX", after: function(aResponse) { if (!aResponse.error) { this._isBlackBoxed = false; if (this._activeThread) { this._activeThread.emit("blackboxchange", this); } } return aResponse; } }), /** * Get Executable Lines from a source * * @param aCallback Function * The callback function called when we receive the response from the server. */ getExecutableLines: function(cb = noop) { let packet = { to: this._form.actor, type: "getExecutableLines" }; return this._client.request(packet).then(res => { cb(res.lines); return res.lines; }); }, /** * Get a long string grip for this SourceClient's source. */ source: function(aCallback = noop) { let packet = { to: this._form.actor, type: "source" }; return this._client.request(packet).then(aResponse => { return this._onSourceResponse(aResponse, aCallback); }); }, /** * Pretty print this source's text. */ prettyPrint: function(aIndent, aCallback = noop) { const packet = { to: this._form.actor, type: "prettyPrint", indent: aIndent }; return this._client.request(packet).then(aResponse => { if (!aResponse.error) { this._isPrettyPrinted = true; this._activeThread._clearFrames(); this._activeThread.emit("prettyprintchange", this); } return this._onSourceResponse(aResponse, aCallback); }); }, /** * Stop pretty printing this source's text. */ disablePrettyPrint: function(aCallback = noop) { const packet = { to: this._form.actor, type: "disablePrettyPrint" }; return this._client.request(packet).then(aResponse => { if (!aResponse.error) { this._isPrettyPrinted = false; this._activeThread._clearFrames(); this._activeThread.emit("prettyprintchange", this); } return this._onSourceResponse(aResponse, aCallback); }); }, _onSourceResponse: function(aResponse, aCallback) { if (aResponse.error) { aCallback(aResponse); return aResponse; } if (typeof aResponse.source === "string") { aCallback(aResponse); return aResponse; } let { contentType, source } = aResponse; let longString = this._activeThread.threadLongString(source); return longString.substring(0, longString.length).then(function(aResponse) { if (aResponse.error) { aCallback(aResponse); return aReponse; } let response = { source: aResponse.substring, contentType: contentType }; aCallback(response); return response; }); }, /** * Request to set a breakpoint in the specified location. * * @param object aLocation * The location and condition of the breakpoint in * the form of { line[, column, condition] }. * @param function aOnResponse * Called with the thread's response. */ setBreakpoint: function({ line, column, condition, noSliding }, aOnResponse = noop) { // A helper function that sets the breakpoint. let doSetBreakpoint = aCallback => { let root = this._client.mainRoot; let location = { line: line, column: column }; let packet = { to: this.actor, type: "setBreakpoint", location: location, condition: condition, noSliding: noSliding }; // Backwards compatibility: send the breakpoint request to the // thread if the server doesn't support Debugger.Source actors. if (!root.traits.debuggerSourceActors) { packet.to = this._activeThread.actor; packet.location.url = this.url; } return this._client.request(packet).then(aResponse => { // Ignoring errors, since the user may be setting a breakpoint in a // dead script that will reappear on a page reload. let bpClient; if (aResponse.actor) { bpClient = new BreakpointClient( this._client, this, aResponse.actor, location, root.traits.conditionalBreakpoints ? condition : undefined ); } aOnResponse(aResponse, bpClient); if (aCallback) { aCallback(); } return [aResponse, bpClient]; }); }; // If the debuggee is paused, just set the breakpoint. if (this._activeThread.paused) { return doSetBreakpoint(); } // Otherwise, force a pause in order to set the breakpoint. return this._activeThread.interrupt().then(aResponse => { if (aResponse.error) { // Can't set the breakpoint if pausing failed. aOnResponse(aResponse); return aResponse; } const { type, why } = aResponse; const cleanUp = type == "paused" && why.type == "interrupted" ? () => this._activeThread.resume() : noop; return doSetBreakpoint(cleanUp); }); } }; /** * Breakpoint clients are used to remove breakpoints that are no longer used. * * @param aClient DebuggerClient * The debugger client parent. * @param aSourceClient SourceClient * The source where this breakpoint exists * @param aActor string * The actor ID for this breakpoint. * @param aLocation object * The location of the breakpoint. This is an object with two properties: * url and line. * @param aCondition string * The conditional expression of the breakpoint */ function BreakpointClient(aClient, aSourceClient, aActor, aLocation, aCondition) { this._client = aClient; this._actor = aActor; this.location = aLocation; this.location.actor = aSourceClient.actor; this.location.url = aSourceClient.url; this.source = aSourceClient; this.request = this._client.request; // The condition property should only exist if it's a truthy value if (aCondition) { this.condition = aCondition; } } BreakpointClient.prototype = { _actor: null, get actor() { return this._actor; }, get _transport() { return this._client._transport; }, /** * Remove the breakpoint from the server. */ remove: DebuggerClient.requester({ type: "delete" }, { telemetry: "DELETE" }), /** * Determines if this breakpoint has a condition */ hasCondition: function() { let root = this._client.mainRoot; // XXX bug 990137: We will remove support for client-side handling of // conditional breakpoints if (root.traits.conditionalBreakpoints) { return "condition" in this; } else { return "conditionalExpression" in this; } }, /** * Get the condition of this breakpoint. Currently we have to * support locally emulated conditional breakpoints until the * debugger servers are updated (see bug 990137). We used a * different property when moving it server-side to ensure that we * are testing the right code. */ getCondition: function() { let root = this._client.mainRoot; if (root.traits.conditionalBreakpoints) { return this.condition; } else { return this.conditionalExpression; } }, /** * Set the condition of this breakpoint */ setCondition: function(gThreadClient, aCondition, noSliding) { let root = this._client.mainRoot; let deferred = promise.defer(); if (root.traits.conditionalBreakpoints) { let info = { line: this.location.line, column: this.location.column, condition: aCondition, noSliding }; // Remove the current breakpoint and add a new one with the // condition. this.remove(aResponse => { if (aResponse && aResponse.error) { deferred.reject(aResponse); return; } this.source.setBreakpoint(info, (aResponse, aNewBreakpoint) => { if (aResponse && aResponse.error) { deferred.reject(aResponse); } else { deferred.resolve(aNewBreakpoint); } }); }); } else { // The property shouldn't even exist if the condition is blank if (aCondition === "") { delete this.conditionalExpression; } else { this.conditionalExpression = aCondition; } deferred.resolve(this); } return deferred.promise; } }; eventSource(BreakpointClient.prototype); /** * Environment clients are used to manipulate the lexical environment actors. * * @param aClient DebuggerClient * The debugger client parent. * @param aForm Object * The form sent across the remote debugging protocol. */ function EnvironmentClient(aClient, aForm) { this._client = aClient; this._form = aForm; this.request = this._client.request; } exports.EnvironmentClient = EnvironmentClient; EnvironmentClient.prototype = { get actor() { return this._form.actor; }, get _transport() { return this._client._transport; }, /** * Fetches the bindings introduced by this lexical environment. */ getBindings: DebuggerClient.requester({ type: "bindings" }, { telemetry: "BINDINGS" }), /** * Changes the value of the identifier whose name is name (a string) to that * represented by value (a grip). */ assign: DebuggerClient.requester({ type: "assign", name: args(0), value: args(1) }, { telemetry: "ASSIGN" }) }; eventSource(EnvironmentClient.prototype); /***/ }, /* 54 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; module.metadata = { "stability": "unstable" }; const UNCAUGHT_ERROR = 'An error event was emitted for which there was no listener.'; const BAD_LISTENER = 'The event listener must be a function.'; const { ns } = __webpack_require__(55); const event = ns(); const EVENT_TYPE_PATTERN = /^on([A-Z]\w+$)/; exports.EVENT_TYPE_PATTERN = EVENT_TYPE_PATTERN; // Utility function to access given event `target` object's event listeners for // the specific event `type`. If listeners for this type does not exists they // will be created. const observers = function observers(target, type) { if (!target) throw TypeError("Event target must be an object"); let listeners = event(target); return type in listeners ? listeners[type] : listeners[type] = []; }; /** * Registers an event `listener` that is called every time events of * specified `type` is emitted on the given event `target`. * @param {Object} target * Event target object. * @param {String} type * The type of event. * @param {Function} listener * The listener function that processes the event. */ function on(target, type, listener) { if (typeof(listener) !== 'function') throw new Error(BAD_LISTENER); let listeners = observers(target, type); if (!~listeners.indexOf(listener)) listeners.push(listener); } exports.on = on; var onceWeakMap = new WeakMap(); /** * Registers an event `listener` that is called only the next time an event * of the specified `type` is emitted on the given event `target`. * @param {Object} target * Event target object. * @param {String} type * The type of the event. * @param {Function} listener * The listener function that processes the event. */ function once(target, type, listener) { let replacement = function observer(...args) { off(target, type, observer); onceWeakMap.delete(listener); listener.apply(target, args); }; onceWeakMap.set(listener, replacement); on(target, type, replacement); } exports.once = once; /** * Execute each of the listeners in order with the supplied arguments. * All the exceptions that are thrown by listeners during the emit * are caught and can be handled by listeners of 'error' event. Thrown * exceptions are passed as an argument to an 'error' event listener. * If no 'error' listener is registered exception will be logged into an * error console. * @param {Object} target * Event target object. * @param {String} type * The type of event. * @params {Object|Number|String|Boolean} args * Arguments that will be passed to listeners. */ function emit (target, type, ...args) { emitOnObject(target, type, target, ...args); } exports.emit = emit; /** * A variant of emit that allows setting the this property for event listeners */ function emitOnObject(target, type, thisArg, ...args) { let all = observers(target, '*').length; let state = observers(target, type); let listeners = state.slice(); let count = listeners.length; let index = 0; // If error event and there are no handlers (explicit or catch-all) // then print error message to the console. if (count === 0 && type === 'error' && all === 0) console.exception(args[0]); while (index < count) { try { let listener = listeners[index]; // Dispatch only if listener is still registered. if (~state.indexOf(listener)) listener.apply(thisArg, args); } catch (error) { // If exception is not thrown by a error listener and error listener is // registered emit `error` event. Otherwise dump exception to the console. if (type !== 'error') emit(target, 'error', error); else console.exception(error); } index++; } // Also emit on `"*"` so that one could listen for all events. if (type !== '*') emit(target, '*', type, ...args); } exports.emitOnObject = emitOnObject; /** * Removes an event `listener` for the given event `type` on the given event * `target`. If no `listener` is passed removes all listeners of the given * `type`. If `type` is not passed removes all the listeners of the given * event `target`. * @param {Object} target * The event target object. * @param {String} type * The type of event. * @param {Function} listener * The listener function that processes the event. */ function off(target, type, listener) { let length = arguments.length; if (length === 3) { if (onceWeakMap.has(listener)) { listener = onceWeakMap.get(listener); onceWeakMap.delete(listener); } let listeners = observers(target, type); let index = listeners.indexOf(listener); if (~index) listeners.splice(index, 1); } else if (length === 2) { observers(target, type).splice(0); } else if (length === 1) { let listeners = event(target); Object.keys(listeners).forEach(type => delete listeners[type]); } } exports.off = off; /** * Returns a number of event listeners registered for the given event `type` * on the given event `target`. */ function count(target, type) { return observers(target, type).length; } exports.count = count; /** * Registers listeners on the given event `target` from the given `listeners` * dictionary. Iterates over the listeners and if property name matches name * pattern `onEventType` and property is a function, then registers it as * an `eventType` listener on `target`. * * @param {Object} target * The type of event. * @param {Object} listeners * Dictionary of listeners. */ function setListeners(target, listeners) { Object.keys(listeners || {}).forEach(key => { let match = EVENT_TYPE_PATTERN.exec(key); let type = match && match[1].toLowerCase(); if (!type) return; let listener = listeners[key]; if (typeof(listener) === 'function') on(target, type, listener); }); } exports.setListeners = setListeners; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(51)(module))) /***/ }, /* 55 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; module.metadata = { "stability": "unstable" }; const create = Object.create; const prototypeOf = Object.getPrototypeOf; /** * Returns a new namespace, function that may can be used to access an * namespaced object of the argument argument. Namespaced object are associated * with owner objects via weak references. Namespaced objects inherit from the * owners ancestor namespaced object. If owner's ancestor is `null` then * namespaced object inherits from given `prototype`. Namespaces can be used * to define internal APIs that can be shared via enclosing `namespace` * function. * @examples * const internals = ns(); * internals(object).secret = secret; */ function ns() { const map = new WeakMap(); return function namespace(target) { if (!target) // If `target` is not an object return `target` itself. return target; // If target has no namespaced object yet, create one that inherits from // the target prototype's namespaced object. if (!map.has(target)) map.set(target, create(namespace(prototypeOf(target) || null))); return map.get(target); }; }; // `Namespace` is a e4x function in the scope, so we export the function also as // `ns` as alias to avoid clashing. exports.ns = ns; exports.Namespace = ns; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(51)(module))) /***/ }, /* 56 */ /***/ function(module, exports, __webpack_require__) { /* -*- js-indent-level: 2; indent-tabs-mode: nil -*- */ /* vim: set ts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; const {Cc, Ci, Cu} = __webpack_require__(35); const DevToolsUtils = __webpack_require__(42); const EventEmitter = __webpack_require__(34); const promise = __webpack_require__(40); const {LongStringClient} = __webpack_require__(53); /** * A WebConsoleClient is used as a front end for the WebConsoleActor that is * created on the server, hiding implementation details. * * @param object aDebuggerClient * The DebuggerClient instance we live for. * @param object aResponse * The response packet received from the "startListeners" request sent to * the WebConsoleActor. */ function WebConsoleClient(aDebuggerClient, aResponse) { this._actor = aResponse.from; this._client = aDebuggerClient; this._longStrings = {}; this.traits = aResponse.traits || {}; this.events = []; this._networkRequests = new Map(); this.pendingEvaluationResults = new Map(); this.onEvaluationResult = this.onEvaluationResult.bind(this); this.onNetworkEvent = this._onNetworkEvent.bind(this); this.onNetworkEventUpdate = this._onNetworkEventUpdate.bind(this); this._client.addListener("evaluationResult", this.onEvaluationResult); this._client.addListener("networkEvent", this.onNetworkEvent); this._client.addListener("networkEventUpdate", this.onNetworkEventUpdate); EventEmitter.decorate(this); } exports.WebConsoleClient = WebConsoleClient; WebConsoleClient.prototype = { _longStrings: null, traits: null, /** * Holds the network requests currently displayed by the Web Console. Each key * represents the connection ID and the value is network request information. * @private * @type object */ _networkRequests: null, getNetworkRequest(actorId) { return this._networkRequests.get(actorId); }, hasNetworkRequest(actorId) { return this._networkRequests.has(actorId); }, removeNetworkRequest(actorId) { this._networkRequests.delete(actorId); }, getNetworkEvents() { return this._networkRequests.values(); }, get actor() { return this._actor; }, /** * The "networkEvent" message type handler. We redirect any message to * the UI for displaying. * * @private * @param string type * Message type. * @param object packet * The message received from the server. */ _onNetworkEvent: function (type, packet) { if (packet.from == this._actor) { let actor = packet.eventActor; let networkInfo = { _type: "NetworkEvent", timeStamp: actor.timeStamp, node: null, actor: actor.actor, discardRequestBody: true, discardResponseBody: true, startedDateTime: actor.startedDateTime, request: { url: actor.url, method: actor.method, }, isXHR: actor.isXHR, response: {}, timings: {}, updates: [], // track the list of network event updates private: actor.private, fromCache: actor.fromCache }; this._networkRequests.set(actor.actor, networkInfo); this.emit("networkEvent", networkInfo); } }, /** * The "networkEventUpdate" message type handler. We redirect any message to * the UI for displaying. * * @private * @param string type * Message type. * @param object packet * The message received from the server. */ _onNetworkEventUpdate: function (type, packet) { let networkInfo = this.getNetworkRequest(packet.from); if (!networkInfo) { return; } networkInfo.updates.push(packet.updateType); switch (packet.updateType) { case "requestHeaders": networkInfo.request.headersSize = packet.headersSize; break; case "requestPostData": networkInfo.discardRequestBody = packet.discardRequestBody; networkInfo.request.bodySize = packet.dataSize; break; case "responseStart": networkInfo.response.httpVersion = packet.response.httpVersion; networkInfo.response.status = packet.response.status; networkInfo.response.statusText = packet.response.statusText; networkInfo.response.headersSize = packet.response.headersSize; networkInfo.response.remoteAddress = packet.response.remoteAddress; networkInfo.response.remotePort = packet.response.remotePort; networkInfo.discardResponseBody = packet.response.discardResponseBody; break; case "responseContent": networkInfo.response.content = { mimeType: packet.mimeType, }; networkInfo.response.bodySize = packet.contentSize; networkInfo.response.transferredSize = packet.transferredSize; networkInfo.discardResponseBody = packet.discardResponseBody; break; case "eventTimings": networkInfo.totalTime = packet.totalTime; break; case "securityInfo": networkInfo.securityInfo = packet.state; break; } this.emit("networkEventUpdate", { packet: packet, networkInfo }); }, /** * Retrieve the cached messages from the server. * * @see this.CACHED_MESSAGES * @param array types * The array of message types you want from the server. See * this.CACHED_MESSAGES for known types. * @param function aOnResponse * The function invoked when the response is received. */ getCachedMessages: function WCC_getCachedMessages(types, aOnResponse) { let packet = { to: this._actor, type: "getCachedMessages", messageTypes: types, }; this._client.request(packet, aOnResponse); }, /** * Inspect the properties of an object. * * @param string aActor * The WebConsoleObjectActor ID to send the request to. * @param function aOnResponse * The function invoked when the response is received. */ inspectObjectProperties: function WCC_inspectObjectProperties(aActor, aOnResponse) { let packet = { to: aActor, type: "inspectProperties", }; this._client.request(packet, aOnResponse); }, /** * Evaluate a JavaScript expression. * * @param string aString * The code you want to evaluate. * @param function aOnResponse * The function invoked when the response is received. * @param object [aOptions={}] * Options for evaluation: * * - bindObjectActor: an ObjectActor ID. The OA holds a reference to * a Debugger.Object that wraps a content object. This option allows * you to bind |_self| to the D.O of the given OA, during string * evaluation. * * See: Debugger.Object.executeInGlobalWithBindings() for information * about bindings. * * Use case: the variable view needs to update objects and it does so * by knowing the ObjectActor it inspects and binding |_self| to the * D.O of the OA. As such, variable view sends strings like these for * eval: * _self["prop"] = value; * * - frameActor: a FrameActor ID. The FA holds a reference to * a Debugger.Frame. This option allows you to evaluate the string in * the frame of the given FA. * * - url: the url to evaluate the script as. Defaults to * "debugger eval code". * * - selectedNodeActor: the NodeActor ID of the current selection in the * Inspector, if such a selection exists. This is used by helper functions * that can reference the currently selected node in the Inspector, like * $0. */ evaluateJS: function WCC_evaluateJS(aString, aOnResponse, aOptions = {}) { let packet = { to: this._actor, type: "evaluateJS", text: aString, bindObjectActor: aOptions.bindObjectActor, frameActor: aOptions.frameActor, url: aOptions.url, selectedNodeActor: aOptions.selectedNodeActor, selectedObjectActor: aOptions.selectedObjectActor, }; this._client.request(packet, aOnResponse); }, /** * Evaluate a JavaScript expression asynchronously. * See evaluateJS for parameter and response information. */ evaluateJSAsync: function(aString, aOnResponse, aOptions = {}) { // Pre-37 servers don't support async evaluation. if (!this.traits.evaluateJSAsync) { this.evaluateJS(aString, aOnResponse, aOptions); return; } let packet = { to: this._actor, type: "evaluateJSAsync", text: aString, bindObjectActor: aOptions.bindObjectActor, frameActor: aOptions.frameActor, url: aOptions.url, selectedNodeActor: aOptions.selectedNodeActor, selectedObjectActor: aOptions.selectedObjectActor, }; this._client.request(packet, response => { // Null check this in case the client has been detached while waiting // for a response. if (this.pendingEvaluationResults) { this.pendingEvaluationResults.set(response.resultID, aOnResponse); } }); }, /** * Handler for the actors's unsolicited evaluationResult packet. */ onEvaluationResult: function(aNotification, aPacket) { // The client on the main thread can receive notification packets from // multiple webconsole actors: the one on the main thread and the ones // on worker threads. So make sure we should be handling this request. if (aPacket.from !== this._actor) { return; } // Find the associated callback based on this ID, and fire it. // In a sync evaluation, this would have already been called in // direct response to the client.request function. let onResponse = this.pendingEvaluationResults.get(aPacket.resultID); if (onResponse) { onResponse(aPacket); this.pendingEvaluationResults.delete(aPacket.resultID); } else { DevToolsUtils.reportException("onEvaluationResult", "No response handler for an evaluateJSAsync result (resultID: " + aPacket.resultID + ")"); } }, /** * Autocomplete a JavaScript expression. * * @param string aString * The code you want to autocomplete. * @param number aCursor * Cursor location inside the string. Index starts from 0. * @param function aOnResponse * The function invoked when the response is received. * @param string aFrameActor * The id of the frame actor that made the call. */ autocomplete: function WCC_autocomplete(aString, aCursor, aOnResponse, aFrameActor) { let packet = { to: this._actor, type: "autocomplete", text: aString, cursor: aCursor, frameActor: aFrameActor, }; this._client.request(packet, aOnResponse); }, /** * Clear the cache of messages (page errors and console API calls). */ clearMessagesCache: function WCC_clearMessagesCache() { let packet = { to: this._actor, type: "clearMessagesCache", }; this._client.request(packet); }, /** * Get Web Console-related preferences on the server. * * @param array aPreferences * An array with the preferences you want to retrieve. * @param function [aOnResponse] * Optional function to invoke when the response is received. */ getPreferences: function WCC_getPreferences(aPreferences, aOnResponse) { let packet = { to: this._actor, type: "getPreferences", preferences: aPreferences, }; this._client.request(packet, aOnResponse); }, /** * Set Web Console-related preferences on the server. * * @param object aPreferences * An object with the preferences you want to change. * @param function [aOnResponse] * Optional function to invoke when the response is received. */ setPreferences: function WCC_setPreferences(aPreferences, aOnResponse) { let packet = { to: this._actor, type: "setPreferences", preferences: aPreferences, }; this._client.request(packet, aOnResponse); }, /** * Retrieve the request headers from the given NetworkEventActor. * * @param string aActor * The NetworkEventActor ID. * @param function aOnResponse * The function invoked when the response is received. */ getRequestHeaders: function WCC_getRequestHeaders(aActor, aOnResponse) { let packet = { to: aActor, type: "getRequestHeaders", }; this._client.request(packet, aOnResponse); }, /** * Retrieve the request cookies from the given NetworkEventActor. * * @param string aActor * The NetworkEventActor ID. * @param function aOnResponse * The function invoked when the response is received. */ getRequestCookies: function WCC_getRequestCookies(aActor, aOnResponse) { let packet = { to: aActor, type: "getRequestCookies", }; this._client.request(packet, aOnResponse); }, /** * Retrieve the request post data from the given NetworkEventActor. * * @param string aActor * The NetworkEventActor ID. * @param function aOnResponse * The function invoked when the response is received. */ getRequestPostData: function WCC_getRequestPostData(aActor, aOnResponse) { let packet = { to: aActor, type: "getRequestPostData", }; this._client.request(packet, aOnResponse); }, /** * Retrieve the response headers from the given NetworkEventActor. * * @param string aActor * The NetworkEventActor ID. * @param function aOnResponse * The function invoked when the response is received. */ getResponseHeaders: function WCC_getResponseHeaders(aActor, aOnResponse) { let packet = { to: aActor, type: "getResponseHeaders", }; this._client.request(packet, aOnResponse); }, /** * Retrieve the response cookies from the given NetworkEventActor. * * @param string aActor * The NetworkEventActor ID. * @param function aOnResponse * The function invoked when the response is received. */ getResponseCookies: function WCC_getResponseCookies(aActor, aOnResponse) { let packet = { to: aActor, type: "getResponseCookies", }; this._client.request(packet, aOnResponse); }, /** * Retrieve the response content from the given NetworkEventActor. * * @param string aActor * The NetworkEventActor ID. * @param function aOnResponse * The function invoked when the response is received. */ getResponseContent: function WCC_getResponseContent(aActor, aOnResponse) { let packet = { to: aActor, type: "getResponseContent", }; this._client.request(packet, aOnResponse); }, /** * Retrieve the timing information for the given NetworkEventActor. * * @param string aActor * The NetworkEventActor ID. * @param function aOnResponse * The function invoked when the response is received. */ getEventTimings: function WCC_getEventTimings(aActor, aOnResponse) { let packet = { to: aActor, type: "getEventTimings", }; this._client.request(packet, aOnResponse); }, /** * Retrieve the security information for the given NetworkEventActor. * * @param string aActor * The NetworkEventActor ID. * @param function aOnResponse * The function invoked when the response is received. */ getSecurityInfo: function WCC_getSecurityInfo(aActor, aOnResponse) { let packet = { to: aActor, type: "getSecurityInfo", }; this._client.request(packet, aOnResponse); }, /** * Send a HTTP request with the given data. * * @param string aData * The details of the HTTP request. * @param function aOnResponse * The function invoked when the response is received. */ sendHTTPRequest: function WCC_sendHTTPRequest(aData, aOnResponse) { let packet = { to: this._actor, type: "sendHTTPRequest", request: aData }; this._client.request(packet, aOnResponse); }, /** * Start the given Web Console listeners. * * @see this.LISTENERS * @param array aListeners * Array of listeners you want to start. See this.LISTENERS for * known listeners. * @param function aOnResponse * Function to invoke when the server response is received. */ startListeners: function WCC_startListeners(aListeners, aOnResponse) { let packet = { to: this._actor, type: "startListeners", listeners: aListeners, }; this._client.request(packet, aOnResponse); }, /** * Stop the given Web Console listeners. * * @see this.LISTENERS * @param array aListeners * Array of listeners you want to stop. See this.LISTENERS for * known listeners. * @param function aOnResponse * Function to invoke when the server response is received. */ stopListeners: function WCC_stopListeners(aListeners, aOnResponse) { let packet = { to: this._actor, type: "stopListeners", listeners: aListeners, }; this._client.request(packet, aOnResponse); }, /** * Return an instance of LongStringClient for the given long string grip. * * @param object aGrip * The long string grip returned by the protocol. * @return object * The LongStringClient for the given long string grip. */ longString: function WCC_longString(aGrip) { if (aGrip.actor in this._longStrings) { return this._longStrings[aGrip.actor]; } let client = new LongStringClient(this._client, aGrip); this._longStrings[aGrip.actor] = client; return client; }, /** * Close the WebConsoleClient. This stops all the listeners on the server and * detaches from the console actor. * * @param function aOnResponse * Function to invoke when the server response is received. */ detach: function WCC_detach(aOnResponse) { this._client.removeListener("evaluationResult", this.onEvaluationResult); this._client.removeListener("networkEvent", this.onNetworkEvent); this._client.removeListener("networkEventUpdate", this.onNetworkEventUpdate); this.stopListeners(null, aOnResponse); this._longStrings = null; this._client = null; this.pendingEvaluationResults.clear(); this.pendingEvaluationResults = null; this.clearNetworkRequests(); this._networkRequests = null; }, clearNetworkRequests: function () { this._networkRequests.clear(); }, /** * Fetches the full text of a LongString. * * @param object | string stringGrip * The long string grip containing the corresponding actor. * If you pass in a plain string (by accident or because you're lazy), * then a promise of the same string is simply returned. * @return object Promise * A promise that is resolved when the full string contents * are available, or rejected if something goes wrong. */ getString: function(stringGrip) { // Make sure this is a long string. if (typeof stringGrip != "object" || stringGrip.type != "longString") { return promise.resolve(stringGrip); // Go home string, you're drunk. } // Fetch the long string only once. if (stringGrip._fullText) { return stringGrip._fullText.promise; } let deferred = stringGrip._fullText = promise.defer(); let { actor, initial, length } = stringGrip; let longStringClient = this.longString(stringGrip); longStringClient.substring(initial.length, length, aResponse => { if (aResponse.error) { DevToolsUtils.reportException("getString", aResponse.error + ": " + aResponse.message); deferred.reject(aResponse); return; } deferred.resolve(initial + aResponse.substring); }); return deferred.promise; } }; /***/ }, /* 57 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ const { Services } = __webpack_require__(28); const EventEmitter = __webpack_require__(34); /** * Shortcuts for lazily accessing and setting various preferences. * Usage: * let prefs = new Prefs("root.path.to.branch", { * myIntPref: ["Int", "leaf.path.to.my-int-pref"], * myCharPref: ["Char", "leaf.path.to.my-char-pref"], * myJsonPref: ["Json", "leaf.path.to.my-json-pref"], * myFloatPref: ["Float", "leaf.path.to.my-float-pref"] * ... * }); * * Get/set: * prefs.myCharPref = "foo"; * let aux = prefs.myCharPref; * * Observe: * prefs.registerObserver(); * prefs.on("pref-changed", (prefName, prefValue) => { * ... * }); * * @param string prefsRoot * The root path to the required preferences branch. * @param object prefsBlueprint * An object containing { accessorName: [prefType, prefName] } keys. */ function PrefsHelper(prefsRoot = "", prefsBlueprint = {}) { EventEmitter.decorate(this); let cache = new Map(); for (let accessorName in prefsBlueprint) { let [prefType, prefName] = prefsBlueprint[accessorName]; map(this, cache, accessorName, prefType, prefsRoot, prefName); } let observer = makeObserver(this, cache, prefsRoot, prefsBlueprint); this.registerObserver = () => observer.register(); this.unregisterObserver = () => observer.unregister(); } /** * Helper method for getting a pref value. * * @param Map cache * @param string prefType * @param string prefsRoot * @param string prefName * @return any */ function get(cache, prefType, prefsRoot, prefName) { let cachedPref = cache.get(prefName); if (cachedPref !== undefined) { return cachedPref; } let value = Services.prefs["get" + prefType + "Pref"]( [prefsRoot, prefName].join(".") ); cache.set(prefName, value); return value; } /** * Helper method for setting a pref value. * * @param Map cache * @param string prefType * @param string prefsRoot * @param string prefName * @param any value */ function set(cache, prefType, prefsRoot, prefName, value) { Services.prefs["set" + prefType + "Pref"]( [prefsRoot, prefName].join("."), value ); cache.set(prefName, value); } /** * Maps a property name to a pref, defining lazy getters and setters. * Supported types are "Bool", "Char", "Int", "Float" (sugar around "Char" * type and casting), and "Json" (which is basically just sugar for "Char" * using the standard JSON serializer). * * @param PrefsHelper self * @param Map cache * @param string accessorName * @param string prefType * @param string prefsRoot * @param string prefName * @param array serializer [optional] */ function map(self, cache, accessorName, prefType, prefsRoot, prefName, serializer = { in: e => e, out: e => e }) { if (prefName in self) { throw new Error(`Can't use ${prefName} because it overrides a property` + "on the instance."); } if (prefType == "Json") { map(self, cache, accessorName, "Char", prefsRoot, prefName, { in: JSON.parse, out: JSON.stringify }); return; } if (prefType == "Float") { map(self, cache, accessorName, "Char", prefsRoot, prefName, { in: Number.parseFloat, out: (n) => n + "" }); return; } Object.defineProperty(self, accessorName, { get: () => serializer.in(get(cache, prefType, prefsRoot, prefName)), set: (e) => set(cache, prefType, prefsRoot, prefName, serializer.out(e)) }); } /** * Finds the accessor for the provided pref, based on the blueprint object * used in the constructor. * * @param PrefsHelper self * @param object prefsBlueprint * @return string */ function accessorNameForPref(somePrefName, prefsBlueprint) { for (let accessorName in prefsBlueprint) { let [, prefName] = prefsBlueprint[accessorName]; if (somePrefName == prefName) { return accessorName; } } return ""; } /** * Creates a pref observer for `self`. * * @param PrefsHelper self * @param Map cache * @param string prefsRoot * @param object prefsBlueprint * @return object */ function makeObserver(self, cache, prefsRoot, prefsBlueprint) { return { register: function() { this._branch = Services.prefs.getBranch(prefsRoot + "."); this._branch.addObserver("", this, false); }, unregister: function() { this._branch.removeObserver("", this); }, observe: function(subject, topic, prefName) { // If this particular pref isn't handled by the blueprint object, // even though it's in the specified branch, ignore it. let accessorName = accessorNameForPref(prefName, prefsBlueprint); if (!(accessorName in self)) { return; } cache.delete(prefName); self.emit("pref-changed", accessorName, self[accessorName]); } }; } exports.PrefsHelper = PrefsHelper; /***/ }, /* 58 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ const promise = __webpack_require__(40); const EventEmitter = __webpack_require__(34); /* const { DebuggerServer } = require("../../server/main");*/ const { DebuggerClient } = __webpack_require__(53); const targets = new WeakMap(); const promiseTargets = new WeakMap(); /** * Functions for creating Targets */ exports.TargetFactory = { /** * Construct a Target * @param {XULTab} tab * The tab to use in creating a new target. * * @return A target object */ forTab: function(tab) { let target = targets.get(tab); if (target == null) { target = new TabTarget(tab); targets.set(tab, target); } return target; }, /** * Return a promise of a Target for a remote tab. * @param {Object} options * The options object has the following properties: * { * form: the remote protocol form of a tab, * client: a DebuggerClient instance * (caller owns this and is responsible for closing), * chrome: true if the remote target is the whole process * } * * @return A promise of a target object */ forRemoteTab: function(options) { let targetPromise = promiseTargets.get(options); if (targetPromise == null) { let target = new TabTarget(options); targetPromise = target.makeRemote().then(() => target); promiseTargets.set(options, targetPromise); } return targetPromise; }, forWorker: function(workerClient) { let target = targets.get(workerClient); if (target == null) { target = new WorkerTarget(workerClient); targets.set(workerClient, target); } return target; }, /** * Creating a target for a tab that is being closed is a problem because it * allows a leak as a result of coming after the close event which normally * clears things up. This function allows us to ask if there is a known * target for a tab without creating a target * @return true/false */ isKnownTab: function(tab) { return targets.has(tab); }, }; /** * A Target represents something that we can debug. Targets are generally * read-only. Any changes that you wish to make to a target should be done via * a Tool that attaches to the target. i.e. a Target is just a pointer saying * "the thing to debug is over there". * * Providing a generalized abstraction of a web-page or web-browser (available * either locally or remotely) is beyond the scope of this class (and maybe * also beyond the scope of this universe) However Target does attempt to * abstract some common events and read-only properties common to many Tools. * * Supported read-only properties: * - name, isRemote, url * * Target extends EventEmitter and provides support for the following events: * - close: The target window has been closed. All tools attached to this * target should close. This event is not currently cancelable. * - navigate: The target window has navigated to a different URL * * Optional events: * - will-navigate: The target window will navigate to a different URL * - hidden: The target is not visible anymore (for TargetTab, another tab is * selected) * - visible: The target is visible (for TargetTab, tab is selected) * * Comparing Targets: 2 instances of a Target object can point at the same * thing, so t1 !== t2 and t1 != t2 even when they represent the same object. * To compare to targets use 't1.equals(t2)'. */ /** * A TabTarget represents a page living in a browser tab. Generally these will * be web pages served over http(s), but they don't have to be. */ function TabTarget(tab) { EventEmitter.decorate(this); this.destroy = this.destroy.bind(this); this._handleThreadState = this._handleThreadState.bind(this); this.on("thread-resumed", this._handleThreadState); this.on("thread-paused", this._handleThreadState); this.activeTab = this.activeConsole = null; // Only real tabs need initialization here. Placeholder objects for remote // targets will be initialized after a makeRemote method call. if (tab && !["client", "form", "chrome"].every(tab.hasOwnProperty, tab)) { this._tab = tab; this._setupListeners(); } else { this._form = tab.form; this._client = tab.client; this._chrome = tab.chrome; } // Default isTabActor to true if not explicitly specified if (typeof tab.isTabActor == "boolean") { this._isTabActor = tab.isTabActor; } else { this._isTabActor = true; } } TabTarget.prototype = { _webProgressListener: null, /** * Returns a promise for the protocol description from the root actor. Used * internally with `target.actorHasMethod`. Takes advantage of caching if * definition was fetched previously with the corresponding actor information. * Actors are lazily loaded, so not only must the tool using a specific actor * be in use, the actors are only registered after invoking a method (for * performance reasons, added in bug 988237), so to use these actor detection * methods, one must already be communicating with a specific actor of that * type. * * Must be a remote target. * * @return {Promise} * { * "category": "actor", * "typeName": "longstractor", * "methods": [{ * "name": "substring", * "request": { * "type": "substring", * "start": { * "_arg": 0, * "type": "primitive" * }, * "end": { * "_arg": 1, * "type": "primitive" * } * }, * "response": { * "substring": { * "_retval": "primitive" * } * } * }], * "events": {} * } */ getActorDescription: function(actorName) { if (!this.client) { throw new Error("TabTarget#getActorDescription() can only be called on " + "remote tabs."); } let deferred = promise.defer(); if (this._protocolDescription && this._protocolDescription.types[actorName]) { deferred.resolve(this._protocolDescription.types[actorName]); } else { this.client.mainRoot.protocolDescription(description => { this._protocolDescription = description; deferred.resolve(description.types[actorName]); }); } return deferred.promise; }, /** * Returns a boolean indicating whether or not the specific actor * type exists. Must be a remote target. * * @param {String} actorName * @return {Boolean} */ hasActor: function(actorName) { if (!this.client) { throw new Error("TabTarget#hasActor() can only be called on remote " + "tabs."); } if (this.form) { return !!this.form[actorName + "Actor"]; } return false; }, /** * Queries the protocol description to see if an actor has * an available method. The actor must already be lazily-loaded (read * the restrictions in the `getActorDescription` comments), * so this is for use inside of tool. Returns a promise that * resolves to a boolean. Must be a remote target. * * @param {String} actorName * @param {String} methodName * @return {Promise} */ actorHasMethod: function(actorName, methodName) { if (!this.client) { throw new Error("TabTarget#actorHasMethod() can only be called on " + "remote tabs."); } return this.getActorDescription(actorName).then(desc => { if (desc && desc.methods) { return !!desc.methods.find(method => method.name === methodName); } return false; }); }, /** * Returns a trait from the root actor. * * @param {String} traitName * @return {Mixed} */ getTrait: function(traitName) { if (!this.client) { throw new Error("TabTarget#getTrait() can only be called on remote " + "tabs."); } // If the targeted actor exposes traits and has a defined value for this // traits, override the root actor traits if (this.form.traits && traitName in this.form.traits) { return this.form.traits[traitName]; } return this.client.traits[traitName]; }, get tab() { return this._tab; }, get form() { return this._form; }, // Get a promise of the root form returned by a listTabs request. This promise // is cached. get root() { if (!this._root) { this._root = this._getRoot(); } return this._root; }, _getRoot: function() { return new Promise((resolve, reject) => { this.client.listTabs(response => { if (response.error) { reject(new Error(response.error + ": " + response.message)); return; } resolve(response); }); }); }, get client() { return this._client; }, // Tells us if we are debugging content document // or if we are debugging chrome stuff. // Allows to controls which features are available against // a chrome or a content document. get chrome() { return this._chrome; }, // Tells us if the related actor implements TabActor interface // and requires to call `attach` request before being used // and `detach` during cleanup get isTabActor() { return this._isTabActor; }, get window() { // XXX - this is a footgun for e10s - there .contentWindow will be null, // and even though .contentWindowAsCPOW *might* work, it will not work // in all contexts. Consumers of .window need to be refactored to not // rely on this. // if (Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT) { // console.error("The .window getter on devtools' |target| object isn't " + // "e10s friendly!\n" + Error().stack); // } // Be extra careful here, since this may be called by HS_getHudByWindow // during shutdown. if (this._tab && this._tab.linkedBrowser) { return this._tab.linkedBrowser.contentWindow; } return null; }, get name() { if (this._tab && this._tab.linkedBrowser.contentDocument) { return this._tab.linkedBrowser.contentDocument.title; } if (this.isAddon) { return this._form.name; } return this._form.title; }, get url() { return this._tab ? this._tab.linkedBrowser.currentURI.spec : this._form.url; }, get isRemote() { return !this.isLocalTab; }, get isAddon() { return !!(this._form && this._form.actor && this._form.actor.match(/conn\d+\.addon\d+/)); }, get isLocalTab() { return !!this._tab; }, get isMultiProcess() { return !this.window; }, get isThreadPaused() { return !!this._isThreadPaused; }, /** * Adds remote protocol capabilities to the target, so that it can be used * for tools that support the Remote Debugging Protocol even for local * connections. */ makeRemote: function() { if (this._remote) { return this._remote.promise; } this._remote = promise.defer(); if (this.isLocalTab) { // Since a remote protocol connection will be made, let's start the // DebuggerServer here, once and for all tools. if (!DebuggerServer.initialized) { DebuggerServer.init(); DebuggerServer.addBrowserActors(); } this._client = new DebuggerClient(DebuggerServer.connectPipe()); // A local TabTarget will never perform chrome debugging. this._chrome = false; } this._setupRemoteListeners(); let attachTab = () => { this._client.attachTab(this._form.actor, (response, tabClient) => { if (!tabClient) { this._remote.reject("Unable to attach to the tab"); return; } this.activeTab = tabClient; this.threadActor = response.threadActor; attachConsole(); }); }; let onConsoleAttached = (response, consoleClient) => { if (!consoleClient) { this._remote.reject("Unable to attach to the console"); return; } this.activeConsole = consoleClient; this._remote.resolve(null); }; let attachConsole = () => { this._client.attachConsole(this._form.consoleActor, [ "NetworkActivity" ], onConsoleAttached); }; if (this.isLocalTab) { this._client.connect(() => { this._client.getTab({ tab: this.tab }).then(response => { this._form = response.tab; attachTab(); }); }); } else if (this.isTabActor) { // In the remote debugging case, the protocol connection will have been // already initialized in the connection screen code. attachTab(); } else { // AddonActor and chrome debugging on RootActor doesn't inherits from // TabActor and doesn't need to be attached. attachConsole(); } return this._remote.promise; }, /** * Listen to the different events. */ _setupListeners: function() { this._webProgressListener = new TabWebProgressListener(this); this.tab.linkedBrowser.addProgressListener(this._webProgressListener); this.tab.addEventListener("TabClose", this); this.tab.parentNode.addEventListener("TabSelect", this); this.tab.ownerDocument.defaultView.addEventListener("unload", this); }, /** * Teardown event listeners. */ _teardownListeners: function() { if (this._webProgressListener) { this._webProgressListener.destroy(); } this._tab.ownerDocument.defaultView.removeEventListener("unload", this); this._tab.removeEventListener("TabClose", this); this._tab.parentNode.removeEventListener("TabSelect", this); }, /** * Setup listeners for remote debugging, updating existing ones as necessary. */ _setupRemoteListeners: function() { this.client.addListener("closed", this.destroy); this._onTabDetached = (aType, aPacket) => { // We have to filter message to ensure that this detach is for this tab if (aPacket.from == this._form.actor) { this.destroy(); } }; this.client.addListener("tabDetached", this._onTabDetached); this._onTabNavigated = (aType, aPacket) => { let event = Object.create(null); event.url = aPacket.url; event.title = aPacket.title; event.nativeConsoleAPI = aPacket.nativeConsoleAPI; event.isFrameSwitching = aPacket.isFrameSwitching; // Send any stored event payload (DOMWindow or nsIRequest) for backwards // compatibility with non-remotable tools. if (aPacket.state == "start") { event._navPayload = this._navRequest; this.emit("will-navigate", event); this._navRequest = null; } else { event._navPayload = this._navWindow; this.emit("navigate", event); this._navWindow = null; } }; this.client.addListener("tabNavigated", this._onTabNavigated); this._onFrameUpdate = (aType, aPacket) => { this.emit("frame-update", aPacket); }; this.client.addListener("frameUpdate", this._onFrameUpdate); }, /** * Teardown listeners for remote debugging. */ _teardownRemoteListeners: function() { this.client.removeListener("closed", this.destroy); this.client.removeListener("tabNavigated", this._onTabNavigated); this.client.removeListener("tabDetached", this._onTabDetached); this.client.removeListener("frameUpdate", this._onFrameUpdate); }, /** * Handle tabs events. */ handleEvent: function(event) { switch (event.type) { case "TabClose": case "unload": this.destroy(); break; case "TabSelect": if (this.tab.selected) { this.emit("visible", event); } else { this.emit("hidden", event); } break; } }, /** * Handle script status. */ _handleThreadState: function(event) { switch (event) { case "thread-resumed": this._isThreadPaused = false; break; case "thread-paused": this._isThreadPaused = true; break; } }, /** * Target is not alive anymore. */ destroy: function() { // If several things call destroy then we give them all the same // destruction promise so we're sure to destroy only once if (this._destroyer) { return this._destroyer.promise; } this._destroyer = promise.defer(); // Before taking any action, notify listeners that destruction is imminent. this.emit("close"); // First of all, do cleanup tasks that pertain to both remoted and // non-remoted targets. this.off("thread-resumed", this._handleThreadState); this.off("thread-paused", this._handleThreadState); if (this._tab) { this._teardownListeners(); } let cleanupAndResolve = () => { this._cleanup(); this._destroyer.resolve(null); }; // If this target was not remoted, the promise will be resolved before the // function returns. if (this._tab && !this._client) { cleanupAndResolve(); } else if (this._client) { // If, on the other hand, this target was remoted, the promise will be // resolved after the remote connection is closed. this._teardownRemoteListeners(); if (this.isLocalTab) { // We started with a local tab and created the client ourselves, so we // should close it. this._client.close(cleanupAndResolve); } else if (this.activeTab) { // The client was handed to us, so we are not responsible for closing // it. We just need to detach from the tab, if already attached. // |detach| may fail if the connection is already dead, so proceed with // cleanup directly after this. this.activeTab.detach(); cleanupAndResolve(); } else { cleanupAndResolve(); } } return this._destroyer.promise; }, /** * Clean up references to what this target points to. */ _cleanup: function() { if (this._tab) { targets.delete(this._tab); } else { promiseTargets.delete(this._form); } this.activeTab = null; this.activeConsole = null; this._client = null; this._tab = null; this._form = null; this._remote = null; }, toString: function() { let id = this._tab ? this._tab : (this._form && this._form.actor); return `TabTarget:${id}`; }, }; function WorkerTarget(workerClient) { EventEmitter.decorate(this); this._workerClient = workerClient; } /** * A WorkerTarget represents a worker. Unlike TabTarget, which can represent * either a local or remote tab, WorkerTarget always represents a remote worker. * Moreover, unlike TabTarget, which is constructed with a placeholder object * for remote tabs (from which a TabClient can then be lazily obtained), * WorkerTarget is constructed with a WorkerClient directly. * * WorkerClient is designed to mimic the interface of TabClient as closely as * possible. This allows us to debug workers as if they were ordinary tabs, * requiring only minimal changes to the rest of the frontend. */ WorkerTarget.prototype = { destroy: function() {}, get isRemote() { return true; }, get isTabActor() { return true; }, get url() { return this._workerClient.url; }, get isWorkerTarget() { return true; }, get form() { return { consoleActor: this._workerClient.consoleActor }; }, get activeTab() { return this._workerClient; }, get client() { return this._workerClient.client; }, destroy: function() {}, hasActor: function(name) { return false; }, getTrait: function() { return undefined; }, makeRemote: function() { return Promise.resolve(); } }; /***/ }, /* 59 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; const EventEmitter = __webpack_require__(34); function WebSocketDebuggerTransport(socket) { EventEmitter.decorate(this); this.active = false; this.hooks = null; this.socket = socket; } WebSocketDebuggerTransport.prototype = { ready() { if (this.active) { return; } this.socket.addEventListener("message", this); this.socket.addEventListener("close", this); this.active = true; }, send(object) { this.emit("send", object); if (this.socket) { this.socket.send(JSON.stringify(object)); } }, startBulkSend() { throw new Error("Bulk send is not supported by WebSocket transport"); }, close() { this.emit("close"); this.active = false; this.socket.removeEventListener("message", this); this.socket.removeEventListener("close", this); this.socket.close(); this.socket = null; if (this.hooks) { this.hooks.onClosed(); this.hooks = null; } }, handleEvent(event) { switch (event.type) { case "message": this.onMessage(event); break; case "close": this.close(); break; } }, onMessage({ data }) { if (typeof data !== "string") { throw new Error("Binary messages are not supported by WebSocket transport"); } let object = JSON.parse(data); this.emit("packet", object); if (this.hooks) { this.hooks.onPacket(object); } }, }; module.exports = WebSocketDebuggerTransport; /***/ }, /* 60 */ /***/ function(module, exports, __webpack_require__) { /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; const EventEmitter = __webpack_require__(34); /** * A partial implementation of the Menu API provided by electron: * https://github.com/electron/electron/blob/master/docs/api/menu.md. * * Extra features: * - Emits an 'open' and 'close' event when the menu is opened/closed * @param String id (non standard) * Needed so tests can confirm the XUL implementation is working */ function Menu({ id = null } = {}) { this.menuitems = []; this.id = id; Object.defineProperty(this, "items", { get() { return this.menuitems; } }); EventEmitter.decorate(this); } /** * Add an item to the end of the Menu * * @param {MenuItem} menuItem */ Menu.prototype.append = function (menuItem) { this.menuitems.push(menuItem); }; /** * Add an item to a specified position in the menu * * @param {int} pos * @param {MenuItem} menuItem */ Menu.prototype.insert = function (pos, menuItem) { throw Error("Not implemented"); }; /** * Show the Menu at a specified location on the screen * * Missing features: * - browserWindow - BrowserWindow (optional) - Default is null. * - positioningItem Number - (optional) OS X * * @param {int} screenX * @param {int} screenY * @param Toolbox toolbox (non standard) * Needed so we in which window to inject XUL */ Menu.prototype.popup = function (screenX, screenY, toolbox) { let doc = toolbox.doc; let popupset = doc.querySelector("popupset"); // See bug 1285229, on Windows, opening the same popup multiple times in a // row ends up duplicating the popup. The newly inserted popup doesn't // dismiss the old one. So remove any previously displayed popup before // opening a new one. let popup = popupset.querySelector("menupopup[menu-api=\"true\"]"); if (popup) { popup.hidePopup(); } popup = this.createPopup(doc) popup.setAttribute("menu-api", "true"); if (this.id) { popup.id = this.id; } this._createMenuItems(popup); // Remove the menu from the DOM once it's hidden. popup.addEventListener("popuphidden", (e) => { if (e.target === popup) { popup.remove(); this.emit("close", popup); } }); popup.addEventListener("popupshown", (e) => { if (e.target === popup) { this.emit("open", popup); } }); popupset.appendChild(popup); popup.openPopupAtScreen(screenX, screenY, true); }; Menu.prototype.createPopup = function(doc) { return doc.createElement("menupopup"); } Menu.prototype._createMenuItems = function (parent) { let doc = parent.ownerDocument; this.menuitems.forEach(item => { if (!item.visible) { return; } if (item.submenu) { let menupopup = doc.createElement("menupopup"); item.submenu._createMenuItems(menupopup); let menu = doc.createElement("menu"); menu.appendChild(menupopup); menu.setAttribute("label", item.label); if (item.disabled) { menu.setAttribute("disabled", "true"); } if (item.accesskey) { menu.setAttribute("accesskey", item.accesskey); } if (item.id) { menu.id = item.id; } parent.appendChild(menu); } else if (item.type === "separator") { let menusep = doc.createElement("menuseparator"); parent.appendChild(menusep); } else { let menuitem = doc.createElement("menuitem"); menuitem.setAttribute("label", item.label); menuitem.textContent = item.label; menuitem.addEventListener("command", () => item.click()); if (item.type === "checkbox") { menuitem.setAttribute("type", "checkbox"); } if (item.type === "radio") { menuitem.setAttribute("type", "radio"); } if (item.disabled) { menuitem.setAttribute("disabled", "true"); } if (item.checked) { menuitem.setAttribute("checked", "true"); } if (item.accesskey) { menuitem.setAttribute("accesskey", item.accesskey); } if (item.id) { menuitem.id = item.id; } parent.appendChild(menuitem); } }); }; Menu.setApplicationMenu = () => { throw Error("Not implemented"); }; Menu.sendActionToFirstResponder = () => { throw Error("Not implemented"); }; Menu.buildFromTemplate = () => { throw Error("Not implemented"); }; module.exports = Menu; /***/ }, /* 61 */ /***/ function(module, exports) { /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set ft=javascript ts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; /** * A partial implementation of the MenuItem API provided by electron: * https://github.com/electron/electron/blob/master/docs/api/menu-item.md. * * Missing features: * - id String - Unique within a single menu. If defined then it can be used * as a reference to this item by the position attribute. * - role String - Define the action of the menu item; when specified the * click property will be ignored * - sublabel String * - accelerator Accelerator * - icon NativeImage * - position String - This field allows fine-grained definition of the * specific location within a given menu. * * Implemented features: * @param Object options * Function click * Will be called with click(menuItem, browserWindow) when the menu item * is clicked * String type * Can be normal, separator, submenu, checkbox or radio * String label * Boolean enabled * If false, the menu item will be greyed out and unclickable. * Boolean checked * Should only be specified for checkbox or radio type menu items. * Menu submenu * Should be specified for submenu type menu items. If submenu is specified, * the type: 'submenu' can be omitted. If the value is not a Menu then it * will be automatically converted to one using Menu.buildFromTemplate. * Boolean visible * If false, the menu item will be entirely hidden. */ function MenuItem({ accesskey = null, checked = false, click = () => {}, disabled = false, label = "", id = null, submenu = null, type = "normal", visible = true, } = { }) { this.accesskey = accesskey; this.checked = checked; this.click = click; this.disabled = disabled; this.id = id; this.label = label; this.submenu = submenu; this.type = type; this.visible = visible; } module.exports = MenuItem; /***/ }, /* 62 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ const { DOM: dom, createClass, createFactory, PropTypes } = __webpack_require__(2); // const { ViewHelpers } = // require("resource://devtools/client/shared/widgets/ViewHelpers.jsm"); // let { VirtualScroll } = require("react-virtualized"); // VirtualScroll = createFactory(VirtualScroll); const AUTO_EXPAND_DEPTH = 0; // depth /** * An arrow that displays whether its node is expanded (▼) or collapsed * (▶). When its node has no children, it is hidden. */ const ArrowExpander = createFactory(createClass({ displayName: "ArrowExpander", shouldComponentUpdate(nextProps, nextState) { return this.props.item !== nextProps.item || this.props.visible !== nextProps.visible || this.props.expanded !== nextProps.expanded; }, render() { const attrs = { className: "arrow theme-twisty", onClick: this.props.expanded ? () => this.props.onCollapse(this.props.item) : e => this.props.onExpand(this.props.item, e.altKey) }; if (this.props.expanded) { attrs.className += " open"; } if (!this.props.visible) { attrs.style = Object.assign({}, this.props.style || {}, { visibility: "hidden" }); } return dom.div(attrs, this.props.children); } })); const TreeNode = createFactory(createClass({ displayName: "TreeNode", componentDidMount() { if (this.props.focused) { this.refs.button.focus(); } }, componentDidUpdate() { if (this.props.focused) { this.refs.button.focus(); } }, shouldComponentUpdate(nextProps) { return this.props.item !== nextProps.item || this.props.focused !== nextProps.focused || this.props.expanded !== nextProps.expanded; }, render() { const arrow = ArrowExpander({ item: this.props.item, expanded: this.props.expanded, visible: this.props.hasChildren, onExpand: this.props.onExpand, onCollapse: this.props.onCollapse, }); let isOddRow = this.props.index % 2; return dom.div( { className: `tree-node div ${isOddRow ? "tree-node-odd" : ""}`, onFocus: this.props.onFocus, onClick: this.props.onFocus, onBlur: this.props.onBlur, style: { padding: 0, margin: 0 } }, this.props.renderItem(this.props.item, this.props.depth, this.props.focused, arrow, this.props.expanded), // XXX: OSX won't focus/blur regular elements even if you set tabindex // unless there is an input/button child. dom.button(this._buttonAttrs) ); }, _buttonAttrs: { ref: "button", style: { opacity: 0, width: "0 !important", height: "0 !important", padding: "0 !important", outline: "none", MozAppearance: "none", // XXX: Despite resetting all of the above properties (and margin), the // button still ends up with ~79px width, so we set a large negative // margin to completely hide it. MozMarginStart: "-1000px !important", } } })); /** * Create a function that calls the given function `fn` only once per animation * frame. * * @param {Function} fn * @returns {Function} */ function oncePerAnimationFrame(fn) { let animationId = null; let argsToPass = null; return function(...args) { argsToPass = args; if (animationId !== null) { return; } animationId = requestAnimationFrame(() => { fn.call(this, ...argsToPass); animationId = null; argsToPass = null; }); }; } const NUMBER_OF_OFFSCREEN_ITEMS = 1; /** * A generic tree component. See propTypes for the public API. * * @see `devtools/client/memory/components/test/mochitest/head.js` for usage * @see `devtools/client/memory/components/heap.js` for usage */ const Tree = module.exports = createClass({ displayName: "Tree", propTypes: { // Required props // A function to get an item's parent, or null if it is a root. getParent: PropTypes.func.isRequired, // A function to get an item's children. getChildren: PropTypes.func.isRequired, // A function which takes an item and ArrowExpander and returns a // component. renderItem: PropTypes.func.isRequired, // A function which returns the roots of the tree (forest). getRoots: PropTypes.func.isRequired, // A function to get a unique key for the given item. getKey: PropTypes.func.isRequired, // A function to get whether an item is expanded or not. If an item is not // expanded, then it must be collapsed. isExpanded: PropTypes.func.isRequired, // The height of an item in the tree including margin and padding, in // pixels. itemHeight: PropTypes.number.isRequired, // Optional props // The currently focused item, if any such item exists. focused: PropTypes.any, // Handle when a new item is focused. onFocus: PropTypes.func, // The depth to which we should automatically expand new items. autoExpandDepth: PropTypes.number, // Should auto expand all new items or just the new items under the first // root item. autoExpandAll: PropTypes.bool, // Optional event handlers for when items are expanded or collapsed. onExpand: PropTypes.func, onCollapse: PropTypes.func, }, getDefaultProps() { return { autoExpandDepth: AUTO_EXPAND_DEPTH, autoExpandAll: true }; }, getInitialState() { return { scroll: 0, height: window.innerHeight, seen: new Set(), }; }, componentDidMount() { window.addEventListener("resize", this._updateHeight); this._autoExpand(this.props); this._updateHeight(); }, componentWillUnmount() { window.removeEventListener("resize", this._updateHeight); }, componentWillReceiveProps(nextProps) { this._autoExpand(nextProps); this._updateHeight(); }, _autoExpand(props) { if (!props.autoExpandDepth) { return; } // Automatically expand the first autoExpandDepth levels for new items. Do // not use the usual DFS infrastructure because we don't want to ignore // collapsed nodes. const autoExpand = (item, currentDepth) => { if (currentDepth >= props.autoExpandDepth || this.state.seen.has(item)) { return; } props.onExpand(item); this.state.seen.add(item); const children = props.getChildren(item); const length = children.length; for (let i = 0; i < length; i++) { autoExpand(children[i], currentDepth + 1); } }; const roots = props.getRoots(); const length = roots.length; if (props.autoExpandAll) { for (let i = 0; i < length; i++) { autoExpand(roots[i], 0); } } else if (length != 0) { autoExpand(roots[0], 0); } }, render() { const traversal = this._dfsFromRoots(); // Remove `NUMBER_OF_OFFSCREEN_ITEMS` from `begin` and add `2 * // NUMBER_OF_OFFSCREEN_ITEMS` to `end` so that the top and bottom of the // page are filled with the `NUMBER_OF_OFFSCREEN_ITEMS` previous and next // items respectively, rather than whitespace if the item is not in full // view. // const begin = Math.max(((this.state.scroll / this.props.itemHeight) | 0) - NUMBER_OF_OFFSCREEN_ITEMS, 0); // const end = begin + (2 * NUMBER_OF_OFFSCREEN_ITEMS) + ((this.state.height / this.props.itemHeight) | 0); // const toRender = traversal; // const nodes = [ // dom.div({ // key: "top-spacer", // style: { // padding: 0, // margin: 0, // height: begin * this.props.itemHeight + "px" // } // }) // ]; const renderItem = i => { let { item, depth } = traversal[i]; return TreeNode({ key: this.props.getKey(item, i), index: i, item: item, depth: depth, renderItem: this.props.renderItem, focused: this.props.focused === item, expanded: this.props.isExpanded(item), hasChildren: !!this.props.getChildren(item).length, onExpand: this._onExpand, onCollapse: this._onCollapse, onFocus: () => this._focus(i, item), }); }; // nodes.push(dom.div({ // key: "bottom-spacer", // style: { // padding: 0, // margin: 0, // height: (traversal.length - 1 - end) * this.props.itemHeight + "px" // } // })); const style = Object.assign({}, this.props.style || {}, { padding: 0, margin: 0 }); return dom.div( { className: "tree", ref: "tree", onKeyDown: this._onKeyDown, onKeyPress: this._preventArrowKeyScrolling, onKeyUp: this._preventArrowKeyScrolling, onScroll: this._onScroll, style }, // VirtualScroll({ // width: this.props.width, // height: this.props.height, // rowsCount: traversal.length, // rowHeight: this.props.itemHeight, // rowRenderer: renderItem // }) traversal.map((v, i) => renderItem(i)) ); }, _preventArrowKeyScrolling(e) { switch (e.key) { case "ArrowUp": case "ArrowDown": case "ArrowLeft": case "ArrowRight": e.preventDefault(); e.stopPropagation(); if (e.nativeEvent) { if (e.nativeEvent.preventDefault) { e.nativeEvent.preventDefault(); } if (e.nativeEvent.stopPropagation) { e.nativeEvent.stopPropagation(); } } } }, /** * Updates the state's height based on clientHeight. */ _updateHeight() { this.setState({ height: this.refs.tree.clientHeight }); }, /** * Perform a pre-order depth-first search from item. */ _dfs(item, maxDepth = Infinity, traversal = [], _depth = 0) { traversal.push({ item, depth: _depth }); if (!this.props.isExpanded(item)) { return traversal; } const nextDepth = _depth + 1; if (nextDepth > maxDepth) { return traversal; } const children = this.props.getChildren(item); const length = children.length; for (let i = 0; i < length; i++) { this._dfs(children[i], maxDepth, traversal, nextDepth); } return traversal; }, /** * Perform a pre-order depth-first search over the whole forest. */ _dfsFromRoots(maxDepth = Infinity) { const traversal = []; const roots = this.props.getRoots(); const length = roots.length; for (let i = 0; i < length; i++) { this._dfs(roots[i], maxDepth, traversal); } return traversal; }, /** * Expands current row. * * @param {Object} item * @param {Boolean} expandAllChildren */ _onExpand: oncePerAnimationFrame(function(item, expandAllChildren) { if (this.props.onExpand) { this.props.onExpand(item); if (expandAllChildren) { const children = this._dfs(item); const length = children.length; for (let i = 0; i < length; i++) { this.props.onExpand(children[i].item); } } } }), /** * Collapses current row. * * @param {Object} item */ _onCollapse: oncePerAnimationFrame(function(item) { if (this.props.onCollapse) { this.props.onCollapse(item); } }), /** * Sets the passed in item to be the focused item. * * @param {Number} index * The index of the item in a full DFS traversal (ignoring collapsed * nodes). Ignored if `item` is undefined. * * @param {Object|undefined} item * The item to be focused, or undefined to focus no item. */ _focus(index, item) { if (item !== undefined) { const itemStartPosition = index * this.props.itemHeight; const itemEndPosition = (index + 1) * this.props.itemHeight; // Note that if the height of the viewport (this.state.height) is less than // `this.props.itemHeight`, we could accidentally try and scroll both up and // down in a futile attempt to make both the item's start and end positions // visible. Instead, give priority to the start of the item by checking its // position first, and then using an "else if", rather than a separate "if", // for the end position. if (this.state.scroll > itemStartPosition) { this.refs.tree.scrollTop = itemStartPosition; } else if ((this.state.scroll + this.state.height) < itemEndPosition) { this.refs.tree.scrollTop = itemEndPosition - this.state.height; } } if (this.props.onFocus) { this.props.onFocus(item); } }, /** * Sets the state to have no focused item. */ _onBlur() { this._focus(0, undefined); }, /** * Fired on a scroll within the tree's container, updates * the stored position of the view port to handle virtual view rendering. * * @param {Event} e */ _onScroll: oncePerAnimationFrame(function(e) { this.setState({ scroll: Math.max(this.refs.tree.scrollTop, 0), height: this.refs.tree.clientHeight }); }), /** * Handles key down events in the tree's container. * * @param {Event} e */ _onKeyDown(e) { if (this.props.focused == null) { return; } // Allow parent nodes to use navigation arrows with modifiers. if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) { return; } this._preventArrowKeyScrolling(e); switch (e.key) { case "ArrowUp": this._focusPrevNode(); return; case "ArrowDown": this._focusNextNode(); return; case "ArrowLeft": if (this.props.isExpanded(this.props.focused) && this.props.getChildren(this.props.focused).length) { this._onCollapse(this.props.focused); } else { this._focusParentNode(); } return; case "ArrowRight": if (!this.props.isExpanded(this.props.focused)) { this._onExpand(this.props.focused); } else { this._focusNextNode(); } return; } }, /** * Sets the previous node relative to the currently focused item, to focused. */ _focusPrevNode: oncePerAnimationFrame(function() { // Start a depth first search and keep going until we reach the currently // focused node. Focus the previous node in the DFS, if it exists. If it // doesn't exist, we're at the first node already. let prev; let prevIndex; const traversal = this._dfsFromRoots(); const length = traversal.length; for (let i = 0; i < length; i++) { const item = traversal[i].item; if (item === this.props.focused) { break; } prev = item; prevIndex = i; } if (prev === undefined) { return; } this._focus(prevIndex, prev); }), /** * Handles the down arrow key which will focus either the next child * or sibling row. */ _focusNextNode: oncePerAnimationFrame(function() { // Start a depth first search and keep going until we reach the currently // focused node. Focus the next node in the DFS, if it exists. If it // doesn't exist, we're at the last node already. const traversal = this._dfsFromRoots(); const length = traversal.length; let i = 0; while (i < length) { if (traversal[i].item === this.props.focused) { break; } i++; } if (i + 1 < traversal.length) { this._focus(i + 1, traversal[i + 1].item); } }), /** * Handles the left arrow key, going back up to the current rows' * parent row. */ _focusParentNode: oncePerAnimationFrame(function() { const parent = this.props.getParent(this.props.focused); if (!parent) { return; } const traversal = this._dfsFromRoots(); const length = traversal.length; let parentIndex = 0; for (; parentIndex < length; parentIndex++) { if (traversal[parentIndex].item === parent) { break; } } this._focus(parentIndex, parent); }), }); /***/ }, /* 63 */ /***/ function(module, exports) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; // const { LocalizationHelper } = require("devtools/shared/l10n"); // // const l10n = new LocalizationHelper("devtools/client/locales/components.properties"); // const UNKNOWN_SOURCE_STRING = l10n.getStr("frame.unknownSource"); const l10n = { getStr: () => {} } // Character codes used in various parsing helper functions. const CHAR_CODE_A = "a".charCodeAt(0); const CHAR_CODE_C = "c".charCodeAt(0); const CHAR_CODE_D = "d".charCodeAt(0); const CHAR_CODE_E = "e".charCodeAt(0); const CHAR_CODE_F = "f".charCodeAt(0); const CHAR_CODE_H = "h".charCodeAt(0); const CHAR_CODE_I = "i".charCodeAt(0); const CHAR_CODE_J = "j".charCodeAt(0); const CHAR_CODE_L = "l".charCodeAt(0); const CHAR_CODE_M = "m".charCodeAt(0); const CHAR_CODE_O = "o".charCodeAt(0); const CHAR_CODE_P = "p".charCodeAt(0); const CHAR_CODE_R = "r".charCodeAt(0); const CHAR_CODE_S = "s".charCodeAt(0); const CHAR_CODE_T = "t".charCodeAt(0); const CHAR_CODE_U = "u".charCodeAt(0); const CHAR_CODE_COLON = ":".charCodeAt(0); const CHAR_CODE_SLASH = "/".charCodeAt(0); const CHAR_CODE_CAP_S = "S".charCodeAt(0); // The cache used in the `parseURL` function. const gURLStore = new Map(); // The cache used in the `getSourceNames` function. const gSourceNamesStore = new Map(); /** * Takes a string and returns an object containing all the properties * available on an URL instance, with additional properties (fileName), * Leverages caching. * * @param {String} location * @return {Object?} An object containing most properties available * in https://developer.mozilla.org/en-US/docs/Web/API/URL */ function parseURL(location) { let url = gURLStore.get(location); if (url !== void 0) { return url; } try { url = new URL(location); // The callers were generally written to expect a URL from // sdk/url, which is subtly different. So, work around some // important differences here. url = { href: url.href, protocol: url.protocol, host: url.host, hostname: url.hostname, port: url.port || null, pathname: url.pathname, search: url.search, hash: url.hash, username: url.username, password: url.password, origin: url.origin, }; // Definitions: // Example: https://foo.com:8888/file.js // `hostname`: "foo.com" // `host`: "foo.com:8888" let isChrome = isChromeScheme(location); url.fileName = url.pathname ? (url.pathname.slice(url.pathname.lastIndexOf("/") + 1) || "/") : "/"; if (isChrome) { url.hostname = null; url.host = null; } gURLStore.set(location, url); return url; } catch (e) { gURLStore.set(location, null); return null; } } /** * Parse a source into a short and long name as well as a host name. * * @param {String} source * The source to parse. Can be a URI or names like "(eval)" or * "self-hosted". * @return {Object} * An object with the following properties: * - {String} short: A short name for the source. * - "http://page.com/test.js#go?q=query" -> "test.js" * - {String} long: The full, long name for the source, with hash/query stripped. * - "http://page.com/test.js#go?q=query" -> "http://page.com/test.js" * - {String?} host: If available, the host name for the source. * - "http://page.com/test.js#go?q=query" -> "page.com" */ function getSourceNames(source) { let data = gSourceNamesStore.get(source); if (data) { return data; } let short, long, host; const sourceStr = source ? String(source) : ""; // If `data:...` uri if (isDataScheme(sourceStr)) { let commaIndex = sourceStr.indexOf(","); if (commaIndex > -1) { // The `short` name for a data URI becomes `data:` followed by the actual // encoded content, omitting the MIME type, and charset. short = `data:${sourceStr.substring(commaIndex + 1)}`.slice(0, 100); let result = { short, long: sourceStr }; gSourceNamesStore.set(source, result); return result; } } // If Scratchpad URI, like "Scratchpad/1"; no modifications, // and short/long are the same. if (isScratchpadScheme(sourceStr)) { let result = { short: sourceStr, long: sourceStr }; gSourceNamesStore.set(source, result); return result; } const parsedUrl = parseURL(sourceStr); if (!parsedUrl) { // Malformed URI. long = sourceStr; short = sourceStr.slice(0, 100); } else { host = parsedUrl.host; long = parsedUrl.href; if (parsedUrl.hash) { long = long.replace(parsedUrl.hash, ""); } if (parsedUrl.search) { long = long.replace(parsedUrl.search, ""); } short = parsedUrl.fileName; // If `short` is just a slash, and we actually have a path, // strip the slash and parse again to get a more useful short name. // e.g. "http://foo.com/bar/" -> "bar", rather than "/" if (short === "/" && parsedUrl.pathname !== "/") { short = parseURL(long.replace(/\/$/, "")).fileName; } } if (!short) { if (!long) { long = UNKNOWN_SOURCE_STRING; } short = long.slice(0, 100); } let result = { short, long, host }; gSourceNamesStore.set(source, result); return result; } // For the functions below, we assume that we will never access the location // argument out of bounds, which is indeed the vast majority of cases. // // They are written this way because they are hot. Each frame is checked for // being content or chrome when processing the profile. function isColonSlashSlash(location, i = 0) { return location.charCodeAt(++i) === CHAR_CODE_COLON && location.charCodeAt(++i) === CHAR_CODE_SLASH && location.charCodeAt(++i) === CHAR_CODE_SLASH; } /** * Checks for a Scratchpad URI, like "Scratchpad/1" */ function isScratchpadScheme(location, i = 0) { return location.charCodeAt(i) === CHAR_CODE_CAP_S && location.charCodeAt(++i) === CHAR_CODE_C && location.charCodeAt(++i) === CHAR_CODE_R && location.charCodeAt(++i) === CHAR_CODE_A && location.charCodeAt(++i) === CHAR_CODE_T && location.charCodeAt(++i) === CHAR_CODE_C && location.charCodeAt(++i) === CHAR_CODE_H && location.charCodeAt(++i) === CHAR_CODE_P && location.charCodeAt(++i) === CHAR_CODE_A && location.charCodeAt(++i) === CHAR_CODE_D && location.charCodeAt(++i) === CHAR_CODE_SLASH; } function isDataScheme(location, i = 0) { return location.charCodeAt(i) === CHAR_CODE_D && location.charCodeAt(++i) === CHAR_CODE_A && location.charCodeAt(++i) === CHAR_CODE_T && location.charCodeAt(++i) === CHAR_CODE_A && location.charCodeAt(++i) === CHAR_CODE_COLON; } function isContentScheme(location, i = 0) { let firstChar = location.charCodeAt(i); switch (firstChar) { // "http://" or "https://" case CHAR_CODE_H: if (location.charCodeAt(++i) === CHAR_CODE_T && location.charCodeAt(++i) === CHAR_CODE_T && location.charCodeAt(++i) === CHAR_CODE_P) { if (location.charCodeAt(i + 1) === CHAR_CODE_S) { ++i; } return isColonSlashSlash(location, i); } return false; // "file://" case CHAR_CODE_F: if (location.charCodeAt(++i) === CHAR_CODE_I && location.charCodeAt(++i) === CHAR_CODE_L && location.charCodeAt(++i) === CHAR_CODE_E) { return isColonSlashSlash(location, i); } return false; // "app://" case CHAR_CODE_A: if (location.charCodeAt(++i) == CHAR_CODE_P && location.charCodeAt(++i) == CHAR_CODE_P) { return isColonSlashSlash(location, i); } return false; default: return false; } } function isChromeScheme(location, i = 0) { let firstChar = location.charCodeAt(i); switch (firstChar) { // "chrome://" case CHAR_CODE_C: if (location.charCodeAt(++i) === CHAR_CODE_H && location.charCodeAt(++i) === CHAR_CODE_R && location.charCodeAt(++i) === CHAR_CODE_O && location.charCodeAt(++i) === CHAR_CODE_M && location.charCodeAt(++i) === CHAR_CODE_E) { return isColonSlashSlash(location, i); } return false; // "resource://" case CHAR_CODE_R: if (location.charCodeAt(++i) === CHAR_CODE_E && location.charCodeAt(++i) === CHAR_CODE_S && location.charCodeAt(++i) === CHAR_CODE_O && location.charCodeAt(++i) === CHAR_CODE_U && location.charCodeAt(++i) === CHAR_CODE_R && location.charCodeAt(++i) === CHAR_CODE_C && location.charCodeAt(++i) === CHAR_CODE_E) { return isColonSlashSlash(location, i); } return false; // "jar:file://" case CHAR_CODE_J: if (location.charCodeAt(++i) === CHAR_CODE_A && location.charCodeAt(++i) === CHAR_CODE_R && location.charCodeAt(++i) === CHAR_CODE_COLON && location.charCodeAt(++i) === CHAR_CODE_F && location.charCodeAt(++i) === CHAR_CODE_I && location.charCodeAt(++i) === CHAR_CODE_L && location.charCodeAt(++i) === CHAR_CODE_E) { return isColonSlashSlash(location, i); } return false; default: return false; } } /** * A utility method to get the file name from a sourcemapped location * The sourcemap location can be in any form. This method returns a * formatted file name for different cases like Windows or OSX. * @param source * @returns String */ function getSourceMappedFile(source) { // If sourcemapped source is a OSX path, return // the characters after last "/". // If sourcemapped source is a Windowss path, return // the characters after last "\\". if (source.lastIndexOf("/") >= 0) { source = source.slice(source.lastIndexOf("/") + 1); } else if (source.lastIndexOf("\\") >= 0) { source = source.slice(source.lastIndexOf("\\") + 1); } return source; } exports.parseURL = parseURL; exports.getSourceNames = getSourceNames; exports.isScratchpadScheme = isScratchpadScheme; exports.isChromeScheme = isChromeScheme; exports.isContentScheme = isContentScheme; exports.isDataScheme = isDataScheme; exports.getSourceMappedFile = getSourceMappedFile; /***/ }, /* 64 */ /***/ function(module, exports, __webpack_require__) { /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; const { DOM: dom, createClass, PropTypes } = __webpack_require__(2); const { getSourceNames, parseURL, isScratchpadScheme, getSourceMappedFile } = __webpack_require__(63); // const { LocalizationHelper } = require("devtools/shared/l10n"); // // const l10n = new LocalizationHelper("devtools/client/locales/components.properties"); // const webl10n = new LocalizationHelper("devtools/client/locales/webconsole.properties"); const l10n = { getStr: () => {} }; const webl10n = { getStr: () => {} }; module.exports = createClass({ displayName: "Frame", propTypes: { // SavedFrame, or an object containing all the required properties. frame: PropTypes.shape({ functionDisplayName: PropTypes.string, source: PropTypes.string.isRequired, line: PropTypes.oneOfType([ PropTypes.string, PropTypes.number ]), column: PropTypes.oneOfType([ PropTypes.string, PropTypes.number ]), }).isRequired, // Clicking on the frame link -- probably should link to the debugger. onClick: PropTypes.func.isRequired, // Option to display a function name before the source link. showFunctionName: PropTypes.bool, // Option to display a function name even if it's anonymous. showAnonymousFunctionName: PropTypes.bool, // Option to display a host name after the source link. showHost: PropTypes.bool, // Option to display a host name if the filename is empty or just '/' showEmptyPathAsHost: PropTypes.bool, // Option to display a full source instead of just the filename. showFullSourceUrl: PropTypes.bool, // Service to enable the source map feature for console. sourceMapService: PropTypes.object, }, getDefaultProps() { return { showFunctionName: false, showAnonymousFunctionName: false, showHost: false, showEmptyPathAsHost: false, showFullSourceUrl: false, }; }, componentWillMount() { const sourceMapService = this.props.sourceMapService; if (sourceMapService) { const source = this.getSource(); sourceMapService.subscribe(source, this.onSourceUpdated); } }, componentWillUnmount() { const sourceMapService = this.props.sourceMapService; if (sourceMapService) { const source = this.getSource(); sourceMapService.unsubscribe(source, this.onSourceUpdated); } }, /** * Component method to update the FrameView when a resolved location is available * @param event * @param location */ onSourceUpdated(event, location, resolvedLocation) { const frame = this.getFrame(resolvedLocation); this.setState({ frame, isSourceMapped: true, }); }, /** * Utility method to convert the Frame object to the * Source Object model required by SourceMapService * @param frame * @returns {{url: *, line: *, column: *}} */ getSource(frame) { frame = frame || this.props.frame; const { source, line, column } = frame; return { url: source, line, column, }; }, /** * Utility method to convert the Source object model to the * Frame object model required by FrameView class. * @param source * @returns {{source: *, line: *, column: *, functionDisplayName: *}} */ getFrame(source) { const { url, line, column } = source; return { source: url, line, column, functionDisplayName: this.props.frame.functionDisplayName, }; }, render() { let frame, isSourceMapped; let { onClick, showFunctionName, showAnonymousFunctionName, showHost, showEmptyPathAsHost, showFullSourceUrl } = this.props; if (this.state && this.state.isSourceMapped) { frame = this.state.frame; isSourceMapped = this.state.isSourceMapped; } else { frame = this.props.frame; } let source = frame.source ? String(frame.source) : ""; let line = frame.line != void 0 ? Number(frame.line) : null; let column = frame.column != void 0 ? Number(frame.column) : null; const { short, long, host } = getSourceNames(source); // Reparse the URL to determine if we should link this; `getSourceNames` // has already cached this indirectly. We don't want to attempt to // link to "self-hosted" and "(unknown)". However, we do want to link // to Scratchpad URIs. // Source mapped sources might not necessary linkable, but they // are still valid in the debugger. const isLinkable = !!(isScratchpadScheme(source) || parseURL(source)) || isSourceMapped; const elements = []; const sourceElements = []; let sourceEl; let tooltip = long; // If the source is linkable and line > 0 const shouldDisplayLine = isLinkable && line; // Exclude all falsy values, including `0`, as even // a number 0 for line doesn't make sense, and should not be displayed. // If source isn't linkable, don't attempt to append line and column // info, as this probably doesn't make sense. if (shouldDisplayLine) { tooltip += `:${line}`; // Intentionally exclude 0 if (column) { tooltip += `:${column}`; } } let attributes = { "data-url": long, className: "frame-link", }; if (showFunctionName) { let functionDisplayName = frame.functionDisplayName; if (!functionDisplayName && showAnonymousFunctionName) { functionDisplayName = webl10n.getStr("stacktrace.anonymousFunction"); } if (functionDisplayName) { elements.push( dom.span({ className: "frame-link-function-display-name" }, functionDisplayName), " " ); } } let displaySource = showFullSourceUrl ? long : short; if (isSourceMapped) { displaySource = getSourceMappedFile(displaySource); } else if (showEmptyPathAsHost && (displaySource === "" || displaySource === "/")) { displaySource = host; } sourceElements.push(dom.span({ className: "frame-link-filename", }, displaySource)); // If source is linkable, and we have a line number > 0 if (shouldDisplayLine) { let lineInfo = `:${line}`; // Add `data-line` attribute for testing attributes["data-line"] = line; // Intentionally exclude 0 if (column) { lineInfo += `:${column}`; // Add `data-column` attribute for testing attributes["data-column"] = column; } sourceElements.push(dom.span({ className: "frame-link-line" }, lineInfo)); } // Inner el is useful for achieving ellipsis on the left and correct LTR/RTL // ordering. See CSS styles for frame-link-source-[inner] and bug 1290056. let sourceInnerEl = dom.span({ className: "frame-link-source-inner", title: isLinkable ? l10n.getFormatStr("frame.viewsourceindebugger", tooltip) : tooltip, }, sourceElements); // If source is not a URL (self-hosted, eval, etc.), don't make // it an anchor link, as we can't link to it. if (isLinkable) { sourceEl = dom.a({ onClick: e => { e.preventDefault(); onClick(this.getSource(frame)); }, href: source, className: "frame-link-source", draggable: false, }, sourceInnerEl); } else { sourceEl = dom.span({ className: "frame-link-source", }, sourceInnerEl); } elements.push(sourceEl); if (showHost && host) { elements.push(" ", dom.span({ className: "frame-link-host" }, host)); } return dom.span(attributes, ...elements); } }); /***/ }, /* 65 */ /***/ function(module, exports, __webpack_require__) { const feature = __webpack_require__(66); module.exports = feature; /***/ }, /* 66 */ /***/ function(module, exports, __webpack_require__) { const pick = __webpack_require__(67); const put = __webpack_require__(112); const fs = __webpack_require__(118); const path = __webpack_require__(119); let config; const flag = __webpack_require__(121); /** * Gets a config value for a given key * e.g "chrome.webSocketPort" */ function getValue(key) { return pick(config, key); } function setValue(key, value) { return put(config, key, value); } function isEnabled(key) { return config.features && typeof config.features[key] == "object" ? config.features[key].enabled : config.features[key]; } function isDevelopment() { if (isFirefoxPanel()) { // Default to production if compiling for the Firefox panel return ("production") === "development"; } return ("production") !== "production"; } function isTesting() { return flag.testing; } function isFirefoxPanel() { return ("firefox-panel") == "firefox-panel"; } function isApplication() { return ("firefox-panel") == "application"; } function isFirefox() { return /firefox/i.test(navigator.userAgent); } function setConfig(value) { config = value; } function getConfig() { return config; } function updateLocalConfig(relativePath) { const localConfigPath = path.resolve(relativePath, "../configs/local.json"); try { const output = JSON.stringify(config, null, 2); fs.writeFileSync(localConfigPath, output); return output; } catch (err) { return "{}"; } } module.exports = { isEnabled, getValue, setValue, isDevelopment, isTesting, isFirefoxPanel, isApplication, isFirefox, getConfig, setConfig, updateLocalConfig }; /***/ }, /* 67 */ /***/ function(module, exports, __webpack_require__) { var baseGet = __webpack_require__(68); /** * Gets the value at `path` of `object`. If the resolved value is * `undefined`, the `defaultValue` is returned in its place. * * @static * @memberOf _ * @since 3.7.0 * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path of the property to get. * @param {*} [defaultValue] The value returned for `undefined` resolved values. * @returns {*} Returns the resolved value. * @example * * var object = { 'a': [{ 'b': { 'c': 3 } }] }; * * _.get(object, 'a[0].b.c'); * // => 3 * * _.get(object, ['a', '0', 'b', 'c']); * // => 3 * * _.get(object, 'a.b.c', 'default'); * // => 'default' */ function get(object, path, defaultValue) { var result = object == null ? undefined : baseGet(object, path); return result === undefined ? defaultValue : result; } module.exports = get; /***/ }, /* 68 */ /***/ function(module, exports, __webpack_require__) { var castPath = __webpack_require__(69), toKey = __webpack_require__(111); /** * The base implementation of `_.get` without support for default values. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path of the property to get. * @returns {*} Returns the resolved value. */ function baseGet(object, path) { path = castPath(path, object); var index = 0, length = path.length; while (object != null && index < length) { object = object[toKey(path[index++])]; } return (index && index == length) ? object : undefined; } module.exports = baseGet; /***/ }, /* 69 */ /***/ function(module, exports, __webpack_require__) { var isArray = __webpack_require__(70), isKey = __webpack_require__(71), stringToPath = __webpack_require__(73), toString = __webpack_require__(108); /** * Casts `value` to a path array if it's not one. * * @private * @param {*} value The value to inspect. * @param {Object} [object] The object to query keys on. * @returns {Array} Returns the cast property path array. */ function castPath(value, object) { if (isArray(value)) { return value; } return isKey(value, object) ? [value] : stringToPath(toString(value)); } module.exports = castPath; /***/ }, /* 70 */ /***/ function(module, exports) { /** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */ var isArray = Array.isArray; module.exports = isArray; /***/ }, /* 71 */ /***/ function(module, exports, __webpack_require__) { var isArray = __webpack_require__(70), isSymbol = __webpack_require__(72); /** Used to match property names within property paths. */ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/; /** * Checks if `value` is a property name and not a property path. * * @private * @param {*} value The value to check. * @param {Object} [object] The object to query keys on. * @returns {boolean} Returns `true` if `value` is a property name, else `false`. */ function isKey(value, object) { if (isArray(value)) { return false; } var type = typeof value; if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) { return true; } return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || (object != null && value in Object(object)); } module.exports = isKey; /***/ }, /* 72 */ /***/ function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(6), isObjectLike = __webpack_require__(14); /** `Object#toString` result references. */ var symbolTag = '[object Symbol]'; /** * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); * // => true * * _.isSymbol('abc'); * // => false */ function isSymbol(value) { return typeof value == 'symbol' || (isObjectLike(value) && baseGetTag(value) == symbolTag); } module.exports = isSymbol; /***/ }, /* 73 */ /***/ function(module, exports, __webpack_require__) { var memoizeCapped = __webpack_require__(74); /** Used to match property names within property paths. */ var reLeadingDot = /^\./, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; /** Used to match backslashes in property paths. */ var reEscapeChar = /\\(\\)?/g; /** * Converts `string` to a property path array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the property path array. */ var stringToPath = memoizeCapped(function(string) { var result = []; if (reLeadingDot.test(string)) { result.push(''); } string.replace(rePropName, function(match, number, quote, string) { result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); }); return result; }); module.exports = stringToPath; /***/ }, /* 74 */ /***/ function(module, exports, __webpack_require__) { var memoize = __webpack_require__(75); /** Used as the maximum memoize cache size. */ var MAX_MEMOIZE_SIZE = 500; /** * A specialized version of `_.memoize` which clears the memoized function's * cache when it exceeds `MAX_MEMOIZE_SIZE`. * * @private * @param {Function} func The function to have its output memoized. * @returns {Function} Returns the new memoized function. */ function memoizeCapped(func) { var result = memoize(func, function(key) { if (cache.size === MAX_MEMOIZE_SIZE) { cache.clear(); } return key; }); var cache = result.cache; return result; } module.exports = memoizeCapped; /***/ }, /* 75 */ /***/ function(module, exports, __webpack_require__) { var MapCache = __webpack_require__(76); /** Error message constants. */ var FUNC_ERROR_TEXT = 'Expected a function'; /** * Creates a function that memoizes the result of `func`. If `resolver` is * provided, it determines the cache key for storing the result based on the * arguments provided to the memoized function. By default, the first argument * provided to the memoized function is used as the map cache key. The `func` * is invoked with the `this` binding of the memoized function. * * **Note:** The cache is exposed as the `cache` property on the memoized * function. Its creation may be customized by replacing the `_.memoize.Cache` * constructor with one whose instances implement the * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) * method interface of `clear`, `delete`, `get`, `has`, and `set`. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to have its output memoized. * @param {Function} [resolver] The function to resolve the cache key. * @returns {Function} Returns the new memoized function. * @example * * var object = { 'a': 1, 'b': 2 }; * var other = { 'c': 3, 'd': 4 }; * * var values = _.memoize(_.values); * values(object); * // => [1, 2] * * values(other); * // => [3, 4] * * object.a = 2; * values(object); * // => [1, 2] * * // Modify the result cache. * values.cache.set(object, ['a', 'b']); * values(object); * // => ['a', 'b'] * * // Replace `_.memoize.Cache`. * _.memoize.Cache = WeakMap; */ function memoize(func, resolver) { if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { throw new TypeError(FUNC_ERROR_TEXT); } var memoized = function() { var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache; if (cache.has(key)) { return cache.get(key); } var result = func.apply(this, args); memoized.cache = cache.set(key, result) || cache; return result; }; memoized.cache = new (memoize.Cache || MapCache); return memoized; } // Expose `MapCache`. memoize.Cache = MapCache; module.exports = memoize; /***/ }, /* 76 */ /***/ function(module, exports, __webpack_require__) { var mapCacheClear = __webpack_require__(77), mapCacheDelete = __webpack_require__(102), mapCacheGet = __webpack_require__(105), mapCacheHas = __webpack_require__(106), mapCacheSet = __webpack_require__(107); /** * Creates a map cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function MapCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `MapCache`. MapCache.prototype.clear = mapCacheClear; MapCache.prototype['delete'] = mapCacheDelete; MapCache.prototype.get = mapCacheGet; MapCache.prototype.has = mapCacheHas; MapCache.prototype.set = mapCacheSet; module.exports = MapCache; /***/ }, /* 77 */ /***/ function(module, exports, __webpack_require__) { var Hash = __webpack_require__(78), ListCache = __webpack_require__(93), Map = __webpack_require__(101); /** * Removes all key-value entries from the map. * * @private * @name clear * @memberOf MapCache */ function mapCacheClear() { this.size = 0; this.__data__ = { 'hash': new Hash, 'map': new (Map || ListCache), 'string': new Hash }; } module.exports = mapCacheClear; /***/ }, /* 78 */ /***/ function(module, exports, __webpack_require__) { var hashClear = __webpack_require__(79), hashDelete = __webpack_require__(89), hashGet = __webpack_require__(90), hashHas = __webpack_require__(91), hashSet = __webpack_require__(92); /** * Creates a hash object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Hash(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `Hash`. Hash.prototype.clear = hashClear; Hash.prototype['delete'] = hashDelete; Hash.prototype.get = hashGet; Hash.prototype.has = hashHas; Hash.prototype.set = hashSet; module.exports = Hash; /***/ }, /* 79 */ /***/ function(module, exports, __webpack_require__) { var nativeCreate = __webpack_require__(80); /** * Removes all key-value entries from the hash. * * @private * @name clear * @memberOf Hash */ function hashClear() { this.__data__ = nativeCreate ? nativeCreate(null) : {}; this.size = 0; } module.exports = hashClear; /***/ }, /* 80 */ /***/ function(module, exports, __webpack_require__) { var getNative = __webpack_require__(81); /* Built-in method references that are verified to be native. */ var nativeCreate = getNative(Object, 'create'); module.exports = nativeCreate; /***/ }, /* 81 */ /***/ function(module, exports, __webpack_require__) { var baseIsNative = __webpack_require__(82), getValue = __webpack_require__(88); /** * Gets the native function at `key` of `object`. * * @private * @param {Object} object The object to query. * @param {string} key The key of the method to get. * @returns {*} Returns the function if it's native, else `undefined`. */ function getNative(object, key) { var value = getValue(object, key); return baseIsNative(value) ? value : undefined; } module.exports = getNative; /***/ }, /* 82 */ /***/ function(module, exports, __webpack_require__) { var isFunction = __webpack_require__(83), isMasked = __webpack_require__(85), isObject = __webpack_require__(84), toSource = __webpack_require__(87); /** * Used to match `RegExp` * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). */ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; /** Used to detect host constructors (Safari). */ var reIsHostCtor = /^\[object .+?Constructor\]$/; /** Used for built-in method references. */ var funcProto = Function.prototype, objectProto = Object.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** Used to detect if a method is native. */ var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' ); /** * The base implementation of `_.isNative` without bad shim checks. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, * else `false`. */ function baseIsNative(value) { if (!isObject(value) || isMasked(value)) { return false; } var pattern = isFunction(value) ? reIsNative : reIsHostCtor; return pattern.test(toSource(value)); } module.exports = baseIsNative; /***/ }, /* 83 */ /***/ function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(6), isObject = __webpack_require__(84); /** `Object#toString` result references. */ var asyncTag = '[object AsyncFunction]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]', proxyTag = '[object Proxy]'; /** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */ function isFunction(value) { if (!isObject(value)) { return false; } // The use of `Object#toString` avoids issues with the `typeof` operator // in Safari 9 which returns 'object' for typed arrays and other constructors. var tag = baseGetTag(value); return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; } module.exports = isFunction; /***/ }, /* 84 */ /***/ function(module, exports) { /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */ function isObject(value) { var type = typeof value; return value != null && (type == 'object' || type == 'function'); } module.exports = isObject; /***/ }, /* 85 */ /***/ function(module, exports, __webpack_require__) { var coreJsData = __webpack_require__(86); /** Used to detect methods masquerading as native. */ var maskSrcKey = (function() { var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); return uid ? ('Symbol(src)_1.' + uid) : ''; }()); /** * Checks if `func` has its source masked. * * @private * @param {Function} func The function to check. * @returns {boolean} Returns `true` if `func` is masked, else `false`. */ function isMasked(func) { return !!maskSrcKey && (maskSrcKey in func); } module.exports = isMasked; /***/ }, /* 86 */ /***/ function(module, exports, __webpack_require__) { var root = __webpack_require__(8); /** Used to detect overreaching core-js shims. */ var coreJsData = root['__core-js_shared__']; module.exports = coreJsData; /***/ }, /* 87 */ /***/ function(module, exports) { /** Used for built-in method references. */ var funcProto = Function.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** * Converts `func` to its source code. * * @private * @param {Function} func The function to convert. * @returns {string} Returns the source code. */ function toSource(func) { if (func != null) { try { return funcToString.call(func); } catch (e) {} try { return (func + ''); } catch (e) {} } return ''; } module.exports = toSource; /***/ }, /* 88 */ /***/ function(module, exports) { /** * Gets the value at `key` of `object`. * * @private * @param {Object} [object] The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */ function getValue(object, key) { return object == null ? undefined : object[key]; } module.exports = getValue; /***/ }, /* 89 */ /***/ function(module, exports) { /** * Removes `key` and its value from the hash. * * @private * @name delete * @memberOf Hash * @param {Object} hash The hash to modify. * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function hashDelete(key) { var result = this.has(key) && delete this.__data__[key]; this.size -= result ? 1 : 0; return result; } module.exports = hashDelete; /***/ }, /* 90 */ /***/ function(module, exports, __webpack_require__) { var nativeCreate = __webpack_require__(80); /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Gets the hash value for `key`. * * @private * @name get * @memberOf Hash * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function hashGet(key) { var data = this.__data__; if (nativeCreate) { var result = data[key]; return result === HASH_UNDEFINED ? undefined : result; } return hasOwnProperty.call(data, key) ? data[key] : undefined; } module.exports = hashGet; /***/ }, /* 91 */ /***/ function(module, exports, __webpack_require__) { var nativeCreate = __webpack_require__(80); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Checks if a hash value for `key` exists. * * @private * @name has * @memberOf Hash * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function hashHas(key) { var data = this.__data__; return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); } module.exports = hashHas; /***/ }, /* 92 */ /***/ function(module, exports, __webpack_require__) { var nativeCreate = __webpack_require__(80); /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** * Sets the hash `key` to `value`. * * @private * @name set * @memberOf Hash * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the hash instance. */ function hashSet(key, value) { var data = this.__data__; this.size += this.has(key) ? 0 : 1; data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; return this; } module.exports = hashSet; /***/ }, /* 93 */ /***/ function(module, exports, __webpack_require__) { var listCacheClear = __webpack_require__(94), listCacheDelete = __webpack_require__(95), listCacheGet = __webpack_require__(98), listCacheHas = __webpack_require__(99), listCacheSet = __webpack_require__(100); /** * Creates an list cache object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function ListCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `ListCache`. ListCache.prototype.clear = listCacheClear; ListCache.prototype['delete'] = listCacheDelete; ListCache.prototype.get = listCacheGet; ListCache.prototype.has = listCacheHas; ListCache.prototype.set = listCacheSet; module.exports = ListCache; /***/ }, /* 94 */ /***/ function(module, exports) { /** * Removes all key-value entries from the list cache. * * @private * @name clear * @memberOf ListCache */ function listCacheClear() { this.__data__ = []; this.size = 0; } module.exports = listCacheClear; /***/ }, /* 95 */ /***/ function(module, exports, __webpack_require__) { var assocIndexOf = __webpack_require__(96); /** Used for built-in method references. */ var arrayProto = Array.prototype; /** Built-in value references. */ var splice = arrayProto.splice; /** * Removes `key` and its value from the list cache. * * @private * @name delete * @memberOf ListCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function listCacheDelete(key) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { return false; } var lastIndex = data.length - 1; if (index == lastIndex) { data.pop(); } else { splice.call(data, index, 1); } --this.size; return true; } module.exports = listCacheDelete; /***/ }, /* 96 */ /***/ function(module, exports, __webpack_require__) { var eq = __webpack_require__(97); /** * Gets the index at which the `key` is found in `array` of key-value pairs. * * @private * @param {Array} array The array to inspect. * @param {*} key The key to search for. * @returns {number} Returns the index of the matched value, else `-1`. */ function assocIndexOf(array, key) { var length = array.length; while (length--) { if (eq(array[length][0], key)) { return length; } } return -1; } module.exports = assocIndexOf; /***/ }, /* 97 */ /***/ function(module, exports) { /** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * comparison between two values to determine if they are equivalent. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.eq(object, object); * // => true * * _.eq(object, other); * // => false * * _.eq('a', 'a'); * // => true * * _.eq('a', Object('a')); * // => false * * _.eq(NaN, NaN); * // => true */ function eq(value, other) { return value === other || (value !== value && other !== other); } module.exports = eq; /***/ }, /* 98 */ /***/ function(module, exports, __webpack_require__) { var assocIndexOf = __webpack_require__(96); /** * Gets the list cache value for `key`. * * @private * @name get * @memberOf ListCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function listCacheGet(key) { var data = this.__data__, index = assocIndexOf(data, key); return index < 0 ? undefined : data[index][1]; } module.exports = listCacheGet; /***/ }, /* 99 */ /***/ function(module, exports, __webpack_require__) { var assocIndexOf = __webpack_require__(96); /** * Checks if a list cache value for `key` exists. * * @private * @name has * @memberOf ListCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function listCacheHas(key) { return assocIndexOf(this.__data__, key) > -1; } module.exports = listCacheHas; /***/ }, /* 100 */ /***/ function(module, exports, __webpack_require__) { var assocIndexOf = __webpack_require__(96); /** * Sets the list cache `key` to `value`. * * @private * @name set * @memberOf ListCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the list cache instance. */ function listCacheSet(key, value) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { ++this.size; data.push([key, value]); } else { data[index][1] = value; } return this; } module.exports = listCacheSet; /***/ }, /* 101 */ /***/ function(module, exports, __webpack_require__) { var getNative = __webpack_require__(81), root = __webpack_require__(8); /* Built-in method references that are verified to be native. */ var Map = getNative(root, 'Map'); module.exports = Map; /***/ }, /* 102 */ /***/ function(module, exports, __webpack_require__) { var getMapData = __webpack_require__(103); /** * Removes `key` and its value from the map. * * @private * @name delete * @memberOf MapCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function mapCacheDelete(key) { var result = getMapData(this, key)['delete'](key); this.size -= result ? 1 : 0; return result; } module.exports = mapCacheDelete; /***/ }, /* 103 */ /***/ function(module, exports, __webpack_require__) { var isKeyable = __webpack_require__(104); /** * Gets the data for `map`. * * @private * @param {Object} map The map to query. * @param {string} key The reference key. * @returns {*} Returns the map data. */ function getMapData(map, key) { var data = map.__data__; return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map; } module.exports = getMapData; /***/ }, /* 104 */ /***/ function(module, exports) { /** * Checks if `value` is suitable for use as unique object key. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is suitable, else `false`. */ function isKeyable(value) { var type = typeof value; return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') ? (value !== '__proto__') : (value === null); } module.exports = isKeyable; /***/ }, /* 105 */ /***/ function(module, exports, __webpack_require__) { var getMapData = __webpack_require__(103); /** * Gets the map value for `key`. * * @private * @name get * @memberOf MapCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function mapCacheGet(key) { return getMapData(this, key).get(key); } module.exports = mapCacheGet; /***/ }, /* 106 */ /***/ function(module, exports, __webpack_require__) { var getMapData = __webpack_require__(103); /** * Checks if a map value for `key` exists. * * @private * @name has * @memberOf MapCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function mapCacheHas(key) { return getMapData(this, key).has(key); } module.exports = mapCacheHas; /***/ }, /* 107 */ /***/ function(module, exports, __webpack_require__) { var getMapData = __webpack_require__(103); /** * Sets the map `key` to `value`. * * @private * @name set * @memberOf MapCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the map cache instance. */ function mapCacheSet(key, value) { var data = getMapData(this, key), size = data.size; data.set(key, value); this.size += data.size == size ? 0 : 1; return this; } module.exports = mapCacheSet; /***/ }, /* 108 */ /***/ function(module, exports, __webpack_require__) { var baseToString = __webpack_require__(109); /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {string} Returns the converted string. * @example * * _.toString(null); * // => '' * * _.toString(-0); * // => '-0' * * _.toString([1, 2, 3]); * // => '1,2,3' */ function toString(value) { return value == null ? '' : baseToString(value); } module.exports = toString; /***/ }, /* 109 */ /***/ function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(7), arrayMap = __webpack_require__(110), isArray = __webpack_require__(70), isSymbol = __webpack_require__(72); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolToString = symbolProto ? symbolProto.toString : undefined; /** * The base implementation of `_.toString` which doesn't convert nullish * values to empty strings. * * @private * @param {*} value The value to process. * @returns {string} Returns the string. */ function baseToString(value) { // Exit early for strings to avoid a performance hit in some environments. if (typeof value == 'string') { return value; } if (isArray(value)) { // Recursively convert values (susceptible to call stack limits). return arrayMap(value, baseToString) + ''; } if (isSymbol(value)) { return symbolToString ? symbolToString.call(value) : ''; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; } module.exports = baseToString; /***/ }, /* 110 */ /***/ function(module, exports) { /** * A specialized version of `_.map` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new mapped array. */ function arrayMap(array, iteratee) { var index = -1, length = array == null ? 0 : array.length, result = Array(length); while (++index < length) { result[index] = iteratee(array[index], index, array); } return result; } module.exports = arrayMap; /***/ }, /* 111 */ /***/ function(module, exports, __webpack_require__) { var isSymbol = __webpack_require__(72); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** * Converts `value` to a string key if it's not a string or symbol. * * @private * @param {*} value The value to inspect. * @returns {string|symbol} Returns the key. */ function toKey(value) { if (typeof value == 'string' || isSymbol(value)) { return value; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; } module.exports = toKey; /***/ }, /* 112 */ /***/ function(module, exports, __webpack_require__) { var baseSet = __webpack_require__(113); /** * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, * it's created. Arrays are created for missing index properties while objects * are created for all other missing properties. Use `_.setWith` to customize * `path` creation. * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 3.7.0 * @category Object * @param {Object} object The object to modify. * @param {Array|string} path The path of the property to set. * @param {*} value The value to set. * @returns {Object} Returns `object`. * @example * * var object = { 'a': [{ 'b': { 'c': 3 } }] }; * * _.set(object, 'a[0].b.c', 4); * console.log(object.a[0].b.c); * // => 4 * * _.set(object, ['x', '0', 'y', 'z'], 5); * console.log(object.x[0].y.z); * // => 5 */ function set(object, path, value) { return object == null ? object : baseSet(object, path, value); } module.exports = set; /***/ }, /* 113 */ /***/ function(module, exports, __webpack_require__) { var assignValue = __webpack_require__(114), castPath = __webpack_require__(69), isIndex = __webpack_require__(117), isObject = __webpack_require__(84), toKey = __webpack_require__(111); /** * The base implementation of `_.set`. * * @private * @param {Object} object The object to modify. * @param {Array|string} path The path of the property to set. * @param {*} value The value to set. * @param {Function} [customizer] The function to customize path creation. * @returns {Object} Returns `object`. */ function baseSet(object, path, value, customizer) { if (!isObject(object)) { return object; } path = castPath(path, object); var index = -1, length = path.length, lastIndex = length - 1, nested = object; while (nested != null && ++index < length) { var key = toKey(path[index]), newValue = value; if (index != lastIndex) { var objValue = nested[key]; newValue = customizer ? customizer(objValue, key, nested) : undefined; if (newValue === undefined) { newValue = isObject(objValue) ? objValue : (isIndex(path[index + 1]) ? [] : {}); } } assignValue(nested, key, newValue); nested = nested[key]; } return object; } module.exports = baseSet; /***/ }, /* 114 */ /***/ function(module, exports, __webpack_require__) { var baseAssignValue = __webpack_require__(115), eq = __webpack_require__(97); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Assigns `value` to `key` of `object` if the existing value is not equivalent * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function assignValue(object, key, value) { var objValue = object[key]; if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || (value === undefined && !(key in object))) { baseAssignValue(object, key, value); } } module.exports = assignValue; /***/ }, /* 115 */ /***/ function(module, exports, __webpack_require__) { var defineProperty = __webpack_require__(116); /** * The base implementation of `assignValue` and `assignMergeValue` without * value checks. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function baseAssignValue(object, key, value) { if (key == '__proto__' && defineProperty) { defineProperty(object, key, { 'configurable': true, 'enumerable': true, 'value': value, 'writable': true }); } else { object[key] = value; } } module.exports = baseAssignValue; /***/ }, /* 116 */ /***/ function(module, exports, __webpack_require__) { var getNative = __webpack_require__(81); var defineProperty = (function() { try { var func = getNative(Object, 'defineProperty'); func({}, '', {}); return func; } catch (e) {} }()); module.exports = defineProperty; /***/ }, /* 117 */ /***/ function(module, exports) { /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** Used to detect unsigned integer values. */ var reIsUint = /^(?:0|[1-9]\d*)$/; /** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */ function isIndex(value, length) { length = length == null ? MAX_SAFE_INTEGER : length; return !!length && (typeof value == 'number' || reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length); } module.exports = isIndex; /***/ }, /* 118 */ /***/ function(module, exports) { /***/ }, /* 119 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(process) {// Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // resolves . and .. elements in a path array with directory names there // must be no slashes, empty elements, or device names (c:\) in the array // (so also no leading and trailing slashes - it does not distinguish // relative and absolute paths) function normalizeArray(parts, allowAboveRoot) { // if the path tries to go above the root, `up` ends up > 0 var up = 0; for (var i = parts.length - 1; i >= 0; i--) { var last = parts[i]; if (last === '.') { parts.splice(i, 1); } else if (last === '..') { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } // if the path is allowed to go above the root, restore leading ..s if (allowAboveRoot) { for (; up--; up) { parts.unshift('..'); } } return parts; } // Split a filename into [root, dir, basename, ext], unix version // 'root' is just a slash, or nothing. var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; var splitPath = function(filename) { return splitPathRe.exec(filename).slice(1); }; // path.resolve([from ...], to) // posix version exports.resolve = function() { var resolvedPath = '', resolvedAbsolute = false; for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { var path = (i >= 0) ? arguments[i] : process.cwd(); // Skip empty and invalid entries if (typeof path !== 'string') { throw new TypeError('Arguments to path.resolve must be strings'); } else if (!path) { continue; } resolvedPath = path + '/' + resolvedPath; resolvedAbsolute = path.charAt(0) === '/'; } // At this point the path should be resolved to a full absolute path, but // handle relative paths to be safe (might happen when process.cwd() fails) // Normalize the path resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { return !!p; }), !resolvedAbsolute).join('/'); return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; }; // path.normalize(path) // posix version exports.normalize = function(path) { var isAbsolute = exports.isAbsolute(path), trailingSlash = substr(path, -1) === '/'; // Normalize the path path = normalizeArray(filter(path.split('/'), function(p) { return !!p; }), !isAbsolute).join('/'); if (!path && !isAbsolute) { path = '.'; } if (path && trailingSlash) { path += '/'; } return (isAbsolute ? '/' : '') + path; }; // posix version exports.isAbsolute = function(path) { return path.charAt(0) === '/'; }; // posix version exports.join = function() { var paths = Array.prototype.slice.call(arguments, 0); return exports.normalize(filter(paths, function(p, index) { if (typeof p !== 'string') { throw new TypeError('Arguments to path.join must be strings'); } return p; }).join('/')); }; // path.relative(from, to) // posix version exports.relative = function(from, to) { from = exports.resolve(from).substr(1); to = exports.resolve(to).substr(1); function trim(arr) { var start = 0; for (; start < arr.length; start++) { if (arr[start] !== '') break; } var end = arr.length - 1; for (; end >= 0; end--) { if (arr[end] !== '') break; } if (start > end) return []; return arr.slice(start, end - start + 1); } var fromParts = trim(from.split('/')); var toParts = trim(to.split('/')); var length = Math.min(fromParts.length, toParts.length); var samePartsLength = length; for (var i = 0; i < length; i++) { if (fromParts[i] !== toParts[i]) { samePartsLength = i; break; } } var outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) { outputParts.push('..'); } outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join('/'); }; exports.sep = '/'; exports.delimiter = ':'; exports.dirname = function(path) { var result = splitPath(path), root = result[0], dir = result[1]; if (!root && !dir) { // No dirname whatsoever return '.'; } if (dir) { // It has a dirname, strip trailing slash dir = dir.substr(0, dir.length - 1); } return root + dir; }; exports.basename = function(path, ext) { var f = splitPath(path)[2]; // TODO: make this comparison case-insensitive on windows? if (ext && f.substr(-1 * ext.length) === ext) { f = f.substr(0, f.length - ext.length); } return f; }; exports.extname = function(path) { return splitPath(path)[3]; }; function filter (xs, f) { if (xs.filter) return xs.filter(f); var res = []; for (var i = 0; i < xs.length; i++) { if (f(xs[i], i, xs)) res.push(xs[i]); } return res; } // String.prototype.substr - negative index don't work in IE8 var substr = 'ab'.substr(-1) === 'b' ? function (str, start, len) { return str.substr(start, len) } : function (str, start, len) { if (start < 0) start = str.length + start; return str.substr(start, len); } ; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(120))) /***/ }, /* 120 */ /***/ function(module, exports) { // shim for using process in browser var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it // don't break things. But we need to wrap it in a try catch in case it is // wrapped in strict mode code which doesn't define any globals. It's inside a // function because try/catches deoptimize in certain engines. var cachedSetTimeout; var cachedClearTimeout; function defaultSetTimout() { throw new Error('setTimeout has not been defined'); } function defaultClearTimeout () { throw new Error('clearTimeout has not been defined'); } (function () { try { if (typeof setTimeout === 'function') { cachedSetTimeout = setTimeout; } else { cachedSetTimeout = defaultSetTimout; } } catch (e) { cachedSetTimeout = defaultSetTimout; } try { if (typeof clearTimeout === 'function') { cachedClearTimeout = clearTimeout; } else { cachedClearTimeout = defaultClearTimeout; } } catch (e) { cachedClearTimeout = defaultClearTimeout; } } ()) function runTimeout(fun) { if (cachedSetTimeout === setTimeout) { //normal enviroments in sane situations return setTimeout(fun, 0); } // if setTimeout wasn't available but was latter defined if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { cachedSetTimeout = setTimeout; return setTimeout(fun, 0); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedSetTimeout(fun, 0); } catch(e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedSetTimeout.call(null, fun, 0); } catch(e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) { //normal enviroments in sane situations return clearTimeout(marker); } // if clearTimeout wasn't available but was latter defined if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { cachedClearTimeout = clearTimeout; return clearTimeout(marker); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedClearTimeout(marker); } catch (e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedClearTimeout.call(null, marker); } catch (e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. // Some versions of I.E. have different rules for clearTimeout vs setTimeout return cachedClearTimeout.call(this, marker); } } } var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; while(len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; runClearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; /***/ }, /* 121 */ /***/ function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_121__; /***/ }, /* 122 */, /* 123 */, /* 124 */, /* 125 */, /* 126 */, /* 127 */, /* 128 */, /* 129 */, /* 130 */, /* 131 */, /* 132 */, /* 133 */, /* 134 */, /* 135 */, /* 136 */, /* 137 */, /* 138 */, /* 139 */, /* 140 */, /* 141 */, /* 142 */, /* 143 */, /* 144 */, /* 145 */, /* 146 */, /* 147 */, /* 148 */, /* 149 */, /* 150 */, /* 151 */, /* 152 */, /* 153 */, /* 154 */, /* 155 */, /* 156 */, /* 157 */, /* 158 */, /* 159 */, /* 160 */, /* 161 */, /* 162 */, /* 163 */, /* 164 */, /* 165 */, /* 166 */, /* 167 */, /* 168 */, /* 169 */, /* 170 */, /* 171 */, /* 172 */, /* 173 */, /* 174 */, /* 175 */, /* 176 */, /* 177 */, /* 178 */, /* 179 */, /* 180 */, /* 181 */, /* 182 */, /* 183 */, /* 184 */, /* 185 */, /* 186 */, /* 187 */, /* 188 */, /* 189 */, /* 190 */, /* 191 */, /* 192 */, /* 193 */, /* 194 */, /* 195 */, /* 196 */, /* 197 */, /* 198 */ /***/ function(module, exports, __webpack_require__) { var DataView = __webpack_require__(199), Map = __webpack_require__(101), Promise = __webpack_require__(200), Set = __webpack_require__(201), WeakMap = __webpack_require__(202), baseGetTag = __webpack_require__(6), toSource = __webpack_require__(87); /** `Object#toString` result references. */ var mapTag = '[object Map]', objectTag = '[object Object]', promiseTag = '[object Promise]', setTag = '[object Set]', weakMapTag = '[object WeakMap]'; var dataViewTag = '[object DataView]'; /** Used to detect maps, sets, and weakmaps. */ var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise), setCtorString = toSource(Set), weakMapCtorString = toSource(WeakMap); /** * Gets the `toStringTag` of `value`. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || (Map && getTag(new Map) != mapTag) || (Promise && getTag(Promise.resolve()) != promiseTag) || (Set && getTag(new Set) != setTag) || (WeakMap && getTag(new WeakMap) != weakMapTag)) { getTag = function(value) { var result = baseGetTag(value), Ctor = result == objectTag ? value.constructor : undefined, ctorString = Ctor ? toSource(Ctor) : ''; if (ctorString) { switch (ctorString) { case dataViewCtorString: return dataViewTag; case mapCtorString: return mapTag; case promiseCtorString: return promiseTag; case setCtorString: return setTag; case weakMapCtorString: return weakMapTag; } } return result; }; } module.exports = getTag; /***/ }, /* 199 */ /***/ function(module, exports, __webpack_require__) { var getNative = __webpack_require__(81), root = __webpack_require__(8); /* Built-in method references that are verified to be native. */ var DataView = getNative(root, 'DataView'); module.exports = DataView; /***/ }, /* 200 */ /***/ function(module, exports, __webpack_require__) { var getNative = __webpack_require__(81), root = __webpack_require__(8); /* Built-in method references that are verified to be native. */ var Promise = getNative(root, 'Promise'); module.exports = Promise; /***/ }, /* 201 */ /***/ function(module, exports, __webpack_require__) { var getNative = __webpack_require__(81), root = __webpack_require__(8); /* Built-in method references that are verified to be native. */ var Set = getNative(root, 'Set'); module.exports = Set; /***/ }, /* 202 */ /***/ function(module, exports, __webpack_require__) { var getNative = __webpack_require__(81), root = __webpack_require__(8); /* Built-in method references that are verified to be native. */ var WeakMap = getNative(root, 'WeakMap'); module.exports = WeakMap; /***/ }, /* 203 */ /***/ function(module, exports) { /** * Converts `map` to its key-value pairs. * * @private * @param {Object} map The map to convert. * @returns {Array} Returns the key-value pairs. */ function mapToArray(map) { var index = -1, result = Array(map.size); map.forEach(function(value, key) { result[++index] = [key, value]; }); return result; } module.exports = mapToArray; /***/ }, /* 204 */, /* 205 */ /***/ function(module, exports, __webpack_require__) { var arrayLikeKeys = __webpack_require__(206), baseKeys = __webpack_require__(217), isArrayLike = __webpack_require__(220); /** * Creates an array of the own enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. See the * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) * for more details. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.keys(new Foo); * // => ['a', 'b'] (iteration order is not guaranteed) * * _.keys('hi'); * // => ['0', '1'] */ function keys(object) { return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); } module.exports = keys; /***/ }, /* 206 */ /***/ function(module, exports, __webpack_require__) { var baseTimes = __webpack_require__(207), isArguments = __webpack_require__(208), isArray = __webpack_require__(70), isBuffer = __webpack_require__(210), isIndex = __webpack_require__(117), isTypedArray = __webpack_require__(212); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Creates an array of the enumerable property names of the array-like `value`. * * @private * @param {*} value The value to query. * @param {boolean} inherited Specify returning inherited property names. * @returns {Array} Returns the array of property names. */ function arrayLikeKeys(value, inherited) { var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length; for (var key in value) { if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && ( // Safari 9 has enumerable `arguments.length` in strict mode. key == 'length' || // Node.js 0.10 has enumerable non-index properties on buffers. (isBuff && (key == 'offset' || key == 'parent')) || // PhantomJS 2 has enumerable non-index properties on typed arrays. (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || // Skip index properties. isIndex(key, length) ))) { result.push(key); } } return result; } module.exports = arrayLikeKeys; /***/ }, /* 207 */ /***/ function(module, exports) { /** * The base implementation of `_.times` without support for iteratee shorthands * or max array length checks. * * @private * @param {number} n The number of times to invoke `iteratee`. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the array of results. */ function baseTimes(n, iteratee) { var index = -1, result = Array(n); while (++index < n) { result[index] = iteratee(index); } return result; } module.exports = baseTimes; /***/ }, /* 208 */ /***/ function(module, exports, __webpack_require__) { var baseIsArguments = __webpack_require__(209), isObjectLike = __webpack_require__(14); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; /** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, * else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */ var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); }; module.exports = isArguments; /***/ }, /* 209 */ /***/ function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(6), isObjectLike = __webpack_require__(14); /** `Object#toString` result references. */ var argsTag = '[object Arguments]'; /** * The base implementation of `_.isArguments`. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, */ function baseIsArguments(value) { return isObjectLike(value) && baseGetTag(value) == argsTag; } module.exports = baseIsArguments; /***/ }, /* 210 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(8), stubFalse = __webpack_require__(211); /** Detect free variable `exports`. */ var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Built-in value references. */ var Buffer = moduleExports ? root.Buffer : undefined; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; /** * Checks if `value` is a buffer. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. * @example * * _.isBuffer(new Buffer(2)); * // => true * * _.isBuffer(new Uint8Array(2)); * // => false */ var isBuffer = nativeIsBuffer || stubFalse; module.exports = isBuffer; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(51)(module))) /***/ }, /* 211 */ /***/ function(module, exports) { /** * This method returns `false`. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {boolean} Returns `false`. * @example * * _.times(2, _.stubFalse); * // => [false, false] */ function stubFalse() { return false; } module.exports = stubFalse; /***/ }, /* 212 */ /***/ function(module, exports, __webpack_require__) { var baseIsTypedArray = __webpack_require__(213), baseUnary = __webpack_require__(215), nodeUtil = __webpack_require__(216); /* Node.js helper references. */ var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; /** * Checks if `value` is classified as a typed array. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. * @example * * _.isTypedArray(new Uint8Array); * // => true * * _.isTypedArray([]); * // => false */ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; module.exports = isTypedArray; /***/ }, /* 213 */ /***/ function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(6), isLength = __webpack_require__(214), isObjectLike = __webpack_require__(14); /** `Object#toString` result references. */ var argsTag = '[object Arguments]', arrayTag = '[object Array]', boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', funcTag = '[object Function]', mapTag = '[object Map]', numberTag = '[object Number]', objectTag = '[object Object]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', weakMapTag = '[object WeakMap]'; var arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]', float32Tag = '[object Float32Array]', float64Tag = '[object Float64Array]', int8Tag = '[object Int8Array]', int16Tag = '[object Int16Array]', int32Tag = '[object Int32Array]', uint8Tag = '[object Uint8Array]', uint8ClampedTag = '[object Uint8ClampedArray]', uint16Tag = '[object Uint16Array]', uint32Tag = '[object Uint32Array]'; /** Used to identify `toStringTag` values of typed arrays. */ var typedArrayTags = {}; typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; /** * The base implementation of `_.isTypedArray` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. */ function baseIsTypedArray(value) { return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; } module.exports = baseIsTypedArray; /***/ }, /* 214 */ /***/ function(module, exports) { /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */ function isLength(value) { return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } module.exports = isLength; /***/ }, /* 215 */ /***/ function(module, exports) { /** * The base implementation of `_.unary` without support for storing metadata. * * @private * @param {Function} func The function to cap arguments for. * @returns {Function} Returns the new capped function. */ function baseUnary(func) { return function(value) { return func(value); }; } module.exports = baseUnary; /***/ }, /* 216 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {var freeGlobal = __webpack_require__(9); /** Detect free variable `exports`. */ var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Detect free variable `process` from Node.js. */ var freeProcess = moduleExports && freeGlobal.process; /** Used to access faster Node.js helpers. */ var nodeUtil = (function() { try { return freeProcess && freeProcess.binding && freeProcess.binding('util'); } catch (e) {} }()); module.exports = nodeUtil; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(51)(module))) /***/ }, /* 217 */ /***/ function(module, exports, __webpack_require__) { var isPrototype = __webpack_require__(218), nativeKeys = __webpack_require__(219); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function baseKeys(object) { if (!isPrototype(object)) { return nativeKeys(object); } var result = []; for (var key in Object(object)) { if (hasOwnProperty.call(object, key) && key != 'constructor') { result.push(key); } } return result; } module.exports = baseKeys; /***/ }, /* 218 */ /***/ function(module, exports) { /** Used for built-in method references. */ var objectProto = Object.prototype; /** * Checks if `value` is likely a prototype object. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. */ function isPrototype(value) { var Ctor = value && value.constructor, proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; return value === proto; } module.exports = isPrototype; /***/ }, /* 219 */ /***/ function(module, exports, __webpack_require__) { var overArg = __webpack_require__(13); /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeKeys = overArg(Object.keys, Object); module.exports = nativeKeys; /***/ }, /* 220 */ /***/ function(module, exports, __webpack_require__) { var isFunction = __webpack_require__(83), isLength = __webpack_require__(214); /** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */ function isArrayLike(value) { return value != null && isLength(value.length) && !isFunction(value); } module.exports = isArrayLike; /***/ }, /* 221 */, /* 222 */, /* 223 */, /* 224 */, /* 225 */, /* 226 */ /***/ function(module, exports, __webpack_require__) { // @flow var { PrefsHelper } = __webpack_require__(26); const { Services: { pref }} = __webpack_require__(28); const { isDevelopment } = __webpack_require__(65); if (isDevelopment()) { pref("devtools.debugger.client-source-maps-enabled", true); pref("devtools.debugger.pause-on-exceptions", false); pref("devtools.debugger.ignore-caught-exceptions", false); pref("devtools.debugger.call-stack-visible", false); pref("devtools.debugger.scopes-visible", false); pref("devtools.debugger.start-panel-collapsed", false); pref("devtools.debugger.end-panel-collapsed", false); pref("devtools.debugger.tabs", "[]"); pref("devtools.debugger.pending-selected-location", "{}"); } const prefs = new PrefsHelper("devtools", { clientSourceMapsEnabled: ["Bool", "debugger.client-source-maps-enabled"], pauseOnExceptions: ["Bool", "debugger.pause-on-exceptions"], ignoreCaughtExceptions: ["Bool", "debugger.ignore-caught-exceptions"], callStackVisible: ["Bool", "debugger.call-stack-visible"], scopesVisible: ["Bool", "debugger.scopes-visible"], startPanelCollapsed: ["Bool", "debugger.start-panel-collapsed"], endPanelCollapsed: ["Bool", "debugger.end-panel-collapsed"], tabs: ["Json", "debugger.tabs"], pendingSelectedLocation: ["Json", "debugger.pending-selected-location"] }); module.exports = { prefs }; /***/ }, /* 227 */, /* 228 */, /* 229 */, /* 230 */, /* 231 */, /* 232 */, /* 233 */, /* 234 */, /* 235 */, /* 236 */, /* 237 */, /* 238 */, /* 239 */, /* 240 */, /* 241 */, /* 242 */, /* 243 */, /* 244 */, /* 245 */, /* 246 */, /* 247 */, /* 248 */, /* 249 */, /* 250 */, /* 251 */, /* 252 */, /* 253 */, /* 254 */, /* 255 */, /* 256 */, /* 257 */, /* 258 */, /* 259 */, /* 260 */, /* 261 */, /* 262 */, /* 263 */, /* 264 */, /* 265 */, /* 266 */, /* 267 */, /* 268 */, /* 269 */, /* 270 */, /* 271 */, /* 272 */, /* 273 */, /* 274 */, /* 275 */, /* 276 */, /* 277 */, /* 278 */, /* 279 */, /* 280 */, /* 281 */, /* 282 */, /* 283 */, /* 284 */, /* 285 */, /* 286 */, /* 287 */, /* 288 */, /* 289 */, /* 290 */, /* 291 */, /* 292 */, /* 293 */, /* 294 */, /* 295 */, /* 296 */, /* 297 */, /* 298 */, /* 299 */, /* 300 */, /* 301 */, /* 302 */, /* 303 */, /* 304 */, /* 305 */, /* 306 */, /* 307 */, /* 308 */, /* 309 */, /* 310 */, /* 311 */, /* 312 */, /* 313 */, /* 314 */, /* 315 */, /* 316 */, /* 317 */, /* 318 */, /* 319 */, /* 320 */, /* 321 */, /* 322 */, /* 323 */, /* 324 */, /* 325 */, /* 326 */, /* 327 */, /* 328 */, /* 329 */, /* 330 */, /* 331 */, /* 332 */, /* 333 */, /* 334 */, /* 335 */, /* 336 */, /* 337 */, /* 338 */, /* 339 */, /* 340 */, /* 341 */, /* 342 */, /* 343 */, /* 344 */, /* 345 */, /* 346 */, /* 347 */, /* 348 */, /* 349 */, /* 350 */, /* 351 */, /* 352 */, /* 353 */, /* 354 */, /* 355 */, /* 356 */, /* 357 */, /* 358 */, /* 359 */, /* 360 */, /* 361 */, /* 362 */, /* 363 */, /* 364 */, /* 365 */, /* 366 */ /***/ function(module, exports, __webpack_require__) { var ListCache = __webpack_require__(93), stackClear = __webpack_require__(367), stackDelete = __webpack_require__(368), stackGet = __webpack_require__(369), stackHas = __webpack_require__(370), stackSet = __webpack_require__(371); /** * Creates a stack cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Stack(entries) { var data = this.__data__ = new ListCache(entries); this.size = data.size; } // Add methods to `Stack`. Stack.prototype.clear = stackClear; Stack.prototype['delete'] = stackDelete; Stack.prototype.get = stackGet; Stack.prototype.has = stackHas; Stack.prototype.set = stackSet; module.exports = Stack; /***/ }, /* 367 */ /***/ function(module, exports, __webpack_require__) { var ListCache = __webpack_require__(93); /** * Removes all key-value entries from the stack. * * @private * @name clear * @memberOf Stack */ function stackClear() { this.__data__ = new ListCache; this.size = 0; } module.exports = stackClear; /***/ }, /* 368 */ /***/ function(module, exports) { /** * Removes `key` and its value from the stack. * * @private * @name delete * @memberOf Stack * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function stackDelete(key) { var data = this.__data__, result = data['delete'](key); this.size = data.size; return result; } module.exports = stackDelete; /***/ }, /* 369 */ /***/ function(module, exports) { /** * Gets the stack value for `key`. * * @private * @name get * @memberOf Stack * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function stackGet(key) { return this.__data__.get(key); } module.exports = stackGet; /***/ }, /* 370 */ /***/ function(module, exports) { /** * Checks if a stack value for `key` exists. * * @private * @name has * @memberOf Stack * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function stackHas(key) { return this.__data__.has(key); } module.exports = stackHas; /***/ }, /* 371 */ /***/ function(module, exports, __webpack_require__) { var ListCache = __webpack_require__(93), Map = __webpack_require__(101), MapCache = __webpack_require__(76); /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; /** * Sets the stack `key` to `value`. * * @private * @name set * @memberOf Stack * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the stack cache instance. */ function stackSet(key, value) { var data = this.__data__; if (data instanceof ListCache) { var pairs = data.__data__; if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { pairs.push([key, value]); this.size = ++data.size; return this; } data = this.__data__ = new MapCache(pairs); } data.set(key, value); this.size = data.size; return this; } module.exports = stackSet; /***/ }, /* 372 */, /* 373 */, /* 374 */, /* 375 */, /* 376 */, /* 377 */, /* 378 */, /* 379 */, /* 380 */, /* 381 */, /* 382 */ /***/ function(module, exports, __webpack_require__) { var arrayFilter = __webpack_require__(383), stubArray = __webpack_require__(384); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeGetSymbols = Object.getOwnPropertySymbols; /** * Creates an array of the own enumerable symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of symbols. */ var getSymbols = !nativeGetSymbols ? stubArray : function(object) { if (object == null) { return []; } object = Object(object); return arrayFilter(nativeGetSymbols(object), function(symbol) { return propertyIsEnumerable.call(object, symbol); }); }; module.exports = getSymbols; /***/ }, /* 383 */ /***/ function(module, exports) { /** * A specialized version of `_.filter` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {Array} Returns the new filtered array. */ function arrayFilter(array, predicate) { var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; while (++index < length) { var value = array[index]; if (predicate(value, index, array)) { result[resIndex++] = value; } } return result; } module.exports = arrayFilter; /***/ }, /* 384 */ /***/ function(module, exports) { /** * This method returns a new empty array. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {Array} Returns the new empty array. * @example * * var arrays = _.times(2, _.stubArray); * * console.log(arrays); * // => [[], []] * * console.log(arrays[0] === arrays[1]); * // => false */ function stubArray() { return []; } module.exports = stubArray; /***/ }, /* 385 */, /* 386 */, /* 387 */ /***/ function(module, exports) { /** * Appends the elements of `values` to `array`. * * @private * @param {Array} array The array to modify. * @param {Array} values The values to append. * @returns {Array} Returns `array`. */ function arrayPush(array, values) { var index = -1, length = values.length, offset = array.length; while (++index < length) { array[offset + index] = values[index]; } return array; } module.exports = arrayPush; /***/ }, /* 388 */ /***/ function(module, exports, __webpack_require__) { var baseGetAllKeys = __webpack_require__(389), getSymbols = __webpack_require__(382), keys = __webpack_require__(205); /** * Creates an array of own enumerable property names and symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names and symbols. */ function getAllKeys(object) { return baseGetAllKeys(object, keys, getSymbols); } module.exports = getAllKeys; /***/ }, /* 389 */ /***/ function(module, exports, __webpack_require__) { var arrayPush = __webpack_require__(387), isArray = __webpack_require__(70); /** * The base implementation of `getAllKeys` and `getAllKeysIn` which uses * `keysFunc` and `symbolsFunc` to get the enumerable property names and * symbols of `object`. * * @private * @param {Object} object The object to query. * @param {Function} keysFunc The function to get the keys of `object`. * @param {Function} symbolsFunc The function to get the symbols of `object`. * @returns {Array} Returns the array of property names and symbols. */ function baseGetAllKeys(object, keysFunc, symbolsFunc) { var result = keysFunc(object); return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); } module.exports = baseGetAllKeys; /***/ }, /* 390 */, /* 391 */, /* 392 */, /* 393 */, /* 394 */ /***/ function(module, exports, __webpack_require__) { var root = __webpack_require__(8); /** Built-in value references. */ var Uint8Array = root.Uint8Array; module.exports = Uint8Array; /***/ }, /* 395 */, /* 396 */, /* 397 */, /* 398 */, /* 399 */, /* 400 */, /* 401 */, /* 402 */ /***/ function(module, exports) { /** * Converts `set` to an array of its values. * * @private * @param {Object} set The set to convert. * @returns {Array} Returns the values. */ function setToArray(set) { var index = -1, result = Array(set.size); set.forEach(function(value) { result[++index] = value; }); return result; } module.exports = setToArray; /***/ }, /* 403 */, /* 404 */, /* 405 */, /* 406 */, /* 407 */, /* 408 */, /* 409 */ /***/ function(module, exports, __webpack_require__) { var MapCache = __webpack_require__(76), setCacheAdd = __webpack_require__(410), setCacheHas = __webpack_require__(411); /** * * Creates an array cache object to store unique values. * * @private * @constructor * @param {Array} [values] The values to cache. */ function SetCache(values) { var index = -1, length = values == null ? 0 : values.length; this.__data__ = new MapCache; while (++index < length) { this.add(values[index]); } } // Add methods to `SetCache`. SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; SetCache.prototype.has = setCacheHas; module.exports = SetCache; /***/ }, /* 410 */ /***/ function(module, exports) { /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** * Adds `value` to the array cache. * * @private * @name add * @memberOf SetCache * @alias push * @param {*} value The value to cache. * @returns {Object} Returns the cache instance. */ function setCacheAdd(value) { this.__data__.set(value, HASH_UNDEFINED); return this; } module.exports = setCacheAdd; /***/ }, /* 411 */ /***/ function(module, exports) { /** * Checks if `value` is in the array cache. * * @private * @name has * @memberOf SetCache * @param {*} value The value to search for. * @returns {number} Returns `true` if `value` is found, else `false`. */ function setCacheHas(value) { return this.__data__.has(value); } module.exports = setCacheHas; /***/ }, /* 412 */, /* 413 */, /* 414 */, /* 415 */, /* 416 */, /* 417 */, /* 418 */ /***/ function(module, exports) { /** * Checks if a `cache` value for `key` exists. * * @private * @param {Object} cache The cache to query. * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function cacheHas(cache, key) { return cache.has(key); } module.exports = cacheHas; /***/ }, /* 419 */, /* 420 */, /* 421 */, /* 422 */, /* 423 */, /* 424 */, /* 425 */, /* 426 */, /* 427 */, /* 428 */, /* 429 */, /* 430 */, /* 431 */, /* 432 */, /* 433 */, /* 434 */, /* 435 */, /* 436 */ /***/ function(module, exports) { /** * This method returns the first argument it receives. * * @static * @since 0.1.0 * @memberOf _ * @category Util * @param {*} value Any value. * @returns {*} Returns `value`. * @example * * var object = { 'a': 1 }; * * console.log(_.identity(object) === object); * // => true */ function identity(value) { return value; } module.exports = identity; /***/ }, /* 437 */, /* 438 */, /* 439 */, /* 440 */, /* 441 */, /* 442 */, /* 443 */, /* 444 */, /* 445 */, /* 446 */, /* 447 */, /* 448 */, /* 449 */, /* 450 */, /* 451 */, /* 452 */, /* 453 */, /* 454 */, /* 455 */, /* 456 */, /* 457 */, /* 458 */, /* 459 */, /* 460 */, /* 461 */, /* 462 */, /* 463 */, /* 464 */, /* 465 */, /* 466 */, /* 467 */, /* 468 */, /* 469 */, /* 470 */, /* 471 */, /* 472 */, /* 473 */, /* 474 */, /* 475 */, /* 476 */, /* 477 */, /* 478 */, /* 479 */, /* 480 */, /* 481 */, /* 482 */, /* 483 */, /* 484 */, /* 485 */, /* 486 */, /* 487 */, /* 488 */, /* 489 */, /* 490 */, /* 491 */, /* 492 */, /* 493 */, /* 494 */, /* 495 */, /* 496 */, /* 497 */, /* 498 */, /* 499 */, /* 500 */, /* 501 */, /* 502 */, /* 503 */, /* 504 */, /* 505 */, /* 506 */, /* 507 */, /* 508 */, /* 509 */, /* 510 */, /* 511 */, /* 512 */, /* 513 */, /* 514 */, /* 515 */, /* 516 */, /* 517 */, /* 518 */, /* 519 */, /* 520 */, /* 521 */, /* 522 */ /***/ function(module, exports, __webpack_require__) { var baseMatches = __webpack_require__(523), baseMatchesProperty = __webpack_require__(534), identity = __webpack_require__(436), isArray = __webpack_require__(70), property = __webpack_require__(538); /** * The base implementation of `_.iteratee`. * * @private * @param {*} [value=_.identity] The value to convert to an iteratee. * @returns {Function} Returns the iteratee. */ function baseIteratee(value) { // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. if (typeof value == 'function') { return value; } if (value == null) { return identity; } if (typeof value == 'object') { return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value); } return property(value); } module.exports = baseIteratee; /***/ }, /* 523 */ /***/ function(module, exports, __webpack_require__) { var baseIsMatch = __webpack_require__(524), getMatchData = __webpack_require__(531), matchesStrictComparable = __webpack_require__(533); /** * The base implementation of `_.matches` which doesn't clone `source`. * * @private * @param {Object} source The object of property values to match. * @returns {Function} Returns the new spec function. */ function baseMatches(source) { var matchData = getMatchData(source); if (matchData.length == 1 && matchData[0][2]) { return matchesStrictComparable(matchData[0][0], matchData[0][1]); } return function(object) { return object === source || baseIsMatch(object, source, matchData); }; } module.exports = baseMatches; /***/ }, /* 524 */ /***/ function(module, exports, __webpack_require__) { var Stack = __webpack_require__(366), baseIsEqual = __webpack_require__(525); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** * The base implementation of `_.isMatch` without support for iteratee shorthands. * * @private * @param {Object} object The object to inspect. * @param {Object} source The object of property values to match. * @param {Array} matchData The property names, values, and compare flags to match. * @param {Function} [customizer] The function to customize comparisons. * @returns {boolean} Returns `true` if `object` is a match, else `false`. */ function baseIsMatch(object, source, matchData, customizer) { var index = matchData.length, length = index, noCustomizer = !customizer; if (object == null) { return !length; } object = Object(object); while (index--) { var data = matchData[index]; if ((noCustomizer && data[2]) ? data[1] !== object[data[0]] : !(data[0] in object) ) { return false; } } while (++index < length) { data = matchData[index]; var key = data[0], objValue = object[key], srcValue = data[1]; if (noCustomizer && data[2]) { if (objValue === undefined && !(key in object)) { return false; } } else { var stack = new Stack; if (customizer) { var result = customizer(objValue, srcValue, key, object, source, stack); } if (!(result === undefined ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result )) { return false; } } } return true; } module.exports = baseIsMatch; /***/ }, /* 525 */ /***/ function(module, exports, __webpack_require__) { var baseIsEqualDeep = __webpack_require__(526), isObjectLike = __webpack_require__(14); /** * The base implementation of `_.isEqual` which supports partial comparisons * and tracks traversed objects. * * @private * @param {*} value The value to compare. * @param {*} other The other value to compare. * @param {boolean} bitmask The bitmask flags. * 1 - Unordered comparison * 2 - Partial comparison * @param {Function} [customizer] The function to customize comparisons. * @param {Object} [stack] Tracks traversed `value` and `other` objects. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. */ function baseIsEqual(value, other, bitmask, customizer, stack) { if (value === other) { return true; } if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { return value !== value && other !== other; } return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); } module.exports = baseIsEqual; /***/ }, /* 526 */ /***/ function(module, exports, __webpack_require__) { var Stack = __webpack_require__(366), equalArrays = __webpack_require__(527), equalByTag = __webpack_require__(529), equalObjects = __webpack_require__(530), getTag = __webpack_require__(198), isArray = __webpack_require__(70), isBuffer = __webpack_require__(210), isTypedArray = __webpack_require__(212); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1; /** `Object#toString` result references. */ var argsTag = '[object Arguments]', arrayTag = '[object Array]', objectTag = '[object Object]'; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * A specialized version of `baseIsEqual` for arrays and objects which performs * deep comparisons and tracks traversed objects enabling objects with circular * references to be compared. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} [stack] Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other); objTag = objTag == argsTag ? objectTag : objTag; othTag = othTag == argsTag ? objectTag : othTag; var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag; if (isSameTag && isBuffer(object)) { if (!isBuffer(other)) { return false; } objIsArr = true; objIsObj = false; } if (isSameTag && !objIsObj) { stack || (stack = new Stack); return (objIsArr || isTypedArray(object)) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); } if (!(bitmask & COMPARE_PARTIAL_FLAG)) { var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); if (objIsWrapped || othIsWrapped) { var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other; stack || (stack = new Stack); return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); } } if (!isSameTag) { return false; } stack || (stack = new Stack); return equalObjects(object, other, bitmask, customizer, equalFunc, stack); } module.exports = baseIsEqualDeep; /***/ }, /* 527 */ /***/ function(module, exports, __webpack_require__) { var SetCache = __webpack_require__(409), arraySome = __webpack_require__(528), cacheHas = __webpack_require__(418); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** * A specialized version of `baseIsEqualDeep` for arrays with support for * partial deep comparisons. * * @private * @param {Array} array The array to compare. * @param {Array} other The other array to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `array` and `other` objects. * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. */ function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length; if (arrLength != othLength && !(isPartial && othLength > arrLength)) { return false; } // Assume cyclic values are equal. var stacked = stack.get(array); if (stacked && stack.get(other)) { return stacked == other; } var index = -1, result = true, seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; stack.set(array, other); stack.set(other, array); // Ignore non-index properties. while (++index < arrLength) { var arrValue = array[index], othValue = other[index]; if (customizer) { var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack); } if (compared !== undefined) { if (compared) { continue; } result = false; break; } // Recursively compare arrays (susceptible to call stack limits). if (seen) { if (!arraySome(other, function(othValue, othIndex) { if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { return seen.push(othIndex); } })) { result = false; break; } } else if (!( arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack) )) { result = false; break; } } stack['delete'](array); stack['delete'](other); return result; } module.exports = equalArrays; /***/ }, /* 528 */ /***/ function(module, exports) { /** * A specialized version of `_.some` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {boolean} Returns `true` if any element passes the predicate check, * else `false`. */ function arraySome(array, predicate) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { if (predicate(array[index], index, array)) { return true; } } return false; } module.exports = arraySome; /***/ }, /* 529 */ /***/ function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(7), Uint8Array = __webpack_require__(394), eq = __webpack_require__(97), equalArrays = __webpack_require__(527), mapToArray = __webpack_require__(203), setToArray = __webpack_require__(402); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** `Object#toString` result references. */ var boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', mapTag = '[object Map]', numberTag = '[object Number]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', symbolTag = '[object Symbol]'; var arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]'; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; /** * A specialized version of `baseIsEqualDeep` for comparing objects of * the same `toStringTag`. * * **Note:** This function only supports comparing values with tags of * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {string} tag The `toStringTag` of the objects to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { switch (tag) { case dataViewTag: if ((object.byteLength != other.byteLength) || (object.byteOffset != other.byteOffset)) { return false; } object = object.buffer; other = other.buffer; case arrayBufferTag: if ((object.byteLength != other.byteLength) || !equalFunc(new Uint8Array(object), new Uint8Array(other))) { return false; } return true; case boolTag: case dateTag: case numberTag: // Coerce booleans to `1` or `0` and dates to milliseconds. // Invalid dates are coerced to `NaN`. return eq(+object, +other); case errorTag: return object.name == other.name && object.message == other.message; case regexpTag: case stringTag: // Coerce regexes to strings and treat strings, primitives and objects, // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring // for more details. return object == (other + ''); case mapTag: var convert = mapToArray; case setTag: var isPartial = bitmask & COMPARE_PARTIAL_FLAG; convert || (convert = setToArray); if (object.size != other.size && !isPartial) { return false; } // Assume cyclic values are equal. var stacked = stack.get(object); if (stacked) { return stacked == other; } bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits). stack.set(object, other); var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); stack['delete'](object); return result; case symbolTag: if (symbolValueOf) { return symbolValueOf.call(object) == symbolValueOf.call(other); } } return false; } module.exports = equalByTag; /***/ }, /* 530 */ /***/ function(module, exports, __webpack_require__) { var getAllKeys = __webpack_require__(388); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * A specialized version of `baseIsEqualDeep` for objects with support for * partial deep comparisons. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */ function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length; if (objLength != othLength && !isPartial) { return false; } var index = objLength; while (index--) { var key = objProps[index]; if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { return false; } } // Assume cyclic values are equal. var stacked = stack.get(object); if (stacked && stack.get(other)) { return stacked == other; } var result = true; stack.set(object, other); stack.set(other, object); var skipCtor = isPartial; while (++index < objLength) { key = objProps[index]; var objValue = object[key], othValue = other[key]; if (customizer) { var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); } // Recursively compare objects (susceptible to call stack limits). if (!(compared === undefined ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) : compared )) { result = false; break; } skipCtor || (skipCtor = key == 'constructor'); } if (result && !skipCtor) { var objCtor = object.constructor, othCtor = other.constructor; // Non `Object` object instances with different constructors are not equal. if (objCtor != othCtor && ('constructor' in object && 'constructor' in other) && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) { result = false; } } stack['delete'](object); stack['delete'](other); return result; } module.exports = equalObjects; /***/ }, /* 531 */ /***/ function(module, exports, __webpack_require__) { var isStrictComparable = __webpack_require__(532), keys = __webpack_require__(205); /** * Gets the property names, values, and compare flags of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the match data of `object`. */ function getMatchData(object) { var result = keys(object), length = result.length; while (length--) { var key = result[length], value = object[key]; result[length] = [key, value, isStrictComparable(value)]; } return result; } module.exports = getMatchData; /***/ }, /* 532 */ /***/ function(module, exports, __webpack_require__) { var isObject = __webpack_require__(84); /** * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` if suitable for strict * equality comparisons, else `false`. */ function isStrictComparable(value) { return value === value && !isObject(value); } module.exports = isStrictComparable; /***/ }, /* 533 */ /***/ function(module, exports) { /** * A specialized version of `matchesProperty` for source values suitable * for strict equality comparisons, i.e. `===`. * * @private * @param {string} key The key of the property to get. * @param {*} srcValue The value to match. * @returns {Function} Returns the new spec function. */ function matchesStrictComparable(key, srcValue) { return function(object) { if (object == null) { return false; } return object[key] === srcValue && (srcValue !== undefined || (key in Object(object))); }; } module.exports = matchesStrictComparable; /***/ }, /* 534 */ /***/ function(module, exports, __webpack_require__) { var baseIsEqual = __webpack_require__(525), get = __webpack_require__(67), hasIn = __webpack_require__(535), isKey = __webpack_require__(71), isStrictComparable = __webpack_require__(532), matchesStrictComparable = __webpack_require__(533), toKey = __webpack_require__(111); /** Used to compose bitmasks for value comparisons. */ var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; /** * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. * * @private * @param {string} path The path of the property to get. * @param {*} srcValue The value to match. * @returns {Function} Returns the new spec function. */ function baseMatchesProperty(path, srcValue) { if (isKey(path) && isStrictComparable(srcValue)) { return matchesStrictComparable(toKey(path), srcValue); } return function(object) { var objValue = get(object, path); return (objValue === undefined && objValue === srcValue) ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); }; } module.exports = baseMatchesProperty; /***/ }, /* 535 */ /***/ function(module, exports, __webpack_require__) { var baseHasIn = __webpack_require__(536), hasPath = __webpack_require__(537); /** * Checks if `path` is a direct or inherited property of `object`. * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @returns {boolean} Returns `true` if `path` exists, else `false`. * @example * * var object = _.create({ 'a': _.create({ 'b': 2 }) }); * * _.hasIn(object, 'a'); * // => true * * _.hasIn(object, 'a.b'); * // => true * * _.hasIn(object, ['a', 'b']); * // => true * * _.hasIn(object, 'b'); * // => false */ function hasIn(object, path) { return object != null && hasPath(object, path, baseHasIn); } module.exports = hasIn; /***/ }, /* 536 */ /***/ function(module, exports) { /** * The base implementation of `_.hasIn` without support for deep paths. * * @private * @param {Object} [object] The object to query. * @param {Array|string} key The key to check. * @returns {boolean} Returns `true` if `key` exists, else `false`. */ function baseHasIn(object, key) { return object != null && key in Object(object); } module.exports = baseHasIn; /***/ }, /* 537 */ /***/ function(module, exports, __webpack_require__) { var castPath = __webpack_require__(69), isArguments = __webpack_require__(208), isArray = __webpack_require__(70), isIndex = __webpack_require__(117), isLength = __webpack_require__(214), toKey = __webpack_require__(111); /** * Checks if `path` exists on `object`. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @param {Function} hasFunc The function to check properties. * @returns {boolean} Returns `true` if `path` exists, else `false`. */ function hasPath(object, path, hasFunc) { path = castPath(path, object); var index = -1, length = path.length, result = false; while (++index < length) { var key = toKey(path[index]); if (!(result = object != null && hasFunc(object, key))) { break; } object = object[key]; } if (result || ++index != length) { return result; } length = object == null ? 0 : object.length; return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)); } module.exports = hasPath; /***/ }, /* 538 */ /***/ function(module, exports, __webpack_require__) { var baseProperty = __webpack_require__(539), basePropertyDeep = __webpack_require__(540), isKey = __webpack_require__(71), toKey = __webpack_require__(111); /** * Creates a function that returns the value at `path` of a given object. * * @static * @memberOf _ * @since 2.4.0 * @category Util * @param {Array|string} path The path of the property to get. * @returns {Function} Returns the new accessor function. * @example * * var objects = [ * { 'a': { 'b': 2 } }, * { 'a': { 'b': 1 } } * ]; * * _.map(objects, _.property('a.b')); * // => [2, 1] * * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); * // => [1, 2] */ function property(path) { return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); } module.exports = property; /***/ }, /* 539 */ /***/ function(module, exports) { /** * The base implementation of `_.property` without support for deep paths. * * @private * @param {string} key The key of the property to get. * @returns {Function} Returns the new accessor function. */ function baseProperty(key) { return function(object) { return object == null ? undefined : object[key]; }; } module.exports = baseProperty; /***/ }, /* 540 */ /***/ function(module, exports, __webpack_require__) { var baseGet = __webpack_require__(68); /** * A specialized version of `baseProperty` which supports deep paths. * * @private * @param {Array|string} path The path of the property to get. * @returns {Function} Returns the new accessor function. */ function basePropertyDeep(path) { return function(object) { return baseGet(object, path); }; } module.exports = basePropertyDeep; /***/ }, /* 541 */, /* 542 */, /* 543 */, /* 544 */, /* 545 */, /* 546 */, /* 547 */, /* 548 */, /* 549 */, /* 550 */, /* 551 */, /* 552 */, /* 553 */, /* 554 */, /* 555 */, /* 556 */, /* 557 */, /* 558 */, /* 559 */, /* 560 */, /* 561 */, /* 562 */, /* 563 */, /* 564 */, /* 565 */, /* 566 */, /* 567 */, /* 568 */, /* 569 */, /* 570 */, /* 571 */, /* 572 */, /* 573 */, /* 574 */, /* 575 */, /* 576 */, /* 577 */, /* 578 */, /* 579 */, /* 580 */, /* 581 */, /* 582 */, /* 583 */, /* 584 */, /* 585 */, /* 586 */, /* 587 */, /* 588 */, /* 589 */, /* 590 */, /* 591 */, /* 592 */, /* 593 */, /* 594 */, /* 595 */, /* 596 */, /* 597 */, /* 598 */, /* 599 */, /* 600 */, /* 601 */, /* 602 */, /* 603 */, /* 604 */, /* 605 */, /* 606 */, /* 607 */, /* 608 */, /* 609 */, /* 610 */, /* 611 */, /* 612 */, /* 613 */, /* 614 */, /* 615 */, /* 616 */, /* 617 */, /* 618 */, /* 619 */, /* 620 */, /* 621 */, /* 622 */, /* 623 */, /* 624 */, /* 625 */, /* 626 */, /* 627 */, /* 628 */, /* 629 */ /***/ function(module, exports, __webpack_require__) { var createBaseFor = __webpack_require__(630); /** * The base implementation of `baseForOwn` which iterates over `object` * properties returned by `keysFunc` and invokes `iteratee` for each property. * Iteratee functions may exit iteration early by explicitly returning `false`. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @param {Function} keysFunc The function to get the keys of `object`. * @returns {Object} Returns `object`. */ var baseFor = createBaseFor(); module.exports = baseFor; /***/ }, /* 630 */ /***/ function(module, exports) { /** * Creates a base function for methods like `_.forIn` and `_.forOwn`. * * @private * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Function} Returns the new base function. */ function createBaseFor(fromRight) { return function(object, iteratee, keysFunc) { var index = -1, iterable = Object(object), props = keysFunc(object), length = props.length; while (length--) { var key = props[fromRight ? length : ++index]; if (iteratee(iterable[key], key, iterable) === false) { break; } } return object; }; } module.exports = createBaseFor; /***/ }, /* 631 */, /* 632 */, /* 633 */, /* 634 */, /* 635 */, /* 636 */, /* 637 */, /* 638 */, /* 639 */, /* 640 */, /* 641 */, /* 642 */, /* 643 */, /* 644 */, /* 645 */, /* 646 */, /* 647 */, /* 648 */, /* 649 */, /* 650 */, /* 651 */, /* 652 */, /* 653 */, /* 654 */, /* 655 */, /* 656 */, /* 657 */, /* 658 */, /* 659 */, /* 660 */, /* 661 */, /* 662 */, /* 663 */, /* 664 */, /* 665 */, /* 666 */, /* 667 */, /* 668 */, /* 669 */, /* 670 */, /* 671 */, /* 672 */, /* 673 */, /* 674 */, /* 675 */, /* 676 */, /* 677 */, /* 678 */, /* 679 */, /* 680 */, /* 681 */, /* 682 */, /* 683 */, /* 684 */, /* 685 */, /* 686 */, /* 687 */, /* 688 */, /* 689 */, /* 690 */, /* 691 */, /* 692 */, /* 693 */, /* 694 */, /* 695 */, /* 696 */, /* 697 */, /* 698 */, /* 699 */, /* 700 */, /* 701 */, /* 702 */, /* 703 */, /* 704 */, /* 705 */, /* 706 */, /* 707 */, /* 708 */, /* 709 */, /* 710 */, /* 711 */, /* 712 */, /* 713 */, /* 714 */, /* 715 */, /* 716 */, /* 717 */, /* 718 */, /* 719 */, /* 720 */, /* 721 */, /* 722 */, /* 723 */, /* 724 */, /* 725 */, /* 726 */, /* 727 */, /* 728 */, /* 729 */, /* 730 */, /* 731 */, /* 732 */, /* 733 */, /* 734 */, /* 735 */, /* 736 */, /* 737 */, /* 738 */, /* 739 */, /* 740 */, /* 741 */, /* 742 */, /* 743 */, /* 744 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var tests = __webpack_require__(745); var _require = __webpack_require__(753), setupTestRunner = _require.setupTestRunner; var utils = __webpack_require__(747); var _require2 = __webpack_require__(65), isDevelopment = _require2.isDevelopment; if (isDevelopment()) { __webpack_require__(779); } module.exports = Object.assign({}, tests, { setupTestRunner, utils }); /***/ }, /* 745 */ /***/ function(module, exports, __webpack_require__) { "use strict"; module.exports = { asm: __webpack_require__(746), breaking: __webpack_require__(756), breakpoints: __webpack_require__(757), breakpointsCond: __webpack_require__(758), callStack: __webpack_require__(759), expressions: __webpack_require__(760), debuggerButtons: __webpack_require__(761), editorSelect: __webpack_require__(762), editorGutter: __webpack_require__(763), editorHighlight: __webpack_require__(764), keyboardNavigation: __webpack_require__(765), keyboardShortcuts: __webpack_require__(766), iframes: __webpack_require__(767), navigation: __webpack_require__(768), pauseOnExceptions: __webpack_require__(769), prettyPrint: __webpack_require__(770), prettyPrintPaused: __webpack_require__(771), returnvalues: __webpack_require__(772), scopes: __webpack_require__(773), searching: __webpack_require__(774), sources: __webpack_require__(775), sourceMaps: __webpack_require__(776), sourceMaps2: __webpack_require__(777), sourceMapsBogus: __webpack_require__(778) }; /***/ }, /* 746 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var asm = (() => { var _ref = _asyncToGenerator(function* (ctx) { var is = ctx.is; var dbg = yield initDebugger("doc-asm.html"); var getSelectedSource = dbg.selectors.getSelectedSource, getState = dbg.getState; yield reload(dbg); // After reload() we are getting getSources notifiction for old sources, // using the debugger statement to really stop are reloaded page. yield waitForPaused(dbg); yield resume(dbg); yield waitForSources(dbg, "doc-asm.html", "asm.js"); // Expand nodes and make sure more sources appear. is(findAllElements(dbg, "sourceNodes").length, 2); clickElement(dbg, "sourceArrow", 2); is(findAllElements(dbg, "sourceNodes").length, 4); selectSource(dbg, 'asm.js'); yield addBreakpoint(dbg, "asm.js", 7); invokeInTab(dbg, "runAsm"); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "asm.js", 7); }); return function asm(_x) { return _ref.apply(this, arguments); }; })(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, invokeInTab = _require.invokeInTab, assertPausedLocation = _require.assertPausedLocation, clickElement = _require.clickElement, findAllElements = _require.findAllElements, addBreakpoint = _require.addBreakpoint, reload = _require.reload, waitForPaused = _require.waitForPaused, resume = _require.resume, selectSource = _require.selectSource, waitForSources = _require.waitForSources; module.exports = asm; /***/ }, /* 747 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var wait = __webpack_require__(748); var assert = __webpack_require__(752); var mocha = __webpack_require__(753); var commands = __webpack_require__(754); var shared = __webpack_require__(749); module.exports = Object.assign({}, wait, assert, mocha, commands, shared); /***/ }, /* 748 */ /***/ function(module, exports, __webpack_require__) { "use strict"; /** * Waits for `predicate(state)` to be true. `state` is the redux app state. * * @memberof mochitest/waits * @param {Object} dbg * @param {Function} predicate * @return {Promise} * @static */ var waitForState = (() => { var _ref = _asyncToGenerator(function* (dbg, predicate) { return new Promise(function (resolve) { var unsubscribe = dbg.store.subscribe(function () { if (predicate(dbg.store.getState())) { unsubscribe(); resolve(); } }); }); }); return function waitForState(_x, _x2) { return _ref.apply(this, arguments); }; })(); var waitForPaused = (() => { var _ref2 = _asyncToGenerator(function* (dbg) { // We want to make sure that we get both a real paused event and // that the state is fully populated. The client may do some more // work (call other client methods) before populating the state. yield waitForThreadEvents(dbg, "paused"), yield waitForState(dbg, function (state) { var pause = dbg.selectors.getPause(state); // Make sure we have the paused state. if (!pause) { return false; } // Make sure the source text is completely loaded for the // source we are paused in. var sourceId = pause.getIn(["frame", "location", "sourceId"]); var sourceText = dbg.selectors.getSourceText(dbg.getState(), sourceId); return sourceText && !sourceText.get("loading"); }); }); return function waitForPaused(_x3) { return _ref2.apply(this, arguments); }; })(); /** * Wait for a specific action type to be dispatch. * If an async action, will wait for it to be done. * * @memberof mochitest/waits * @param {Object} dbg * @param {String} type * @param {Number} eventRepeat * @return {Promise} * @static */ var waitForDispatch = (() => { var _ref3 = _asyncToGenerator(function* (dbg, type) { var _ref4 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, _ref4$useLaunchpad = _ref4.useLaunchpad, useLaunchpad = _ref4$useLaunchpad === undefined ? false : _ref4$useLaunchpad, _ref4$eventRepeat = _ref4.eventRepeat, eventRepeat = _ref4$eventRepeat === undefined ? 1 : _ref4$eventRepeat; var store = useLaunchpad ? dbg.launchpadStore : dbg.store; var count = 0; info("Waiting for " + type + " to dispatch " + eventRepeat + " time(s)"); while (count < eventRepeat) { yield _afterDispatchDone(store, type); count++; info(type + " dispatched " + count + " time(s)"); } }); return function waitForDispatch(_x4, _x5) { return _ref3.apply(this, arguments); }; })(); // Wait until an action of `type` is dispatched. If it's part of an // async operation, wait until the `status` field is "done" or "error" var _afterDispatchDone = (() => { var _ref5 = _asyncToGenerator(function* (store, type) { return new Promise(function (resolve) { store.dispatch({ // Normally we would use `services.WAIT_UNTIL`, but use the // internal name here so tests aren't forced to always pass it // in type: "@@service/waitUntil", predicate: function (action) { if (action.type === type) { return action.status ? action.status === "done" || action.status === "error" : true; } }, run: function (dispatch, getState, action) { resolve(action); } }); }); }); return function _afterDispatchDone(_x7, _x8) { return _ref5.apply(this, arguments); }; })(); // Wait until an action of `type` is dispatched. This is different // than `_afterDispatchDone` because it doesn't wait for async actions // to be done/errored. Use this if you want to listen for the "start" // action of an async operation (somewhat rare). var waitForNextDispatch = (() => { var _ref6 = _asyncToGenerator(function* (store, type) { return new Promise(function (resolve) { store.dispatch({ // Normally we would use `services.WAIT_UNTIL`, but use the // internal name here so tests aren't forced to always pass it // in type: "@@service/waitUntil", predicate: function (action) { return action.type === type; }, run: function (dispatch, getState, action) { resolve(action); } }); }); }); return function waitForNextDispatch(_x9, _x10) { return _ref6.apply(this, arguments); }; })(); var waitForTime = (() => { var _ref7 = _asyncToGenerator(function* (time) { return new Promise(function (resolve, reject) { setTimeout(resolve, time); }); }); return function waitForTime(_x11) { return _ref7.apply(this, arguments); }; })(); var waitForSources = (() => { var _ref8 = _asyncToGenerator(function* (dbg) { for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { sources[_key - 1] = arguments[_key]; } if (sources.length === 0) { return Promise.resolve(); } function sourceExists(state, url) { return getSources(state).some(s => { var sourceUrl = s.get("url"); return sourceUrl && sourceUrl.includes(url); }); } info("Waiting on sources: " + sources.join(", ")); var getSources = dbg.selectors.getSources, store = dbg.store; return Promise.all(sources.map(function (url) { if (!sourceExists(store.getState(), url)) { return waitForState(dbg, function () { return sourceExists(store.getState(), url); }); } })); }); return function waitForSources(_x12) { return _ref8.apply(this, arguments); }; })(); var waitForElement = (() => { var _ref9 = _asyncToGenerator(function* (dbg, selector) { return waitUntil(function () { return findElementWithSelector(dbg, selector); }); }); return function waitForElement(_x13, _x14) { return _ref9.apply(this, arguments); }; })(); var waitUntil = (() => { var _ref10 = _asyncToGenerator(function* (predicate) { var interval = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 20; return new Promise(function (resolve) { var timer = setInterval(function () { if (predicate()) { clearInterval(timer); resolve(); } }, interval); }); }); return function waitUntil(_x15) { return _ref10.apply(this, arguments); }; })(); /** * Waits for specific thread events. * * @memberof mochitest/waits * @param {Object} dbg * @param {String} eventName * @return {Promise} * @static */ var waitForThreadEvents = (() => { var _ref11 = _asyncToGenerator(function* (dbg, eventName) { info("Waiting for thread event '" + eventName + "' to fire."); var thread = dbg.threadClient; return new Promise(function (resolve, reject) { thread.addListener(eventName, function onEvent(eventName) { info("Thread event '" + eventName + "' fired."); thread.removeListener(eventName, onEvent); resolve.apply(resolve); }); }); }); return function waitForThreadEvents(_x17, _x18) { return _ref11.apply(this, arguments); }; })(); var waitForTargetEvent = (() => { var _ref12 = _asyncToGenerator(function* (dbg, eventName) { info("Waiting for target event '" + eventName + "' to fire."); var tabTarget = dbg.tabTarget; return new Promise(function (resolve, reject) { tabTarget.on(eventName, function onEvent(eventName) { info("Thread event '" + eventName + "' fired."); tabTarget.off(eventName, onEvent); resolve.apply(resolve); }); }); }); return function waitForTargetEvent(_x19, _x20) { return _ref12.apply(this, arguments); }; })(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(749), findElementWithSelector = _require.findElementWithSelector, info = _require.info; module.exports = { waitForPaused, waitForDispatch, waitForTime, waitForSources, waitForElement, waitForTargetEvent, waitForThreadEvents, waitUntil }; /***/ }, /* 749 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var mapValues = __webpack_require__(750); var selectors = { callStackHeader: ".call-stack-pane ._header", callStackBody: ".call-stack-pane .pane", scopesHeader: ".scopes-pane ._header", breakpointItem: i => `.breakpoints-list .breakpoint:nth-child(${i})`, scopeNode: i => `.scopes-list .tree-node:nth-child(${i}) .object-label`, scopeValue: i => `.scopes-list .tree-node:nth-child(${i}) .object-value`, expressionNode: i => `.expressions-list .tree-node:nth-child(${i}) .object-label`, expressionValue: i => `.expressions-list .tree-node:nth-child(${i}) .object-value`, expressionClose: i => `.expressions-list .expression-container:nth-child(${i}) .close-btn`, expressionNodes: ".expressions-list .tree-node", frame: i => `.frames ul li:nth-child(${i})`, frames: ".frames ul li", gutter: i => `.CodeMirror-code *:nth-child(${i}) .CodeMirror-linenumber`, menuitem: i => `menupopup menuitem:nth-child(${i})`, pauseOnExceptions: ".pause-exceptions", breakpoint: ".CodeMirror-code > .new-breakpoint", highlightLine: ".CodeMirror-code > .highlight-line", codeMirror: ".CodeMirror", resume: ".resume.active", stepOver: ".stepOver.active", stepOut: ".stepOut.active", stepIn: ".stepIn.active", toggleBreakpoints: ".breakpoints-toggle", prettyPrintButton: ".prettyPrint", sourceFooter: ".source-footer", sourceNode: i => `.sources-list .tree-node:nth-child(${i}) .node`, sourceNodes: ".sources-list .tree-node", sourceArrow: i => `.sources-list .tree-node:nth-child(${i}) .arrow` }; function findElement(dbg, elementName) { for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } var selector = getSelector.apply(undefined, [elementName].concat(args)); return findElementWithSelector(dbg, selector); } function findElementWithSelector(dbg, selector) { return dbg.win.document.querySelector(selector); } function findAllElements(dbg, elementName) { for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { args[_key2 - 2] = arguments[_key2]; } var selector = getSelector.apply(undefined, [elementName].concat(args)); return dbg.win.document.querySelectorAll(selector); } function getSelector(elementName) { var selector = selectors[elementName]; if (!selector) { throw new Error(`The selector ${elementName} is not defined`); } if (typeof selector == "function") { for (var _len3 = arguments.length, args = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { args[_key3 - 1] = arguments[_key3]; } selector = selector.apply(undefined, args); } return selector; } function findSource(dbg, url) { if (typeof url !== "string") { // Support passing in a source object itelf all APIs that use this // function support both styles return url; } var sources = dbg.selectors.getSources(dbg.getState()); var source = sources.find(s => { var sourceUrl = s.get("url"); return sourceUrl && sourceUrl.includes(url); }); if (!source) { throw new Error("Unable to find source: " + url); } return source.toJS(); } function isPaused(dbg) { var getPause = dbg.selectors.getPause, getState = dbg.getState; return !!getPause(getState()); } function isVisibleWithin(outerEl, innerEl) { var innerRect = innerEl.getBoundingClientRect(); var outerRect = outerEl.getBoundingClientRect(); return innerRect.top > outerRect.top && innerRect.bottom < outerRect.bottom; } function info(msg) { var message = `INFO: ${msg}\n`; if (typeof dump == "function") { dump(message); } console.log(message); } module.exports = { findElement, findElementWithSelector, findAllElements, findSource, selectors, getSelector, isPaused, isVisibleWithin, info }; /***/ }, /* 750 */ /***/ function(module, exports, __webpack_require__) { var baseAssignValue = __webpack_require__(115), baseForOwn = __webpack_require__(751), baseIteratee = __webpack_require__(522); /** * Creates an object with the same keys as `object` and values generated * by running each own enumerable string keyed property of `object` thru * `iteratee`. The iteratee is invoked with three arguments: * (value, key, object). * * @static * @memberOf _ * @since 2.4.0 * @category Object * @param {Object} object The object to iterate over. * @param {Function} [iteratee=_.identity] The function invoked per iteration. * @returns {Object} Returns the new mapped object. * @see _.mapKeys * @example * * var users = { * 'fred': { 'user': 'fred', 'age': 40 }, * 'pebbles': { 'user': 'pebbles', 'age': 1 } * }; * * _.mapValues(users, function(o) { return o.age; }); * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) * * // The `_.property` iteratee shorthand. * _.mapValues(users, 'age'); * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) */ function mapValues(object, iteratee) { var result = {}; iteratee = baseIteratee(iteratee, 3); baseForOwn(object, function(value, key, object) { baseAssignValue(result, key, iteratee(value, key, object)); }); return result; } module.exports = mapValues; /***/ }, /* 751 */ /***/ function(module, exports, __webpack_require__) { var baseFor = __webpack_require__(629), keys = __webpack_require__(205); /** * The base implementation of `_.forOwn` without support for iteratee shorthands. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Object} Returns `object`. */ function baseForOwn(object, iteratee) { return object && baseFor(object, iteratee, keys); } module.exports = baseForOwn; /***/ }, /* 752 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var _require = __webpack_require__(749), findSource = _require.findSource, findElement = _require.findElement, isVisibleWithin = _require.isVisibleWithin, isPaused = _require.isPaused; function assertPausedLocation(dbg, ctx, source, line) { var _dbg$selectors = dbg.selectors, getSelectedSource = _dbg$selectors.getSelectedSource, getPause = _dbg$selectors.getPause, getState = dbg.getState; source = findSource(dbg, source); var is = ctx.is, ok = ctx.ok; // Check the selected source is(getSelectedSource(getState()).get("id"), source.id); // Check the pause location var location = getPause(getState()).getIn(["frame", "location"]); is(location.get("sourceId"), source.id); is(location.get("line"), line); // Check the debug line ok(dbg.win.cm.lineInfo(line - 1).wrapClass.includes("debug-line"), "Line is highlighted as paused"); } function assertNotPaused(dbg, ctx) { var ok = ctx.ok; ok(!isPaused(dbg), "not paused"); } function assertHighlightLocation(dbg, ctx, source, line) { var _dbg$selectors2 = dbg.selectors, getSelectedSource = _dbg$selectors2.getSelectedSource, getPause = _dbg$selectors2.getPause, getState = dbg.getState; var is = ctx.is, ok = ctx.ok; source = findSource(dbg, source); // Check the selected source is(getSelectedSource(getState()).get("url"), source.url); // Check the highlight line var lineEl = findElement(dbg, "highlightLine"); ok(lineEl, "Line is highlighted"); ok(isVisibleWithin(findElement(dbg, "codeMirror"), lineEl), "Highlighted line is visible"); ok(dbg.win.cm.lineInfo(line - 1).wrapClass.includes("highlight-line"), "Line is highlighted"); } module.exports = { assertPausedLocation, assertNotPaused, assertHighlightLocation }; /***/ }, /* 753 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var initDebugger = (() => { var _ref = _asyncToGenerator(function* (url) { Services.prefs.clearUserPref("devtools.debugger.tabs"); Services.prefs.clearUserPref("devtools.debugger.pending-selected-location"); url = url.startsWith("data:") ? url : EXAMPLE_URL + url; var toolbox = yield openNewTabAndToolbox(url, "jsdebugger"); return createDebuggerContext(toolbox); }); return function initDebugger(_x) { return _ref.apply(this, arguments); }; })(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(749), info = _require.info; var ContentTask, gBrowser, isLinux, cmdOrCtrl, keyMappings, openNewTabAndToolbox, Services, EXAMPLE_URL, EventUtils; function setKeyboardMapping(isLinux, cmdOrCtrl) { return { sourceSearch: { code: "p", modifiers: cmdOrCtrl }, fileSearch: { code: "f", modifiers: cmdOrCtrl }, "Enter": { code: "VK_RETURN" }, "Up": { code: "VK_UP" }, "Down": { code: "VK_DOWN" }, "Tab": { code: "VK_TAB" }, "Escape": { code: "VK_ESCAPE" }, pauseKey: { code: "VK_F8" }, resumeKey: { code: "VK_F8" }, stepOverKey: { code: "VK_F10" }, stepInKey: { code: "VK_F11", modifiers: { ctrlKey: isLinux } }, stepOutKey: { code: "VK_F11", modifiers: { ctrlKey: isLinux, shiftKey: true } } }; } function setupTestRunner(context) { ContentTask = context.ContentTask; gBrowser = context.gBrowser; openNewTabAndToolbox = context.openNewTabAndToolbox; Services = context.Services; EXAMPLE_URL = context.EXAMPLE_URL; EventUtils = context.EventUtils; isLinux = Services.appinfo.OS === "Linux"; cmdOrCtrl = isLinux ? { ctrlKey: true } : { metaKey: true }; keyMappings = setKeyboardMapping(isLinux, cmdOrCtrl); } function invokeInTab(dbg, fnc) { info(`Invoking function ${fnc} in tab`); return ContentTask.spawn(gBrowser.selectedBrowser, fnc, function* (fnc) { content.wrappedJSObject[fnc](); // eslint-disable-line mozilla/no-cpows-in-tests, max-len }); } function evalInTab(dbg, script) { info(`evaling script ${script}`); return ContentTask.spawn(gBrowser.selectedBrowser, script, function (script) { content.eval(script); }); } function selectMenuItem(dbg, index) { // the context menu is in the toolbox window var doc = dbg.toolbox.win.document; // there are several context menus, we want the one with the menu-api var popup = doc.querySelector("menupopup[menu-api=\"true\"]"); var item = popup.querySelector(`menuitem:nth-child(${index})`); return EventUtils.synthesizeMouseAtCenter(item, {}, dbg.toolbox.win); } /** * Simulates a key press in the debugger window. * * @memberof mochitest/helpers * @param {Object} dbg * @param {String} keyName * @return {Promise} * @static */ function pressKey(dbg, keyName) { var keyEvent = keyMappings[keyName]; var code = keyEvent.code, modifiers = keyEvent.modifiers; return EventUtils.synthesizeKey(code, modifiers || {}, dbg.win); } function type(dbg, string) { string.split("").forEach(char => { EventUtils.synthesizeKey(char, {}, dbg.win); }); } function countSources(dbg) { var sources = dbg.selectors.getSources(dbg.getState()); return sources.size; } function createDebuggerContext(toolbox) { var win = toolbox.getPanel("jsdebugger").panelWin; var store = win.Debugger.store; return { actions: win.Debugger.actions, selectors: win.Debugger.selectors, getState: store.getState, store: store, client: win.Debugger.client, threadClient: toolbox.threadClient, toolbox: toolbox, win: win }; } module.exports = { invokeInTab, evalInTab, selectMenuItem, pressKey, type, countSources, setupTestRunner, info, initDebugger, environment: "mochitest" }; /***/ }, /* 754 */ /***/ function(module, exports, __webpack_require__) { "use strict"; /** * Selects the source. * * @memberof mochitest/actions * @param {Object} dbg * @param {String} url * @param {Number} line * @return {Promise} * @static */ var selectSource = (() => { var _ref = _asyncToGenerator(function* (dbg, url, line) { info("Selecting source: " + url); var source = findSource(dbg, url); var hasText = !!dbg.selectors.getSourceText(dbg.getState(), source.id); yield dbg.actions.selectSource(source.id, { line }); if (!hasText) { yield waitForDispatch(dbg, "LOAD_SOURCE_TEXT"); } }); return function selectSource(_x, _x2, _x3) { return _ref.apply(this, arguments); }; })(); /** * Steps over. * * @memberof mochitest/actions * @param {Object} dbg * @return {Promise} * @static */ var stepOver = (() => { var _ref2 = _asyncToGenerator(function* (dbg) { info("Stepping over"); dbg.actions.stepOver(); return waitForPaused(dbg); }); return function stepOver(_x4) { return _ref2.apply(this, arguments); }; })(); /** * Steps in. * * @memberof mochitest/actions * @param {Object} dbg * @return {Promise} * @static */ var stepIn = (() => { var _ref3 = _asyncToGenerator(function* (dbg) { info("Stepping in"); dbg.actions.stepIn(); return waitForPaused(dbg); }); return function stepIn(_x5) { return _ref3.apply(this, arguments); }; })(); /** * Steps out. * * @memberof mochitest/actions * @param {Object} dbg * @return {Promise} * @static */ var stepOut = (() => { var _ref4 = _asyncToGenerator(function* (dbg) { info("Stepping out"); dbg.actions.stepOut(); return waitForPaused(dbg); }); return function stepOut(_x6) { return _ref4.apply(this, arguments); }; })(); /** * Resumes. * * @memberof mochitest/actions * @param {Object} dbg * @return {Promise} * @static */ var resume = (() => { var _ref5 = _asyncToGenerator(function* (dbg) { info("Resuming"); dbg.actions.resume(); return waitForThreadEvents(dbg, "resumed"); }); return function resume(_x7) { return _ref5.apply(this, arguments); }; })(); /** * Reloads the debuggee. * * @memberof mochitest/actions * @param {Object} dbg * @param {Array} sources * @return {Promise} * @static */ var reload = (() => { var _ref6 = _asyncToGenerator(function* (dbg) { for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { sources[_key - 1] = arguments[_key]; } return dbg.client.reload().then(function () { return waitForSources.apply(undefined, [dbg].concat(sources)); }); }); return function reload(_x8) { return _ref6.apply(this, arguments); }; })(); /** * Navigates the debuggee to another url. * * @memberof mochitest/actions * @param {Object} dbg * @param {String} url * @param {Array} sources * @return {Promise} * @static */ var navigate = (() => { var _ref7 = _asyncToGenerator(function* (dbg, url) { dbg.client.navigate(url); for (var _len2 = arguments.length, sources = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { sources[_key2 - 2] = arguments[_key2]; } return waitForSources.apply(undefined, [dbg].concat(sources)); }); return function navigate(_x9, _x10) { return _ref7.apply(this, arguments); }; })(); /** * Adds a breakpoint to a source at line/col. * * @memberof mochitest/actions * @param {Object} dbg * @param {String} source * @param {Number} line * @param {Number} col * @return {Promise} * @static */ var addBreakpoint = (() => { var _ref8 = _asyncToGenerator(function* (dbg, source, line, col) { source = findSource(dbg, source); var sourceId = source.id; dbg.actions.addBreakpoint({ sourceId, line, col }); return waitForDispatch(dbg, "ADD_BREAKPOINT"); }); return function addBreakpoint(_x11, _x12, _x13, _x14) { return _ref8.apply(this, arguments); }; })(); /** * Removes a breakpoint from a source at line/col. * * @memberof mochitest/actions * @param {Object} dbg * @param {String} source * @param {Number} line * @param {Number} col * @return {Promise} * @static */ var removeBreakpoint = (() => { var _ref9 = _asyncToGenerator(function* (dbg, sourceId, line, col) { return dbg.actions.removeBreakpoint({ sourceId, line, col }); }); return function removeBreakpoint(_x15, _x16, _x17, _x18) { return _ref9.apply(this, arguments); }; })(); /** * Toggles the Pause on exceptions feature in the debugger. * * @memberof mochitest/actions * @param {Object} dbg * @param {Boolean} pauseOnExceptions * @param {Boolean} ignoreCaughtExceptions * @return {Promise} * @static */ var togglePauseOnExceptions = (() => { var _ref10 = _asyncToGenerator(function* (dbg, pauseOnExceptions, ignoreCaughtExceptions) { var command = dbg.actions.pauseOnExceptions(pauseOnExceptions, ignoreCaughtExceptions); if (!isPaused(dbg)) { return waitForThreadEvents(dbg, "resumed"); } return command; }); return function togglePauseOnExceptions(_x19, _x20, _x21) { return _ref10.apply(this, arguments); }; })(); var clickElement = (() => { var _ref11 = _asyncToGenerator(function* (dbg, elementName) { for (var _len3 = arguments.length, args = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) { args[_key3 - 2] = arguments[_key3]; } var selector = getSelector.apply(undefined, [elementName].concat(args)); var el = dbg.win.document.querySelector(selector); clickEl(dbg.win, el); }); return function clickElement(_x22, _x23) { return _ref11.apply(this, arguments); }; })(); var dblClickElement = (() => { var _ref12 = _asyncToGenerator(function* (dbg, elementName) { for (var _len4 = arguments.length, args = Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) { args[_key4 - 2] = arguments[_key4]; } var selector = getSelector.apply(undefined, [elementName].concat(args)); var el = dbg.win.document.querySelector(selector); dblClickEl(dbg.win, el); }); return function dblClickElement(_x24, _x25) { return _ref12.apply(this, arguments); }; })(); var rightClickElement = (() => { var _ref13 = _asyncToGenerator(function* (dbg, elementName) { for (var _len5 = arguments.length, args = Array(_len5 > 2 ? _len5 - 2 : 0), _key5 = 2; _key5 < _len5; _key5++) { args[_key5 - 2] = arguments[_key5]; } var selector = getSelector.apply(undefined, [elementName].concat(args)); var el = dbg.win.document.querySelector(selector); info('right click on the gutter', el); rightClickEl(dbg.win, el); }); return function rightClickElement(_x26, _x27) { return _ref13.apply(this, arguments); }; })(); // NOTE: we should fix this for mochitests. It's likely that `this` would work. function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(755), clickEl = _require.clickEl, rightClickEl = _require.rightClickEl, dblClickEl = _require.dblClickEl; function info(msg) { console.log(`info: ${msg}\n`); } var _require2 = __webpack_require__(753), evalInTab = _require2.evalInTab, invokeInTab = _require2.invokeInTab, selectMenuItem = _require2.selectMenuItem, pressKey = _require2.pressKey, type = _require2.type; var _require3 = __webpack_require__(749), selectors = _require3.selectors, findSource = _require3.findSource, getSelector = _require3.getSelector, info = _require3.info, isPaused = _require3.isPaused; var _require4 = __webpack_require__(748), waitForSources = _require4.waitForSources, waitForDispatch = _require4.waitForDispatch, waitForPaused = _require4.waitForPaused, waitForThreadEvents = _require4.waitForThreadEvents; var winObj = typeof window == "Object" ? window : {}; winObj.resumeTest = undefined; /** * Pause the test and let you interact with the debugger. * The test can be resumed by invoking `resumeTest` in the console. * * @memberof mochitest * @static */ function pauseTest() { info("Test paused. Invoke resumeTest to continue."); return new Promise(resolve => resumeTest = resolve); } module.exports = { selectSource, stepOver, stepIn, stepOut, resume, reload, navigate, addBreakpoint, removeBreakpoint, togglePauseOnExceptions, clickElement, navigate, invokeInTab, evalInTab, rightClickElement, dblClickElement, selectMenuItem, type, pressKey, pauseTest }; /***/ }, /* 755 */ /***/ function(module, exports) { "use strict"; function triggerMouseEvent(_ref) { var type = _ref.type, _ref$props = _ref.props, props = _ref$props === undefined ? {} : _ref$props, win = _ref.win, el = _ref.el; var event = new win.Event(type, { "view": win, "bubbles": true, "cancelable": true }); var rect = el.getBoundingClientRect(); event = Object.assign(event, props, { clientX: (rect.left + rect.right) / 2, clientY: (rect.top + rect.bottom) / 2 }); el.dispatchEvent(event); } function clickEl(win, el) { triggerMouseEvent({ type: "mousedown", win: win, el }); triggerMouseEvent({ type: "click", win: win, el }); return triggerMouseEvent({ type: "mouseup", win: win, el }); } function rightClickEl(win, el) { return triggerMouseEvent({ type: "contextmenu", props: { which: 3 }, win, el }); } function dblClickEl(win, el) { return triggerMouseEvent({ type: "dblclick", win, el }); } module.exports = { clickEl, rightClickEl, dblClickEl }; /***/ }, /* 756 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), assertPausedLocation = _require.assertPausedLocation, findSource = _require.findSource, findElement = _require.findElement, selectSource = _require.selectSource, clickElement = _require.clickElement, addBreakpoint = _require.addBreakpoint, reload = _require.reload, stepOver = _require.stepOver, invokeInTab = _require.invokeInTab, resume = _require.resume, waitForPaused = _require.waitForPaused, waitForDispatch = _require.waitForDispatch, setupTestRunner = _require.setupTestRunner, initDebugger = _require.initDebugger; module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is; var dbg = yield initDebugger("doc-scripts.html", "scripts.html"); var getSelectedSource = dbg.selectors.getSelectedSource, getState = dbg.getState; // Make sure we can set a top-level breakpoint and it will be hit on // reload. yield addBreakpoint(dbg, "scripts.html", 18); reload(dbg); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "scripts.html", 18); yield resume(dbg); var paused = waitForPaused(dbg); // Create an eval script that pauses itself. invokeInTab(dbg, "doEval"); yield paused; yield resume(dbg); var source = getSelectedSource(getState()).toJS(); ok(!source.url, "It is an eval source"); yield addBreakpoint(dbg, source, 5); invokeInTab(dbg, "evaledFunc"); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, source, 5); }); function breaking(_x) { return _ref.apply(this, arguments); } return breaking; })(); /***/ }, /* 757 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var removeBreakpoint = (() => { var _ref = _asyncToGenerator(function* (dbg, index) { var bp = findElement(dbg, "breakpointItem", index); bp.querySelector(".close-btn").click(); yield waitForDispatch(dbg, "REMOVE_BREAKPOINT"); }); return function removeBreakpoint(_x, _x2) { return _ref.apply(this, arguments); }; })(); var disableBreakpoint = (() => { var _ref2 = _asyncToGenerator(function* (dbg, index) { toggleBreakpoint(dbg, index); yield waitForDispatch(dbg, "REMOVE_BREAKPOINT"); }); return function disableBreakpoint(_x3, _x4) { return _ref2.apply(this, arguments); }; })(); var enableBreakpoint = (() => { var _ref3 = _asyncToGenerator(function* (dbg, index) { toggleBreakpoint(dbg, index); yield waitForDispatch(dbg, "ADD_BREAKPOINT"); }); return function enableBreakpoint(_x5, _x6) { return _ref3.apply(this, arguments); }; })(); var toggleBreakpoints = (() => { var _ref4 = _asyncToGenerator(function* (dbg) { clickElement(dbg, "toggleBreakpoints"); yield waitForDispatch(dbg, "TOGGLE_BREAKPOINTS"); }); return function toggleBreakpoints(_x7) { return _ref4.apply(this, arguments); }; })(); var toggle = (() => { var _ref5 = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-scripts.html"); // Create two breakpoints yield selectSource(dbg, "simple2"); yield addBreakpoint(dbg, "simple2", 3); yield addBreakpoint(dbg, "simple2", 5); // Disable the first one yield disableBreakpoint(dbg, 1); var bp1 = findBreakpoint(dbg, "simple2", 3); var bp2 = findBreakpoint(dbg, "simple2", 5); is(bp1.disabled, true, "first breakpoint is disabled"); is(bp2.disabled, false, "second breakpoint is enabled"); // Disable and Re-Enable the second one yield disableBreakpoint(dbg, 2); yield enableBreakpoint(dbg, 2); bp2 = findBreakpoint(dbg, "simple2", 5); is(bp2.disabled, false, "second breakpoint is enabled"); }); return function toggle(_x8) { return _ref5.apply(this, arguments); }; })(); // toggle all var toggleAll = (() => { var _ref6 = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-scripts.html"); // Create two breakpoints yield selectSource(dbg, "simple2"); yield addBreakpoint(dbg, "simple2", 3); yield addBreakpoint(dbg, "simple2", 5); // Disable all of the breakpoints yield toggleBreakpoints(dbg); var bp1 = findBreakpoint(dbg, "simple2", 3); var bp2 = findBreakpoint(dbg, "simple2", 5); is(bp1.disabled, true, "first breakpoint is disabled"); is(bp2.disabled, true, "second breakpoint is disabled"); // Enable all of the breakpoints yield toggleBreakpoints(dbg); bp1 = findBreakpoint(dbg, "simple2", 3); bp2 = findBreakpoint(dbg, "simple2", 5); is(bp1.disabled, false, "first breakpoint is enabled"); is(bp2.disabled, false, "second breakpoint is enabled"); // Remove the breakpoints yield removeBreakpoint(dbg, 1); yield removeBreakpoint(dbg, 1); var bps = findBreakpoints(dbg); is(bps.size, 0, "breakpoints are removed"); }); return function toggleAll(_x9) { return _ref6.apply(this, arguments); }; })(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, assertPausedLocation = _require.assertPausedLocation, findElement = _require.findElement, findSource = _require.findSource, selectSource = _require.selectSource, clickElement = _require.clickElement, addBreakpoint = _require.addBreakpoint, waitForDispatch = _require.waitForDispatch; function toggleBreakpoint(dbg, index) { var bp = findElement(dbg, "breakpointItem", index); var input = bp.querySelector("input"); input.click(); } function findBreakpoint(dbg, url, line) { var getBreakpoint = dbg.selectors.getBreakpoint, getState = dbg.getState; var source = findSource(dbg, url); return getBreakpoint(getState(), { sourceId: source.id, line }); } function findBreakpoints(dbg) { var getBreakpoints = dbg.selectors.getBreakpoints, getState = dbg.getState; return getBreakpoints(getState()); } module.exports = { toggle, toggleAll }; /***/ }, /* 758 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var setConditionalBreakpoint = (() => { var _ref = _asyncToGenerator(function* (dbg, _ref2, index, condition) { var info = _ref2.info; info("right click on the gutter"); rightClickElement(dbg, "gutter", index); selectMenuItem(dbg, 2); yield waitForElement(dbg, cbInput); var el = findElementWithSelector(dbg, cbInput); type(dbg, condition); pressKey(dbg, "Enter"); }); return function setConditionalBreakpoint(_x, _x2, _x3, _x4) { return _ref.apply(this, arguments); }; })(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), waitForPaused = _require.waitForPaused, waitForElement = _require.waitForElement, waitForDispatch = _require.waitForDispatch, findSource = _require.findSource, findElement = _require.findElement, findElementWithSelector = _require.findElementWithSelector, selectSource = _require.selectSource, clickElement = _require.clickElement, rightClickElement = _require.rightClickElement, selectMenuItem = _require.selectMenuItem, type = _require.type, pressKey = _require.pressKey, initDebugger = _require.initDebugger; var cbInput = ".conditional-breakpoint-panel input"; function findBreakpoint(dbg, url, line) { var getBreakpoint = dbg.selectors.getBreakpoint, getState = dbg.getState; var source = findSource(dbg, url); return getBreakpoint(getState(), { sourceId: source.id, line }); } module.exports = (() => { var _ref3 = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-scripts.html", "simple2"); yield selectSource(dbg, "simple2"); info("Adding a conditional Breakpoint"); yield setConditionalBreakpoint(dbg, ctx, 5, "1"); yield waitForDispatch(dbg, "ADD_BREAKPOINT"); var bp = findBreakpoint(dbg, "simple2", 5); is(bp.condition, "1", "breakpoint is created with the condition"); info("Editing a conditional Breakpoint"); yield setConditionalBreakpoint(dbg, ctx, 5, "2"); yield waitForDispatch(dbg, "SET_BREAKPOINT_CONDITION"); bp = findBreakpoint(dbg, "simple2", 5); is(bp.condition, "12", "breakpoint is created with the condition"); info("Removing a conditional breakpoint"); clickElement(dbg, "gutter", 5); yield waitForDispatch(dbg, "REMOVE_BREAKPOINT"); bp = findBreakpoint(dbg, "simple2", 5); is(bp, undefined, "breakpoint was removed"); info("Adding a condition to a breakpoint"); clickElement(dbg, "gutter", 5); yield waitForDispatch(dbg, "ADD_BREAKPOINT"); yield setConditionalBreakpoint(dbg, ctx, 5, "1"); bp = findBreakpoint(dbg, "simple2", 5); is(bp.condition, "1", "breakpoint is created with the condition"); }); function breakpointsCond(_x5) { return _ref3.apply(this, arguments); } return breakpointsCond; })(); /***/ }, /* 759 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var test1 = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-script-switching.html"); toggleCallStack(dbg); var notPaused = findElement(dbg, "callStackBody").innerText.trim(); is(notPaused, "Not Paused", "Not paused message is shown"); invokeInTab(dbg, "firstCall"); yield waitForPaused(dbg); ok(isFrameSelected(dbg, 1, "secondCall"), "the first frame is selected"); clickElement(dbg, "frame", 2); ok(isFrameSelected(dbg, 2, "firstCall"), "the second frame is selected"); var button = toggleButton(dbg); ok(!button, "toggle button shouldn't be there"); }); return function test1(_x) { return _ref.apply(this, arguments); }; })(); var test2 = (() => { var _ref2 = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-frames.html"); toggleCallStack(dbg); invokeInTab(dbg, "startRecursion"); yield waitForPaused(dbg); ok(isFrameSelected(dbg, 1, "recurseA"), "the first frame is selected"); // check to make sure that the toggle button isn't there var button = toggleButton(dbg); var frames = findAllElements(dbg, "frames"); is(button.innerText, "Expand Rows", "toggle button should be expand"); is(frames.length, 7, "There should be at most seven frames"); button.click(); button = toggleButton(dbg); frames = findAllElements(dbg, "frames"); is(button.innerText, "Collapse Rows", "toggle button should be collapse"); // the web runner uses an console eval to call the function, which adds an extra frame var frameCount = environment == "mocha" ? 23 : 22; is(frames.length, frameCount, "All of the frames should be shown"); }); return function test2(_x2) { return _ref2.apply(this, arguments); }; })(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, environment = _require.environment, assertPausedLocation = _require.assertPausedLocation, waitForPaused = _require.waitForPaused, invokeInTab = _require.invokeInTab, clickElement = _require.clickElement, findElement = _require.findElement, findAllElements = _require.findAllElements, reload = _require.reload; // checks to see if the frame is selected and the title is correct function isFrameSelected(dbg, index, title) { var $frame = findElement(dbg, "frame", index); var frame = dbg.selectors.getSelectedFrame(dbg.getState()); var elSelected = $frame.classList.contains("selected"); var titleSelected = frame.displayName == title; return elSelected && titleSelected; } function toggleButton(dbg) { var callStackBody = findElement(dbg, "callStackBody"); return callStackBody.querySelector(".show-more"); } function toggleCallStack(dbg) { return findElement(dbg, "callStackHeader").click(); } module.exports = { test1, test2 }; /***/ }, /* 760 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var addExpression = (() => { var _ref = _asyncToGenerator(function* (dbg, input) { info("Adding an expression"); findElementWithSelector(dbg, selectors.input).focus(); type(dbg, input); pressKey(dbg, "Enter"); yield waitForDispatch(dbg, "EVALUATE_EXPRESSION"); }); return function addExpression(_x, _x2) { return _ref.apply(this, arguments); }; })(); var editExpression = (() => { var _ref2 = _asyncToGenerator(function* (dbg, input) { info("updating the expression"); dblClickElement(dbg, "expressionNode", 1); type(dbg, input); pressKey(dbg, "Enter"); yield waitForDispatch(dbg, "EVALUATE_EXPRESSION"); }); return function editExpression(_x3, _x4) { return _ref2.apply(this, arguments); }; })(); var deleteExpression = (() => { var _ref3 = _asyncToGenerator(function* (dbg, index) { info("Deleting the expression"); var deleteExpression = waitForDispatch(dbg, "DELETE_EXPRESSION"); clickElement(dbg, "expressionClose", index); yield deleteExpression; }); return function deleteExpression(_x5, _x6) { return _ref3.apply(this, arguments); }; })(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, assertPausedLocation = _require.assertPausedLocation, findSource = _require.findSource, addBreakpoint = _require.addBreakpoint, waitForPaused = _require.waitForPaused, waitForDispatch = _require.waitForDispatch, type = _require.type, pressKey = _require.pressKey, findElementWithSelector = _require.findElementWithSelector, findElement = _require.findElement, findAllElements = _require.findAllElements, invokeInTab = _require.invokeInTab, clickElement = _require.clickElement, dblClickElement = _require.dblClickElement; /** * tests the watch expressions component * 1. add watch expressions * 2. edit watch expressions * 3. delete watch expressions */ var selectors = { input: "input.input-expression" }; function getLabel(dbg, index) { return findElement(dbg, "expressionNode", index).innerText; } function getValue(dbg, index) { return findElement(dbg, "expressionValue", index).innerText; } module.exports = (() => { var _ref4 = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info, requestLongerTimeout = ctx.requestLongerTimeout; var dbg = yield initDebugger("doc-script-switching.html"); invokeInTab(dbg, "firstCall"); yield waitForPaused(dbg); yield addExpression(dbg, "f"); is(getLabel(dbg, 1), "f"); is(getValue(dbg, 1), "ReferenceError"); yield editExpression(dbg, "oo"); is(getLabel(dbg, 1), "foo"); is(getValue(dbg, 1), "function foo()"); yield deleteExpression(dbg, 1); is(findAllElements(dbg, "expressionNodes").length, 0); }); return function (_x7) { return _ref4.apply(this, arguments); }; })(); /***/ }, /* 761 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, assertPausedLocation = _require.assertPausedLocation, waitForPaused = _require.waitForPaused, invokeInTab = _require.invokeInTab, clickElement = _require.clickElement, findElement = _require.findElement, reload = _require.reload; function clickStepOver(dbg) { clickElement(dbg, "stepOver"); return waitForPaused(dbg); } function clickStepIn(dbg) { clickElement(dbg, "stepIn"); return waitForPaused(dbg); } function clickStepOut(dbg) { clickElement(dbg, "stepOut"); return waitForPaused(dbg); } /** * Test debugger buttons * 1. resume * 2. stepOver * 3. stepIn * 4. stepOver to the end of a function * 5. stepUp at the end of a function */ module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-debugger-statements.html"); yield reload(dbg); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 8); // resume clickElement(dbg, "resume"); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 12); // step over yield clickStepOver(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 13); // step into yield clickStepIn(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 18); // step over yield clickStepOver(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 20); // step out yield clickStepOut(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 20); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 762 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, assertPausedLocation = _require.assertPausedLocation, findSource = _require.findSource, addBreakpoint = _require.addBreakpoint, waitForPaused = _require.waitForPaused, invokeInTab = _require.invokeInTab, clickElement = _require.clickElement, findElement = _require.findElement, stepIn = _require.stepIn, stepOut = _require.stepOut, resume = _require.resume, isVisibleWithin = _require.isVisibleWithin; // Tests that the editor highlights the correct location when the // debugger pauses // checks to see if the first breakpoint is visible function isElementVisible(dbg, elementName) { var bpLine = findElement(dbg, elementName); var cm = findElement(dbg, "codeMirror"); return bpLine && isVisibleWithin(cm, bpLine); } module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info, requestLongerTimeout = ctx.requestLongerTimeout; // This test runs too slowly on linux debug. I'd like to figure out // which is the slowest part of this and make it run faster, but to // fix a frequent failure allow a longer timeout. requestLongerTimeout(2); var dbg = yield initDebugger("doc-scripts.html"); var getSelectedSource = dbg.selectors.getSelectedSource, getState = dbg.getState; var simple1 = findSource(dbg, "simple1.js"); var simple2 = findSource(dbg, "simple2.js"); // Set the initial breakpoint. yield addBreakpoint(dbg, simple1, 4); ok(!getSelectedSource(getState()), "No selected source"); // Call the function that we set a breakpoint in. invokeInTab(dbg, "main"); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, simple1, 4); // Step through to another file and make sure it's paused in the // right place. yield stepIn(dbg); assertPausedLocation(dbg, ctx, simple2, 2); // Step back out to the initial file. yield stepOut(dbg); yield stepOut(dbg); assertPausedLocation(dbg, ctx, simple1, 5); yield resume(dbg); // Make sure that we can set a breakpoint on a line out of the // viewport, and that pausing there scrolls the editor to it. var longSrc = findSource(dbg, "long.js"); yield addBreakpoint(dbg, longSrc, 66); invokeInTab(dbg, "testModel"); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, longSrc, 66); ok(isElementVisible(dbg, "breakpoint"), "Breakpoint is visible"); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 763 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, clickElement = _require.clickElement, assertPausedLocation = _require.assertPausedLocation, findSource = _require.findSource, selectSource = _require.selectSource, addBreakpoint = _require.addBreakpoint, assertHighlightLocation = _require.assertHighlightLocation, waitForPaused = _require.waitForPaused, waitForDispatch = _require.waitForDispatch; // Tests the breakpoint gutter and making sure breakpoint icons exist // correctly // Utilities for interacting with the editor function clickGutter(dbg, line) { clickElement(dbg, "gutter", line); } function getLineEl(dbg, line) { var lines = dbg.win.document.querySelectorAll(".CodeMirror-code > div"); return lines[line - 1]; } function assertEditorBreakpoint(dbg, ctx, line, shouldExist) { var ok = ctx.ok; var exists = !!getLineEl(dbg, line).querySelector(".new-breakpoint"); ok(exists === shouldExist, "Breakpoint " + (shouldExist ? "exists" : "does not exist") + " on line " + line); } module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-scripts.html"); var _dbg$selectors = dbg.selectors, getBreakpoints = _dbg$selectors.getBreakpoints, getBreakpoint = _dbg$selectors.getBreakpoint, getState = dbg.getState; var source = findSource(dbg, "simple1.js"); yield selectSource(dbg, source.url); // Make sure that clicking the gutter creates a breakpoint icon. clickGutter(dbg, 4); yield waitForDispatch(dbg, "ADD_BREAKPOINT"); is(getBreakpoints(getState()).size, 1, "One breakpoint exists"); assertEditorBreakpoint(dbg, ctx, 4, true); // Make sure clicking at the same place removes the icon. clickGutter(dbg, 4); yield waitForDispatch(dbg, "REMOVE_BREAKPOINT"); is(getBreakpoints(getState()).size, 0, "No breakpoints exist"); assertEditorBreakpoint(dbg, ctx, 4, false); // Test that a breakpoint icon slides down to the correct line. clickGutter(dbg, 2); yield waitForDispatch(dbg, "ADD_BREAKPOINT"); is(getBreakpoints(getState()).size, 1, "One breakpoint exists"); ok(getBreakpoint(getState(), { sourceId: source.id, line: 4 }), "Breakpoint has correct line"); assertEditorBreakpoint(dbg, ctx, 2, false); assertEditorBreakpoint(dbg, ctx, 4, true); // Do the same sliding and make sure it works if there's already a // breakpoint. clickGutter(dbg, 2); yield waitForDispatch(dbg, "ADD_BREAKPOINT"); is(getBreakpoints(getState()).size, 1, "One breakpoint exists"); assertEditorBreakpoint(dbg, ctx, 2, false); assertEditorBreakpoint(dbg, ctx, 4, true); clickGutter(dbg, 4); yield waitForDispatch(dbg, "REMOVE_BREAKPOINT"); is(getBreakpoints(getState()).size, 0, "No breakpoints exist"); assertEditorBreakpoint(dbg, ctx, 4, false); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 764 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, assertPausedLocation = _require.assertPausedLocation, findSource = _require.findSource, addBreakpoint = _require.addBreakpoint, assertHighlightLocation = _require.assertHighlightLocation, selectSource = _require.selectSource, findAllElements = _require.findAllElements, waitForPaused = _require.waitForPaused, waitForDispatch = _require.waitForDispatch; // Tests that the editor will always highight the right line, no // matter if the source text doesn't exist yet or even if the source // doesn't exist. module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info, EXAMPLE_URL = ctx.EXAMPLE_URL; var dbg = yield initDebugger("doc-scripts.html"); var getSourceText = dbg.selectors.getSourceText, getState = dbg.getState; var sourceUrl = EXAMPLE_URL + "long.js"; // The source itself doesn't even exist yet, and using // `selectSourceURL` will set a pending request to load this source // and highlight a specific line. dbg.actions.selectSourceURL(sourceUrl, { line: 66 }); // Wait for the source text to load and make sure we're in the right // place. yield waitForDispatch(dbg, "LOAD_SOURCE_TEXT"); assertHighlightLocation(dbg, ctx, "long.js", 66); // Jump to line 16 and make sure the editor scrolled. yield selectSource(dbg, "long.js", 16); assertHighlightLocation(dbg, ctx, "long.js", 16); // Make sure only one line is ever highlighted and the flash // animation is cancelled on old lines. yield selectSource(dbg, "long.js", 17); yield selectSource(dbg, "long.js", 18); assertHighlightLocation(dbg, ctx, "long.js", 18); is(findAllElements(dbg, "highlightLine").length, 1, "Only 1 line is highlighted"); // Test jumping to a line in a source that exists but hasn't been // loaded yet. selectSource(dbg, "simple1.js", 6); // Make sure the source is in the loading state, wait for it to be // fully loaded, and check the highlighted line. var simple1 = findSource(dbg, "simple1.js"); ok(getSourceText(getState(), simple1.id).get("loading")); yield waitForDispatch(dbg, "LOAD_SOURCE_TEXT"); ok(getSourceText(getState(), simple1.id).get("text")); assertHighlightLocation(dbg, ctx, "simple1.js", 6); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 765 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var keyboardNavigation = (() => { var _ref = _asyncToGenerator(function* (ctx) { var is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-scripts.html"); var doc = dbg.win.document; yield selectSource(dbg, "simple2"); yield waitForElement(dbg, ".CodeMirror"); var editor = findElementWithSelector(dbg, ".CodeMirror"); var textarea = findElementWithSelector(dbg, "textarea"); editor.focus(); info("Enter code editor"); pressKey(dbg, "Enter"); is(textarea, doc.activeElement, "Editor is enabled"); info("Exit code editor and focus on container"); pressKey(dbg, "Escape"); is(editor, doc.activeElement, "Focused on container"); info("Enter code editor"); pressKey(dbg, "Tab"); is(textarea, doc.activeElement, "Editor is enabled"); }); return function keyboardNavigation(_x) { return _ref.apply(this, arguments); }; })(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, waitForElement = _require.waitForElement, findElement = _require.findElement, findElementWithSelector = _require.findElementWithSelector, selectSource = _require.selectSource, pressKey = _require.pressKey; module.exports = keyboardNavigation; /***/ }, /* 766 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var keyboardShortcuts = (() => { var _ref = _asyncToGenerator(function* (ctx) { var info = ctx.info; var dbg = yield initDebugger("doc-debugger-statements.html"); yield reload(dbg); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 8); yield pressResume(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 12); yield pressStepIn(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 13); yield pressStepOut(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 14); yield pressStepOver(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 9); }); return function keyboardShortcuts(_x) { return _ref.apply(this, arguments); }; })(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, waitForElement = _require.waitForElement, waitForPaused = _require.waitForPaused, assertPausedLocation = _require.assertPausedLocation, pressKey = _require.pressKey, reload = _require.reload; function pressResume(dbg) { pressKey(dbg, "resumeKey"); return waitForPaused(dbg); } function pressStepOver(dbg) { pressKey(dbg, "stepOverKey"); return waitForPaused(dbg); } function pressStepIn(dbg) { pressKey(dbg, "stepInKey"); return waitForPaused(dbg); } function pressStepOut(dbg) { pressKey(dbg, "stepOutKey"); return waitForPaused(dbg); } ; module.exports = keyboardShortcuts; /***/ }, /* 767 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, assertPausedLocation = _require.assertPausedLocation, reload = _require.reload, resume = _require.resume, waitForPaused = _require.waitForPaused; /** * Test debugging a page with iframes * 1. pause in the main thread * 2. pause in the iframe */ module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-iframes.html"); // test pausing in the main thread yield reload(dbg); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "iframes.html", 8); // test pausing in the iframe yield resume(dbg); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 8); // test pausing in the iframe yield resume(dbg); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "debugger-statements.html", 12); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 768 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, invokeInTab = _require.invokeInTab, waitForElement = _require.waitForElement, navigate = _require.navigate, addBreakpoint = _require.addBreakpoint, selectSource = _require.selectSource, waitForPaused = _require.waitForPaused, waitForDispatch = _require.waitForDispatch, assertPausedLocation = _require.assertPausedLocation, reload = _require.reload; function countSources(dbg) { var sources = dbg.selectors.getSources(dbg.getState()); return sources.size; } /** * Test navigating * navigating while paused will reset the pause state and sources */ module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-script-switching.html"); var _dbg$selectors = dbg.selectors, getSelectedSource = _dbg$selectors.getSelectedSource, getPause = _dbg$selectors.getPause, getState = dbg.getState; invokeInTab(dbg, "firstCall"); yield waitForPaused(dbg); yield navigate(dbg, "doc-scripts.html", "simple1.js"); yield addBreakpoint(dbg, "simple1.js", 4); invokeInTab(dbg, "main"); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "simple1.js", 4); is(countSources(dbg), 4, "4 sources are loaded."); yield navigate(dbg, "about:blank"); yield waitForDispatch(dbg, "NAVIGATE"); is(countSources(dbg), 0, "0 sources are loaded."); ok(!getPause(getState()), "No pause state exists"); yield navigate(dbg, "doc-scripts.html", "simple1.js", "simple2.js", "long.js", "scripts.html"); is(countSources(dbg), 4, "4 sources are loaded."); // Test that the current select source persists across reloads yield selectSource(dbg, "long.js"); yield reload(dbg, "long.js"); ok(getSelectedSource(getState()).get("url").includes("long.js"), "Selected source is long.js"); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 769 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, assertPausedLocation = _require.assertPausedLocation, invokeInTab = _require.invokeInTab, togglePauseOnExceptions = _require.togglePauseOnExceptions, waitForPaused = _require.waitForPaused, isPaused = _require.isPaused, resume = _require.resume; function uncaughtException(dbg) { return invokeInTab(dbg, "uncaughtException").catch(() => {}); } function caughtException(dbg) { return invokeInTab(dbg, "caughtException"); } /* Tests Pausing on exception 1. skip an uncaught exception 2. pause on an uncaught exception 3. pause on a caught error 4. skip a caught error */ module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-exceptions.html"); // test skipping an uncaught exception yield togglePauseOnExceptions(dbg, false, false); yield uncaughtException(dbg); ok(!isPaused(dbg)); // Test pausing on an uncaught exception yield togglePauseOnExceptions(dbg, true, false); uncaughtException(dbg); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "exceptions.js", 2); yield resume(dbg); // Test pausing on a caught Error yield togglePauseOnExceptions(dbg, true, false); caughtException(dbg); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "exceptions.js", 15); yield resume(dbg); // Test skipping a caught error yield togglePauseOnExceptions(dbg, true, true); caughtException(dbg); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "exceptions.js", 17); yield resume(dbg); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 770 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var prettyPrint = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is; var dbg = yield initDebugger("doc-minified.html", "math.min"); yield selectSource(dbg, "math.min.js"); clickElement(dbg, "prettyPrintButton"); yield waitForDispatch(dbg, "TOGGLE_PRETTY_PRINT"); var ppSrc = findSource(dbg, "math.min.js:formatted"); ok(ppSrc, "Pretty-printed source exists"); yield addBreakpoint(dbg, ppSrc, 18); invokeInTab(dbg, "arithmetic"); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, ppSrc, 18); yield stepOver(dbg); assertPausedLocation(dbg, ctx, ppSrc, 27); yield resume(dbg); // The pretty-print button should go away in the pretty-printed // source. ok(!findElement(dbg, "sourceFooter"), "Footer is hidden"); yield selectSource(dbg, "math.min.js"); ok(findElement(dbg, "sourceFooter"), "Footer is hidden"); }); return function prettyPrint(_x) { return _ref.apply(this, arguments); }; })(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, assertPausedLocation = _require.assertPausedLocation, waitForPaused = _require.waitForPaused, waitForDispatch = _require.waitForDispatch, findSource = _require.findSource, findElement = _require.findElement, selectSource = _require.selectSource, clickElement = _require.clickElement, addBreakpoint = _require.addBreakpoint, stepOver = _require.stepOver, invokeInTab = _require.invokeInTab, resume = _require.resume; module.exports = prettyPrint; /***/ }, /* 771 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, assertPausedLocation = _require.assertPausedLocation, selectSource = _require.selectSource, addBreakpoint = _require.addBreakpoint, invokeInTab = _require.invokeInTab, resume = _require.resume, waitForPaused = _require.waitForPaused, waitForDispatch = _require.waitForDispatch, clickElement = _require.clickElement; // Tests pretty-printing a source that is currently paused. module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-minified.html"); yield selectSource(dbg, "math.min.js"); yield addBreakpoint(dbg, "math.min.js", 2); invokeInTab(dbg, "arithmetic"); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "math.min.js", 2); clickElement(dbg, "prettyPrintButton"); yield waitForDispatch(dbg, "TOGGLE_PRETTY_PRINT"); assertPausedLocation(dbg, ctx, "math.min.js:formatted", 18); yield resume(dbg); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 772 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var testReturnValue = (() => { var _ref = _asyncToGenerator(function* (dbg, ctx, val) { var is = ctx.is; evalInTab(dbg, `return_something(${val})`); yield waitForPaused(dbg); // "Step in" 3 times to get to the point where the debugger can // see the return value. yield stepIn(dbg); yield stepIn(dbg); yield stepIn(dbg); is(getLabel(dbg, 1), "return_something", "check for return_something"); is(getLabel(dbg, 2), "", "check for "); is(getValue(dbg, 2), val, `check value is ${val}`); yield resume(dbg); assertNotPaused(dbg, ctx); }); return function testReturnValue(_x, _x2, _x3) { return _ref.apply(this, arguments); }; })(); var testThrowValue = (() => { var _ref2 = _asyncToGenerator(function* (dbg, ctx, val) { var is = ctx.is; evalInTab(dbg, `throw_something(${val})`).catch(function () {}); yield waitForPaused(dbg); // "Step in" to get to the exception. yield stepIn(dbg); is(getLabel(dbg, 1), "callee", "check for callee"); is(getLabel(dbg, 2), "", "check for "); is(getValue(dbg, 2), val, `check exception value is ${val}`); yield resume(dbg); yield waitForPaused(dbg); yield resume(dbg); assertNotPaused(dbg, ctx); }); return function testThrowValue(_x4, _x5, _x6) { return _ref2.apply(this, arguments); }; })(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), evalInTab = _require.evalInTab, assertNotPaused = _require.assertNotPaused, findElement = _require.findElement, initDebugger = _require.initDebugger, togglePauseOnExceptions = _require.togglePauseOnExceptions, resume = _require.resume, stepIn = _require.stepIn, waitForPaused = _require.waitForPaused, pauseTest = _require.pauseTest, resumeTest = _require.resumeTest; function getLabel(dbg, index) { return findElement(dbg, "scopeNode", index).innerText; } function getValue(dbg, index) { return findElement(dbg, "scopeValue", index).innerText; } function toggleScopes(dbg) { return findElement(dbg, "scopesHeader").click(); } module.exports = (() => { var _ref3 = _asyncToGenerator(function* (ctx) { var is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-return-values.html"); toggleScopes(dbg); yield togglePauseOnExceptions(dbg, true, false); var TESTS = ["57", "0", "false", "undefined", "null"]; for (var test of TESTS) { info(`testing ${test}`); yield testReturnValue(dbg, ctx, test); yield testThrowValue(dbg, ctx, test); } }); return function (_x7) { return _ref3.apply(this, arguments); }; })(); /***/ }, /* 773 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, waitForPaused = _require.waitForPaused, invokeInTab = _require.invokeInTab, evalInTab = _require.evalInTab, clickElement = _require.clickElement, findElement = _require.findElement, waitForTime = _require.waitForTime, waitForDispatch = _require.waitForDispatch, stepOver = _require.stepOver; function toggleNode(dbg, index) { clickElement(dbg, "scopeNode", index); } function getLabel(dbg, index) { return findElement(dbg, "scopeNode", index).innerText; } function toggleScopes(dbg) { return findElement(dbg, "scopesHeader").click(); } module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; console.log('>>> starting'); var dbg = yield initDebugger("doc-script-switching.html", "script-switching-01", "script-switching-02"); toggleScopes(dbg); invokeInTab(dbg, "firstCall"); yield waitForPaused(dbg); console.log('>>> first call and paused'); is(getLabel(dbg, 1), "secondCall"); is(getLabel(dbg, 2), ""); is(getLabel(dbg, 4), "foo"); toggleNode(dbg, 4); yield waitForDispatch(dbg, "LOAD_OBJECT_PROPERTIES"); is(getLabel(dbg, 5), "length"); yield stepOver(dbg); is(getLabel(dbg, 4), "foo"); is(getLabel(dbg, 5), "length"); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 774 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, waitForPaused = _require.waitForPaused, pressKey = _require.pressKey, findElementWithSelector = _require.findElementWithSelector, type = _require.type, waitForElement = _require.waitForElement, invokeInTab = _require.invokeInTab, clickElement = _require.clickElement, findElement = _require.findElement, waitForDispatch = _require.waitForDispatch; // Testing source search module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-script-switching.html"); pressKey(dbg, "sourceSearch"); yield waitForElement(dbg, "input"); findElementWithSelector(dbg, "input").focus(); type(dbg, "sw"); pressKey(dbg, "Enter"); yield waitForDispatch(dbg, "LOAD_SOURCE_TEXT"); var source = dbg.selectors.getSelectedSource(dbg.getState()); ok(source.get("url").match(/switching-01/), "first source is selected"); // 2. arrow keys and check to see if source is selected pressKey(dbg, "sourceSearch"); findElementWithSelector(dbg, "input").focus(); type(dbg, "sw"); pressKey(dbg, "Down"); pressKey(dbg, "Enter"); yield waitForDispatch(dbg, "LOAD_SOURCE_TEXT"); source = dbg.selectors.getSelectedSource(dbg.getState()); ok(source.get("url").match(/switching-02/), "second source is selected"); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 775 */ /***/ function(module, exports, __webpack_require__) { "use strict"; var waitForSourceCount = (() => { var _ref = _asyncToGenerator(function* (dbg, i) { // We are forced to wait until the DOM nodes appear because the // source tree batches its rendering. yield waitUntil(function () { return countSources(dbg) === i; }); }); return function waitForSourceCount(_x, _x2) { return _ref.apply(this, arguments); }; })(); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, environment = _require.environment, clickElement = _require.clickElement, invokeInTab = _require.invokeInTab, pressKey = _require.pressKey, selectSource = _require.selectSource, evalInTab = _require.evalInTab, findElement = _require.findElement, findAllElements = _require.findAllElements, findElementWithSelector = _require.findElementWithSelector, waitForSources = _require.waitForSources, waitForDispatch = _require.waitForDispatch, waitUntil = _require.waitUntil, waitForTime = _require.waitForTime; // Tests that the source tree works. function countSources(dbg) { return findAllElements(dbg, "sourceNodes").length; } function toggleDirectory(dbg, index) { return clickElement(dbg, "sourceArrow", index); } function clickNode(dbg, index) { return clickElement(dbg, "sourceNode", index); } function getSourceNode(dbg, index) { return findElement(dbg, "sourceNode", index).textContent; } function getFocusedNode(dbg) { return findElementWithSelector(dbg, ".sources-list .focused"); } module.exports = (() => { var _ref2 = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-sources.html"); var getSelectedSource = dbg.selectors.getSelectedSource, getState = dbg.getState; yield waitForSources(dbg, "simple1", "simple2", "nested-source", "long.js", "doc-sources.html"); // wait for source render to debounce yield waitForTime(200); // Expand nodes and make sure more sources appear. is(countSources(dbg), 2); toggleDirectory(dbg, 2); is(countSources(dbg), 7); toggleDirectory(dbg, 3); is(countSources(dbg), 8); // Select a source. ok(!getFocusedNode(dbg), "Source is not focused"); var selected = waitForDispatch(dbg, "SELECT_SOURCE"); clickNode(dbg, 4); yield selected; ok(getFocusedNode(dbg), "Source is focused"); ok(getSelectedSource(getState()).get("url").includes("nested-source.js"), "The right source is selected"); // Make sure new sources appear in the list. invokeInTab(dbg, "loadScript"); yield waitForSourceCount(dbg, 9); is(getSourceNode(dbg, 7), "math.min.js", "The dynamic script exists"); if (environment == "mochitest") { // Make sure named eval sources appear in the list. evalInTab(dbg, "window.evaledFunc = function() {} //# sourceURL=evaled.js"); yield waitForSourceCount(dbg, 11); is(findElement(dbg, "sourceNode", 2).textContent, "evaled.js", "The eval script exists"); } }); return function (_x3) { return _ref2.apply(this, arguments); }; })(); /***/ }, /* 776 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, assertPausedLocation = _require.assertPausedLocation, findSource = _require.findSource, waitForSources = _require.waitForSources, selectSource = _require.selectSource, addBreakpoint = _require.addBreakpoint, stepIn = _require.stepIn, stepOut = _require.stepOut, stepOver = _require.stepOver, invokeInTab = _require.invokeInTab, waitForPaused = _require.waitForPaused; // Tests loading sourcemapped sources, setting breakpoints, and // stepping in them. module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-sourcemaps.html"); var _dbg$selectors = dbg.selectors, getBreakpoint = _dbg$selectors.getBreakpoint, getBreakpoints = _dbg$selectors.getBreakpoints, getState = dbg.getState; yield waitForSources(dbg, "entry.js", "output.js", "times2.js", "opts.js"); ok(true, "Original sources exist"); var entrySrc = findSource(dbg, "entry.js"); yield selectSource(dbg, entrySrc); ok(dbg.win.cm.getValue().includes("window.keepMeAlive"), "Original source text loaded correctly"); // Test that breakpoint sliding is not attempted. The breakpoint // should not move anywhere. yield addBreakpoint(dbg, entrySrc, 13); is(getBreakpoints(getState()).size, 1, "One breakpoint exists"); ok(getBreakpoint(getState(), { sourceId: entrySrc.id, line: 13 }), "Breakpoint has correct line"); // Test breaking on a breakpoint yield addBreakpoint(dbg, "entry.js", 15); is(getBreakpoints(getState()).size, 2, "Two breakpoints exist"); ok(getBreakpoint(getState(), { sourceId: entrySrc.id, line: 15 }), "Breakpoint has correct line"); invokeInTab(dbg, "keepMeAlive"); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, entrySrc, 15); yield stepIn(dbg); assertPausedLocation(dbg, ctx, "times2.js", 2); yield stepOver(dbg); assertPausedLocation(dbg, ctx, "times2.js", 3); yield stepOut(dbg); yield stepOut(dbg); assertPausedLocation(dbg, ctx, "entry.js", 16); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 777 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, assertPausedLocation = _require.assertPausedLocation, findSource = _require.findSource, waitForSources = _require.waitForSources, selectSource = _require.selectSource, addBreakpoint = _require.addBreakpoint, invokeInTab = _require.invokeInTab, waitForPaused = _require.waitForPaused; // Tests loading sourcemapped sources, setting breakpoints, and // stepping in them. // This source map does not have source contents, so it's fetched separately module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-sourcemaps2.html"); var _dbg$selectors = dbg.selectors, getBreakpoint = _dbg$selectors.getBreakpoint, getBreakpoints = _dbg$selectors.getBreakpoints, getState = dbg.getState; yield waitForSources(dbg, "main.js", "main.min.js"); ok(true, "Original sources exist"); var mainSrc = findSource(dbg, "main.js"); yield selectSource(dbg, mainSrc); // Test that breakpoint is not off by a line. yield addBreakpoint(dbg, mainSrc, 4); is(getBreakpoints(getState()).size, 1, "One breakpoint exists"); ok(getBreakpoint(getState(), { sourceId: mainSrc.id, line: 4 }), "Breakpoint has correct line"); invokeInTab(dbg, "logMessage"); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "main.js", 4); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 778 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var _require = __webpack_require__(747), initDebugger = _require.initDebugger, countSources = _require.countSources, assertPausedLocation = _require.assertPausedLocation, selectSource = _require.selectSource, addBreakpoint = _require.addBreakpoint, invokeInTab = _require.invokeInTab, waitForPaused = _require.waitForPaused; // Test that an error while loading a sourcemap does not break // debugging. module.exports = (() => { var _ref = _asyncToGenerator(function* (ctx) { var ok = ctx.ok, is = ctx.is, info = ctx.info; var dbg = yield initDebugger("doc-sourcemap-bogus.html"); var getSources = dbg.selectors.getSources, getState = dbg.getState; yield selectSource(dbg, "bogus-map.js"); // We should still be able to set breakpoints and pause in the // generated source. yield addBreakpoint(dbg, "bogus-map.js", 4); invokeInTab(dbg, "runCode"); yield waitForPaused(dbg); assertPausedLocation(dbg, ctx, "bogus-map.js", 4); // Make sure that only the single generated source exists. The // sourcemap failed to download. is(countSources(dbg), 1, "Only 1 source exists"); }); return function (_x) { return _ref.apply(this, arguments); }; })(); /***/ }, /* 779 */ /***/ function(module, exports, __webpack_require__) { "use strict"; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } __webpack_require__(780); var expect = __webpack_require__(787); var _require = __webpack_require__(226), prefs = _require.prefs; var _require2 = __webpack_require__(745), asm = _require2.asm, breaking = _require2.breaking, breakpoints = _require2.breakpoints, breakpointsCond = _require2.breakpointsCond, callStack = _require2.callStack, expressions = _require2.expressions, debuggerButtons = _require2.debuggerButtons, editorSelect = _require2.editorSelect, editorGutter = _require2.editorGutter, editorHighlight = _require2.editorHighlight, keyboardNavigation = _require2.keyboardNavigation, keyboardShortcuts = _require2.keyboardShortcuts, iframes = _require2.iframes, navigation = _require2.navigation, pauseOnExceptions = _require2.pauseOnExceptions, prettyPrint = _require2.prettyPrint, prettyPrintPaused = _require2.prettyPrintPaused, returnvalues = _require2.returnvalues, scopes = _require2.scopes, searching = _require2.searching, sources = _require2.sources, sourceMaps = _require2.sourceMaps, sourceMaps2 = _require2.sourceMaps2, sourceMapsBogus = _require2.sourceMapsBogus; window.ok = function ok(expected) { expect(expected).to.be.truthy; }; window.is = function is(expected, actual) { expect(expected).to.equal(actual); }; window.info = function info(msg) { console.log(`info: ${msg}\n`); }; window.requestLongerTimeout = function () {}; var ctx = { ok, is, info, requestLongerTimeout }; mocha.setup({ timeout: 10000, ui: 'bdd' }); describe("Tests", () => { beforeEach(() => { prefs.pauseOnExceptions = false; prefs.ignoreCaughtExceptions = false; prefs.pendingSelectedLocation = {}; prefs.tabs = []; }); it("asm", _asyncToGenerator(function* () { yield asm(ctx); })); it("breakpoints - toggle", _asyncToGenerator(function* () { yield breakpoints.toggle(ctx); })); it("breakpoints - toggleAll", _asyncToGenerator(function* () { yield breakpoints.toggleAll(ctx); })); it("breaking", _asyncToGenerator(function* () { yield breaking(ctx); })); it("pretty print", _asyncToGenerator(function* () { yield prettyPrint(ctx); })); it("conditional breakpoints", _asyncToGenerator(function* () { yield breakpointsCond(ctx); })); it("expressions", _asyncToGenerator(function* () { yield expressions(ctx); })); it("editor select", _asyncToGenerator(function* () { yield editorSelect(ctx); })); it("editor gutter", _asyncToGenerator(function* () { yield editorGutter(ctx); })); xit("editor highlight", _asyncToGenerator(function* () { yield editorHighlight(ctx); })); xit("keyboard navigation", _asyncToGenerator(function* () { yield keyboardNavigation(ctx); })); xit("keyboard shortcuts", _asyncToGenerator(function* () { yield keyboardShortcuts(ctx); })); xit("navigation", _asyncToGenerator(function* () { yield navigation(ctx); })); it("call stack test 1", _asyncToGenerator(function* () { yield callStack.test1(ctx); })); it("call stack test 2", _asyncToGenerator(function* () { yield callStack.test2(ctx); })); it("debugger buttons", _asyncToGenerator(function* () { yield debuggerButtons(ctx); })); it("iframes", _asyncToGenerator(function* () { yield iframes(ctx); })); // expected 17 to equal 15 it("pause on exceptions", _asyncToGenerator(function* () { yield pauseOnExceptions(ctx); })); it("pretty print", _asyncToGenerator(function* () { yield prettyPrint(ctx); })); // timed out it("pretty print paused", _asyncToGenerator(function* () { yield prettyPrintPaused(ctx); })); it("returnvalues", _asyncToGenerator(function* () { yield returnvalues(ctx); })); xit("searching", _asyncToGenerator(function* () { yield searching(ctx); })); // timed out it("scopes", _asyncToGenerator(function* () { yield scopes(ctx); })); // expected 0 to equal 2 it("sources", _asyncToGenerator(function* () { yield sources(ctx); })); // timed out // requires firefox nightly for noSliding xit("source maps", _asyncToGenerator(function* () { yield sourceMaps(ctx); })); it("source maps 2", _asyncToGenerator(function* () { yield sourceMaps2(ctx); })); // expected 2 to equal 1 xit("source maps bogus", _asyncToGenerator(function* () { yield sourceMapsBogus(ctx); })); }); mocha.run(); /***/ }, /* 780 */ /***/ function(module, exports, __webpack_require__) { var require;var require;var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global, Buffer, setImmediate) {(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return require(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1) { suites.shift(); } return common.suite.create({ title: title, file: file, fn: false }); }; /** * Exclusive Suite. */ context.suite.only = function (title) { if (suites.length > 1) { suites.shift(); } return common.suite.only({ title: title, file: file, fn: false }); }; /** * Describe a specification or test-case * with the given `title` and callback `fn` * acting as a thunk. */ context.test = function (title, fn) { var test = new Test(title, fn); test.file = file; suites[0].addTest(test); return test; }; /** * Exclusive test-case. */ context.test.only = function (title, fn) { return common.test.only(mocha, context.test(title, fn)); }; context.test.skip = common.test.skip; context.test.retries = common.test.retries; }); }; },{"../test":36,"./common":9}],13:[function(require,module,exports){ 'use strict'; /** * Module dependencies. */ var Test = require('../test'); /** * TDD-style interface: * * suite('Array', function() { * suite('#indexOf()', function() { * suiteSetup(function() { * * }); * * test('should return -1 when not present', function() { * * }); * * test('should return the index when present', function() { * * }); * * suiteTeardown(function() { * * }); * }); * }); * * @param {Suite} suite Root suite. */ module.exports = function (suite) { var suites = [suite]; suite.on('pre-require', function (context, file, mocha) { var common = require('./common')(suites, context, mocha); context.setup = common.beforeEach; context.teardown = common.afterEach; context.suiteSetup = common.before; context.suiteTeardown = common.after; context.run = mocha.options.delay && common.runWithSuite(suite); /** * Describe a "suite" with the given `title` and callback `fn` containing * nested suites and/or tests. */ context.suite = function (title, fn) { return common.suite.create({ title: title, file: file, fn: fn }); }; /** * Pending suite. */ context.suite.skip = function (title, fn) { return common.suite.skip({ title: title, file: file, fn: fn }); }; /** * Exclusive test-case. */ context.suite.only = function (title, fn) { return common.suite.only({ title: title, file: file, fn: fn }); }; /** * Describe a specification or test-case with the given `title` and * callback `fn` acting as a thunk. */ context.test = function (title, fn) { var suite = suites[0]; if (suite.isPending()) { fn = null; } var test = new Test(title, fn); test.file = file; suite.addTest(test); return test; }; /** * Exclusive test-case. */ context.test.only = function (title, fn) { return common.test.only(mocha, context.test(title, fn)); }; context.test.skip = common.test.skip; context.test.retries = common.test.retries; }); }; },{"../test":36,"./common":9}],14:[function(require,module,exports){ (function (process,global,__dirname){ 'use strict'; /*! * mocha * Copyright(c) 2011 TJ Holowaychuk * MIT Licensed */ /** * Module dependencies. */ var escapeRe = require('escape-string-regexp'); var path = require('path'); var reporters = require('./reporters'); var utils = require('./utils'); /** * Expose `Mocha`. */ exports = module.exports = Mocha; /** * To require local UIs and reporters when running in node. */ if (!process.browser) { var cwd = process.cwd(); module.paths.push(cwd, path.join(cwd, 'node_modules')); } /** * Expose internals. */ exports.utils = utils; exports.interfaces = require('./interfaces'); exports.reporters = reporters; exports.Runnable = require('./runnable'); exports.Context = require('./context'); exports.Runner = require('./runner'); exports.Suite = require('./suite'); exports.Hook = require('./hook'); exports.Test = require('./test'); /** * Return image `name` path. * * @api private * @param {string} name * @return {string} */ function image (name) { return path.join(__dirname, '../images', name + '.png'); } /** * Set up mocha with `options`. * * Options: * * - `ui` name "bdd", "tdd", "exports" etc * - `reporter` reporter instance, defaults to `mocha.reporters.spec` * - `globals` array of accepted globals * - `timeout` timeout in milliseconds * - `retries` number of times to retry failed tests * - `bail` bail on the first test failure * - `slow` milliseconds to wait before considering a test slow * - `ignoreLeaks` ignore global leaks * - `fullTrace` display the full stack-trace on failing * - `grep` string or regexp to filter tests with * * @param {Object} options * @api public */ function Mocha (options) { options = options || {}; this.files = []; this.options = options; if (options.grep) { this.grep(new RegExp(options.grep)); } if (options.fgrep) { this.fgrep(options.fgrep); } this.suite = new exports.Suite('', new exports.Context()); this.ui(options.ui); this.bail(options.bail); this.reporter(options.reporter, options.reporterOptions); if (typeof options.timeout !== 'undefined' && options.timeout !== null) { this.timeout(options.timeout); } if (typeof options.retries !== 'undefined' && options.retries !== null) { this.retries(options.retries); } this.useColors(options.useColors); if (options.enableTimeouts !== null) { this.enableTimeouts(options.enableTimeouts); } if (options.slow) { this.slow(options.slow); } } /** * Enable or disable bailing on the first failure. * * @api public * @param {boolean} [bail] */ Mocha.prototype.bail = function (bail) { if (!arguments.length) { bail = true; } this.suite.bail(bail); return this; }; /** * Add test `file`. * * @api public * @param {string} file */ Mocha.prototype.addFile = function (file) { this.files.push(file); return this; }; /** * Set reporter to `reporter`, defaults to "spec". * * @param {String|Function} reporter name or constructor * @param {Object} reporterOptions optional options * @api public * @param {string|Function} reporter name or constructor * @param {Object} reporterOptions optional options */ Mocha.prototype.reporter = function (reporter, reporterOptions) { if (typeof reporter === 'function') { this._reporter = reporter; } else { reporter = reporter || 'spec'; var _reporter; // Try to load a built-in reporter. if (reporters[reporter]) { _reporter = reporters[reporter]; } // Try to load reporters from process.cwd() and node_modules if (!_reporter) { try { _reporter = require(reporter); } catch (err) { err.message.indexOf('Cannot find module') !== -1 ? console.warn('"' + reporter + '" reporter not found') : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack); } } if (!_reporter && reporter === 'teamcity') { console.warn('The Teamcity reporter was moved to a package named ' + 'mocha-teamcity-reporter ' + '(https://npmjs.org/package/mocha-teamcity-reporter).'); } if (!_reporter) { throw new Error('invalid reporter "' + reporter + '"'); } this._reporter = _reporter; } this.options.reporterOptions = reporterOptions; return this; }; /** * Set test UI `name`, defaults to "bdd". * * @api public * @param {string} bdd */ Mocha.prototype.ui = function (name) { name = name || 'bdd'; this._ui = exports.interfaces[name]; if (!this._ui) { try { this._ui = require(name); } catch (err) { throw new Error('invalid interface "' + name + '"'); } } this._ui = this._ui(this.suite); this.suite.on('pre-require', function (context) { exports.afterEach = context.afterEach || context.teardown; exports.after = context.after || context.suiteTeardown; exports.beforeEach = context.beforeEach || context.setup; exports.before = context.before || context.suiteSetup; exports.describe = context.describe || context.suite; exports.it = context.it || context.test; exports.setup = context.setup || context.beforeEach; exports.suiteSetup = context.suiteSetup || context.before; exports.suiteTeardown = context.suiteTeardown || context.after; exports.suite = context.suite || context.describe; exports.teardown = context.teardown || context.afterEach; exports.test = context.test || context.it; exports.run = context.run; }); return this; }; /** * Load registered files. * * @api private */ Mocha.prototype.loadFiles = function (fn) { var self = this; var suite = this.suite; this.files.forEach(function (file) { file = path.resolve(file); suite.emit('pre-require', global, file, self); suite.emit('require', require(file), file, self); suite.emit('post-require', global, file, self); }); fn && fn(); }; /** * Enable growl support. * * @api private */ Mocha.prototype._growl = function (runner, reporter) { var notify = require('growl'); runner.on('end', function () { var stats = reporter.stats; if (stats.failures) { var msg = stats.failures + ' of ' + runner.total + ' tests failed'; notify(msg, { name: 'mocha', title: 'Failed', image: image('error') }); } else { notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', { name: 'mocha', title: 'Passed', image: image('ok') }); } }); }; /** * Escape string and add it to grep as a regexp. * * @api public * @param str * @returns {Mocha} */ Mocha.prototype.fgrep = function (str) { return this.grep(new RegExp(escapeRe(str))); }; /** * Add regexp to grep, if `re` is a string it is escaped. * * @param {RegExp|String} re * @return {Mocha} * @api public * @param {RegExp|string} re * @return {Mocha} */ Mocha.prototype.grep = function (re) { if (utils.isString(re)) { // extract args if it's regex-like, i.e: [string, pattern, flag] var arg = re.match(/^\/(.*)\/(g|i|)$|.*/); this.options.grep = new RegExp(arg[1] || arg[0], arg[2]); } else { this.options.grep = re; } return this; }; /** * Invert `.grep()` matches. * * @return {Mocha} * @api public */ Mocha.prototype.invert = function () { this.options.invert = true; return this; }; /** * Ignore global leaks. * * @param {Boolean} ignore * @return {Mocha} * @api public * @param {boolean} ignore * @return {Mocha} */ Mocha.prototype.ignoreLeaks = function (ignore) { this.options.ignoreLeaks = Boolean(ignore); return this; }; /** * Enable global leak checking. * * @return {Mocha} * @api public */ Mocha.prototype.checkLeaks = function () { this.options.ignoreLeaks = false; return this; }; /** * Display long stack-trace on failing * * @return {Mocha} * @api public */ Mocha.prototype.fullTrace = function () { this.options.fullStackTrace = true; return this; }; /** * Enable growl support. * * @return {Mocha} * @api public */ Mocha.prototype.growl = function () { this.options.growl = true; return this; }; /** * Ignore `globals` array or string. * * @param {Array|String} globals * @return {Mocha} * @api public * @param {Array|string} globals * @return {Mocha} */ Mocha.prototype.globals = function (globals) { this.options.globals = (this.options.globals || []).concat(globals); return this; }; /** * Emit color output. * * @param {Boolean} colors * @return {Mocha} * @api public * @param {boolean} colors * @return {Mocha} */ Mocha.prototype.useColors = function (colors) { if (colors !== undefined) { this.options.useColors = colors; } return this; }; /** * Use inline diffs rather than +/-. * * @param {Boolean} inlineDiffs * @return {Mocha} * @api public * @param {boolean} inlineDiffs * @return {Mocha} */ Mocha.prototype.useInlineDiffs = function (inlineDiffs) { this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs; return this; }; /** * Set the timeout in milliseconds. * * @param {Number} timeout * @return {Mocha} * @api public * @param {number} timeout * @return {Mocha} */ Mocha.prototype.timeout = function (timeout) { this.suite.timeout(timeout); return this; }; /** * Set the number of times to retry failed tests. * * @param {Number} retry times * @return {Mocha} * @api public */ Mocha.prototype.retries = function (n) { this.suite.retries(n); return this; }; /** * Set slowness threshold in milliseconds. * * @param {Number} slow * @return {Mocha} * @api public * @param {number} slow * @return {Mocha} */ Mocha.prototype.slow = function (slow) { this.suite.slow(slow); return this; }; /** * Enable timeouts. * * @param {Boolean} enabled * @return {Mocha} * @api public * @param {boolean} enabled * @return {Mocha} */ Mocha.prototype.enableTimeouts = function (enabled) { this.suite.enableTimeouts(arguments.length && enabled !== undefined ? enabled : true); return this; }; /** * Makes all tests async (accepting a callback) * * @return {Mocha} * @api public */ Mocha.prototype.asyncOnly = function () { this.options.asyncOnly = true; return this; }; /** * Disable syntax highlighting (in browser). * * @api public */ Mocha.prototype.noHighlighting = function () { this.options.noHighlighting = true; return this; }; /** * Enable uncaught errors to propagate (in browser). * * @return {Mocha} * @api public */ Mocha.prototype.allowUncaught = function () { this.options.allowUncaught = true; return this; }; /** * Delay root suite execution. * @returns {Mocha} */ Mocha.prototype.delay = function delay () { this.options.delay = true; return this; }; /** * Run tests and invoke `fn()` when complete. * * @api public * @param {Function} fn * @return {Runner} */ Mocha.prototype.run = function (fn) { if (this.files.length) { this.loadFiles(); } var suite = this.suite; var options = this.options; options.files = this.files; var runner = new exports.Runner(suite, options.delay); var reporter = new this._reporter(runner, options); runner.ignoreLeaks = options.ignoreLeaks !== false; runner.fullStackTrace = options.fullStackTrace; runner.hasOnly = options.hasOnly; runner.asyncOnly = options.asyncOnly; runner.allowUncaught = options.allowUncaught; if (options.grep) { runner.grep(options.grep, options.invert); } if (options.globals) { runner.globals(options.globals); } if (options.growl) { this._growl(runner, reporter); } if (options.useColors !== undefined) { exports.reporters.Base.useColors = options.useColors; } exports.reporters.Base.inlineDiffs = options.useInlineDiffs; function done (failures) { if (reporter.done) { reporter.done(failures, fn); } else { fn && fn(failures); } } return runner.run(done); }; }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib") },{"./context":6,"./hook":7,"./interfaces":11,"./reporters":21,"./runnable":33,"./runner":34,"./suite":35,"./test":36,"./utils":38,"_process":67,"escape-string-regexp":47,"growl":49,"path":42}],15:[function(require,module,exports){ 'use strict'; /** * Helpers. */ var s = 1000; var m = s * 60; var h = m * 60; var d = h * 24; var y = d * 365.25; /** * Parse or format the given `val`. * * Options: * * - `long` verbose formatting [false] * * @api public * @param {string|number} val * @param {Object} options * @return {string|number} */ module.exports = function (val, options) { options = options || {}; if (typeof val === 'string') { return parse(val); } // https://github.com/mochajs/mocha/pull/1035 return options['long'] ? longFormat(val) : shortFormat(val); }; /** * Parse the given `str` and return milliseconds. * * @api private * @param {string} str * @return {number} */ function parse (str) { var match = (/^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i).exec(str); if (!match) { return; } var n = parseFloat(match[1]); var type = (match[2] || 'ms').toLowerCase(); switch (type) { case 'years': case 'year': case 'y': return n * y; case 'days': case 'day': case 'd': return n * d; case 'hours': case 'hour': case 'h': return n * h; case 'minutes': case 'minute': case 'm': return n * m; case 'seconds': case 'second': case 's': return n * s; case 'ms': return n; default: // No default case } } /** * Short format for `ms`. * * @api private * @param {number} ms * @return {string} */ function shortFormat (ms) { if (ms >= d) { return Math.round(ms / d) + 'd'; } if (ms >= h) { return Math.round(ms / h) + 'h'; } if (ms >= m) { return Math.round(ms / m) + 'm'; } if (ms >= s) { return Math.round(ms / s) + 's'; } return ms + 'ms'; } /** * Long format for `ms`. * * @api private * @param {number} ms * @return {string} */ function longFormat (ms) { return plural(ms, d, 'day') || plural(ms, h, 'hour') || plural(ms, m, 'minute') || plural(ms, s, 'second') || ms + ' ms'; } /** * Pluralization helper. * * @api private * @param {number} ms * @param {number} n * @param {string} name */ function plural (ms, n, name) { if (ms < n) { return; } if (ms < n * 1.5) { return Math.floor(ms / n) + ' ' + name; } return Math.ceil(ms / n) + ' ' + name + 's'; } },{}],16:[function(require,module,exports){ 'use strict'; /** * Expose `Pending`. */ module.exports = Pending; /** * Initialize a new `Pending` error with the given message. * * @param {string} message */ function Pending (message) { this.message = message; } },{}],17:[function(require,module,exports){ (function (process,global){ 'use strict'; /** * Module dependencies. */ var tty = require('tty'); var diff = require('diff'); var ms = require('../ms'); var utils = require('../utils'); var supportsColor = process.browser ? null : require('supports-color'); /** * Expose `Base`. */ exports = module.exports = Base; /** * Save timer references to avoid Sinon interfering. * See: https://github.com/mochajs/mocha/issues/237 */ /* eslint-disable no-unused-vars, no-native-reassign */ var Date = global.Date; var setTimeout = global.setTimeout; var setInterval = global.setInterval; var clearTimeout = global.clearTimeout; var clearInterval = global.clearInterval; /* eslint-enable no-unused-vars, no-native-reassign */ /** * Check if both stdio streams are associated with a tty. */ var isatty = tty.isatty(1) && tty.isatty(2); /** * Enable coloring by default, except in the browser interface. */ exports.useColors = !process.browser && (supportsColor || (process.env.MOCHA_COLORS !== undefined)); /** * Inline diffs instead of +/- */ exports.inlineDiffs = false; /** * Default color map. */ exports.colors = { pass: 90, fail: 31, 'bright pass': 92, 'bright fail': 91, 'bright yellow': 93, pending: 36, suite: 0, 'error title': 0, 'error message': 31, 'error stack': 90, checkmark: 32, fast: 90, medium: 33, slow: 31, green: 32, light: 90, 'diff gutter': 90, 'diff added': 32, 'diff removed': 31 }; /** * Default symbol map. */ exports.symbols = { ok: '✓', err: '✖', dot: '․', comma: ',', bang: '!' }; // With node.js on Windows: use symbols available in terminal default fonts if (process.platform === 'win32') { exports.symbols.ok = '\u221A'; exports.symbols.err = '\u00D7'; exports.symbols.dot = '.'; } /** * Color `str` with the given `type`, * allowing colors to be disabled, * as well as user-defined color * schemes. * * @param {string} type * @param {string} str * @return {string} * @api private */ var color = exports.color = function (type, str) { if (!exports.useColors) { return String(str); } return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; }; /** * Expose term window size, with some defaults for when stderr is not a tty. */ exports.window = { width: 75 }; if (isatty) { exports.window.width = process.stdout.getWindowSize ? process.stdout.getWindowSize(1)[0] : tty.getWindowSize()[1]; } /** * Expose some basic cursor interactions that are common among reporters. */ exports.cursor = { hide: function () { isatty && process.stdout.write('\u001b[?25l'); }, show: function () { isatty && process.stdout.write('\u001b[?25h'); }, deleteLine: function () { isatty && process.stdout.write('\u001b[2K'); }, beginningOfLine: function () { isatty && process.stdout.write('\u001b[0G'); }, CR: function () { if (isatty) { exports.cursor.deleteLine(); exports.cursor.beginningOfLine(); } else { process.stdout.write('\r'); } } }; /** * Outut the given `failures` as a list. * * @param {Array} failures * @api public */ exports.list = function (failures) { console.log(); failures.forEach(function (test, i) { // format var fmt = color('error title', ' %s) %s:\n') + color('error message', ' %s') + color('error stack', '\n%s\n'); // msg var msg; var err = test.err; var message; if (err.message && typeof err.message.toString === 'function') { message = err.message + ''; } else if (typeof err.inspect === 'function') { message = err.inspect() + ''; } else { message = ''; } var stack = err.stack || message; var index = message ? stack.indexOf(message) : -1; var actual = err.actual; var expected = err.expected; var escape = true; if (index === -1) { msg = message; } else { index += message.length; msg = stack.slice(0, index); // remove msg from stack stack = stack.slice(index + 1); } // uncaught if (err.uncaught) { msg = 'Uncaught ' + msg; } // explicitly show diff if (err.showDiff !== false && sameType(actual, expected) && expected !== undefined) { escape = false; if (!(utils.isString(actual) && utils.isString(expected))) { err.actual = actual = utils.stringify(actual); err.expected = expected = utils.stringify(expected); } fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); var match = message.match(/^([^:]+): expected/); msg = '\n ' + color('error message', match ? match[1] : msg); if (exports.inlineDiffs) { msg += inlineDiff(err, escape); } else { msg += unifiedDiff(err, escape); } } // indent stack trace stack = stack.replace(/^/gm, ' '); console.log(fmt, (i + 1), test.fullTitle(), msg, stack); }); }; /** * Initialize a new `Base` reporter. * * All other reporters generally * inherit from this reporter, providing * stats such as test duration, number * of tests passed / failed etc. * * @param {Runner} runner * @api public */ function Base (runner) { var stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 }; var failures = this.failures = []; if (!runner) { return; } this.runner = runner; runner.stats = stats; runner.on('start', function () { stats.start = new Date(); }); runner.on('suite', function (suite) { stats.suites = stats.suites || 0; suite.root || stats.suites++; }); runner.on('test end', function () { stats.tests = stats.tests || 0; stats.tests++; }); runner.on('pass', function (test) { stats.passes = stats.passes || 0; if (test.duration > test.slow()) { test.speed = 'slow'; } else if (test.duration > test.slow() / 2) { test.speed = 'medium'; } else { test.speed = 'fast'; } stats.passes++; }); runner.on('fail', function (test, err) { stats.failures = stats.failures || 0; stats.failures++; test.err = err; failures.push(test); }); runner.on('end', function () { stats.end = new Date(); stats.duration = new Date() - stats.start; }); runner.on('pending', function () { stats.pending++; }); } /** * Output common epilogue used by many of * the bundled reporters. * * @api public */ Base.prototype.epilogue = function () { var stats = this.stats; var fmt; console.log(); // passes fmt = color('bright pass', ' ') + color('green', ' %d passing') + color('light', ' (%s)'); console.log(fmt, stats.passes || 0, ms(stats.duration)); // pending if (stats.pending) { fmt = color('pending', ' ') + color('pending', ' %d pending'); console.log(fmt, stats.pending); } // failures if (stats.failures) { fmt = color('fail', ' %d failing'); console.log(fmt, stats.failures); Base.list(this.failures); console.log(); } console.log(); }; /** * Pad the given `str` to `len`. * * @api private * @param {string} str * @param {string} len * @return {string} */ function pad (str, len) { str = String(str); return Array(len - str.length + 1).join(' ') + str; } /** * Returns an inline diff between 2 strings with coloured ANSI output * * @api private * @param {Error} err with actual/expected * @param {boolean} escape * @return {string} Diff */ function inlineDiff (err, escape) { var msg = errorDiff(err, 'WordsWithSpace', escape); // linenos var lines = msg.split('\n'); if (lines.length > 4) { var width = String(lines.length).length; msg = lines.map(function (str, i) { return pad(++i, width) + ' |' + ' ' + str; }).join('\n'); } // legend msg = '\n' + color('diff removed', 'actual') + ' ' + color('diff added', 'expected') + '\n\n' + msg + '\n'; // indent msg = msg.replace(/^/gm, ' '); return msg; } /** * Returns a unified diff between two strings. * * @api private * @param {Error} err with actual/expected * @param {boolean} escape * @return {string} The diff. */ function unifiedDiff (err, escape) { var indent = ' '; function cleanUp (line) { if (escape) { line = escapeInvisibles(line); } if (line[0] === '+') { return indent + colorLines('diff added', line); } if (line[0] === '-') { return indent + colorLines('diff removed', line); } if (line.match(/@@/)) { return null; } if (line.match(/\\ No newline/)) { return null; } return indent + line; } function notBlank (line) { return typeof line !== 'undefined' && line !== null; } var msg = diff.createPatch('string', err.actual, err.expected); var lines = msg.split('\n').splice(4); return '\n ' + colorLines('diff added', '+ expected') + ' ' + colorLines('diff removed', '- actual') + '\n\n' + lines.map(cleanUp).filter(notBlank).join('\n'); } /** * Return a character diff for `err`. * * @api private * @param {Error} err * @param {string} type * @param {boolean} escape * @return {string} */ function errorDiff (err, type, escape) { var actual = escape ? escapeInvisibles(err.actual) : err.actual; var expected = escape ? escapeInvisibles(err.expected) : err.expected; return diff['diff' + type](actual, expected).map(function (str) { if (str.added) { return colorLines('diff added', str.value); } if (str.removed) { return colorLines('diff removed', str.value); } return str.value; }).join(''); } /** * Returns a string with all invisible characters in plain text * * @api private * @param {string} line * @return {string} */ function escapeInvisibles (line) { return line.replace(/\t/g, '') .replace(/\r/g, '') .replace(/\n/g, '\n'); } /** * Color lines for `str`, using the color `name`. * * @api private * @param {string} name * @param {string} str * @return {string} */ function colorLines (name, str) { return str.split('\n').map(function (str) { return color(name, str); }).join('\n'); } /** * Object#toString reference. */ var objToString = Object.prototype.toString; /** * Check that a / b have the same type. * * @api private * @param {Object} a * @param {Object} b * @return {boolean} */ function sameType (a, b) { return objToString.call(a) === objToString.call(b); } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"../ms":15,"../utils":38,"_process":67,"diff":46,"supports-color":42,"tty":5}],18:[function(require,module,exports){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); var utils = require('../utils'); /** * Expose `Doc`. */ exports = module.exports = Doc; /** * Initialize a new `Doc` reporter. * * @param {Runner} runner * @api public */ function Doc (runner) { Base.call(this, runner); var indents = 2; function indent () { return Array(indents).join(' '); } runner.on('suite', function (suite) { if (suite.root) { return; } ++indents; console.log('%s
', indent()); ++indents; console.log('%s

%s

', indent(), utils.escape(suite.title)); console.log('%s
', indent()); }); runner.on('suite end', function (suite) { if (suite.root) { return; } console.log('%s
', indent()); --indents; console.log('%s
', indent()); --indents; }); runner.on('pass', function (test) { console.log('%s
%s
', indent(), utils.escape(test.title)); var code = utils.escape(utils.clean(test.body)); console.log('%s
%s
', indent(), code); }); runner.on('fail', function (test, err) { console.log('%s
%s
', indent(), utils.escape(test.title)); var code = utils.escape(utils.clean(test.body)); console.log('%s
%s
', indent(), code); console.log('%s
%s
', indent(), utils.escape(err)); }); } },{"../utils":38,"./base":17}],19:[function(require,module,exports){ (function (process){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); var inherits = require('../utils').inherits; var color = Base.color; /** * Expose `Dot`. */ exports = module.exports = Dot; /** * Initialize a new `Dot` matrix test reporter. * * @api public * @param {Runner} runner */ function Dot (runner) { Base.call(this, runner); var self = this; var width = Base.window.width * 0.75 | 0; var n = -1; runner.on('start', function () { process.stdout.write('\n'); }); runner.on('pending', function () { if (++n % width === 0) { process.stdout.write('\n '); } process.stdout.write(color('pending', Base.symbols.comma)); }); runner.on('pass', function (test) { if (++n % width === 0) { process.stdout.write('\n '); } if (test.speed === 'slow') { process.stdout.write(color('bright yellow', Base.symbols.dot)); } else { process.stdout.write(color(test.speed, Base.symbols.dot)); } }); runner.on('fail', function () { if (++n % width === 0) { process.stdout.write('\n '); } process.stdout.write(color('fail', Base.symbols.bang)); }); runner.on('end', function () { console.log(); self.epilogue(); }); } /** * Inherit from `Base.prototype`. */ inherits(Dot, Base); }).call(this,require('_process')) },{"../utils":38,"./base":17,"_process":67}],20:[function(require,module,exports){ (function (global){ 'use strict'; /* eslint-env browser */ /** * Module dependencies. */ var Base = require('./base'); var utils = require('../utils'); var Progress = require('../browser/progress'); var escapeRe = require('escape-string-regexp'); var escape = utils.escape; /** * Save timer references to avoid Sinon interfering (see GH-237). */ /* eslint-disable no-unused-vars, no-native-reassign */ var Date = global.Date; var setTimeout = global.setTimeout; var setInterval = global.setInterval; var clearTimeout = global.clearTimeout; var clearInterval = global.clearInterval; /* eslint-enable no-unused-vars, no-native-reassign */ /** * Expose `HTML`. */ exports = module.exports = HTML; /** * Stats template. */ var statsTemplate = ''; /** * Initialize a new `HTML` reporter. * * @api public * @param {Runner} runner */ function HTML (runner) { Base.call(this, runner); var self = this; var stats = this.stats; var stat = fragment(statsTemplate); var items = stat.getElementsByTagName('li'); var passes = items[1].getElementsByTagName('em')[0]; var passesLink = items[1].getElementsByTagName('a')[0]; var failures = items[2].getElementsByTagName('em')[0]; var failuresLink = items[2].getElementsByTagName('a')[0]; var duration = items[3].getElementsByTagName('em')[0]; var canvas = stat.getElementsByTagName('canvas')[0]; var report = fragment('
    '); var stack = [report]; var progress; var ctx; var root = document.getElementById('mocha'); if (canvas.getContext) { var ratio = window.devicePixelRatio || 1; canvas.style.width = canvas.width; canvas.style.height = canvas.height; canvas.width *= ratio; canvas.height *= ratio; ctx = canvas.getContext('2d'); ctx.scale(ratio, ratio); progress = new Progress(); } if (!root) { return error('#mocha div missing, add it to your document'); } // pass toggle on(passesLink, 'click', function (evt) { evt.preventDefault(); unhide(); var name = (/pass/).test(report.className) ? '' : ' pass'; report.className = report.className.replace(/fail|pass/g, '') + name; if (report.className.trim()) { hideSuitesWithout('test pass'); } }); // failure toggle on(failuresLink, 'click', function (evt) { evt.preventDefault(); unhide(); var name = (/fail/).test(report.className) ? '' : ' fail'; report.className = report.className.replace(/fail|pass/g, '') + name; if (report.className.trim()) { hideSuitesWithout('test fail'); } }); root.appendChild(stat); root.appendChild(report); if (progress) { progress.size(40); } runner.on('suite', function (suite) { if (suite.root) { return; } // suite var url = self.suiteURL(suite); var el = fragment('
  • %s

  • ', url, escape(suite.title)); // container stack[0].appendChild(el); stack.unshift(document.createElement('ul')); el.appendChild(stack[0]); }); runner.on('suite end', function (suite) { if (suite.root) { updateStats(); return; } stack.shift(); }); runner.on('pass', function (test) { var url = self.testURL(test); var markup = '
  • %e%ems ' + '

  • '; var el = fragment(markup, test.speed, test.title, test.duration, url); self.addCodeToggle(el, test.body); appendToStack(el); updateStats(); }); runner.on('fail', function (test) { var el = fragment('
  • %e

  • ', test.title, self.testURL(test)); var stackString; // Note: Includes leading newline var message = test.err.toString(); // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we // check for the result of the stringifying. if (message === '[object Error]') { message = test.err.message; } if (test.err.stack) { var indexOfMessage = test.err.stack.indexOf(test.err.message); if (indexOfMessage === -1) { stackString = test.err.stack; } else { stackString = test.err.stack.substr(test.err.message.length + indexOfMessage); } } else if (test.err.sourceURL && test.err.line !== undefined) { // Safari doesn't give you a stack. Let's at least provide a source line. stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')'; } stackString = stackString || ''; if (test.err.htmlMessage && stackString) { el.appendChild(fragment('
    %s\n
    %e
    ', test.err.htmlMessage, stackString)); } else if (test.err.htmlMessage) { el.appendChild(fragment('
    %s
    ', test.err.htmlMessage)); } else { el.appendChild(fragment('
    %e%e
    ', message, stackString)); } self.addCodeToggle(el, test.body); appendToStack(el); updateStats(); }); runner.on('pending', function (test) { var el = fragment('
  • %e

  • ', test.title); appendToStack(el); updateStats(); }); function appendToStack (el) { // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. if (stack[0]) { stack[0].appendChild(el); } } function updateStats () { // TODO: add to stats var percent = stats.tests / runner.total * 100 | 0; if (progress) { progress.update(percent).draw(ctx); } // update stats var ms = new Date() - stats.start; text(passes, stats.passes); text(failures, stats.failures); text(duration, (ms / 1000).toFixed(2)); } } /** * Makes a URL, preserving querystring ("search") parameters. * * @param {string} s * @return {string} A new URL. */ function makeUrl (s) { var search = window.location.search; // Remove previous grep query parameter if present if (search) { search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?'); } return window.location.pathname + (search ? search + '&' : '?') + 'grep=' + encodeURIComponent(escapeRe(s)); } /** * Provide suite URL. * * @param {Object} [suite] */ HTML.prototype.suiteURL = function (suite) { return makeUrl(suite.fullTitle()); }; /** * Provide test URL. * * @param {Object} [test] */ HTML.prototype.testURL = function (test) { return makeUrl(test.fullTitle()); }; /** * Adds code toggle functionality for the provided test's list element. * * @param {HTMLLIElement} el * @param {string} contents */ HTML.prototype.addCodeToggle = function (el, contents) { var h2 = el.getElementsByTagName('h2')[0]; on(h2, 'click', function () { pre.style.display = pre.style.display === 'none' ? 'block' : 'none'; }); var pre = fragment('
    %e
    ', utils.clean(contents)); el.appendChild(pre); pre.style.display = 'none'; }; /** * Display error `msg`. * * @param {string} msg */ function error (msg) { document.body.appendChild(fragment('
    %s
    ', msg)); } /** * Return a DOM fragment from `html`. * * @param {string} html */ function fragment (html) { var args = arguments; var div = document.createElement('div'); var i = 1; div.innerHTML = html.replace(/%([se])/g, function (_, type) { switch (type) { case 's': return String(args[i++]); case 'e': return escape(args[i++]); // no default } }); return div.firstChild; } /** * Check for suites that do not have elements * with `classname`, and hide them. * * @param {text} classname */ function hideSuitesWithout (classname) { var suites = document.getElementsByClassName('suite'); for (var i = 0; i < suites.length; i++) { var els = suites[i].getElementsByClassName(classname); if (!els.length) { suites[i].className += ' hidden'; } } } /** * Unhide .hidden suites. */ function unhide () { var els = document.getElementsByClassName('suite hidden'); for (var i = 0; i < els.length; ++i) { els[i].className = els[i].className.replace('suite hidden', 'suite'); } } /** * Set an element's text contents. * * @param {HTMLElement} el * @param {string} contents */ function text (el, contents) { if (el.textContent) { el.textContent = contents; } else { el.innerText = contents; } } /** * Listen on `event` with callback `fn`. */ function on (el, event, fn) { if (el.addEventListener) { el.addEventListener(event, fn, false); } else { el.attachEvent('on' + event, fn); } } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"../browser/progress":4,"../utils":38,"./base":17,"escape-string-regexp":47}],21:[function(require,module,exports){ 'use strict'; // Alias exports to a their normalized format Mocha#reporter to prevent a need // for dynamic (try/catch) requires, which Browserify doesn't handle. exports.Base = exports.base = require('./base'); exports.Dot = exports.dot = require('./dot'); exports.Doc = exports.doc = require('./doc'); exports.TAP = exports.tap = require('./tap'); exports.JSON = exports.json = require('./json'); exports.HTML = exports.html = require('./html'); exports.List = exports.list = require('./list'); exports.Min = exports.min = require('./min'); exports.Spec = exports.spec = require('./spec'); exports.Nyan = exports.nyan = require('./nyan'); exports.XUnit = exports.xunit = require('./xunit'); exports.Markdown = exports.markdown = require('./markdown'); exports.Progress = exports.progress = require('./progress'); exports.Landing = exports.landing = require('./landing'); exports.JSONStream = exports['json-stream'] = require('./json-stream'); },{"./base":17,"./doc":18,"./dot":19,"./html":20,"./json":23,"./json-stream":22,"./landing":24,"./list":25,"./markdown":26,"./min":27,"./nyan":28,"./progress":29,"./spec":30,"./tap":31,"./xunit":32}],22:[function(require,module,exports){ (function (process){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); var JSON = require('json3'); /** * Expose `List`. */ exports = module.exports = List; /** * Initialize a new `List` test reporter. * * @api public * @param {Runner} runner */ function List (runner) { Base.call(this, runner); var self = this; var total = runner.total; runner.on('start', function () { console.log(JSON.stringify(['start', { total: total }])); }); runner.on('pass', function (test) { console.log(JSON.stringify(['pass', clean(test)])); }); runner.on('fail', function (test, err) { test = clean(test); test.err = err.message; test.stack = err.stack || null; console.log(JSON.stringify(['fail', test])); }); runner.on('end', function () { process.stdout.write(JSON.stringify(['end', self.stats])); }); } /** * Return a plain-object representation of `test` * free of cyclic properties etc. * * @api private * @param {Object} test * @return {Object} */ function clean (test) { return { title: test.title, fullTitle: test.fullTitle(), duration: test.duration, currentRetry: test.currentRetry() }; } }).call(this,require('_process')) },{"./base":17,"_process":67,"json3":54}],23:[function(require,module,exports){ (function (process){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); /** * Expose `JSON`. */ exports = module.exports = JSONReporter; /** * Initialize a new `JSON` reporter. * * @api public * @param {Runner} runner */ function JSONReporter (runner) { Base.call(this, runner); var self = this; var tests = []; var pending = []; var failures = []; var passes = []; runner.on('test end', function (test) { tests.push(test); }); runner.on('pass', function (test) { passes.push(test); }); runner.on('fail', function (test) { failures.push(test); }); runner.on('pending', function (test) { pending.push(test); }); runner.on('end', function () { var obj = { stats: self.stats, tests: tests.map(clean), pending: pending.map(clean), failures: failures.map(clean), passes: passes.map(clean) }; runner.testResults = obj; process.stdout.write(JSON.stringify(obj, null, 2)); }); } /** * Return a plain-object representation of `test` * free of cyclic properties etc. * * @api private * @param {Object} test * @return {Object} */ function clean (test) { return { title: test.title, fullTitle: test.fullTitle(), duration: test.duration, currentRetry: test.currentRetry(), err: errorJSON(test.err || {}) }; } /** * Transform `error` into a JSON object. * * @api private * @param {Error} err * @return {Object} */ function errorJSON (err) { var res = {}; Object.getOwnPropertyNames(err).forEach(function (key) { res[key] = err[key]; }, err); return res; } }).call(this,require('_process')) },{"./base":17,"_process":67}],24:[function(require,module,exports){ (function (process){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); var inherits = require('../utils').inherits; var cursor = Base.cursor; var color = Base.color; /** * Expose `Landing`. */ exports = module.exports = Landing; /** * Airplane color. */ Base.colors.plane = 0; /** * Airplane crash color. */ Base.colors['plane crash'] = 31; /** * Runway color. */ Base.colors.runway = 90; /** * Initialize a new `Landing` reporter. * * @api public * @param {Runner} runner */ function Landing (runner) { Base.call(this, runner); var self = this; var width = Base.window.width * 0.75 | 0; var total = runner.total; var stream = process.stdout; var plane = color('plane', '✈'); var crashed = -1; var n = 0; function runway () { var buf = Array(width).join('-'); return ' ' + color('runway', buf); } runner.on('start', function () { stream.write('\n\n\n '); cursor.hide(); }); runner.on('test end', function (test) { // check if the plane crashed var col = crashed === -1 ? width * ++n / total | 0 : crashed; // show the crash if (test.state === 'failed') { plane = color('plane crash', '✈'); crashed = col; } // render landing strip stream.write('\u001b[' + (width + 1) + 'D\u001b[2A'); stream.write(runway()); stream.write('\n '); stream.write(color('runway', Array(col).join('⋅'))); stream.write(plane); stream.write(color('runway', Array(width - col).join('⋅') + '\n')); stream.write(runway()); stream.write('\u001b[0m'); }); runner.on('end', function () { cursor.show(); console.log(); self.epilogue(); }); } /** * Inherit from `Base.prototype`. */ inherits(Landing, Base); }).call(this,require('_process')) },{"../utils":38,"./base":17,"_process":67}],25:[function(require,module,exports){ (function (process){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); var inherits = require('../utils').inherits; var color = Base.color; var cursor = Base.cursor; /** * Expose `List`. */ exports = module.exports = List; /** * Initialize a new `List` test reporter. * * @api public * @param {Runner} runner */ function List (runner) { Base.call(this, runner); var self = this; var n = 0; runner.on('start', function () { console.log(); }); runner.on('test', function (test) { process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); }); runner.on('pending', function (test) { var fmt = color('checkmark', ' -') + color('pending', ' %s'); console.log(fmt, test.fullTitle()); }); runner.on('pass', function (test) { var fmt = color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s: ') + color(test.speed, '%dms'); cursor.CR(); console.log(fmt, test.fullTitle(), test.duration); }); runner.on('fail', function (test) { cursor.CR(); console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); }); runner.on('end', self.epilogue.bind(self)); } /** * Inherit from `Base.prototype`. */ inherits(List, Base); }).call(this,require('_process')) },{"../utils":38,"./base":17,"_process":67}],26:[function(require,module,exports){ (function (process){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); var utils = require('../utils'); /** * Constants */ var SUITE_PREFIX = '$'; /** * Expose `Markdown`. */ exports = module.exports = Markdown; /** * Initialize a new `Markdown` reporter. * * @api public * @param {Runner} runner */ function Markdown (runner) { Base.call(this, runner); var level = 0; var buf = ''; function title (str) { return Array(level).join('#') + ' ' + str; } function mapTOC (suite, obj) { var ret = obj; var key = SUITE_PREFIX + suite.title; obj = obj[key] = obj[key] || { suite: suite }; suite.suites.forEach(function (suite) { mapTOC(suite, obj); }); return ret; } function stringifyTOC (obj, level) { ++level; var buf = ''; var link; for (var key in obj) { if (key === 'suite') { continue; } if (key !== SUITE_PREFIX) { link = ' - [' + key.substring(1) + ']'; link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; buf += Array(level).join(' ') + link; } buf += stringifyTOC(obj[key], level); } return buf; } function generateTOC (suite) { var obj = mapTOC(suite, {}); return stringifyTOC(obj, 0); } generateTOC(runner.suite); runner.on('suite', function (suite) { ++level; var slug = utils.slug(suite.fullTitle()); buf += '' + '\n'; buf += title(suite.title) + '\n'; }); runner.on('suite end', function () { --level; }); runner.on('pass', function (test) { var code = utils.clean(test.body); buf += test.title + '.\n'; buf += '\n```js\n'; buf += code + '\n'; buf += '```\n\n'; }); runner.on('end', function () { process.stdout.write('# TOC\n'); process.stdout.write(generateTOC(runner.suite)); process.stdout.write(buf); }); } }).call(this,require('_process')) },{"../utils":38,"./base":17,"_process":67}],27:[function(require,module,exports){ (function (process){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); var inherits = require('../utils').inherits; /** * Expose `Min`. */ exports = module.exports = Min; /** * Initialize a new `Min` minimal test reporter (best used with --watch). * * @api public * @param {Runner} runner */ function Min (runner) { Base.call(this, runner); runner.on('start', function () { // clear screen process.stdout.write('\u001b[2J'); // set cursor position process.stdout.write('\u001b[1;3H'); }); runner.on('end', this.epilogue.bind(this)); } /** * Inherit from `Base.prototype`. */ inherits(Min, Base); }).call(this,require('_process')) },{"../utils":38,"./base":17,"_process":67}],28:[function(require,module,exports){ (function (process){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); var inherits = require('../utils').inherits; /** * Expose `Dot`. */ exports = module.exports = NyanCat; /** * Initialize a new `Dot` matrix test reporter. * * @param {Runner} runner * @api public */ function NyanCat (runner) { Base.call(this, runner); var self = this; var width = Base.window.width * 0.75 | 0; var nyanCatWidth = this.nyanCatWidth = 11; this.colorIndex = 0; this.numberOfLines = 4; this.rainbowColors = self.generateColors(); this.scoreboardWidth = 5; this.tick = 0; this.trajectories = [[], [], [], []]; this.trajectoryWidthMax = (width - nyanCatWidth); runner.on('start', function () { Base.cursor.hide(); self.draw(); }); runner.on('pending', function () { self.draw(); }); runner.on('pass', function () { self.draw(); }); runner.on('fail', function () { self.draw(); }); runner.on('end', function () { Base.cursor.show(); for (var i = 0; i < self.numberOfLines; i++) { write('\n'); } self.epilogue(); }); } /** * Inherit from `Base.prototype`. */ inherits(NyanCat, Base); /** * Draw the nyan cat * * @api private */ NyanCat.prototype.draw = function () { this.appendRainbow(); this.drawScoreboard(); this.drawRainbow(); this.drawNyanCat(); this.tick = !this.tick; }; /** * Draw the "scoreboard" showing the number * of passes, failures and pending tests. * * @api private */ NyanCat.prototype.drawScoreboard = function () { var stats = this.stats; function draw (type, n) { write(' '); write(Base.color(type, n)); write('\n'); } draw('green', stats.passes); draw('fail', stats.failures); draw('pending', stats.pending); write('\n'); this.cursorUp(this.numberOfLines); }; /** * Append the rainbow. * * @api private */ NyanCat.prototype.appendRainbow = function () { var segment = this.tick ? '_' : '-'; var rainbowified = this.rainbowify(segment); for (var index = 0; index < this.numberOfLines; index++) { var trajectory = this.trajectories[index]; if (trajectory.length >= this.trajectoryWidthMax) { trajectory.shift(); } trajectory.push(rainbowified); } }; /** * Draw the rainbow. * * @api private */ NyanCat.prototype.drawRainbow = function () { var self = this; this.trajectories.forEach(function (line) { write('\u001b[' + self.scoreboardWidth + 'C'); write(line.join('')); write('\n'); }); this.cursorUp(this.numberOfLines); }; /** * Draw the nyan cat * * @api private */ NyanCat.prototype.drawNyanCat = function () { var self = this; var startWidth = this.scoreboardWidth + this.trajectories[0].length; var dist = '\u001b[' + startWidth + 'C'; var padding = ''; write(dist); write('_,------,'); write('\n'); write(dist); padding = self.tick ? ' ' : ' '; write('_|' + padding + '/\\_/\\ '); write('\n'); write(dist); padding = self.tick ? '_' : '__'; var tail = self.tick ? '~' : '^'; write(tail + '|' + padding + this.face() + ' '); write('\n'); write(dist); padding = self.tick ? ' ' : ' '; write(padding + '"" "" '); write('\n'); this.cursorUp(this.numberOfLines); }; /** * Draw nyan cat face. * * @api private * @return {string} */ NyanCat.prototype.face = function () { var stats = this.stats; if (stats.failures) { return '( x .x)'; } else if (stats.pending) { return '( o .o)'; } else if (stats.passes) { return '( ^ .^)'; } return '( - .-)'; }; /** * Move cursor up `n`. * * @api private * @param {number} n */ NyanCat.prototype.cursorUp = function (n) { write('\u001b[' + n + 'A'); }; /** * Move cursor down `n`. * * @api private * @param {number} n */ NyanCat.prototype.cursorDown = function (n) { write('\u001b[' + n + 'B'); }; /** * Generate rainbow colors. * * @api private * @return {Array} */ NyanCat.prototype.generateColors = function () { var colors = []; for (var i = 0; i < (6 * 7); i++) { var pi3 = Math.floor(Math.PI / 3); var n = (i * (1.0 / 6)); var r = Math.floor(3 * Math.sin(n) + 3); var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3); var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3); colors.push(36 * r + 6 * g + b + 16); } return colors; }; /** * Apply rainbow to the given `str`. * * @api private * @param {string} str * @return {string} */ NyanCat.prototype.rainbowify = function (str) { if (!Base.useColors) { return str; } var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; this.colorIndex += 1; return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; }; /** * Stdout helper. * * @param {string} string A message to write to stdout. */ function write (string) { process.stdout.write(string); } }).call(this,require('_process')) },{"../utils":38,"./base":17,"_process":67}],29:[function(require,module,exports){ (function (process){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); var inherits = require('../utils').inherits; var color = Base.color; var cursor = Base.cursor; /** * Expose `Progress`. */ exports = module.exports = Progress; /** * General progress bar color. */ Base.colors.progress = 90; /** * Initialize a new `Progress` bar test reporter. * * @api public * @param {Runner} runner * @param {Object} options */ function Progress (runner, options) { Base.call(this, runner); var self = this; var width = Base.window.width * 0.50 | 0; var total = runner.total; var complete = 0; var lastN = -1; // default chars options = options || {}; options.open = options.open || '['; options.complete = options.complete || '▬'; options.incomplete = options.incomplete || Base.symbols.dot; options.close = options.close || ']'; options.verbose = false; // tests started runner.on('start', function () { console.log(); cursor.hide(); }); // tests complete runner.on('test end', function () { complete++; var percent = complete / total; var n = width * percent | 0; var i = width - n; if (n === lastN && !options.verbose) { // Don't re-render the line if it hasn't changed return; } lastN = n; cursor.CR(); process.stdout.write('\u001b[J'); process.stdout.write(color('progress', ' ' + options.open)); process.stdout.write(Array(n).join(options.complete)); process.stdout.write(Array(i).join(options.incomplete)); process.stdout.write(color('progress', options.close)); if (options.verbose) { process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); } }); // tests are complete, output some stats // and the failures if any runner.on('end', function () { cursor.show(); console.log(); self.epilogue(); }); } /** * Inherit from `Base.prototype`. */ inherits(Progress, Base); }).call(this,require('_process')) },{"../utils":38,"./base":17,"_process":67}],30:[function(require,module,exports){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); var inherits = require('../utils').inherits; var color = Base.color; /** * Expose `Spec`. */ exports = module.exports = Spec; /** * Initialize a new `Spec` test reporter. * * @api public * @param {Runner} runner */ function Spec (runner) { Base.call(this, runner); var self = this; var indents = 0; var n = 0; function indent () { return Array(indents).join(' '); } runner.on('start', function () { console.log(); }); runner.on('suite', function (suite) { ++indents; console.log(color('suite', '%s%s'), indent(), suite.title); }); runner.on('suite end', function () { --indents; if (indents === 1) { console.log(); } }); runner.on('pending', function (test) { var fmt = indent() + color('pending', ' - %s'); console.log(fmt, test.title); }); runner.on('pass', function (test) { var fmt; if (test.speed === 'fast') { fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s'); console.log(fmt, test.title); } else { fmt = indent() + color('checkmark', ' ' + Base.symbols.ok) + color('pass', ' %s') + color(test.speed, ' (%dms)'); console.log(fmt, test.title, test.duration); } }); runner.on('fail', function (test) { console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); }); runner.on('end', self.epilogue.bind(self)); } /** * Inherit from `Base.prototype`. */ inherits(Spec, Base); },{"../utils":38,"./base":17}],31:[function(require,module,exports){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); /** * Expose `TAP`. */ exports = module.exports = TAP; /** * Initialize a new `TAP` reporter. * * @api public * @param {Runner} runner */ function TAP (runner) { Base.call(this, runner); var n = 1; var passes = 0; var failures = 0; runner.on('start', function () { var total = runner.grepTotal(runner.suite); console.log('%d..%d', 1, total); }); runner.on('test end', function () { ++n; }); runner.on('pending', function (test) { console.log('ok %d %s # SKIP -', n, title(test)); }); runner.on('pass', function (test) { passes++; console.log('ok %d %s', n, title(test)); }); runner.on('fail', function (test, err) { failures++; console.log('not ok %d %s', n, title(test)); if (err.stack) { console.log(err.stack.replace(/^/gm, ' ')); } }); runner.on('end', function () { console.log('# tests ' + (passes + failures)); console.log('# pass ' + passes); console.log('# fail ' + failures); }); } /** * Return a TAP-safe title of `test` * * @api private * @param {Object} test * @return {String} */ function title (test) { return test.fullTitle().replace(/#/g, ''); } },{"./base":17}],32:[function(require,module,exports){ (function (process,global){ 'use strict'; /** * Module dependencies. */ var Base = require('./base'); var utils = require('../utils'); var inherits = utils.inherits; var fs = require('fs'); var escape = utils.escape; var mkdirp = require('mkdirp'); var path = require('path'); /** * Save timer references to avoid Sinon interfering (see GH-237). */ /* eslint-disable no-unused-vars, no-native-reassign */ var Date = global.Date; var setTimeout = global.setTimeout; var setInterval = global.setInterval; var clearTimeout = global.clearTimeout; var clearInterval = global.clearInterval; /* eslint-enable no-unused-vars, no-native-reassign */ /** * Expose `XUnit`. */ exports = module.exports = XUnit; /** * Initialize a new `XUnit` reporter. * * @api public * @param {Runner} runner */ function XUnit (runner, options) { Base.call(this, runner); var stats = this.stats; var tests = []; var self = this; if (options && options.reporterOptions && options.reporterOptions.output) { if (!fs.createWriteStream) { throw new Error('file output not supported in browser'); } mkdirp.sync(path.dirname(options.reporterOptions.output)); self.fileStream = fs.createWriteStream(options.reporterOptions.output); } runner.on('pending', function (test) { tests.push(test); }); runner.on('pass', function (test) { tests.push(test); }); runner.on('fail', function (test) { tests.push(test); }); runner.on('end', function () { self.write(tag('testsuite', { name: 'Mocha Tests', tests: stats.tests, failures: stats.failures, errors: stats.failures, skipped: stats.tests - stats.failures - stats.passes, timestamp: (new Date()).toUTCString(), time: (stats.duration / 1000) || 0 }, false)); tests.forEach(function (t) { self.test(t); }); self.write(''); }); } /** * Inherit from `Base.prototype`. */ inherits(XUnit, Base); /** * Override done to close the stream (if it's a file). * * @param failures * @param {Function} fn */ XUnit.prototype.done = function (failures, fn) { if (this.fileStream) { this.fileStream.end(function () { fn(failures); }); } else { fn(failures); } }; /** * Write out the given line. * * @param {string} line */ XUnit.prototype.write = function (line) { if (this.fileStream) { this.fileStream.write(line + '\n'); } else if (typeof process === 'object' && process.stdout) { process.stdout.write(line + '\n'); } else { console.log(line); } }; /** * Output tag for the given `test.` * * @param {Test} test */ XUnit.prototype.test = function (test) { var attrs = { classname: test.parent.fullTitle(), name: test.title, time: (test.duration / 1000) || 0 }; if (test.state === 'failed') { var err = test.err; this.write(tag('testcase', attrs, false, tag('failure', {}, false, escape(err.message) + '\n' + escape(err.stack)))); } else if (test.isPending()) { this.write(tag('testcase', attrs, false, tag('skipped', {}, true))); } else { this.write(tag('testcase', attrs, true)); } }; /** * HTML tag helper. * * @param name * @param attrs * @param close * @param content * @return {string} */ function tag (name, attrs, close, content) { var end = close ? '/>' : '>'; var pairs = []; var tag; for (var key in attrs) { if (Object.prototype.hasOwnProperty.call(attrs, key)) { pairs.push(key + '="' + escape(attrs[key]) + '"'); } } tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; if (content) { tag += content + ' Math.pow(2, 31)) { this._enableTimeouts = false; } if (typeof ms === 'string') { ms = milliseconds(ms); } debug('timeout %d', ms); this._timeout = ms; if (this.timer) { this.resetTimeout(); } return this; }; /** * Set & get slow `ms`. * * @api private * @param {number|string} ms * @return {Runnable|number} ms or Runnable instance. */ Runnable.prototype.slow = function (ms) { if (typeof ms === 'undefined') { return this._slow; } if (typeof ms === 'string') { ms = milliseconds(ms); } debug('timeout %d', ms); this._slow = ms; return this; }; /** * Set and get whether timeout is `enabled`. * * @api private * @param {boolean} enabled * @return {Runnable|boolean} enabled or Runnable instance. */ Runnable.prototype.enableTimeouts = function (enabled) { if (!arguments.length) { return this._enableTimeouts; } debug('enableTimeouts %s', enabled); this._enableTimeouts = enabled; return this; }; /** * Halt and mark as pending. * * @api public */ Runnable.prototype.skip = function () { throw new Pending('sync skip'); }; /** * Check if this runnable or its parent suite is marked as pending. * * @api private */ Runnable.prototype.isPending = function () { return this.pending || (this.parent && this.parent.isPending()); }; /** * Set number of retries. * * @api private */ Runnable.prototype.retries = function (n) { if (!arguments.length) { return this._retries; } this._retries = n; }; /** * Get current retry * * @api private */ Runnable.prototype.currentRetry = function (n) { if (!arguments.length) { return this._currentRetry; } this._currentRetry = n; }; /** * Return the full title generated by recursively concatenating the parent's * full title. * * @api public * @return {string} */ Runnable.prototype.fullTitle = function () { return this.parent.fullTitle() + ' ' + this.title; }; /** * Clear the timeout. * * @api private */ Runnable.prototype.clearTimeout = function () { clearTimeout(this.timer); }; /** * Inspect the runnable void of private properties. * * @api private * @return {string} */ Runnable.prototype.inspect = function () { return JSON.stringify(this, function (key, val) { if (key[0] === '_') { return; } if (key === 'parent') { return '#'; } if (key === 'ctx') { return '#'; } return val; }, 2); }; /** * Reset the timeout. * * @api private */ Runnable.prototype.resetTimeout = function () { var self = this; var ms = this.timeout() || 1e9; if (!this._enableTimeouts) { return; } this.clearTimeout(); this.timer = setTimeout(function () { if (!self._enableTimeouts) { return; } self.callback(new Error('Timeout of ' + ms + 'ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.')); self.timedOut = true; }, ms); }; /** * Whitelist a list of globals for this test run. * * @api private * @param {string[]} globals */ Runnable.prototype.globals = function (globals) { if (!arguments.length) { return this._allowedGlobals; } this._allowedGlobals = globals; }; /** * Run the test and invoke `fn(err)`. * * @param {Function} fn * @api private */ Runnable.prototype.run = function (fn) { var self = this; var start = new Date(); var ctx = this.ctx; var finished; var emitted; // Sometimes the ctx exists, but it is not runnable if (ctx && ctx.runnable) { ctx.runnable(this); } // called multiple times function multiple (err) { if (emitted) { return; } emitted = true; self.emit('error', err || new Error('done() called multiple times; stacktrace may be inaccurate')); } // finished function done (err) { var ms = self.timeout(); if (self.timedOut) { return; } if (finished) { return multiple(err || self._trace); } self.clearTimeout(); self.duration = new Date() - start; finished = true; if (!err && self.duration > ms && self._enableTimeouts) { err = new Error('Timeout of ' + ms + 'ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.'); } fn(err); } // for .resetTimeout() this.callback = done; // explicit async with `done` argument if (this.async) { this.resetTimeout(); // allows skip() to be used in an explicit async context this.skip = function asyncSkip () { done(new Pending('async skip call')); // halt execution. the Runnable will be marked pending // by the previous call, and the uncaught handler will ignore // the failure. throw new Pending('async skip; aborting execution'); }; if (this.allowUncaught) { return callFnAsync(this.fn); } try { callFnAsync(this.fn); } catch (err) { emitted = true; done(utils.getError(err)); } return; } if (this.allowUncaught) { callFn(this.fn); done(); return; } // sync or promise-returning try { if (this.isPending()) { done(); } else { callFn(this.fn); } } catch (err) { emitted = true; done(utils.getError(err)); } function callFn (fn) { var result = fn.call(ctx); if (result && typeof result.then === 'function') { self.resetTimeout(); result .then(function () { done(); // Return null so libraries like bluebird do not warn about // subsequently constructed Promises. return null; }, function (reason) { done(reason || new Error('Promise rejected with no or falsy reason')); }); } else { if (self.asyncOnly) { return done(new Error('--async-only option in use without declaring `done()` or returning a promise')); } done(); } } function callFnAsync (fn) { var result = fn.call(ctx, function (err) { if (err instanceof Error || toString.call(err) === '[object Error]') { return done(err); } if (err) { if (Object.prototype.toString.call(err) === '[object Object]') { return done(new Error('done() invoked with non-Error: ' + JSON.stringify(err))); } return done(new Error('done() invoked with non-Error: ' + err)); } if (result && utils.isPromise(result)) { return done(new Error('Resolution method is overspecified. Specify a callback *or* return a Promise; not both.')); } done(); }); } }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./ms":15,"./pending":16,"./utils":38,"debug":2,"events":3,"json3":54,"lodash.create":60}],34:[function(require,module,exports){ (function (process,global){ 'use strict'; /** * Module dependencies. */ var EventEmitter = require('events').EventEmitter; var Pending = require('./pending'); var utils = require('./utils'); var inherits = utils.inherits; var debug = require('debug')('mocha:runner'); var Runnable = require('./runnable'); var filter = utils.filter; var indexOf = utils.indexOf; var some = utils.some; var keys = utils.keys; var stackFilter = utils.stackTraceFilter(); var stringify = utils.stringify; var type = utils.type; var undefinedError = utils.undefinedError; var isArray = utils.isArray; /** * Non-enumerable globals. */ var globals = [ 'setTimeout', 'clearTimeout', 'setInterval', 'clearInterval', 'XMLHttpRequest', 'Date', 'setImmediate', 'clearImmediate' ]; /** * Expose `Runner`. */ module.exports = Runner; /** * Initialize a `Runner` for the given `suite`. * * Events: * * - `start` execution started * - `end` execution complete * - `suite` (suite) test suite execution started * - `suite end` (suite) all tests (and sub-suites) have finished * - `test` (test) test execution started * - `test end` (test) test completed * - `hook` (hook) hook execution started * - `hook end` (hook) hook complete * - `pass` (test) test passed * - `fail` (test, err) test failed * - `pending` (test) test pending * * @api public * @param {Suite} suite Root suite * @param {boolean} [delay] Whether or not to delay execution of root suite * until ready. */ function Runner (suite, delay) { var self = this; this._globals = []; this._abort = false; this._delay = delay; this.suite = suite; this.started = false; this.total = suite.total(); this.failures = 0; this.on('test end', function (test) { self.checkGlobals(test); }); this.on('hook end', function (hook) { self.checkGlobals(hook); }); this._defaultGrep = /.*/; this.grep(this._defaultGrep); this.globals(this.globalProps().concat(extraGlobals())); } /** * Wrapper for setImmediate, process.nextTick, or browser polyfill. * * @param {Function} fn * @api private */ Runner.immediately = global.setImmediate || process.nextTick; /** * Inherit from `EventEmitter.prototype`. */ inherits(Runner, EventEmitter); /** * Run tests with full titles matching `re`. Updates runner.total * with number of tests matched. * * @param {RegExp} re * @param {Boolean} invert * @return {Runner} for chaining * @api public * @param {RegExp} re * @param {boolean} invert * @return {Runner} Runner instance. */ Runner.prototype.grep = function (re, invert) { debug('grep %s', re); this._grep = re; this._invert = invert; this.total = this.grepTotal(this.suite); return this; }; /** * Returns the number of tests matching the grep search for the * given suite. * * @param {Suite} suite * @return {Number} * @api public * @param {Suite} suite * @return {number} */ Runner.prototype.grepTotal = function (suite) { var self = this; var total = 0; suite.eachTest(function (test) { var match = self._grep.test(test.fullTitle()); if (self._invert) { match = !match; } if (match) { total++; } }); return total; }; /** * Return a list of global properties. * * @return {Array} * @api private */ Runner.prototype.globalProps = function () { var props = keys(global); // non-enumerables for (var i = 0; i < globals.length; ++i) { if (~indexOf(props, globals[i])) { continue; } props.push(globals[i]); } return props; }; /** * Allow the given `arr` of globals. * * @param {Array} arr * @return {Runner} for chaining * @api public * @param {Array} arr * @return {Runner} Runner instance. */ Runner.prototype.globals = function (arr) { if (!arguments.length) { return this._globals; } debug('globals %j', arr); this._globals = this._globals.concat(arr); return this; }; /** * Check for global variable leaks. * * @api private */ Runner.prototype.checkGlobals = function (test) { if (this.ignoreLeaks) { return; } var ok = this._globals; var globals = this.globalProps(); var leaks; if (test) { ok = ok.concat(test._allowedGlobals || []); } if (this.prevGlobalsLength === globals.length) { return; } this.prevGlobalsLength = globals.length; leaks = filterLeaks(ok, globals); this._globals = this._globals.concat(leaks); if (leaks.length > 1) { this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); } else if (leaks.length) { this.fail(test, new Error('global leak detected: ' + leaks[0])); } }; /** * Fail the given `test`. * * @api private * @param {Test} test * @param {Error} err */ Runner.prototype.fail = function (test, err) { if (test.isPending()) { return; } ++this.failures; test.state = 'failed'; if (!(err instanceof Error || err && typeof err.message === 'string')) { err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)'); } try { err.stack = (this.fullStackTrace || !err.stack) ? err.stack : stackFilter(err.stack); } catch (ignored) { // some environments do not take kindly to monkeying with the stack } this.emit('fail', test, err); }; /** * Fail the given `hook` with `err`. * * Hook failures work in the following pattern: * - If bail, then exit * - Failed `before` hook skips all tests in a suite and subsuites, * but jumps to corresponding `after` hook * - Failed `before each` hook skips remaining tests in a * suite and jumps to corresponding `after each` hook, * which is run only once * - Failed `after` hook does not alter * execution order * - Failed `after each` hook skips remaining tests in a * suite and subsuites, but executes other `after each` * hooks * * @api private * @param {Hook} hook * @param {Error} err */ Runner.prototype.failHook = function (hook, err) { if (hook.ctx && hook.ctx.currentTest) { hook.originalTitle = hook.originalTitle || hook.title; hook.title = hook.originalTitle + ' for "' + hook.ctx.currentTest.title + '"'; } this.fail(hook, err); if (this.suite.bail()) { this.emit('end'); } }; /** * Run hook `name` callbacks and then invoke `fn()`. * * @api private * @param {string} name * @param {Function} fn */ Runner.prototype.hook = function (name, fn) { var suite = this.suite; var hooks = suite['_' + name]; var self = this; function next (i) { var hook = hooks[i]; if (!hook) { return fn(); } self.currentRunnable = hook; hook.ctx.currentTest = self.test; self.emit('hook', hook); if (!hook.listeners('error').length) { hook.on('error', function (err) { self.failHook(hook, err); }); } hook.run(function (err) { var testError = hook.error(); if (testError) { self.fail(self.test, testError); } if (err) { if (err instanceof Pending) { if (name === 'beforeEach' || name === 'afterEach') { self.test.pending = true; } else { utils.forEach(suite.tests, function (test) { test.pending = true; }); // a pending hook won't be executed twice. hook.pending = true; } } else { self.failHook(hook, err); // stop executing hooks, notify callee of hook err return fn(err); } } self.emit('hook end', hook); delete hook.ctx.currentTest; next(++i); }); } Runner.immediately(function () { next(0); }); }; /** * Run hook `name` for the given array of `suites` * in order, and callback `fn(err, errSuite)`. * * @api private * @param {string} name * @param {Array} suites * @param {Function} fn */ Runner.prototype.hooks = function (name, suites, fn) { var self = this; var orig = this.suite; function next (suite) { self.suite = suite; if (!suite) { self.suite = orig; return fn(); } self.hook(name, function (err) { if (err) { var errSuite = self.suite; self.suite = orig; return fn(err, errSuite); } next(suites.pop()); }); } next(suites.pop()); }; /** * Run hooks from the top level down. * * @param {String} name * @param {Function} fn * @api private */ Runner.prototype.hookUp = function (name, fn) { var suites = [this.suite].concat(this.parents()).reverse(); this.hooks(name, suites, fn); }; /** * Run hooks from the bottom up. * * @param {String} name * @param {Function} fn * @api private */ Runner.prototype.hookDown = function (name, fn) { var suites = [this.suite].concat(this.parents()); this.hooks(name, suites, fn); }; /** * Return an array of parent Suites from * closest to furthest. * * @return {Array} * @api private */ Runner.prototype.parents = function () { var suite = this.suite; var suites = []; while (suite.parent) { suite = suite.parent; suites.push(suite); } return suites; }; /** * Run the current test and callback `fn(err)`. * * @param {Function} fn * @api private */ Runner.prototype.runTest = function (fn) { var self = this; var test = this.test; if (!test) { return; } if (this.asyncOnly) { test.asyncOnly = true; } if (this.allowUncaught) { test.allowUncaught = true; return test.run(fn); } try { test.on('error', function (err) { self.fail(test, err); }); test.run(fn); } catch (err) { fn(err); } }; /** * Run tests in the given `suite` and invoke the callback `fn()` when complete. * * @api private * @param {Suite} suite * @param {Function} fn */ Runner.prototype.runTests = function (suite, fn) { var self = this; var tests = suite.tests.slice(); var test; function hookErr (_, errSuite, after) { // before/after Each hook for errSuite failed: var orig = self.suite; // for failed 'after each' hook start from errSuite parent, // otherwise start from errSuite itself self.suite = after ? errSuite.parent : errSuite; if (self.suite) { // call hookUp afterEach self.hookUp('afterEach', function (err2, errSuite2) { self.suite = orig; // some hooks may fail even now if (err2) { return hookErr(err2, errSuite2, true); } // report error suite fn(errSuite); }); } else { // there is no need calling other 'after each' hooks self.suite = orig; fn(errSuite); } } function next (err, errSuite) { // if we bail after first err if (self.failures && suite._bail) { return fn(); } if (self._abort) { return fn(); } if (err) { return hookErr(err, errSuite, true); } // next test test = tests.shift(); // all done if (!test) { return fn(); } // grep var match = self._grep.test(test.fullTitle()); if (self._invert) { match = !match; } if (!match) { // Run immediately only if we have defined a grep. When we // define a grep — It can cause maximum callstack error if // the grep is doing a large recursive loop by neglecting // all tests. The run immediately function also comes with // a performance cost. So we don't want to run immediately // if we run the whole test suite, because running the whole // test suite don't do any immediate recursive loops. Thus, // allowing a JS runtime to breathe. if (self._grep !== self._defaultGrep) { Runner.immediately(next); } else { next(); } return; } if (test.isPending()) { self.emit('pending', test); self.emit('test end', test); return next(); } // execute test and hook(s) self.emit('test', self.test = test); self.hookDown('beforeEach', function (err, errSuite) { if (test.isPending()) { self.emit('pending', test); self.emit('test end', test); return next(); } if (err) { return hookErr(err, errSuite, false); } self.currentRunnable = self.test; self.runTest(function (err) { test = self.test; if (err) { var retry = test.currentRetry(); if (err instanceof Pending) { test.pending = true; self.emit('pending', test); } else if (retry < test.retries()) { var clonedTest = test.clone(); clonedTest.currentRetry(retry + 1); tests.unshift(clonedTest); // Early return + hook trigger so that it doesn't // increment the count wrong return self.hookUp('afterEach', next); } else { self.fail(test, err); } self.emit('test end', test); if (err instanceof Pending) { return next(); } return self.hookUp('afterEach', next); } test.state = 'passed'; self.emit('pass', test); self.emit('test end', test); self.hookUp('afterEach', next); }); }); } this.next = next; this.hookErr = hookErr; next(); }; /** * Run the given `suite` and invoke the callback `fn()` when complete. * * @api private * @param {Suite} suite * @param {Function} fn */ Runner.prototype.runSuite = function (suite, fn) { var i = 0; var self = this; var total = this.grepTotal(suite); var afterAllHookCalled = false; debug('run suite %s', suite.fullTitle()); if (!total || (self.failures && suite._bail)) { return fn(); } this.emit('suite', this.suite = suite); function next (errSuite) { if (errSuite) { // current suite failed on a hook from errSuite if (errSuite === suite) { // if errSuite is current suite // continue to the next sibling suite return done(); } // errSuite is among the parents of current suite // stop execution of errSuite and all sub-suites return done(errSuite); } if (self._abort) { return done(); } var curr = suite.suites[i++]; if (!curr) { return done(); } // Avoid grep neglecting large number of tests causing a // huge recursive loop and thus a maximum call stack error. // See comment in `this.runTests()` for more information. if (self._grep !== self._defaultGrep) { Runner.immediately(function () { self.runSuite(curr, next); }); } else { self.runSuite(curr, next); } } function done (errSuite) { self.suite = suite; self.nextSuite = next; if (afterAllHookCalled) { fn(errSuite); } else { // mark that the afterAll block has been called once // and so can be skipped if there is an error in it. afterAllHookCalled = true; // remove reference to test delete self.test; self.hook('afterAll', function () { self.emit('suite end', suite); fn(errSuite); }); } } this.nextSuite = next; this.hook('beforeAll', function (err) { if (err) { return done(); } self.runTests(suite, next); }); }; /** * Handle uncaught exceptions. * * @param {Error} err * @api private */ Runner.prototype.uncaught = function (err) { if (err) { debug('uncaught exception %s', err !== function () { return this; }.call(err) ? err : (err.message || err)); } else { debug('uncaught undefined exception'); err = undefinedError(); } err.uncaught = true; var runnable = this.currentRunnable; if (!runnable) { runnable = new Runnable('Uncaught error outside test suite'); runnable.parent = this.suite; if (this.started) { this.fail(runnable, err); } else { // Can't recover from this failure this.emit('start'); this.fail(runnable, err); this.emit('end'); } return; } runnable.clearTimeout(); // Ignore errors if complete or pending if (runnable.state || runnable.isPending()) { return; } this.fail(runnable, err); // recover from test if (runnable.type === 'test') { this.emit('test end', runnable); this.hookUp('afterEach', this.next); return; } // recover from hooks if (runnable.type === 'hook') { var errSuite = this.suite; // if hook failure is in afterEach block if (runnable.fullTitle().indexOf('after each') > -1) { return this.hookErr(err, errSuite, true); } // if hook failure is in beforeEach block if (runnable.fullTitle().indexOf('before each') > -1) { return this.hookErr(err, errSuite, false); } // if hook failure is in after or before blocks return this.nextSuite(errSuite); } // bail this.emit('end'); }; /** * Cleans up the references to all the deferred functions * (before/after/beforeEach/afterEach) and tests of a Suite. * These must be deleted otherwise a memory leak can happen, * as those functions may reference variables from closures, * thus those variables can never be garbage collected as long * as the deferred functions exist. * * @param {Suite} suite */ function cleanSuiteReferences (suite) { function cleanArrReferences (arr) { for (var i = 0; i < arr.length; i++) { delete arr[i].fn; } } if (isArray(suite._beforeAll)) { cleanArrReferences(suite._beforeAll); } if (isArray(suite._beforeEach)) { cleanArrReferences(suite._beforeEach); } if (isArray(suite._afterAll)) { cleanArrReferences(suite._afterAll); } if (isArray(suite._afterEach)) { cleanArrReferences(suite._afterEach); } for (var i = 0; i < suite.tests.length; i++) { delete suite.tests[i].fn; } } /** * Run the root suite and invoke `fn(failures)` * on completion. * * @param {Function} fn * @return {Runner} for chaining * @api public * @param {Function} fn * @return {Runner} Runner instance. */ Runner.prototype.run = function (fn) { var self = this; var rootSuite = this.suite; // If there is an `only` filter if (this.hasOnly) { filterOnly(rootSuite); } fn = fn || function () {}; function uncaught (err) { self.uncaught(err); } function start () { self.started = true; self.emit('start'); self.runSuite(rootSuite, function () { debug('finished running'); self.emit('end'); }); } debug('start'); // references cleanup to avoid memory leaks this.on('suite end', cleanSuiteReferences); // callback this.on('end', function () { debug('end'); process.removeListener('uncaughtException', uncaught); fn(self.failures); }); // uncaught exception process.on('uncaughtException', uncaught); if (this._delay) { // for reporters, I guess. // might be nice to debounce some dots while we wait. this.emit('waiting', rootSuite); rootSuite.once('run', start); } else { start(); } return this; }; /** * Cleanly abort execution. * * @api public * @return {Runner} Runner instance. */ Runner.prototype.abort = function () { debug('aborting'); this._abort = true; return this; }; /** * Filter suites based on `isOnly` logic. * * @param {Array} suite * @returns {Boolean} * @api private */ function filterOnly (suite) { if (suite._onlyTests.length) { // If the suite contains `only` tests, run those and ignore any nested suites. suite.tests = suite._onlyTests; suite.suites = []; } else { // Otherwise, do not run any of the tests in this suite. suite.tests = []; utils.forEach(suite._onlySuites, function (onlySuite) { // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite. // Otherwise, all of the tests on this `only` suite should be run, so don't filter it. if (hasOnly(onlySuite)) { filterOnly(onlySuite); } }); // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants. suite.suites = filter(suite.suites, function (childSuite) { return indexOf(suite._onlySuites, childSuite) !== -1 || filterOnly(childSuite); }); } // Keep the suite only if there is something to run return suite.tests.length || suite.suites.length; } /** * Determines whether a suite has an `only` test or suite as a descendant. * * @param {Array} suite * @returns {Boolean} * @api private */ function hasOnly (suite) { return suite._onlyTests.length || suite._onlySuites.length || some(suite.suites, hasOnly); } /** * Filter leaks with the given globals flagged as `ok`. * * @api private * @param {Array} ok * @param {Array} globals * @return {Array} */ function filterLeaks (ok, globals) { return filter(globals, function (key) { // Firefox and Chrome exposes iframes as index inside the window object if (/^\d+/.test(key)) { return false; } // in firefox // if runner runs in an iframe, this iframe's window.getInterface method // not init at first it is assigned in some seconds if (global.navigator && (/^getInterface/).test(key)) { return false; } // an iframe could be approached by window[iframeIndex] // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak if (global.navigator && (/^\d+/).test(key)) { return false; } // Opera and IE expose global variables for HTML element IDs (issue #243) if (/^mocha-/.test(key)) { return false; } var matched = filter(ok, function (ok) { if (~ok.indexOf('*')) { return key.indexOf(ok.split('*')[0]) === 0; } return key === ok; }); return !matched.length && (!global.navigator || key !== 'onerror'); }); } /** * Array of globals dependent on the environment. * * @return {Array} * @api private */ function extraGlobals () { if (typeof process === 'object' && typeof process.version === 'string') { var parts = process.version.split('.'); var nodeVersion = utils.reduce(parts, function (a, v) { return a << 8 | v; }); // 'errno' was renamed to process._errno in v0.9.11. if (nodeVersion < 0x00090B) { return ['errno']; } } return []; } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./pending":16,"./runnable":33,"./utils":38,"_process":67,"debug":2,"events":3}],35:[function(require,module,exports){ 'use strict'; /** * Module dependencies. */ var EventEmitter = require('events').EventEmitter; var Hook = require('./hook'); var utils = require('./utils'); var inherits = utils.inherits; var debug = require('debug')('mocha:suite'); var milliseconds = require('./ms'); /** * Expose `Suite`. */ exports = module.exports = Suite; /** * Create a new `Suite` with the given `title` and parent `Suite`. When a suite * with the same title is already present, that suite is returned to provide * nicer reporter and more flexible meta-testing. * * @api public * @param {Suite} parent * @param {string} title * @return {Suite} */ exports.create = function (parent, title) { var suite = new Suite(title, parent.ctx); suite.parent = parent; title = suite.fullTitle(); parent.addSuite(suite); return suite; }; /** * Initialize a new `Suite` with the given `title` and `ctx`. * * @api private * @param {string} title * @param {Context} parentContext */ function Suite (title, parentContext) { if (!utils.isString(title)) { throw new Error('Suite `title` should be a "string" but "' + typeof title + '" was given instead.'); } this.title = title; function Context () {} Context.prototype = parentContext; this.ctx = new Context(); this.suites = []; this.tests = []; this.pending = false; this._beforeEach = []; this._beforeAll = []; this._afterEach = []; this._afterAll = []; this.root = !title; this._timeout = 2000; this._enableTimeouts = true; this._slow = 75; this._bail = false; this._retries = -1; this._onlyTests = []; this._onlySuites = []; this.delayed = false; } /** * Inherit from `EventEmitter.prototype`. */ inherits(Suite, EventEmitter); /** * Return a clone of this `Suite`. * * @api private * @return {Suite} */ Suite.prototype.clone = function () { var suite = new Suite(this.title); debug('clone'); suite.ctx = this.ctx; suite.timeout(this.timeout()); suite.retries(this.retries()); suite.enableTimeouts(this.enableTimeouts()); suite.slow(this.slow()); suite.bail(this.bail()); return suite; }; /** * Set timeout `ms` or short-hand such as "2s". * * @api private * @param {number|string} ms * @return {Suite|number} for chaining */ Suite.prototype.timeout = function (ms) { if (!arguments.length) { return this._timeout; } if (ms.toString() === '0') { this._enableTimeouts = false; } if (typeof ms === 'string') { ms = milliseconds(ms); } debug('timeout %d', ms); this._timeout = parseInt(ms, 10); return this; }; /** * Set number of times to retry a failed test. * * @api private * @param {number|string} n * @return {Suite|number} for chaining */ Suite.prototype.retries = function (n) { if (!arguments.length) { return this._retries; } debug('retries %d', n); this._retries = parseInt(n, 10) || 0; return this; }; /** * Set timeout to `enabled`. * * @api private * @param {boolean} enabled * @return {Suite|boolean} self or enabled */ Suite.prototype.enableTimeouts = function (enabled) { if (!arguments.length) { return this._enableTimeouts; } debug('enableTimeouts %s', enabled); this._enableTimeouts = enabled; return this; }; /** * Set slow `ms` or short-hand such as "2s". * * @api private * @param {number|string} ms * @return {Suite|number} for chaining */ Suite.prototype.slow = function (ms) { if (!arguments.length) { return this._slow; } if (typeof ms === 'string') { ms = milliseconds(ms); } debug('slow %d', ms); this._slow = ms; return this; }; /** * Sets whether to bail after first error. * * @api private * @param {boolean} bail * @return {Suite|number} for chaining */ Suite.prototype.bail = function (bail) { if (!arguments.length) { return this._bail; } debug('bail %s', bail); this._bail = bail; return this; }; /** * Check if this suite or its parent suite is marked as pending. * * @api private */ Suite.prototype.isPending = function () { return this.pending || (this.parent && this.parent.isPending()); }; /** * Run `fn(test[, done])` before running tests. * * @api private * @param {string} title * @param {Function} fn * @return {Suite} for chaining */ Suite.prototype.beforeAll = function (title, fn) { if (this.isPending()) { return this; } if (typeof title === 'function') { fn = title; title = fn.name; } title = '"before all" hook' + (title ? ': ' + title : ''); var hook = new Hook(title, fn); hook.parent = this; hook.timeout(this.timeout()); hook.retries(this.retries()); hook.enableTimeouts(this.enableTimeouts()); hook.slow(this.slow()); hook.ctx = this.ctx; this._beforeAll.push(hook); this.emit('beforeAll', hook); return this; }; /** * Run `fn(test[, done])` after running tests. * * @api private * @param {string} title * @param {Function} fn * @return {Suite} for chaining */ Suite.prototype.afterAll = function (title, fn) { if (this.isPending()) { return this; } if (typeof title === 'function') { fn = title; title = fn.name; } title = '"after all" hook' + (title ? ': ' + title : ''); var hook = new Hook(title, fn); hook.parent = this; hook.timeout(this.timeout()); hook.retries(this.retries()); hook.enableTimeouts(this.enableTimeouts()); hook.slow(this.slow()); hook.ctx = this.ctx; this._afterAll.push(hook); this.emit('afterAll', hook); return this; }; /** * Run `fn(test[, done])` before each test case. * * @api private * @param {string} title * @param {Function} fn * @return {Suite} for chaining */ Suite.prototype.beforeEach = function (title, fn) { if (this.isPending()) { return this; } if (typeof title === 'function') { fn = title; title = fn.name; } title = '"before each" hook' + (title ? ': ' + title : ''); var hook = new Hook(title, fn); hook.parent = this; hook.timeout(this.timeout()); hook.retries(this.retries()); hook.enableTimeouts(this.enableTimeouts()); hook.slow(this.slow()); hook.ctx = this.ctx; this._beforeEach.push(hook); this.emit('beforeEach', hook); return this; }; /** * Run `fn(test[, done])` after each test case. * * @api private * @param {string} title * @param {Function} fn * @return {Suite} for chaining */ Suite.prototype.afterEach = function (title, fn) { if (this.isPending()) { return this; } if (typeof title === 'function') { fn = title; title = fn.name; } title = '"after each" hook' + (title ? ': ' + title : ''); var hook = new Hook(title, fn); hook.parent = this; hook.timeout(this.timeout()); hook.retries(this.retries()); hook.enableTimeouts(this.enableTimeouts()); hook.slow(this.slow()); hook.ctx = this.ctx; this._afterEach.push(hook); this.emit('afterEach', hook); return this; }; /** * Add a test `suite`. * * @api private * @param {Suite} suite * @return {Suite} for chaining */ Suite.prototype.addSuite = function (suite) { suite.parent = this; suite.timeout(this.timeout()); suite.retries(this.retries()); suite.enableTimeouts(this.enableTimeouts()); suite.slow(this.slow()); suite.bail(this.bail()); this.suites.push(suite); this.emit('suite', suite); return this; }; /** * Add a `test` to this suite. * * @api private * @param {Test} test * @return {Suite} for chaining */ Suite.prototype.addTest = function (test) { test.parent = this; test.timeout(this.timeout()); test.retries(this.retries()); test.enableTimeouts(this.enableTimeouts()); test.slow(this.slow()); test.ctx = this.ctx; this.tests.push(test); this.emit('test', test); return this; }; /** * Return the full title generated by recursively concatenating the parent's * full title. * * @api public * @return {string} */ Suite.prototype.fullTitle = function () { if (this.parent) { var full = this.parent.fullTitle(); if (full) { return full + ' ' + this.title; } } return this.title; }; /** * Return the total number of tests. * * @api public * @return {number} */ Suite.prototype.total = function () { return utils.reduce(this.suites, function (sum, suite) { return sum + suite.total(); }, 0) + this.tests.length; }; /** * Iterates through each suite recursively to find all tests. Applies a * function in the format `fn(test)`. * * @api private * @param {Function} fn * @return {Suite} */ Suite.prototype.eachTest = function (fn) { utils.forEach(this.tests, fn); utils.forEach(this.suites, function (suite) { suite.eachTest(fn); }); return this; }; /** * This will run the root suite if we happen to be running in delayed mode. */ Suite.prototype.run = function run () { if (this.root) { this.emit('run'); } }; },{"./hook":7,"./ms":15,"./utils":38,"debug":2,"events":3}],36:[function(require,module,exports){ 'use strict'; /** * Module dependencies. */ var Runnable = require('./runnable'); var create = require('lodash.create'); var isString = require('./utils').isString; /** * Expose `Test`. */ module.exports = Test; /** * Initialize a new `Test` with the given `title` and callback `fn`. * * @api private * @param {String} title * @param {Function} fn */ function Test (title, fn) { if (!isString(title)) { throw new Error('Test `title` should be a "string" but "' + typeof title + '" was given instead.'); } Runnable.call(this, title, fn); this.pending = !fn; this.type = 'test'; } /** * Inherit from `Runnable.prototype`. */ Test.prototype = create(Runnable.prototype, { constructor: Test }); Test.prototype.clone = function () { var test = new Test(this.title, this.fn); test.timeout(this.timeout()); test.slow(this.slow()); test.enableTimeouts(this.enableTimeouts()); test.retries(this.retries()); test.currentRetry(this.currentRetry()); test.globals(this.globals()); test.parent = this.parent; test.file = this.file; test.ctx = this.ctx; return test; }; },{"./runnable":33,"./utils":38,"lodash.create":60}],37:[function(require,module,exports){ 'use strict'; /** * Pad a `number` with a ten's place zero. * * @param {number} number * @return {string} */ function pad(number) { var n = number.toString(); return n.length === 1 ? '0' + n : n; } /** * Turn a `date` into an ISO string. * * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString * * @param {Date} date * @return {string} */ function toISOString(date) { return date.getUTCFullYear() + '-' + pad(date.getUTCMonth() + 1) + '-' + pad(date.getUTCDate()) + 'T' + pad(date.getUTCHours()) + ':' + pad(date.getUTCMinutes()) + ':' + pad(date.getUTCSeconds()) + '.' + String((date.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5) + 'Z'; } /* * Exports. */ module.exports = toISOString; },{}],38:[function(require,module,exports){ (function (process,Buffer){ 'use strict'; /* eslint-env browser */ /** * Module dependencies. */ var JSON = require('json3'); var basename = require('path').basename; var debug = require('debug')('mocha:watch'); var exists = require('fs').existsSync || require('path').existsSync; var glob = require('glob'); var path = require('path'); var join = path.join; var readdirSync = require('fs').readdirSync; var statSync = require('fs').statSync; var watchFile = require('fs').watchFile; var lstatSync = require('fs').lstatSync; var toISOString = require('./to-iso-string'); /** * Ignored directories. */ var ignore = ['node_modules', '.git']; exports.inherits = require('util').inherits; /** * Escape special characters in the given string of html. * * @api private * @param {string} html * @return {string} */ exports.escape = function (html) { return String(html) .replace(/&/g, '&') .replace(/"/g, '"') .replace(//g, '>'); }; /** * Array#forEach (<=IE8) * * @api private * @param {Array} arr * @param {Function} fn * @param {Object} scope */ exports.forEach = function (arr, fn, scope) { for (var i = 0, l = arr.length; i < l; i++) { fn.call(scope, arr[i], i); } }; /** * Test if the given obj is type of string. * * @api private * @param {Object} obj * @return {boolean} */ exports.isString = function (obj) { return typeof obj === 'string'; }; /** * Array#map (<=IE8) * * @api private * @param {Array} arr * @param {Function} fn * @param {Object} scope * @return {Array} */ exports.map = function (arr, fn, scope) { var result = []; for (var i = 0, l = arr.length; i < l; i++) { result.push(fn.call(scope, arr[i], i, arr)); } return result; }; /** * Array#indexOf (<=IE8) * * @api private * @param {Array} arr * @param {Object} obj to find index of * @param {number} start * @return {number} */ var indexOf = exports.indexOf = function (arr, obj, start) { for (var i = start || 0, l = arr.length; i < l; i++) { if (arr[i] === obj) { return i; } } return -1; }; /** * Array#reduce (<=IE8) * * @api private * @param {Array} arr * @param {Function} fn * @param {Object} val Initial value. * @return {*} */ var reduce = exports.reduce = function (arr, fn, val) { var rval = val; for (var i = 0, l = arr.length; i < l; i++) { rval = fn(rval, arr[i], i, arr); } return rval; }; /** * Array#filter (<=IE8) * * @api private * @param {Array} arr * @param {Function} fn * @return {Array} */ exports.filter = function (arr, fn) { var ret = []; for (var i = 0, l = arr.length; i < l; i++) { var val = arr[i]; if (fn(val, i, arr)) { ret.push(val); } } return ret; }; /** * Array#some (<=IE8) * * @api private * @param {Array} arr * @param {Function} fn * @return {Array} */ exports.some = function (arr, fn) { for (var i = 0, l = arr.length; i < l; i++) { if (fn(arr[i])) { return true; } } return false; }; /** * Object.keys (<=IE8) * * @api private * @param {Object} obj * @return {Array} keys */ exports.keys = typeof Object.keys === 'function' ? Object.keys : function (obj) { var keys = []; var has = Object.prototype.hasOwnProperty; // for `window` on <=IE8 for (var key in obj) { if (has.call(obj, key)) { keys.push(key); } } return keys; }; /** * Watch the given `files` for changes * and invoke `fn(file)` on modification. * * @api private * @param {Array} files * @param {Function} fn */ exports.watch = function (files, fn) { var options = { interval: 100 }; files.forEach(function (file) { debug('file %s', file); watchFile(file, options, function (curr, prev) { if (prev.mtime < curr.mtime) { fn(file); } }); }); }; /** * Array.isArray (<=IE8) * * @api private * @param {Object} obj * @return {Boolean} */ var isArray = typeof Array.isArray === 'function' ? Array.isArray : function (obj) { return Object.prototype.toString.call(obj) === '[object Array]'; }; exports.isArray = isArray; /** * Buffer.prototype.toJSON polyfill. * * @type {Function} */ if (typeof Buffer !== 'undefined' && Buffer.prototype) { Buffer.prototype.toJSON = Buffer.prototype.toJSON || function () { return Array.prototype.slice.call(this, 0); }; } /** * Ignored files. * * @api private * @param {string} path * @return {boolean} */ function ignored (path) { return !~ignore.indexOf(path); } /** * Lookup files in the given `dir`. * * @api private * @param {string} dir * @param {string[]} [ext=['.js']] * @param {Array} [ret=[]] * @return {Array} */ exports.files = function (dir, ext, ret) { ret = ret || []; ext = ext || ['js']; var re = new RegExp('\\.(' + ext.join('|') + ')$'); readdirSync(dir) .filter(ignored) .forEach(function (path) { path = join(dir, path); if (lstatSync(path).isDirectory()) { exports.files(path, ext, ret); } else if (path.match(re)) { ret.push(path); } }); return ret; }; /** * Compute a slug from the given `str`. * * @api private * @param {string} str * @return {string} */ exports.slug = function (str) { return str .toLowerCase() .replace(/ +/g, '-') .replace(/[^-\w]/g, ''); }; /** * Strip the function definition from `str`, and re-indent for pre whitespace. * * @param {string} str * @return {string} */ exports.clean = function (str) { str = str .replace(/\r\n?|[\n\u2028\u2029]/g, '\n').replace(/^\uFEFF/, '') // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content .replace(/^function(?:\s*|\s+[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\s*\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\s*\}|((?:.|\n)*))$/, '$1$2$3'); var spaces = str.match(/^\n?( *)/)[1].length; var tabs = str.match(/^\n?(\t*)/)[1].length; var re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs || spaces) + '}', 'gm'); str = str.replace(re, ''); return exports.trim(str); }; /** * Trim the given `str`. * * @api private * @param {string} str * @return {string} */ exports.trim = function (str) { return str.replace(/^\s+|\s+$/g, ''); }; /** * Parse the given `qs`. * * @api private * @param {string} qs * @return {Object} */ exports.parseQuery = function (qs) { return reduce(qs.replace('?', '').split('&'), function (obj, pair) { var i = pair.indexOf('='); var key = pair.slice(0, i); var val = pair.slice(++i); obj[key] = decodeURIComponent(val); return obj; }, {}); }; /** * Highlight the given string of `js`. * * @api private * @param {string} js * @return {string} */ function highlight (js) { return js .replace(//g, '>') .replace(/\/\/(.*)/gm, '//$1') .replace(/('.*?')/gm, '$1') .replace(/(\d+\.\d+)/gm, '$1') .replace(/(\d+)/gm, '$1') .replace(/\bnew[ \t]+(\w+)/gm, 'new $1') .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1'); } /** * Highlight the contents of tag `name`. * * @api private * @param {string} name */ exports.highlightTags = function (name) { var code = document.getElementById('mocha').getElementsByTagName(name); for (var i = 0, len = code.length; i < len; ++i) { code[i].innerHTML = highlight(code[i].innerHTML); } }; /** * If a value could have properties, and has none, this function is called, * which returns a string representation of the empty value. * * Functions w/ no properties return `'[Function]'` * Arrays w/ length === 0 return `'[]'` * Objects w/ no properties return `'{}'` * All else: return result of `value.toString()` * * @api private * @param {*} value The value to inspect. * @param {string} typeHint The type of the value * @returns {string} */ function emptyRepresentation (value, typeHint) { switch (typeHint) { case 'function': return '[Function]'; case 'object': return '{}'; case 'array': return '[]'; default: return value.toString(); } } /** * Takes some variable and asks `Object.prototype.toString()` what it thinks it * is. * * @api private * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString * @param {*} value The value to test. * @returns {string} Computed type * @example * type({}) // 'object' * type([]) // 'array' * type(1) // 'number' * type(false) // 'boolean' * type(Infinity) // 'number' * type(null) // 'null' * type(new Date()) // 'date' * type(/foo/) // 'regexp' * type('type') // 'string' * type(global) // 'global' * type(new String('foo') // 'object' */ var type = exports.type = function type (value) { if (value === undefined) { return 'undefined'; } else if (value === null) { return 'null'; } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { return 'buffer'; } return Object.prototype.toString.call(value) .replace(/^\[.+\s(.+?)\]$/, '$1') .toLowerCase(); }; /** * Stringify `value`. Different behavior depending on type of value: * * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively. * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes. * - If `value` is an *empty* object, function, or array, return result of function * {@link emptyRepresentation}. * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of * JSON.stringify(). * * @api private * @see exports.type * @param {*} value * @return {string} */ exports.stringify = function (value) { var typeHint = type(value); if (!~indexOf(['object', 'array', 'function'], typeHint)) { if (typeHint === 'buffer') { var json = value.toJSON(); // Based on the toJSON result return jsonStringify(json.data && json.type ? json.data : json, 2) .replace(/,(\n|$)/g, '$1'); } // IE7/IE8 has a bizarre String constructor; needs to be coerced // into an array and back to obj. if (typeHint === 'string' && typeof value === 'object') { value = reduce(value.split(''), function (acc, char, idx) { acc[idx] = char; return acc; }, {}); typeHint = 'object'; } else { return jsonStringify(value); } } for (var prop in value) { if (Object.prototype.hasOwnProperty.call(value, prop)) { return jsonStringify(exports.canonicalize(value, null, typeHint), 2).replace(/,(\n|$)/g, '$1'); } } return emptyRepresentation(value, typeHint); }; /** * like JSON.stringify but more sense. * * @api private * @param {Object} object * @param {number=} spaces * @param {number=} depth * @returns {*} */ function jsonStringify (object, spaces, depth) { if (typeof spaces === 'undefined') { // primitive types return _stringify(object); } depth = depth || 1; var space = spaces * depth; var str = isArray(object) ? '[' : '{'; var end = isArray(object) ? ']' : '}'; var length = typeof object.length === 'number' ? object.length : exports.keys(object).length; // `.repeat()` polyfill function repeat (s, n) { return new Array(n).join(s); } function _stringify (val) { switch (type(val)) { case 'null': case 'undefined': val = '[' + val + ']'; break; case 'array': case 'object': val = jsonStringify(val, spaces, depth + 1); break; case 'boolean': case 'regexp': case 'symbol': case 'number': val = val === 0 && (1 / val) === -Infinity // `-0` ? '-0' : val.toString(); break; case 'date': var sDate; if (isNaN(val.getTime())) { // Invalid date sDate = val.toString(); } else { sDate = val.toISOString ? val.toISOString() : toISOString(val); } val = '[Date: ' + sDate + ']'; break; case 'buffer': var json = val.toJSON(); // Based on the toJSON result json = json.data && json.type ? json.data : json; val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']'; break; default: val = (val === '[Function]' || val === '[Circular]') ? val : JSON.stringify(val); // string } return val; } for (var i in object) { if (!Object.prototype.hasOwnProperty.call(object, i)) { continue; // not my business } --length; str += '\n ' + repeat(' ', space) + (isArray(object) ? '' : '"' + i + '": ') + // key _stringify(object[i]) + // value (length ? ',' : ''); // comma } return str + // [], {} (str.length !== 1 ? '\n' + repeat(' ', --space) + end : end); } /** * Test if a value is a buffer. * * @api private * @param {*} value The value to test. * @return {boolean} True if `value` is a buffer, otherwise false */ exports.isBuffer = function (value) { return typeof Buffer !== 'undefined' && Buffer.isBuffer(value); }; /** * Return a new Thing that has the keys in sorted order. Recursive. * * If the Thing... * - has already been seen, return string `'[Circular]'` * - is `undefined`, return string `'[undefined]'` * - is `null`, return value `null` * - is some other primitive, return the value * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again. * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()` * * @api private * @see {@link exports.stringify} * @param {*} value Thing to inspect. May or may not have properties. * @param {Array} [stack=[]] Stack of seen values * @param {string} [typeHint] Type hint * @return {(Object|Array|Function|string|undefined)} */ exports.canonicalize = function canonicalize (value, stack, typeHint) { var canonicalizedObj; /* eslint-disable no-unused-vars */ var prop; /* eslint-enable no-unused-vars */ typeHint = typeHint || type(value); function withStack (value, fn) { stack.push(value); fn(); stack.pop(); } stack = stack || []; if (indexOf(stack, value) !== -1) { return '[Circular]'; } switch (typeHint) { case 'undefined': case 'buffer': case 'null': canonicalizedObj = value; break; case 'array': withStack(value, function () { canonicalizedObj = exports.map(value, function (item) { return exports.canonicalize(item, stack); }); }); break; case 'function': /* eslint-disable guard-for-in */ for (prop in value) { canonicalizedObj = {}; break; } /* eslint-enable guard-for-in */ if (!canonicalizedObj) { canonicalizedObj = emptyRepresentation(value, typeHint); break; } /* falls through */ case 'object': canonicalizedObj = canonicalizedObj || {}; withStack(value, function () { exports.forEach(exports.keys(value).sort(), function (key) { canonicalizedObj[key] = exports.canonicalize(value[key], stack); }); }); break; case 'date': case 'number': case 'regexp': case 'boolean': case 'symbol': canonicalizedObj = value; break; default: canonicalizedObj = value + ''; } return canonicalizedObj; }; /** * Lookup file names at the given `path`. * * @api public * @param {string} path Base path to start searching from. * @param {string[]} extensions File extensions to look for. * @param {boolean} recursive Whether or not to recurse into subdirectories. * @return {string[]} An array of paths. */ exports.lookupFiles = function lookupFiles (path, extensions, recursive) { var files = []; var re = new RegExp('\\.(' + extensions.join('|') + ')$'); if (!exists(path)) { if (exists(path + '.js')) { path += '.js'; } else { files = glob.sync(path); if (!files.length) { throw new Error("cannot resolve path (or pattern) '" + path + "'"); } return files; } } try { var stat = statSync(path); if (stat.isFile()) { return path; } } catch (err) { // ignore error return; } readdirSync(path).forEach(function (file) { file = join(path, file); try { var stat = statSync(file); if (stat.isDirectory()) { if (recursive) { files = files.concat(lookupFiles(file, extensions, recursive)); } return; } } catch (err) { // ignore error return; } if (!stat.isFile() || !re.test(file) || basename(file)[0] === '.') { return; } files.push(file); }); return files; }; /** * Generate an undefined error with a message warning the user. * * @return {Error} */ exports.undefinedError = function () { return new Error('Caught undefined error, did you throw without specifying what?'); }; /** * Generate an undefined error if `err` is not defined. * * @param {Error} err * @return {Error} */ exports.getError = function (err) { return err || exports.undefinedError(); }; /** * @summary * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`) * @description * When invoking this function you get a filter function that get the Error.stack as an input, * and return a prettify output. * (i.e: strip Mocha and internal node functions from stack trace). * @returns {Function} */ exports.stackTraceFilter = function () { // TODO: Replace with `process.browser` var is = typeof document === 'undefined' ? { node: true } : { browser: true }; var slash = path.sep; var cwd; if (is.node) { cwd = process.cwd() + slash; } else { cwd = (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/'); slash = '/'; } function isMochaInternal (line) { return (~line.indexOf('node_modules' + slash + 'mocha' + slash)) || (~line.indexOf('node_modules' + slash + 'mocha.js')) || (~line.indexOf('bower_components' + slash + 'mocha.js')) || (~line.indexOf(slash + 'mocha.js')); } function isNodeInternal (line) { return (~line.indexOf('(timers.js:')) || (~line.indexOf('(events.js:')) || (~line.indexOf('(node.js:')) || (~line.indexOf('(module.js:')) || (~line.indexOf('GeneratorFunctionPrototype.next (native)')) || false; } return function (stack) { stack = stack.split('\n'); stack = reduce(stack, function (list, line) { if (isMochaInternal(line)) { return list; } if (is.node && isNodeInternal(line)) { return list; } // Clean up cwd(absolute) if (/\(?.+:\d+:\d+\)?$/.test(line)) { line = line.replace(cwd, ''); } list.push(line); return list; }, []); return stack.join('\n'); }; }; /** * Crude, but effective. * @api * @param {*} value * @returns {boolean} Whether or not `value` is a Promise */ exports.isPromise = function isPromise (value) { return typeof value === 'object' && typeof value.then === 'function'; }; /** * It's a noop. * @api */ exports.noop = function () {}; }).call(this,require('_process'),require("buffer").Buffer) },{"./to-iso-string":37,"_process":67,"buffer":44,"debug":2,"fs":42,"glob":42,"json3":54,"path":42,"util":84}],39:[function(require,module,exports){ 'use strict' exports.byteLength = byteLength exports.toByteArray = toByteArray exports.fromByteArray = fromByteArray var lookup = [] var revLookup = [] var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' for (var i = 0, len = code.length; i < len; ++i) { lookup[i] = code[i] revLookup[code.charCodeAt(i)] = i } revLookup['-'.charCodeAt(0)] = 62 revLookup['_'.charCodeAt(0)] = 63 function placeHoldersCount (b64) { var len = b64.length if (len % 4 > 0) { throw new Error('Invalid string. Length must be a multiple of 4') } // the number of equal signs (place holders) // if there are two placeholders, than the two characters before it // represent one byte // if there is only one, then the three characters before it represent 2 bytes // this is just a cheap hack to not do indexOf twice return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 } function byteLength (b64) { // base64 is 4/3 + up to two characters of the original data return b64.length * 3 / 4 - placeHoldersCount(b64) } function toByteArray (b64) { var i, j, l, tmp, placeHolders, arr var len = b64.length placeHolders = placeHoldersCount(b64) arr = new Arr(len * 3 / 4 - placeHolders) // if there are placeholders, only get up to the last complete 4 chars l = placeHolders > 0 ? len - 4 : len var L = 0 for (i = 0, j = 0; i < l; i += 4, j += 3) { tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] arr[L++] = (tmp >> 16) & 0xFF arr[L++] = (tmp >> 8) & 0xFF arr[L++] = tmp & 0xFF } if (placeHolders === 2) { tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) arr[L++] = tmp & 0xFF } else if (placeHolders === 1) { tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) arr[L++] = (tmp >> 8) & 0xFF arr[L++] = tmp & 0xFF } return arr } function tripletToBase64 (num) { return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] } function encodeChunk (uint8, start, end) { var tmp var output = [] for (var i = start; i < end; i += 3) { tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) output.push(tripletToBase64(tmp)) } return output.join('') } function fromByteArray (uint8) { var tmp var len = uint8.length var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes var output = '' var parts = [] var maxChunkLength = 16383 // must be multiple of 3 // go through the array every three bytes, we'll deal with trailing stuff later for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) } // pad the end with zeros, but make sure to not forget the extra bytes if (extraBytes === 1) { tmp = uint8[len - 1] output += lookup[tmp >> 2] output += lookup[(tmp << 4) & 0x3F] output += '==' } else if (extraBytes === 2) { tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) output += lookup[tmp >> 10] output += lookup[(tmp >> 4) & 0x3F] output += lookup[(tmp << 2) & 0x3F] output += '=' } parts.push(output) return parts.join('') } },{}],40:[function(require,module,exports){ },{}],41:[function(require,module,exports){ (function (process){ var WritableStream = require('stream').Writable var inherits = require('util').inherits module.exports = BrowserStdout inherits(BrowserStdout, WritableStream) function BrowserStdout(opts) { if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts) opts = opts || {} WritableStream.call(this, opts) this.label = (opts.label !== undefined) ? opts.label : 'stdout' } BrowserStdout.prototype._write = function(chunks, encoding, cb) { var output = chunks.toString ? chunks.toString() : chunks if (this.label === false) { console.log(output) } else { console.log(this.label+':', output) } process.nextTick(cb) } }).call(this,require('_process')) },{"_process":67,"stream":79,"util":84}],42:[function(require,module,exports){ arguments[4][40][0].apply(exports,arguments) },{"dup":40}],43:[function(require,module,exports){ (function (global){ 'use strict'; var buffer = require('buffer'); var Buffer = buffer.Buffer; var SlowBuffer = buffer.SlowBuffer; var MAX_LEN = buffer.kMaxLength || 2147483647; exports.alloc = function alloc(size, fill, encoding) { if (typeof Buffer.alloc === 'function') { return Buffer.alloc(size, fill, encoding); } if (typeof encoding === 'number') { throw new TypeError('encoding must not be number'); } if (typeof size !== 'number') { throw new TypeError('size must be a number'); } if (size > MAX_LEN) { throw new RangeError('size is too large'); } var enc = encoding; var _fill = fill; if (_fill === undefined) { enc = undefined; _fill = 0; } var buf = new Buffer(size); if (typeof _fill === 'string') { var fillBuf = new Buffer(_fill, enc); var flen = fillBuf.length; var i = -1; while (++i < size) { buf[i] = fillBuf[i % flen]; } } else { buf.fill(_fill); } return buf; } exports.allocUnsafe = function allocUnsafe(size) { if (typeof Buffer.allocUnsafe === 'function') { return Buffer.allocUnsafe(size); } if (typeof size !== 'number') { throw new TypeError('size must be a number'); } if (size > MAX_LEN) { throw new RangeError('size is too large'); } return new Buffer(size); } exports.from = function from(value, encodingOrOffset, length) { if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) { return Buffer.from(value, encodingOrOffset, length); } if (typeof value === 'number') { throw new TypeError('"value" argument must not be a number'); } if (typeof value === 'string') { return new Buffer(value, encodingOrOffset); } if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { var offset = encodingOrOffset; if (arguments.length === 1) { return new Buffer(value); } if (typeof offset === 'undefined') { offset = 0; } var len = length; if (typeof len === 'undefined') { len = value.byteLength - offset; } if (offset >= value.byteLength) { throw new RangeError('\'offset\' is out of bounds'); } if (len > value.byteLength - offset) { throw new RangeError('\'length\' is out of bounds'); } return new Buffer(value.slice(offset, offset + len)); } if (Buffer.isBuffer(value)) { var out = new Buffer(value.length); value.copy(out, 0, 0, value.length); return out; } if (value) { if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) { return new Buffer(value); } if (value.type === 'Buffer' && Array.isArray(value.data)) { return new Buffer(value.data); } } throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.'); } exports.allocUnsafeSlow = function allocUnsafeSlow(size) { if (typeof Buffer.allocUnsafeSlow === 'function') { return Buffer.allocUnsafeSlow(size); } if (typeof size !== 'number') { throw new TypeError('size must be a number'); } if (size >= MAX_LEN) { throw new RangeError('size is too large'); } return new SlowBuffer(size); } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"buffer":44}],44:[function(require,module,exports){ (function (global){ /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ /* eslint-disable no-proto */ 'use strict' var base64 = require('base64-js') var ieee754 = require('ieee754') var isArray = require('isarray') exports.Buffer = Buffer exports.SlowBuffer = SlowBuffer exports.INSPECT_MAX_BYTES = 50 /** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) * === false Use Object implementation (most compatible, even IE6) * * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * * Due to various browser bugs, sometimes the Object implementation will be used even * when the browser supports typed arrays. * * Note: * * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. * * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. * * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of * incorrect length in some situations. * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they * get the Object implementation, which is slower but behaves correctly. */ Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined ? global.TYPED_ARRAY_SUPPORT : typedArraySupport() /* * Export kMaxLength after typed array support is determined. */ exports.kMaxLength = kMaxLength() function typedArraySupport () { try { var arr = new Uint8Array(1) arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} return arr.foo() === 42 && // typed array instances can be augmented typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` } catch (e) { return false } } function kMaxLength () { return Buffer.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff } function createBuffer (that, length) { if (kMaxLength() < length) { throw new RangeError('Invalid typed array length') } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = new Uint8Array(length) that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class if (that === null) { that = new Buffer(length) } that.length = length } return that } /** * The Buffer constructor returns instances of `Uint8Array` that have their * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of * `Uint8Array`, so the returned instances will have all the node `Buffer` methods * and the `Uint8Array` methods. Square bracket notation works as expected -- it * returns a single octet. * * The `Uint8Array` prototype remains unmodified. */ function Buffer (arg, encodingOrOffset, length) { if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { return new Buffer(arg, encodingOrOffset, length) } // Common case. if (typeof arg === 'number') { if (typeof encodingOrOffset === 'string') { throw new Error( 'If encoding is specified then the first argument must be a string' ) } return allocUnsafe(this, arg) } return from(this, arg, encodingOrOffset, length) } Buffer.poolSize = 8192 // not used by this implementation // TODO: Legacy, not needed anymore. Remove in next major version. Buffer._augment = function (arr) { arr.__proto__ = Buffer.prototype return arr } function from (that, value, encodingOrOffset, length) { if (typeof value === 'number') { throw new TypeError('"value" argument must not be a number') } if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { return fromArrayBuffer(that, value, encodingOrOffset, length) } if (typeof value === 'string') { return fromString(that, value, encodingOrOffset) } return fromObject(that, value) } /** * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError * if value is a number. * Buffer.from(str[, encoding]) * Buffer.from(array) * Buffer.from(buffer) * Buffer.from(arrayBuffer[, byteOffset[, length]]) **/ Buffer.from = function (value, encodingOrOffset, length) { return from(null, value, encodingOrOffset, length) } if (Buffer.TYPED_ARRAY_SUPPORT) { Buffer.prototype.__proto__ = Uint8Array.prototype Buffer.__proto__ = Uint8Array if (typeof Symbol !== 'undefined' && Symbol.species && Buffer[Symbol.species] === Buffer) { // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 Object.defineProperty(Buffer, Symbol.species, { value: null, configurable: true }) } } function assertSize (size) { if (typeof size !== 'number') { throw new TypeError('"size" argument must be a number') } else if (size < 0) { throw new RangeError('"size" argument must not be negative') } } function alloc (that, size, fill, encoding) { assertSize(size) if (size <= 0) { return createBuffer(that, size) } if (fill !== undefined) { // Only pay attention to encoding if it's a string. This // prevents accidentally sending in a number that would // be interpretted as a start offset. return typeof encoding === 'string' ? createBuffer(that, size).fill(fill, encoding) : createBuffer(that, size).fill(fill) } return createBuffer(that, size) } /** * Creates a new filled Buffer instance. * alloc(size[, fill[, encoding]]) **/ Buffer.alloc = function (size, fill, encoding) { return alloc(null, size, fill, encoding) } function allocUnsafe (that, size) { assertSize(size) that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) if (!Buffer.TYPED_ARRAY_SUPPORT) { for (var i = 0; i < size; ++i) { that[i] = 0 } } return that } /** * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. * */ Buffer.allocUnsafe = function (size) { return allocUnsafe(null, size) } /** * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. */ Buffer.allocUnsafeSlow = function (size) { return allocUnsafe(null, size) } function fromString (that, string, encoding) { if (typeof encoding !== 'string' || encoding === '') { encoding = 'utf8' } if (!Buffer.isEncoding(encoding)) { throw new TypeError('"encoding" must be a valid string encoding') } var length = byteLength(string, encoding) | 0 that = createBuffer(that, length) var actual = that.write(string, encoding) if (actual !== length) { // Writing a hex string, for example, that contains invalid characters will // cause everything after the first invalid character to be ignored. (e.g. // 'abxxcd' will be treated as 'ab') that = that.slice(0, actual) } return that } function fromArrayLike (that, array) { var length = array.length < 0 ? 0 : checked(array.length) | 0 that = createBuffer(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } function fromArrayBuffer (that, array, byteOffset, length) { array.byteLength // this throws if `array` is not a valid ArrayBuffer if (byteOffset < 0 || array.byteLength < byteOffset) { throw new RangeError('\'offset\' is out of bounds') } if (array.byteLength < byteOffset + (length || 0)) { throw new RangeError('\'length\' is out of bounds') } if (byteOffset === undefined && length === undefined) { array = new Uint8Array(array) } else if (length === undefined) { array = new Uint8Array(array, byteOffset) } else { array = new Uint8Array(array, byteOffset, length) } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = array that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class that = fromArrayLike(that, array) } return that } function fromObject (that, obj) { if (Buffer.isBuffer(obj)) { var len = checked(obj.length) | 0 that = createBuffer(that, len) if (that.length === 0) { return that } obj.copy(that, 0, 0, len) return that } if (obj) { if ((typeof ArrayBuffer !== 'undefined' && obj.buffer instanceof ArrayBuffer) || 'length' in obj) { if (typeof obj.length !== 'number' || isnan(obj.length)) { return createBuffer(that, 0) } return fromArrayLike(that, obj) } if (obj.type === 'Buffer' && isArray(obj.data)) { return fromArrayLike(that, obj.data) } } throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') } function checked (length) { // Note: cannot use `length < kMaxLength()` here because that fails when // length is NaN (which is otherwise coerced to zero.) if (length >= kMaxLength()) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength().toString(16) + ' bytes') } return length | 0 } function SlowBuffer (length) { if (+length != length) { // eslint-disable-line eqeqeq length = 0 } return Buffer.alloc(+length) } Buffer.isBuffer = function isBuffer (b) { return !!(b != null && b._isBuffer) } Buffer.compare = function compare (a, b) { if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { throw new TypeError('Arguments must be Buffers') } if (a === b) return 0 var x = a.length var y = b.length for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i] y = b[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } Buffer.isEncoding = function isEncoding (encoding) { switch (String(encoding).toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'latin1': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return true default: return false } } Buffer.concat = function concat (list, length) { if (!isArray(list)) { throw new TypeError('"list" argument must be an Array of Buffers') } if (list.length === 0) { return Buffer.alloc(0) } var i if (length === undefined) { length = 0 for (i = 0; i < list.length; ++i) { length += list[i].length } } var buffer = Buffer.allocUnsafe(length) var pos = 0 for (i = 0; i < list.length; ++i) { var buf = list[i] if (!Buffer.isBuffer(buf)) { throw new TypeError('"list" argument must be an Array of Buffers') } buf.copy(buffer, pos) pos += buf.length } return buffer } function byteLength (string, encoding) { if (Buffer.isBuffer(string)) { return string.length } if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { return string.byteLength } if (typeof string !== 'string') { string = '' + string } var len = string.length if (len === 0) return 0 // Use a for loop to avoid recursion var loweredCase = false for (;;) { switch (encoding) { case 'ascii': case 'latin1': case 'binary': return len case 'utf8': case 'utf-8': case undefined: return utf8ToBytes(string).length case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return len * 2 case 'hex': return len >>> 1 case 'base64': return base64ToBytes(string).length default: if (loweredCase) return utf8ToBytes(string).length // assume utf8 encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.byteLength = byteLength function slowToString (encoding, start, end) { var loweredCase = false // No need to verify that "this.length <= MAX_UINT32" since it's a read-only // property of a typed array. // This behaves neither like String nor Uint8Array in that we set start/end // to their upper/lower bounds if the value passed is out of range. // undefined is handled specially as per ECMA-262 6th Edition, // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. if (start === undefined || start < 0) { start = 0 } // Return early if start > this.length. Done here to prevent potential uint32 // coercion fail below. if (start > this.length) { return '' } if (end === undefined || end > this.length) { end = this.length } if (end <= 0) { return '' } // Force coersion to uint32. This will also coerce falsey/NaN values to 0. end >>>= 0 start >>>= 0 if (end <= start) { return '' } if (!encoding) encoding = 'utf8' while (true) { switch (encoding) { case 'hex': return hexSlice(this, start, end) case 'utf8': case 'utf-8': return utf8Slice(this, start, end) case 'ascii': return asciiSlice(this, start, end) case 'latin1': case 'binary': return latin1Slice(this, start, end) case 'base64': return base64Slice(this, start, end) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return utf16leSlice(this, start, end) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = (encoding + '').toLowerCase() loweredCase = true } } } // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect // Buffer instances. Buffer.prototype._isBuffer = true function swap (b, n, m) { var i = b[n] b[n] = b[m] b[m] = i } Buffer.prototype.swap16 = function swap16 () { var len = this.length if (len % 2 !== 0) { throw new RangeError('Buffer size must be a multiple of 16-bits') } for (var i = 0; i < len; i += 2) { swap(this, i, i + 1) } return this } Buffer.prototype.swap32 = function swap32 () { var len = this.length if (len % 4 !== 0) { throw new RangeError('Buffer size must be a multiple of 32-bits') } for (var i = 0; i < len; i += 4) { swap(this, i, i + 3) swap(this, i + 1, i + 2) } return this } Buffer.prototype.swap64 = function swap64 () { var len = this.length if (len % 8 !== 0) { throw new RangeError('Buffer size must be a multiple of 64-bits') } for (var i = 0; i < len; i += 8) { swap(this, i, i + 7) swap(this, i + 1, i + 6) swap(this, i + 2, i + 5) swap(this, i + 3, i + 4) } return this } Buffer.prototype.toString = function toString () { var length = this.length | 0 if (length === 0) return '' if (arguments.length === 0) return utf8Slice(this, 0, length) return slowToString.apply(this, arguments) } Buffer.prototype.equals = function equals (b) { if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') if (this === b) return true return Buffer.compare(this, b) === 0 } Buffer.prototype.inspect = function inspect () { var str = '' var max = exports.INSPECT_MAX_BYTES if (this.length > 0) { str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') if (this.length > max) str += ' ... ' } return '' } Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { if (!Buffer.isBuffer(target)) { throw new TypeError('Argument must be a Buffer') } if (start === undefined) { start = 0 } if (end === undefined) { end = target ? target.length : 0 } if (thisStart === undefined) { thisStart = 0 } if (thisEnd === undefined) { thisEnd = this.length } if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { throw new RangeError('out of range index') } if (thisStart >= thisEnd && start >= end) { return 0 } if (thisStart >= thisEnd) { return -1 } if (start >= end) { return 1 } start >>>= 0 end >>>= 0 thisStart >>>= 0 thisEnd >>>= 0 if (this === target) return 0 var x = thisEnd - thisStart var y = end - start var len = Math.min(x, y) var thisCopy = this.slice(thisStart, thisEnd) var targetCopy = target.slice(start, end) for (var i = 0; i < len; ++i) { if (thisCopy[i] !== targetCopy[i]) { x = thisCopy[i] y = targetCopy[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, // OR the last index of `val` in `buffer` at offset <= `byteOffset`. // // Arguments: // - buffer - a Buffer to search // - val - a string, Buffer, or number // - byteOffset - an index into `buffer`; will be clamped to an int32 // - encoding - an optional encoding, relevant is val is a string // - dir - true for indexOf, false for lastIndexOf function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { // Empty buffer means no match if (buffer.length === 0) return -1 // Normalize byteOffset if (typeof byteOffset === 'string') { encoding = byteOffset byteOffset = 0 } else if (byteOffset > 0x7fffffff) { byteOffset = 0x7fffffff } else if (byteOffset < -0x80000000) { byteOffset = -0x80000000 } byteOffset = +byteOffset // Coerce to Number. if (isNaN(byteOffset)) { // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer byteOffset = dir ? 0 : (buffer.length - 1) } // Normalize byteOffset: negative offsets start from the end of the buffer if (byteOffset < 0) byteOffset = buffer.length + byteOffset if (byteOffset >= buffer.length) { if (dir) return -1 else byteOffset = buffer.length - 1 } else if (byteOffset < 0) { if (dir) byteOffset = 0 else return -1 } // Normalize val if (typeof val === 'string') { val = Buffer.from(val, encoding) } // Finally, search either indexOf (if dir is true) or lastIndexOf if (Buffer.isBuffer(val)) { // Special case: looking for empty string/buffer always fails if (val.length === 0) { return -1 } return arrayIndexOf(buffer, val, byteOffset, encoding, dir) } else if (typeof val === 'number') { val = val & 0xFF // Search for a byte value [0-255] if (Buffer.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf === 'function') { if (dir) { return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) } else { return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) } } return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) } throw new TypeError('val must be string, number or Buffer') } function arrayIndexOf (arr, val, byteOffset, encoding, dir) { var indexSize = 1 var arrLength = arr.length var valLength = val.length if (encoding !== undefined) { encoding = String(encoding).toLowerCase() if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') { if (arr.length < 2 || val.length < 2) { return -1 } indexSize = 2 arrLength /= 2 valLength /= 2 byteOffset /= 2 } } function read (buf, i) { if (indexSize === 1) { return buf[i] } else { return buf.readUInt16BE(i * indexSize) } } var i if (dir) { var foundIndex = -1 for (i = byteOffset; i < arrLength; i++) { if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { if (foundIndex === -1) foundIndex = i if (i - foundIndex + 1 === valLength) return foundIndex * indexSize } else { if (foundIndex !== -1) i -= i - foundIndex foundIndex = -1 } } } else { if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength for (i = byteOffset; i >= 0; i--) { var found = true for (var j = 0; j < valLength; j++) { if (read(arr, i + j) !== read(val, j)) { found = false break } } if (found) return i } } return -1 } Buffer.prototype.includes = function includes (val, byteOffset, encoding) { return this.indexOf(val, byteOffset, encoding) !== -1 } Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, true) } Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, false) } function hexWrite (buf, string, offset, length) { offset = Number(offset) || 0 var remaining = buf.length - offset if (!length) { length = remaining } else { length = Number(length) if (length > remaining) { length = remaining } } // must be an even number of digits var strLen = string.length if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') if (length > strLen / 2) { length = strLen / 2 } for (var i = 0; i < length; ++i) { var parsed = parseInt(string.substr(i * 2, 2), 16) if (isNaN(parsed)) return i buf[offset + i] = parsed } return i } function utf8Write (buf, string, offset, length) { return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) } function asciiWrite (buf, string, offset, length) { return blitBuffer(asciiToBytes(string), buf, offset, length) } function latin1Write (buf, string, offset, length) { return asciiWrite(buf, string, offset, length) } function base64Write (buf, string, offset, length) { return blitBuffer(base64ToBytes(string), buf, offset, length) } function ucs2Write (buf, string, offset, length) { return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) } Buffer.prototype.write = function write (string, offset, length, encoding) { // Buffer#write(string) if (offset === undefined) { encoding = 'utf8' length = this.length offset = 0 // Buffer#write(string, encoding) } else if (length === undefined && typeof offset === 'string') { encoding = offset length = this.length offset = 0 // Buffer#write(string, offset[, length][, encoding]) } else if (isFinite(offset)) { offset = offset | 0 if (isFinite(length)) { length = length | 0 if (encoding === undefined) encoding = 'utf8' } else { encoding = length length = undefined } // legacy write(string, encoding, offset, length) - remove in v0.13 } else { throw new Error( 'Buffer.write(string, encoding, offset[, length]) is no longer supported' ) } var remaining = this.length - offset if (length === undefined || length > remaining) length = remaining if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { throw new RangeError('Attempt to write outside buffer bounds') } if (!encoding) encoding = 'utf8' var loweredCase = false for (;;) { switch (encoding) { case 'hex': return hexWrite(this, string, offset, length) case 'utf8': case 'utf-8': return utf8Write(this, string, offset, length) case 'ascii': return asciiWrite(this, string, offset, length) case 'latin1': case 'binary': return latin1Write(this, string, offset, length) case 'base64': // Warning: maxLength not taken into account in base64Write return base64Write(this, string, offset, length) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return ucs2Write(this, string, offset, length) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.prototype.toJSON = function toJSON () { return { type: 'Buffer', data: Array.prototype.slice.call(this._arr || this, 0) } } function base64Slice (buf, start, end) { if (start === 0 && end === buf.length) { return base64.fromByteArray(buf) } else { return base64.fromByteArray(buf.slice(start, end)) } } function utf8Slice (buf, start, end) { end = Math.min(buf.length, end) var res = [] var i = start while (i < end) { var firstByte = buf[i] var codePoint = null var bytesPerSequence = (firstByte > 0xEF) ? 4 : (firstByte > 0xDF) ? 3 : (firstByte > 0xBF) ? 2 : 1 if (i + bytesPerSequence <= end) { var secondByte, thirdByte, fourthByte, tempCodePoint switch (bytesPerSequence) { case 1: if (firstByte < 0x80) { codePoint = firstByte } break case 2: secondByte = buf[i + 1] if ((secondByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) if (tempCodePoint > 0x7F) { codePoint = tempCodePoint } } break case 3: secondByte = buf[i + 1] thirdByte = buf[i + 2] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { codePoint = tempCodePoint } } break case 4: secondByte = buf[i + 1] thirdByte = buf[i + 2] fourthByte = buf[i + 3] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { codePoint = tempCodePoint } } } } if (codePoint === null) { // we did not generate a valid codePoint so insert a // replacement char (U+FFFD) and advance only 1 byte codePoint = 0xFFFD bytesPerSequence = 1 } else if (codePoint > 0xFFFF) { // encode to utf16 (surrogate pair dance) codePoint -= 0x10000 res.push(codePoint >>> 10 & 0x3FF | 0xD800) codePoint = 0xDC00 | codePoint & 0x3FF } res.push(codePoint) i += bytesPerSequence } return decodeCodePointsArray(res) } // Based on http://stackoverflow.com/a/22747272/680742, the browser with // the lowest limit is Chrome, with 0x10000 args. // We go 1 magnitude less, for safety var MAX_ARGUMENTS_LENGTH = 0x1000 function decodeCodePointsArray (codePoints) { var len = codePoints.length if (len <= MAX_ARGUMENTS_LENGTH) { return String.fromCharCode.apply(String, codePoints) // avoid extra slice() } // Decode in chunks to avoid "call stack size exceeded". var res = '' var i = 0 while (i < len) { res += String.fromCharCode.apply( String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) ) } return res } function asciiSlice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i] & 0x7F) } return ret } function latin1Slice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i]) } return ret } function hexSlice (buf, start, end) { var len = buf.length if (!start || start < 0) start = 0 if (!end || end < 0 || end > len) end = len var out = '' for (var i = start; i < end; ++i) { out += toHex(buf[i]) } return out } function utf16leSlice (buf, start, end) { var bytes = buf.slice(start, end) var res = '' for (var i = 0; i < bytes.length; i += 2) { res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) } return res } Buffer.prototype.slice = function slice (start, end) { var len = this.length start = ~~start end = end === undefined ? len : ~~end if (start < 0) { start += len if (start < 0) start = 0 } else if (start > len) { start = len } if (end < 0) { end += len if (end < 0) end = 0 } else if (end > len) { end = len } if (end < start) end = start var newBuf if (Buffer.TYPED_ARRAY_SUPPORT) { newBuf = this.subarray(start, end) newBuf.__proto__ = Buffer.prototype } else { var sliceLen = end - start newBuf = new Buffer(sliceLen, undefined) for (var i = 0; i < sliceLen; ++i) { newBuf[i] = this[i + start] } } return newBuf } /* * Need to make sure that buffer isn't trying to write out of bounds. */ function checkOffset (offset, ext, length) { if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') } Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } return val } Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { checkOffset(offset, byteLength, this.length) } var val = this[offset + --byteLength] var mul = 1 while (byteLength > 0 && (mul *= 0x100)) { val += this[offset + --byteLength] * mul } return val } Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { if (!noAssert) checkOffset(offset, 1, this.length) return this[offset] } Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return this[offset] | (this[offset + 1] << 8) } Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return (this[offset] << 8) | this[offset + 1] } Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ((this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16)) + (this[offset + 3] * 0x1000000) } Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] * 0x1000000) + ((this[offset + 1] << 16) | (this[offset + 2] << 8) | this[offset + 3]) } Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var i = byteLength var mul = 1 var val = this[offset + --i] while (i > 0 && (mul *= 0x100)) { val += this[offset + --i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { if (!noAssert) checkOffset(offset, 1, this.length) if (!(this[offset] & 0x80)) return (this[offset]) return ((0xff - this[offset] + 1) * -1) } Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset] | (this[offset + 1] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset + 1] | (this[offset] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16) | (this[offset + 3] << 24) } Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] << 24) | (this[offset + 1] << 16) | (this[offset + 2] << 8) | (this[offset + 3]) } Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, true, 23, 4) } Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, false, 23, 4) } Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, true, 52, 8) } Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, false, 52, 8) } function checkInt (buf, value, offset, ext, max, min) { if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') if (offset + ext > buf.length) throw new RangeError('Index out of range') } Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) } var mul = 1 var i = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) } var i = byteLength - 1 var mul = 1 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) this[offset] = (value & 0xff) return offset + 1 } function objectWriteUInt16 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> (littleEndian ? i : 1 - i) * 8 } } Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } return offset + 2 } Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } function objectWriteUInt32 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffffffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff } } Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset + 3] = (value >>> 24) this[offset + 2] = (value >>> 16) this[offset + 1] = (value >>> 8) this[offset] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, true) } return offset + 4 } Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } return offset + 4 } Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 if (!noAssert) { var limit = Math.pow(2, 8 * byteLength - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = 0 var mul = 1 var sub = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { sub = 1 } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 if (!noAssert) { var limit = Math.pow(2, 8 * byteLength - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = byteLength - 1 var mul = 1 var sub = 0 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { sub = 1 } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) if (value < 0) value = 0xff + value + 1 this[offset] = (value & 0xff) return offset + 1 } Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } return offset + 2 } Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) this[offset + 2] = (value >>> 16) this[offset + 3] = (value >>> 24) } else { objectWriteUInt32(this, value, offset, true) } return offset + 4 } Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (value < 0) value = 0xffffffff + value + 1 if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } return offset + 4 } function checkIEEE754 (buf, value, offset, ext, max, min) { if (offset + ext > buf.length) throw new RangeError('Index out of range') if (offset < 0) throw new RangeError('Index out of range') } function writeFloat (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) } ieee754.write(buf, value, offset, littleEndian, 23, 4) return offset + 4 } Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { return writeFloat(this, value, offset, true, noAssert) } Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { return writeFloat(this, value, offset, false, noAssert) } function writeDouble (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) } ieee754.write(buf, value, offset, littleEndian, 52, 8) return offset + 8 } Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { return writeDouble(this, value, offset, true, noAssert) } Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { return writeDouble(this, value, offset, false, noAssert) } // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) Buffer.prototype.copy = function copy (target, targetStart, start, end) { if (!start) start = 0 if (!end && end !== 0) end = this.length if (targetStart >= target.length) targetStart = target.length if (!targetStart) targetStart = 0 if (end > 0 && end < start) end = start // Copy 0 bytes; we're done if (end === start) return 0 if (target.length === 0 || this.length === 0) return 0 // Fatal error conditions if (targetStart < 0) { throw new RangeError('targetStart out of bounds') } if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') if (end < 0) throw new RangeError('sourceEnd out of bounds') // Are we oob? if (end > this.length) end = this.length if (target.length - targetStart < end - start) { end = target.length - targetStart + start } var len = end - start var i if (this === target && start < targetStart && targetStart < end) { // descending copy from end for (i = len - 1; i >= 0; --i) { target[i + targetStart] = this[i + start] } } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { // ascending copy from start for (i = 0; i < len; ++i) { target[i + targetStart] = this[i + start] } } else { Uint8Array.prototype.set.call( target, this.subarray(start, start + len), targetStart ) } return len } // Usage: // buffer.fill(number[, offset[, end]]) // buffer.fill(buffer[, offset[, end]]) // buffer.fill(string[, offset[, end]][, encoding]) Buffer.prototype.fill = function fill (val, start, end, encoding) { // Handle string cases: if (typeof val === 'string') { if (typeof start === 'string') { encoding = start start = 0 end = this.length } else if (typeof end === 'string') { encoding = end end = this.length } if (val.length === 1) { var code = val.charCodeAt(0) if (code < 256) { val = code } } if (encoding !== undefined && typeof encoding !== 'string') { throw new TypeError('encoding must be a string') } if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { throw new TypeError('Unknown encoding: ' + encoding) } } else if (typeof val === 'number') { val = val & 255 } // Invalid ranges are not set to a default, so can range check early. if (start < 0 || this.length < start || this.length < end) { throw new RangeError('Out of range index') } if (end <= start) { return this } start = start >>> 0 end = end === undefined ? this.length : end >>> 0 if (!val) val = 0 var i if (typeof val === 'number') { for (i = start; i < end; ++i) { this[i] = val } } else { var bytes = Buffer.isBuffer(val) ? val : utf8ToBytes(new Buffer(val, encoding).toString()) var len = bytes.length for (i = 0; i < end - start; ++i) { this[i + start] = bytes[i % len] } } return this } // HELPER FUNCTIONS // ================ var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g function base64clean (str) { // Node strips out invalid characters like \n and \t from the string, base64-js does not str = stringtrim(str).replace(INVALID_BASE64_RE, '') // Node converts strings with length < 2 to '' if (str.length < 2) return '' // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not while (str.length % 4 !== 0) { str = str + '=' } return str } function stringtrim (str) { if (str.trim) return str.trim() return str.replace(/^\s+|\s+$/g, '') } function toHex (n) { if (n < 16) return '0' + n.toString(16) return n.toString(16) } function utf8ToBytes (string, units) { units = units || Infinity var codePoint var length = string.length var leadSurrogate = null var bytes = [] for (var i = 0; i < length; ++i) { codePoint = string.charCodeAt(i) // is surrogate component if (codePoint > 0xD7FF && codePoint < 0xE000) { // last char was a lead if (!leadSurrogate) { // no lead yet if (codePoint > 0xDBFF) { // unexpected trail if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } else if (i + 1 === length) { // unpaired lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } // valid lead leadSurrogate = codePoint continue } // 2 leads in a row if (codePoint < 0xDC00) { if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) leadSurrogate = codePoint continue } // valid surrogate pair codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 } else if (leadSurrogate) { // valid bmp char, but last char was a lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) } leadSurrogate = null // encode utf8 if (codePoint < 0x80) { if ((units -= 1) < 0) break bytes.push(codePoint) } else if (codePoint < 0x800) { if ((units -= 2) < 0) break bytes.push( codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x10000) { if ((units -= 3) < 0) break bytes.push( codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x110000) { if ((units -= 4) < 0) break bytes.push( codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else { throw new Error('Invalid code point') } } return bytes } function asciiToBytes (str) { var byteArray = [] for (var i = 0; i < str.length; ++i) { // Node's code seems to be doing this and not & 0x7F.. byteArray.push(str.charCodeAt(i) & 0xFF) } return byteArray } function utf16leToBytes (str, units) { var c, hi, lo var byteArray = [] for (var i = 0; i < str.length; ++i) { if ((units -= 2) < 0) break c = str.charCodeAt(i) hi = c >> 8 lo = c % 256 byteArray.push(lo) byteArray.push(hi) } return byteArray } function base64ToBytes (str) { return base64.toByteArray(base64clean(str)) } function blitBuffer (src, dst, offset, length) { for (var i = 0; i < length; ++i) { if ((i + offset >= dst.length) || (i >= src.length)) break dst[i + offset] = src[i] } return i } function isnan (val) { return val !== val // eslint-disable-line no-self-compare } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"base64-js":39,"ieee754":50,"isarray":53}],45:[function(require,module,exports){ (function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(arg) { if (Array.isArray) { return Array.isArray(arg); } return objectToString(arg) === '[object Array]'; } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = Buffer.isBuffer; function objectToString(o) { return Object.prototype.toString.call(o); } }).call(this,{"isBuffer":require("../../is-buffer/index.js")}) },{"../../is-buffer/index.js":52}],46:[function(require,module,exports){ /* See LICENSE file for terms of use */ /* * Text diff implementation. * * This library supports the following APIS: * JsDiff.diffChars: Character by character diff * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace * JsDiff.diffLines: Line based diff * * JsDiff.diffCss: Diff targeted at CSS content * * These methods are based on the implementation proposed in * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 */ (function(global, undefined) { var objectPrototypeToString = Object.prototype.toString; /*istanbul ignore next*/ function map(arr, mapper, that) { if (Array.prototype.map) { return Array.prototype.map.call(arr, mapper, that); } var other = new Array(arr.length); for (var i = 0, n = arr.length; i < n; i++) { other[i] = mapper.call(that, arr[i], i, arr); } return other; } function clonePath(path) { return { newPos: path.newPos, components: path.components.slice(0) }; } function removeEmpty(array) { var ret = []; for (var i = 0; i < array.length; i++) { if (array[i]) { ret.push(array[i]); } } return ret; } function escapeHTML(s) { var n = s; n = n.replace(/&/g, '&'); n = n.replace(//g, '>'); n = n.replace(/"/g, '"'); return n; } // This function handles the presence of circular references by bailing out when encountering an // object that is already on the "stack" of items being processed. function canonicalize(obj, stack, replacementStack) { stack = stack || []; replacementStack = replacementStack || []; var i; for (i = 0; i < stack.length; i += 1) { if (stack[i] === obj) { return replacementStack[i]; } } var canonicalizedObj; if ('[object Array]' === objectPrototypeToString.call(obj)) { stack.push(obj); canonicalizedObj = new Array(obj.length); replacementStack.push(canonicalizedObj); for (i = 0; i < obj.length; i += 1) { canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack); } stack.pop(); replacementStack.pop(); } else if (typeof obj === 'object' && obj !== null) { stack.push(obj); canonicalizedObj = {}; replacementStack.push(canonicalizedObj); var sortedKeys = [], key; for (key in obj) { sortedKeys.push(key); } sortedKeys.sort(); for (i = 0; i < sortedKeys.length; i += 1) { key = sortedKeys[i]; canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack); } stack.pop(); replacementStack.pop(); } else { canonicalizedObj = obj; } return canonicalizedObj; } function buildValues(components, newString, oldString, useLongestToken) { var componentPos = 0, componentLen = components.length, newPos = 0, oldPos = 0; for (; componentPos < componentLen; componentPos++) { var component = components[componentPos]; if (!component.removed) { if (!component.added && useLongestToken) { var value = newString.slice(newPos, newPos + component.count); value = map(value, function(value, i) { var oldValue = oldString[oldPos + i]; return oldValue.length > value.length ? oldValue : value; }); component.value = value.join(''); } else { component.value = newString.slice(newPos, newPos + component.count).join(''); } newPos += component.count; // Common case if (!component.added) { oldPos += component.count; } } else { component.value = oldString.slice(oldPos, oldPos + component.count).join(''); oldPos += component.count; // Reverse add and remove so removes are output first to match common convention // The diffing algorithm is tied to add then remove output and this is the simplest // route to get the desired output with minimal overhead. if (componentPos && components[componentPos - 1].added) { var tmp = components[componentPos - 1]; components[componentPos - 1] = components[componentPos]; components[componentPos] = tmp; } } } return components; } function Diff(ignoreWhitespace) { this.ignoreWhitespace = ignoreWhitespace; } Diff.prototype = { diff: function(oldString, newString, callback) { var self = this; function done(value) { if (callback) { setTimeout(function() { callback(undefined, value); }, 0); return true; } else { return value; } } // Handle the identity case (this is due to unrolling editLength == 0 if (newString === oldString) { return done([{ value: newString }]); } if (!newString) { return done([{ value: oldString, removed: true }]); } if (!oldString) { return done([{ value: newString, added: true }]); } newString = this.tokenize(newString); oldString = this.tokenize(oldString); var newLen = newString.length, oldLen = oldString.length; var editLength = 1; var maxEditLength = newLen + oldLen; var bestPath = [{ newPos: -1, components: [] }]; // Seed editLength = 0, i.e. the content starts with the same values var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { // Identity per the equality and tokenizer return done([{value: newString.join('')}]); } // Main worker method. checks all permutations of a given edit length for acceptance. function execEditLength() { for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { var basePath; var addPath = bestPath[diagonalPath - 1], removePath = bestPath[diagonalPath + 1], oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; if (addPath) { // No one else is going to attempt to use this value, clear it bestPath[diagonalPath - 1] = undefined; } var canAdd = addPath && addPath.newPos + 1 < newLen, canRemove = removePath && 0 <= oldPos && oldPos < oldLen; if (!canAdd && !canRemove) { // If this path is a terminal then prune bestPath[diagonalPath] = undefined; continue; } // Select the diagonal that we want to branch from. We select the prior // path whose position in the new string is the farthest from the origin // and does not pass the bounds of the diff graph if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { basePath = clonePath(removePath); self.pushComponent(basePath.components, undefined, true); } else { basePath = addPath; // No need to clone, we've pulled it from the list basePath.newPos++; self.pushComponent(basePath.components, true, undefined); } oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) { return done(buildValues(basePath.components, newString, oldString, self.useLongestToken)); } else { // Otherwise track this path as a potential candidate and continue. bestPath[diagonalPath] = basePath; } } editLength++; } // Performs the length of edit iteration. Is a bit fugly as this has to support the // sync and async mode which is never fun. Loops over execEditLength until a value // is produced. if (callback) { (function exec() { setTimeout(function() { // This should not happen, but we want to be safe. /*istanbul ignore next */ if (editLength > maxEditLength) { return callback(); } if (!execEditLength()) { exec(); } }, 0); }()); } else { while (editLength <= maxEditLength) { var ret = execEditLength(); if (ret) { return ret; } } } }, pushComponent: function(components, added, removed) { var last = components[components.length - 1]; if (last && last.added === added && last.removed === removed) { // We need to clone here as the component clone operation is just // as shallow array clone components[components.length - 1] = {count: last.count + 1, added: added, removed: removed }; } else { components.push({count: 1, added: added, removed: removed }); } }, extractCommon: function(basePath, newString, oldString, diagonalPath) { var newLen = newString.length, oldLen = oldString.length, newPos = basePath.newPos, oldPos = newPos - diagonalPath, commonCount = 0; while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { newPos++; oldPos++; commonCount++; } if (commonCount) { basePath.components.push({count: commonCount}); } basePath.newPos = newPos; return oldPos; }, equals: function(left, right) { var reWhitespace = /\S/; return left === right || (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)); }, tokenize: function(value) { return value.split(''); } }; var CharDiff = new Diff(); var WordDiff = new Diff(true); var WordWithSpaceDiff = new Diff(); WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) { return removeEmpty(value.split(/(\s+|\b)/)); }; var CssDiff = new Diff(true); CssDiff.tokenize = function(value) { return removeEmpty(value.split(/([{}:;,]|\s+)/)); }; var LineDiff = new Diff(); var TrimmedLineDiff = new Diff(); TrimmedLineDiff.ignoreTrim = true; LineDiff.tokenize = TrimmedLineDiff.tokenize = function(value) { var retLines = [], lines = value.split(/^/m); for (var i = 0; i < lines.length; i++) { var line = lines[i], lastLine = lines[i - 1], lastLineLastChar = lastLine && lastLine[lastLine.length - 1]; // Merge lines that may contain windows new lines if (line === '\n' && lastLineLastChar === '\r') { retLines[retLines.length - 1] = retLines[retLines.length - 1].slice(0, -1) + '\r\n'; } else { if (this.ignoreTrim) { line = line.trim(); // add a newline unless this is the last line. if (i < lines.length - 1) { line += '\n'; } } retLines.push(line); } } return retLines; }; var PatchDiff = new Diff(); PatchDiff.tokenize = function(value) { var ret = [], linesAndNewlines = value.split(/(\n|\r\n)/); // Ignore the final empty token that occurs if the string ends with a new line if (!linesAndNewlines[linesAndNewlines.length - 1]) { linesAndNewlines.pop(); } // Merge the content and line separators into single tokens for (var i = 0; i < linesAndNewlines.length; i++) { var line = linesAndNewlines[i]; if (i % 2) { ret[ret.length - 1] += line; } else { ret.push(line); } } return ret; }; var SentenceDiff = new Diff(); SentenceDiff.tokenize = function(value) { return removeEmpty(value.split(/(\S.+?[.!?])(?=\s+|$)/)); }; var JsonDiff = new Diff(); // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: JsonDiff.useLongestToken = true; JsonDiff.tokenize = LineDiff.tokenize; JsonDiff.equals = function(left, right) { return LineDiff.equals(left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')); }; var JsDiff = { Diff: Diff, diffChars: function(oldStr, newStr, callback) { return CharDiff.diff(oldStr, newStr, callback); }, diffWords: function(oldStr, newStr, callback) { return WordDiff.diff(oldStr, newStr, callback); }, diffWordsWithSpace: function(oldStr, newStr, callback) { return WordWithSpaceDiff.diff(oldStr, newStr, callback); }, diffLines: function(oldStr, newStr, callback) { return LineDiff.diff(oldStr, newStr, callback); }, diffTrimmedLines: function(oldStr, newStr, callback) { return TrimmedLineDiff.diff(oldStr, newStr, callback); }, diffSentences: function(oldStr, newStr, callback) { return SentenceDiff.diff(oldStr, newStr, callback); }, diffCss: function(oldStr, newStr, callback) { return CssDiff.diff(oldStr, newStr, callback); }, diffJson: function(oldObj, newObj, callback) { return JsonDiff.diff( typeof oldObj === 'string' ? oldObj : JSON.stringify(canonicalize(oldObj), undefined, ' '), typeof newObj === 'string' ? newObj : JSON.stringify(canonicalize(newObj), undefined, ' '), callback ); }, createTwoFilesPatch: function(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) { var ret = []; if (oldFileName == newFileName) { ret.push('Index: ' + oldFileName); } ret.push('==================================================================='); ret.push('--- ' + oldFileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); ret.push('+++ ' + newFileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); var diff = PatchDiff.diff(oldStr, newStr); diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier // Formats a given set of lines for printing as context lines in a patch function contextLines(lines) { return map(lines, function(entry) { return ' ' + entry; }); } // Outputs the no newline at end of file warning if needed function eofNL(curRange, i, current) { var last = diff[diff.length - 2], isLast = i === diff.length - 2, isLastOfType = i === diff.length - 3 && current.added !== last.added; // Figure out if this is the last line for the given file and missing NL if (!(/\n$/.test(current.value)) && (isLast || isLastOfType)) { curRange.push('\\ No newline at end of file'); } } var oldRangeStart = 0, newRangeStart = 0, curRange = [], oldLine = 1, newLine = 1; for (var i = 0; i < diff.length; i++) { var current = diff[i], lines = current.lines || current.value.replace(/\n$/, '').split('\n'); current.lines = lines; if (current.added || current.removed) { // If we have previous context, start with that if (!oldRangeStart) { var prev = diff[i - 1]; oldRangeStart = oldLine; newRangeStart = newLine; if (prev) { curRange = contextLines(prev.lines.slice(-4)); oldRangeStart -= curRange.length; newRangeStart -= curRange.length; } } // Output our changes curRange.push.apply(curRange, map(lines, function(entry) { return (current.added ? '+' : '-') + entry; })); eofNL(curRange, i, current); // Track the updated file position if (current.added) { newLine += lines.length; } else { oldLine += lines.length; } } else { // Identical context lines. Track line changes if (oldRangeStart) { // Close out any changes that have been output (or join overlapping) if (lines.length <= 8 && i < diff.length - 2) { // Overlapping curRange.push.apply(curRange, contextLines(lines)); } else { // end the range and output var contextSize = Math.min(lines.length, 4); ret.push( '@@ -' + oldRangeStart + ',' + (oldLine - oldRangeStart + contextSize) + ' +' + newRangeStart + ',' + (newLine - newRangeStart + contextSize) + ' @@'); ret.push.apply(ret, curRange); ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); if (lines.length <= 4) { eofNL(ret, i, current); } oldRangeStart = 0; newRangeStart = 0; curRange = []; } } oldLine += lines.length; newLine += lines.length; } } return ret.join('\n') + '\n'; }, createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { return JsDiff.createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader); }, applyPatch: function(oldStr, uniDiff) { var diffstr = uniDiff.split('\n'), hunks = [], i = 0, remEOFNL = false, addEOFNL = false; // Skip to the first change hunk while (i < diffstr.length && !(/^@@/.test(diffstr[i]))) { i++; } // Parse the unified diff for (; i < diffstr.length; i++) { if (diffstr[i][0] === '@') { var chnukHeader = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/); hunks.unshift({ start: chnukHeader[3], oldlength: +chnukHeader[2], removed: [], newlength: chnukHeader[4], added: [] }); } else if (diffstr[i][0] === '+') { hunks[0].added.push(diffstr[i].substr(1)); } else if (diffstr[i][0] === '-') { hunks[0].removed.push(diffstr[i].substr(1)); } else if (diffstr[i][0] === ' ') { hunks[0].added.push(diffstr[i].substr(1)); hunks[0].removed.push(diffstr[i].substr(1)); } else if (diffstr[i][0] === '\\') { if (diffstr[i - 1][0] === '+') { remEOFNL = true; } else if (diffstr[i - 1][0] === '-') { addEOFNL = true; } } } // Apply the diff to the input var lines = oldStr.split('\n'); for (i = hunks.length - 1; i >= 0; i--) { var hunk = hunks[i]; // Sanity check the input string. Bail if we don't match. for (var j = 0; j < hunk.oldlength; j++) { if (lines[hunk.start - 1 + j] !== hunk.removed[j]) { return false; } } Array.prototype.splice.apply(lines, [hunk.start - 1, hunk.oldlength].concat(hunk.added)); } // Handle EOFNL insertion/removal if (remEOFNL) { while (!lines[lines.length - 1]) { lines.pop(); } } else if (addEOFNL) { lines.push(''); } return lines.join('\n'); }, convertChangesToXML: function(changes) { var ret = []; for (var i = 0; i < changes.length; i++) { var change = changes[i]; if (change.added) { ret.push(''); } else if (change.removed) { ret.push(''); } ret.push(escapeHTML(change.value)); if (change.added) { ret.push(''); } else if (change.removed) { ret.push(''); } } return ret.join(''); }, // See: http://code.google.com/p/google-diff-match-patch/wiki/API convertChangesToDMP: function(changes) { var ret = [], change, operation; for (var i = 0; i < changes.length; i++) { change = changes[i]; if (change.added) { operation = 1; } else if (change.removed) { operation = -1; } else { operation = 0; } ret.push([operation, change.value]); } return ret; }, canonicalize: canonicalize }; /*istanbul ignore next */ /*global module */ if (typeof module !== 'undefined' && module.exports) { module.exports = JsDiff; } else if (false) { /*global define */ define([], function() { return JsDiff; }); } else if (typeof global.JsDiff === 'undefined') { global.JsDiff = JsDiff; } }(this)); },{}],47:[function(require,module,exports){ 'use strict'; var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; module.exports = function (str) { if (typeof str !== 'string') { throw new TypeError('Expected a string'); } return str.replace(matchOperatorsRe, '\\$&'); }; },{}],48:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. function EventEmitter() { this._events = this._events || {}; this._maxListeners = this._maxListeners || undefined; } module.exports = EventEmitter; // Backwards-compat with node 0.10.x EventEmitter.EventEmitter = EventEmitter; EventEmitter.prototype._events = undefined; EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are // added to it. This is a useful default which helps finding memory leaks. EventEmitter.defaultMaxListeners = 10; // Obviously not all Emitters should be limited to 10. This function allows // that to be increased. Set to zero for unlimited. EventEmitter.prototype.setMaxListeners = function(n) { if (!isNumber(n) || n < 0 || isNaN(n)) throw TypeError('n must be a positive number'); this._maxListeners = n; return this; }; EventEmitter.prototype.emit = function(type) { var er, handler, len, args, i, listeners; if (!this._events) this._events = {}; // If there is no 'error' event listener then throw. if (type === 'error') { if (!this._events.error || (isObject(this._events.error) && !this._events.error.length)) { er = arguments[1]; if (er instanceof Error) { throw er; // Unhandled 'error' event } else { // At least give some kind of context to the user var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); err.context = er; throw err; } } } handler = this._events[type]; if (isUndefined(handler)) return false; if (isFunction(handler)) { switch (arguments.length) { // fast cases case 1: handler.call(this); break; case 2: handler.call(this, arguments[1]); break; case 3: handler.call(this, arguments[1], arguments[2]); break; // slower default: args = Array.prototype.slice.call(arguments, 1); handler.apply(this, args); } } else if (isObject(handler)) { args = Array.prototype.slice.call(arguments, 1); listeners = handler.slice(); len = listeners.length; for (i = 0; i < len; i++) listeners[i].apply(this, args); } return true; }; EventEmitter.prototype.addListener = function(type, listener) { var m; if (!isFunction(listener)) throw TypeError('listener must be a function'); if (!this._events) this._events = {}; // To avoid recursion in the case that type === "newListener"! Before // adding it to the listeners, first emit "newListener". if (this._events.newListener) this.emit('newListener', type, isFunction(listener.listener) ? listener.listener : listener); if (!this._events[type]) // Optimize the case of one listener. Don't need the extra array object. this._events[type] = listener; else if (isObject(this._events[type])) // If we've already got an array, just append. this._events[type].push(listener); else // Adding the second element, need to change to array. this._events[type] = [this._events[type], listener]; // Check for listener leak if (isObject(this._events[type]) && !this._events[type].warned) { if (!isUndefined(this._maxListeners)) { m = this._maxListeners; } else { m = EventEmitter.defaultMaxListeners; } if (m && m > 0 && this._events[type].length > m) { this._events[type].warned = true; console.error('(node) warning: possible EventEmitter memory ' + 'leak detected. %d listeners added. ' + 'Use emitter.setMaxListeners() to increase limit.', this._events[type].length); if (typeof console.trace === 'function') { // not supported in IE 10 console.trace(); } } } return this; }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; EventEmitter.prototype.once = function(type, listener) { if (!isFunction(listener)) throw TypeError('listener must be a function'); var fired = false; function g() { this.removeListener(type, g); if (!fired) { fired = true; listener.apply(this, arguments); } } g.listener = listener; this.on(type, g); return this; }; // emits a 'removeListener' event iff the listener was removed EventEmitter.prototype.removeListener = function(type, listener) { var list, position, length, i; if (!isFunction(listener)) throw TypeError('listener must be a function'); if (!this._events || !this._events[type]) return this; list = this._events[type]; length = list.length; position = -1; if (list === listener || (isFunction(list.listener) && list.listener === listener)) { delete this._events[type]; if (this._events.removeListener) this.emit('removeListener', type, listener); } else if (isObject(list)) { for (i = length; i-- > 0;) { if (list[i] === listener || (list[i].listener && list[i].listener === listener)) { position = i; break; } } if (position < 0) return this; if (list.length === 1) { list.length = 0; delete this._events[type]; } else { list.splice(position, 1); } if (this._events.removeListener) this.emit('removeListener', type, listener); } return this; }; EventEmitter.prototype.removeAllListeners = function(type) { var key, listeners; if (!this._events) return this; // not listening for removeListener, no need to emit if (!this._events.removeListener) { if (arguments.length === 0) this._events = {}; else if (this._events[type]) delete this._events[type]; return this; } // emit removeListener for all listeners on all events if (arguments.length === 0) { for (key in this._events) { if (key === 'removeListener') continue; this.removeAllListeners(key); } this.removeAllListeners('removeListener'); this._events = {}; return this; } listeners = this._events[type]; if (isFunction(listeners)) { this.removeListener(type, listeners); } else if (listeners) { // LIFO order while (listeners.length) this.removeListener(type, listeners[listeners.length - 1]); } delete this._events[type]; return this; }; EventEmitter.prototype.listeners = function(type) { var ret; if (!this._events || !this._events[type]) ret = []; else if (isFunction(this._events[type])) ret = [this._events[type]]; else ret = this._events[type].slice(); return ret; }; EventEmitter.prototype.listenerCount = function(type) { if (this._events) { var evlistener = this._events[type]; if (isFunction(evlistener)) return 1; else if (evlistener) return evlistener.length; } return 0; }; EventEmitter.listenerCount = function(emitter, type) { return emitter.listenerCount(type); }; function isFunction(arg) { return typeof arg === 'function'; } function isNumber(arg) { return typeof arg === 'number'; } function isObject(arg) { return typeof arg === 'object' && arg !== null; } function isUndefined(arg) { return arg === void 0; } },{}],49:[function(require,module,exports){ (function (process){ // Growl - Copyright TJ Holowaychuk (MIT Licensed) /** * Module dependencies. */ var exec = require('child_process').exec , fs = require('fs') , path = require('path') , exists = fs.existsSync || path.existsSync , os = require('os') , quote = JSON.stringify , cmd; function which(name) { var paths = process.env.PATH.split(':'); var loc; for (var i = 0, len = paths.length; i < len; ++i) { loc = path.join(paths[i], name); if (exists(loc)) return loc; } } switch(os.type()) { case 'Darwin': if (which('terminal-notifier')) { cmd = { type: "Darwin-NotificationCenter" , pkg: "terminal-notifier" , msg: '-message' , title: '-title' , subtitle: '-subtitle' , icon: '-appIcon' , sound: '-sound' , url: '-open' , priority: { cmd: '-execute' , range: [] } }; } else { cmd = { type: "Darwin-Growl" , pkg: "growlnotify" , msg: '-m' , sticky: '--sticky' , priority: { cmd: '--priority' , range: [ -2 , -1 , 0 , 1 , 2 , "Very Low" , "Moderate" , "Normal" , "High" , "Emergency" ] } }; } break; case 'Linux': if (which('growl')) { cmd = { type: "Linux-Growl" , pkg: "growl" , msg: '-m' , title: '-title' , subtitle: '-subtitle' , host: { cmd: '-H' , hostname: '192.168.33.1' } }; } else { cmd = { type: "Linux" , pkg: "notify-send" , msg: '' , sticky: '-t 0' , icon: '-i' , priority: { cmd: '-u' , range: [ "low" , "normal" , "critical" ] } }; } break; case 'Windows_NT': cmd = { type: "Windows" , pkg: "growlnotify" , msg: '' , sticky: '/s:true' , title: '/t:' , icon: '/i:' , url: '/cu:' , priority: { cmd: '/p:' , range: [ -2 , -1 , 0 , 1 , 2 ] } }; break; } /** * Expose `growl`. */ exports = module.exports = growl; /** * Node-growl version. */ exports.version = '1.4.1' /** * Send growl notification _msg_ with _options_. * * Options: * * - title Notification title * - sticky Make the notification stick (defaults to false) * - priority Specify an int or named key (default is 0) * - name Application name (defaults to growlnotify) * - sound Sound efect ( in OSx defined in preferences -> sound -> effects) * works only in OSX > 10.8x * - image * - path to an icon sets --iconpath * - path to an image sets --image * - capitalized word sets --appIcon * - filename uses extname as --icon * - otherwise treated as --icon * * Examples: * * growl('New email') * growl('5 new emails', { title: 'Thunderbird' }) * growl('5 new emails', { title: 'Thunderbird', sound: 'Purr' }) * growl('Email sent', function(){ * // ... notification sent * }) * * @param {string} msg * @param {object} options * @param {function} fn * @api public */ function growl(msg, options, fn) { var image , args , options = options || {} , fn = fn || function(){}; if (options.exec) { cmd = { type: "Custom" , pkg: options.exec , range: [] }; } // noop if (!cmd) return fn(new Error('growl not supported on this platform')); args = [cmd.pkg]; // image if (image = options.image) { switch(cmd.type) { case 'Darwin-Growl': var flag, ext = path.extname(image).substr(1) flag = flag || ext == 'icns' && 'iconpath' flag = flag || /^[A-Z]/.test(image) && 'appIcon' flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image' flag = flag || ext && (image = ext) && 'icon' flag = flag || 'icon' args.push('--' + flag, quote(image)) break; case 'Darwin-NotificationCenter': args.push(cmd.icon, quote(image)); break; case 'Linux': args.push(cmd.icon, quote(image)); // libnotify defaults to sticky, set a hint for transient notifications if (!options.sticky) args.push('--hint=int:transient:1'); break; case 'Windows': args.push(cmd.icon + quote(image)); break; } } // sticky if (options.sticky) args.push(cmd.sticky); // priority if (options.priority) { var priority = options.priority + ''; var checkindexOf = cmd.priority.range.indexOf(priority); if (~cmd.priority.range.indexOf(priority)) { args.push(cmd.priority, options.priority); } } //sound if(options.sound && cmd.type === 'Darwin-NotificationCenter'){ args.push(cmd.sound, options.sound) } // name if (options.name && cmd.type === "Darwin-Growl") { args.push('--name', options.name); } switch(cmd.type) { case 'Darwin-Growl': args.push(cmd.msg); args.push(quote(msg).replace(/\\n/g, '\n')); if (options.title) args.push(quote(options.title)); break; case 'Darwin-NotificationCenter': args.push(cmd.msg); var stringifiedMsg = quote(msg); var escapedMsg = stringifiedMsg.replace(/\\n/g, '\n'); args.push(escapedMsg); if (options.title) { args.push(cmd.title); args.push(quote(options.title)); } if (options.subtitle) { args.push(cmd.subtitle); args.push(quote(options.subtitle)); } if (options.url) { args.push(cmd.url); args.push(quote(options.url)); } break; case 'Linux-Growl': args.push(cmd.msg); args.push(quote(msg).replace(/\\n/g, '\n')); if (options.title) args.push(quote(options.title)); if (cmd.host) { args.push(cmd.host.cmd, cmd.host.hostname) } break; case 'Linux': if (options.title) { args.push(quote(options.title)); args.push(cmd.msg); args.push(quote(msg).replace(/\\n/g, '\n')); } else { args.push(quote(msg).replace(/\\n/g, '\n')); } break; case 'Windows': args.push(quote(msg).replace(/\\n/g, '\n')); if (options.title) args.push(cmd.title + quote(options.title)); if (options.url) args.push(cmd.url + quote(options.url)); break; case 'Custom': args[0] = (function(origCommand) { var message = options.title ? options.title + ': ' + msg : msg; var command = origCommand.replace(/(^|[^%])%s/g, '$1' + quote(message)); if (command === origCommand) args.push(quote(message)); return command; })(args[0]); break; } // execute exec(args.join(' '), fn); }; }).call(this,require('_process')) },{"_process":67,"child_process":42,"fs":42,"os":65,"path":42}],50:[function(require,module,exports){ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = nBytes * 8 - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var nBits = -7 var i = isLE ? (nBytes - 1) : 0 var d = isLE ? -1 : 1 var s = buffer[offset + i] i += d e = s & ((1 << (-nBits)) - 1) s >>= (-nBits) nBits += eLen for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1) e >>= (-nBits) nBits += mLen for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} if (e === 0) { e = 1 - eBias } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity) } else { m = m + Math.pow(2, mLen) e = e - eBias } return (s ? -1 : 1) * m * Math.pow(2, e - mLen) } exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { var e, m, c var eLen = nBytes * 8 - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) var i = isLE ? 0 : (nBytes - 1) var d = isLE ? 1 : -1 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 value = Math.abs(value) if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0 e = eMax } else { e = Math.floor(Math.log(value) / Math.LN2) if (value * (c = Math.pow(2, -e)) < 1) { e-- c *= 2 } if (e + eBias >= 1) { value += rt / c } else { value += rt * Math.pow(2, 1 - eBias) } if (value * c >= 2) { e++ c /= 2 } if (e + eBias >= eMax) { m = 0 e = eMax } else if (e + eBias >= 1) { m = (value * c - 1) * Math.pow(2, mLen) e = e + eBias } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) e = 0 } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} e = (e << mLen) | m eLen += mLen for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} buffer[offset + i - d] |= s * 128 } },{}],51:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor var TempCtor = function () {} TempCtor.prototype = superCtor.prototype ctor.prototype = new TempCtor() ctor.prototype.constructor = ctor } } },{}],52:[function(require,module,exports){ /*! * Determine if an object is a Buffer * * @author Feross Aboukhadijeh * @license MIT */ // The _isBuffer check is for Safari 5-7 support, because it's missing // Object.prototype.constructor. Remove this eventually module.exports = function (obj) { return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) } function isBuffer (obj) { return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) } // For Node v0.10 support. Remove this eventually. function isSlowBuffer (obj) { return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) } },{}],53:[function(require,module,exports){ var toString = {}.toString; module.exports = Array.isArray || function (arr) { return toString.call(arr) == '[object Array]'; }; },{}],54:[function(require,module,exports){ (function (global){ /*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */ ;(function () { // Detect the `define` function exposed by asynchronous module loaders. The // strict `define` check is necessary for compatibility with `r.js`. var isLoader = false; // A set of types used to distinguish objects from primitives. var objectTypes = { "function": true, "object": true }; // Detect the `exports` object exposed by CommonJS implementations. var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports; // Use the `global` object exposed by Node (including Browserify via // `insert-module-globals`), Narwhal, and Ringo as the default context, // and the `window` object in browsers. Rhino exports a `global` function // instead. var root = objectTypes[typeof window] && window || this, freeGlobal = freeExports && objectTypes[typeof module] && module && !module.nodeType && typeof global == "object" && global; if (freeGlobal && (freeGlobal["global"] === freeGlobal || freeGlobal["window"] === freeGlobal || freeGlobal["self"] === freeGlobal)) { root = freeGlobal; } // Public: Initializes JSON 3 using the given `context` object, attaching the // `stringify` and `parse` functions to the specified `exports` object. function runInContext(context, exports) { context || (context = root["Object"]()); exports || (exports = root["Object"]()); // Native constructor aliases. var Number = context["Number"] || root["Number"], String = context["String"] || root["String"], Object = context["Object"] || root["Object"], Date = context["Date"] || root["Date"], SyntaxError = context["SyntaxError"] || root["SyntaxError"], TypeError = context["TypeError"] || root["TypeError"], Math = context["Math"] || root["Math"], nativeJSON = context["JSON"] || root["JSON"]; // Delegate to the native `stringify` and `parse` implementations. if (typeof nativeJSON == "object" && nativeJSON) { exports.stringify = nativeJSON.stringify; exports.parse = nativeJSON.parse; } // Convenience aliases. var objectProto = Object.prototype, getClass = objectProto.toString, isProperty, forEach, undef; // Test the `Date#getUTC*` methods. Based on work by @Yaffle. var isExtended = new Date(-3509827334573292); try { // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical // results for certain dates in Opera >= 10.53. isExtended = isExtended.getUTCFullYear() == -109252 && isExtended.getUTCMonth() === 0 && isExtended.getUTCDate() === 1 && // Safari < 2.0.2 stores the internal millisecond time value correctly, // but clips the values returned by the date methods to the range of // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]). isExtended.getUTCHours() == 10 && isExtended.getUTCMinutes() == 37 && isExtended.getUTCSeconds() == 6 && isExtended.getUTCMilliseconds() == 708; } catch (exception) {} // Internal: Determines whether the native `JSON.stringify` and `parse` // implementations are spec-compliant. Based on work by Ken Snyder. function has(name) { if (has[name] !== undef) { // Return cached feature test result. return has[name]; } var isSupported; if (name == "bug-string-char-index") { // IE <= 7 doesn't support accessing string characters using square // bracket notation. IE 8 only supports this for primitives. isSupported = "a"[0] != "a"; } else if (name == "json") { // Indicates whether both `JSON.stringify` and `JSON.parse` are // supported. isSupported = has("json-stringify") && has("json-parse"); } else { var value, serialized = '{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}'; // Test `JSON.stringify`. if (name == "json-stringify") { var stringify = exports.stringify, stringifySupported = typeof stringify == "function" && isExtended; if (stringifySupported) { // A test function object with a custom `toJSON` method. (value = function () { return 1; }).toJSON = value; try { stringifySupported = // Firefox 3.1b1 and b2 serialize string, number, and boolean // primitives as object literals. stringify(0) === "0" && // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object // literals. stringify(new Number()) === "0" && stringify(new String()) == '""' && // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or // does not define a canonical JSON representation (this applies to // objects with `toJSON` properties as well, *unless* they are nested // within an object or array). stringify(getClass) === undef && // IE 8 serializes `undefined` as `"undefined"`. Safari <= 5.1.7 and // FF 3.1b3 pass this test. stringify(undef) === undef && // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s, // respectively, if the value is omitted entirely. stringify() === undef && // FF 3.1b1, 2 throw an error if the given value is not a number, // string, array, object, Boolean, or `null` literal. This applies to // objects with custom `toJSON` methods as well, unless they are nested // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON` // methods entirely. stringify(value) === "1" && stringify([value]) == "[1]" && // Prototype <= 1.6.1 serializes `[undefined]` as `"[]"` instead of // `"[null]"`. stringify([undef]) == "[null]" && // YUI 3.0.0b1 fails to serialize `null` literals. stringify(null) == "null" && // FF 3.1b1, 2 halts serialization if an array contains a function: // `[1, true, getClass, 1]` serializes as "[1,true,],". FF 3.1b3 // elides non-JSON values from objects and arrays, unless they // define custom `toJSON` methods. stringify([undef, getClass, null]) == "[null,null,null]" && // Simple serialization test. FF 3.1b1 uses Unicode escape sequences // where character escape codes are expected (e.g., `\b` => `\u0008`). stringify({ "a": [value, true, false, null, "\x00\b\n\f\r\t"] }) == serialized && // FF 3.1b1 and b2 ignore the `filter` and `width` arguments. stringify(null, value) === "1" && stringify([1, 2], null, 1) == "[\n 1,\n 2\n]" && // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly // serialize extended years. stringify(new Date(-8.64e15)) == '"-271821-04-20T00:00:00.000Z"' && // The milliseconds are optional in ES 5, but required in 5.1. stringify(new Date(8.64e15)) == '"+275760-09-13T00:00:00.000Z"' && // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative // four-digit years instead of six-digit years. Credits: @Yaffle. stringify(new Date(-621987552e5)) == '"-000001-01-01T00:00:00.000Z"' && // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond // values less than 1000. Credits: @Yaffle. stringify(new Date(-1)) == '"1969-12-31T23:59:59.999Z"'; } catch (exception) { stringifySupported = false; } } isSupported = stringifySupported; } // Test `JSON.parse`. if (name == "json-parse") { var parse = exports.parse; if (typeof parse == "function") { try { // FF 3.1b1, b2 will throw an exception if a bare literal is provided. // Conforming implementations should also coerce the initial argument to // a string prior to parsing. if (parse("0") === 0 && !parse(false)) { // Simple parsing test. value = parse(serialized); var parseSupported = value["a"].length == 5 && value["a"][0] === 1; if (parseSupported) { try { // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings. parseSupported = !parse('"\t"'); } catch (exception) {} if (parseSupported) { try { // FF 4.0 and 4.0.1 allow leading `+` signs and leading // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow // certain octal literals. parseSupported = parse("01") !== 1; } catch (exception) {} } if (parseSupported) { try { // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal // points. These environments, along with FF 3.1b1 and 2, // also allow trailing commas in JSON objects and arrays. parseSupported = parse("1.") !== 1; } catch (exception) {} } } } } catch (exception) { parseSupported = false; } } isSupported = parseSupported; } } return has[name] = !!isSupported; } if (!has("json")) { // Common `[[Class]]` name aliases. var functionClass = "[object Function]", dateClass = "[object Date]", numberClass = "[object Number]", stringClass = "[object String]", arrayClass = "[object Array]", booleanClass = "[object Boolean]"; // Detect incomplete support for accessing string characters by index. var charIndexBuggy = has("bug-string-char-index"); // Define additional utility methods if the `Date` methods are buggy. if (!isExtended) { var floor = Math.floor; // A mapping between the months of the year and the number of days between // January 1st and the first of the respective month. var Months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; // Internal: Calculates the number of days between the Unix epoch and the // first day of the given month. var getDay = function (year, month) { return Months[month] + 365 * (year - 1970) + floor((year - 1969 + (month = +(month > 1))) / 4) - floor((year - 1901 + month) / 100) + floor((year - 1601 + month) / 400); }; } // Internal: Determines if a property is a direct property of the given // object. Delegates to the native `Object#hasOwnProperty` method. if (!(isProperty = objectProto.hasOwnProperty)) { isProperty = function (property) { var members = {}, constructor; if ((members.__proto__ = null, members.__proto__ = { // The *proto* property cannot be set multiple times in recent // versions of Firefox and SeaMonkey. "toString": 1 }, members).toString != getClass) { // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but // supports the mutable *proto* property. isProperty = function (property) { // Capture and break the object's prototype chain (see section 8.6.2 // of the ES 5.1 spec). The parenthesized expression prevents an // unsafe transformation by the Closure Compiler. var original = this.__proto__, result = property in (this.__proto__ = null, this); // Restore the original prototype chain. this.__proto__ = original; return result; }; } else { // Capture a reference to the top-level `Object` constructor. constructor = members.constructor; // Use the `constructor` property to simulate `Object#hasOwnProperty` in // other environments. isProperty = function (property) { var parent = (this.constructor || constructor).prototype; return property in this && !(property in parent && this[property] === parent[property]); }; } members = null; return isProperty.call(this, property); }; } // Internal: Normalizes the `for...in` iteration algorithm across // environments. Each enumerated key is yielded to a `callback` function. forEach = function (object, callback) { var size = 0, Properties, members, property; // Tests for bugs in the current environment's `for...in` algorithm. The // `valueOf` property inherits the non-enumerable flag from // `Object.prototype` in older versions of IE, Netscape, and Mozilla. (Properties = function () { this.valueOf = 0; }).prototype.valueOf = 0; // Iterate over a new instance of the `Properties` class. members = new Properties(); for (property in members) { // Ignore all properties inherited from `Object.prototype`. if (isProperty.call(members, property)) { size++; } } Properties = members = null; // Normalize the iteration algorithm. if (!size) { // A list of non-enumerable properties inherited from `Object.prototype`. members = ["valueOf", "toString", "toLocaleString", "propertyIsEnumerable", "isPrototypeOf", "hasOwnProperty", "constructor"]; // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable // properties. forEach = function (object, callback) { var isFunction = getClass.call(object) == functionClass, property, length; var hasProperty = !isFunction && typeof object.constructor != "function" && objectTypes[typeof object.hasOwnProperty] && object.hasOwnProperty || isProperty; for (property in object) { // Gecko <= 1.0 enumerates the `prototype` property of functions under // certain conditions; IE does not. if (!(isFunction && property == "prototype") && hasProperty.call(object, property)) { callback(property); } } // Manually invoke the callback for each non-enumerable property. for (length = members.length; property = members[--length]; hasProperty.call(object, property) && callback(property)); }; } else if (size == 2) { // Safari <= 2.0.4 enumerates shadowed properties twice. forEach = function (object, callback) { // Create a set of iterated properties. var members = {}, isFunction = getClass.call(object) == functionClass, property; for (property in object) { // Store each property name to prevent double enumeration. The // `prototype` property of functions is not enumerated due to cross- // environment inconsistencies. if (!(isFunction && property == "prototype") && !isProperty.call(members, property) && (members[property] = 1) && isProperty.call(object, property)) { callback(property); } } }; } else { // No bugs detected; use the standard `for...in` algorithm. forEach = function (object, callback) { var isFunction = getClass.call(object) == functionClass, property, isConstructor; for (property in object) { if (!(isFunction && property == "prototype") && isProperty.call(object, property) && !(isConstructor = property === "constructor")) { callback(property); } } // Manually invoke the callback for the `constructor` property due to // cross-environment inconsistencies. if (isConstructor || isProperty.call(object, (property = "constructor"))) { callback(property); } }; } return forEach(object, callback); }; // Public: Serializes a JavaScript `value` as a JSON string. The optional // `filter` argument may specify either a function that alters how object and // array members are serialized, or an array of strings and numbers that // indicates which properties should be serialized. The optional `width` // argument may be either a string or number that specifies the indentation // level of the output. if (!has("json-stringify")) { // Internal: A map of control characters and their escaped equivalents. var Escapes = { 92: "\\\\", 34: '\\"', 8: "\\b", 12: "\\f", 10: "\\n", 13: "\\r", 9: "\\t" }; // Internal: Converts `value` into a zero-padded string such that its // length is at least equal to `width`. The `width` must be <= 6. var leadingZeroes = "000000"; var toPaddedString = function (width, value) { // The `|| 0` expression is necessary to work around a bug in // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== "0"`. return (leadingZeroes + (value || 0)).slice(-width); }; // Internal: Double-quotes a string `value`, replacing all ASCII control // characters (characters with code unit values between 0 and 31) with // their escaped equivalents. This is an implementation of the // `Quote(value)` operation defined in ES 5.1 section 15.12.3. var unicodePrefix = "\\u00"; var quote = function (value) { var result = '"', index = 0, length = value.length, useCharIndex = !charIndexBuggy || length > 10; var symbols = useCharIndex && (charIndexBuggy ? value.split("") : value); for (; index < length; index++) { var charCode = value.charCodeAt(index); // If the character is a control character, append its Unicode or // shorthand escape sequence; otherwise, append the character as-is. switch (charCode) { case 8: case 9: case 10: case 12: case 13: case 34: case 92: result += Escapes[charCode]; break; default: if (charCode < 32) { result += unicodePrefix + toPaddedString(2, charCode.toString(16)); break; } result += useCharIndex ? symbols[index] : value.charAt(index); } } return result + '"'; }; // Internal: Recursively serializes an object. Implements the // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations. var serialize = function (property, object, callback, properties, whitespace, indentation, stack) { var value, className, year, month, date, time, hours, minutes, seconds, milliseconds, results, element, index, length, prefix, result; try { // Necessary for host object support. value = object[property]; } catch (exception) {} if (typeof value == "object" && value) { className = getClass.call(value); if (className == dateClass && !isProperty.call(value, "toJSON")) { if (value > -1 / 0 && value < 1 / 0) { // Dates are serialized according to the `Date#toJSON` method // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15 // for the ISO 8601 date time string format. if (getDay) { // Manually compute the year, month, date, hours, minutes, // seconds, and milliseconds if the `getUTC*` methods are // buggy. Adapted from @Yaffle's `date-shim` project. date = floor(value / 864e5); for (year = floor(date / 365.2425) + 1970 - 1; getDay(year + 1, 0) <= date; year++); for (month = floor((date - getDay(year, 0)) / 30.42); getDay(year, month + 1) <= date; month++); date = 1 + date - getDay(year, month); // The `time` value specifies the time within the day (see ES // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used // to compute `A modulo B`, as the `%` operator does not // correspond to the `modulo` operation for negative numbers. time = (value % 864e5 + 864e5) % 864e5; // The hours, minutes, seconds, and milliseconds are obtained by // decomposing the time within the day. See section 15.9.1.10. hours = floor(time / 36e5) % 24; minutes = floor(time / 6e4) % 60; seconds = floor(time / 1e3) % 60; milliseconds = time % 1e3; } else { year = value.getUTCFullYear(); month = value.getUTCMonth(); date = value.getUTCDate(); hours = value.getUTCHours(); minutes = value.getUTCMinutes(); seconds = value.getUTCSeconds(); milliseconds = value.getUTCMilliseconds(); } // Serialize extended years correctly. value = (year <= 0 || year >= 1e4 ? (year < 0 ? "-" : "+") + toPaddedString(6, year < 0 ? -year : year) : toPaddedString(4, year)) + "-" + toPaddedString(2, month + 1) + "-" + toPaddedString(2, date) + // Months, dates, hours, minutes, and seconds should have two // digits; milliseconds should have three. "T" + toPaddedString(2, hours) + ":" + toPaddedString(2, minutes) + ":" + toPaddedString(2, seconds) + // Milliseconds are optional in ES 5.0, but required in 5.1. "." + toPaddedString(3, milliseconds) + "Z"; } else { value = null; } } else if (typeof value.toJSON == "function" && ((className != numberClass && className != stringClass && className != arrayClass) || isProperty.call(value, "toJSON"))) { // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3 // ignores all `toJSON` methods on these objects unless they are // defined directly on an instance. value = value.toJSON(property); } } if (callback) { // If a replacement function was provided, call it to obtain the value // for serialization. value = callback.call(object, property, value); } if (value === null) { return "null"; } className = getClass.call(value); if (className == booleanClass) { // Booleans are represented literally. return "" + value; } else if (className == numberClass) { // JSON numbers must be finite. `Infinity` and `NaN` are serialized as // `"null"`. return value > -1 / 0 && value < 1 / 0 ? "" + value : "null"; } else if (className == stringClass) { // Strings are double-quoted and escaped. return quote("" + value); } // Recursively serialize objects and arrays. if (typeof value == "object") { // Check for cyclic structures. This is a linear search; performance // is inversely proportional to the number of unique nested objects. for (length = stack.length; length--;) { if (stack[length] === value) { // Cyclic structures cannot be serialized by `JSON.stringify`. throw TypeError(); } } // Add the object to the stack of traversed objects. stack.push(value); results = []; // Save the current indentation level and indent one additional level. prefix = indentation; indentation += whitespace; if (className == arrayClass) { // Recursively serialize array elements. for (index = 0, length = value.length; index < length; index++) { element = serialize(index, value, callback, properties, whitespace, indentation, stack); results.push(element === undef ? "null" : element); } result = results.length ? (whitespace ? "[\n" + indentation + results.join(",\n" + indentation) + "\n" + prefix + "]" : ("[" + results.join(",") + "]")) : "[]"; } else { // Recursively serialize object members. Members are selected from // either a user-specified list of property names, or the object // itself. forEach(properties || value, function (property) { var element = serialize(property, value, callback, properties, whitespace, indentation, stack); if (element !== undef) { // According to ES 5.1 section 15.12.3: "If `gap` {whitespace} // is not the empty string, let `member` {quote(property) + ":"} // be the concatenation of `member` and the `space` character." // The "`space` character" refers to the literal space // character, not the `space` {width} argument provided to // `JSON.stringify`. results.push(quote(property) + ":" + (whitespace ? " " : "") + element); } }); result = results.length ? (whitespace ? "{\n" + indentation + results.join(",\n" + indentation) + "\n" + prefix + "}" : ("{" + results.join(",") + "}")) : "{}"; } // Remove the object from the traversed object stack. stack.pop(); return result; } }; // Public: `JSON.stringify`. See ES 5.1 section 15.12.3. exports.stringify = function (source, filter, width) { var whitespace, callback, properties, className; if (objectTypes[typeof filter] && filter) { if ((className = getClass.call(filter)) == functionClass) { callback = filter; } else if (className == arrayClass) { // Convert the property names array into a makeshift set. properties = {}; for (var index = 0, length = filter.length, value; index < length; value = filter[index++], ((className = getClass.call(value)), className == stringClass || className == numberClass) && (properties[value] = 1)); } } if (width) { if ((className = getClass.call(width)) == numberClass) { // Convert the `width` to an integer and create a string containing // `width` number of space characters. if ((width -= width % 1) > 0) { for (whitespace = "", width > 10 && (width = 10); whitespace.length < width; whitespace += " "); } } else if (className == stringClass) { whitespace = width.length <= 10 ? width : width.slice(0, 10); } } // Opera <= 7.54u2 discards the values associated with empty string keys // (`""`) only if they are used directly within an object member list // (e.g., `!("" in { "": 1})`). return serialize("", (value = {}, value[""] = source, value), callback, properties, whitespace, "", []); }; } // Public: Parses a JSON source string. if (!has("json-parse")) { var fromCharCode = String.fromCharCode; // Internal: A map of escaped control characters and their unescaped // equivalents. var Unescapes = { 92: "\\", 34: '"', 47: "/", 98: "\b", 116: "\t", 110: "\n", 102: "\f", 114: "\r" }; // Internal: Stores the parser state. var Index, Source; // Internal: Resets the parser state and throws a `SyntaxError`. var abort = function () { Index = Source = null; throw SyntaxError(); }; // Internal: Returns the next token, or `"$"` if the parser has reached // the end of the source string. A token may be a string, number, `null` // literal, or Boolean literal. var lex = function () { var source = Source, length = source.length, value, begin, position, isSigned, charCode; while (Index < length) { charCode = source.charCodeAt(Index); switch (charCode) { case 9: case 10: case 13: case 32: // Skip whitespace tokens, including tabs, carriage returns, line // feeds, and space characters. Index++; break; case 123: case 125: case 91: case 93: case 58: case 44: // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at // the current position. value = charIndexBuggy ? source.charAt(Index) : source[Index]; Index++; return value; case 34: // `"` delimits a JSON string; advance to the next character and // begin parsing the string. String tokens are prefixed with the // sentinel `@` character to distinguish them from punctuators and // end-of-string tokens. for (value = "@", Index++; Index < length;) { charCode = source.charCodeAt(Index); if (charCode < 32) { // Unescaped ASCII control characters (those with a code unit // less than the space character) are not permitted. abort(); } else if (charCode == 92) { // A reverse solidus (`\`) marks the beginning of an escaped // control character (including `"`, `\`, and `/`) or Unicode // escape sequence. charCode = source.charCodeAt(++Index); switch (charCode) { case 92: case 34: case 47: case 98: case 116: case 110: case 102: case 114: // Revive escaped control characters. value += Unescapes[charCode]; Index++; break; case 117: // `\u` marks the beginning of a Unicode escape sequence. // Advance to the first character and validate the // four-digit code point. begin = ++Index; for (position = Index + 4; Index < position; Index++) { charCode = source.charCodeAt(Index); // A valid sequence comprises four hexdigits (case- // insensitive) that form a single hexadecimal value. if (!(charCode >= 48 && charCode <= 57 || charCode >= 97 && charCode <= 102 || charCode >= 65 && charCode <= 70)) { // Invalid Unicode escape sequence. abort(); } } // Revive the escaped character. value += fromCharCode("0x" + source.slice(begin, Index)); break; default: // Invalid escape sequence. abort(); } } else { if (charCode == 34) { // An unescaped double-quote character marks the end of the // string. break; } charCode = source.charCodeAt(Index); begin = Index; // Optimize for the common case where a string is valid. while (charCode >= 32 && charCode != 92 && charCode != 34) { charCode = source.charCodeAt(++Index); } // Append the string as-is. value += source.slice(begin, Index); } } if (source.charCodeAt(Index) == 34) { // Advance to the next character and return the revived string. Index++; return value; } // Unterminated string. abort(); default: // Parse numbers and literals. begin = Index; // Advance past the negative sign, if one is specified. if (charCode == 45) { isSigned = true; charCode = source.charCodeAt(++Index); } // Parse an integer or floating-point value. if (charCode >= 48 && charCode <= 57) { // Leading zeroes are interpreted as octal literals. if (charCode == 48 && ((charCode = source.charCodeAt(Index + 1)), charCode >= 48 && charCode <= 57)) { // Illegal octal literal. abort(); } isSigned = false; // Parse the integer component. for (; Index < length && ((charCode = source.charCodeAt(Index)), charCode >= 48 && charCode <= 57); Index++); // Floats cannot contain a leading decimal point; however, this // case is already accounted for by the parser. if (source.charCodeAt(Index) == 46) { position = ++Index; // Parse the decimal component. for (; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++); if (position == Index) { // Illegal trailing decimal. abort(); } Index = position; } // Parse exponents. The `e` denoting the exponent is // case-insensitive. charCode = source.charCodeAt(Index); if (charCode == 101 || charCode == 69) { charCode = source.charCodeAt(++Index); // Skip past the sign following the exponent, if one is // specified. if (charCode == 43 || charCode == 45) { Index++; } // Parse the exponential component. for (position = Index; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++); if (position == Index) { // Illegal empty exponent. abort(); } Index = position; } // Coerce the parsed value to a JavaScript number. return +source.slice(begin, Index); } // A negative sign may only precede numbers. if (isSigned) { abort(); } // `true`, `false`, and `null` literals. if (source.slice(Index, Index + 4) == "true") { Index += 4; return true; } else if (source.slice(Index, Index + 5) == "false") { Index += 5; return false; } else if (source.slice(Index, Index + 4) == "null") { Index += 4; return null; } // Unrecognized token. abort(); } } // Return the sentinel `$` character if the parser has reached the end // of the source string. return "$"; }; // Internal: Parses a JSON `value` token. var get = function (value) { var results, hasMembers; if (value == "$") { // Unexpected end of input. abort(); } if (typeof value == "string") { if ((charIndexBuggy ? value.charAt(0) : value[0]) == "@") { // Remove the sentinel `@` character. return value.slice(1); } // Parse object and array literals. if (value == "[") { // Parses a JSON array, returning a new JavaScript array. results = []; for (;; hasMembers || (hasMembers = true)) { value = lex(); // A closing square bracket marks the end of the array literal. if (value == "]") { break; } // If the array literal contains elements, the current token // should be a comma separating the previous element from the // next. if (hasMembers) { if (value == ",") { value = lex(); if (value == "]") { // Unexpected trailing `,` in array literal. abort(); } } else { // A `,` must separate each array element. abort(); } } // Elisions and leading commas are not permitted. if (value == ",") { abort(); } results.push(get(value)); } return results; } else if (value == "{") { // Parses a JSON object, returning a new JavaScript object. results = {}; for (;; hasMembers || (hasMembers = true)) { value = lex(); // A closing curly brace marks the end of the object literal. if (value == "}") { break; } // If the object literal contains members, the current token // should be a comma separator. if (hasMembers) { if (value == ",") { value = lex(); if (value == "}") { // Unexpected trailing `,` in object literal. abort(); } } else { // A `,` must separate each object member. abort(); } } // Leading commas are not permitted, object property names must be // double-quoted strings, and a `:` must separate each property // name and value. if (value == "," || typeof value != "string" || (charIndexBuggy ? value.charAt(0) : value[0]) != "@" || lex() != ":") { abort(); } results[value.slice(1)] = get(lex()); } return results; } // Unexpected token encountered. abort(); } return value; }; // Internal: Updates a traversed object member. var update = function (source, property, callback) { var element = walk(source, property, callback); if (element === undef) { delete source[property]; } else { source[property] = element; } }; // Internal: Recursively traverses a parsed JSON object, invoking the // `callback` function for each value. This is an implementation of the // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2. var walk = function (source, property, callback) { var value = source[property], length; if (typeof value == "object" && value) { // `forEach` can't be used to traverse an array in Opera <= 8.54 // because its `Object#hasOwnProperty` implementation returns `false` // for array indices (e.g., `![1, 2, 3].hasOwnProperty("0")`). if (getClass.call(value) == arrayClass) { for (length = value.length; length--;) { update(value, length, callback); } } else { forEach(value, function (property) { update(value, property, callback); }); } } return callback.call(source, property, value); }; // Public: `JSON.parse`. See ES 5.1 section 15.12.2. exports.parse = function (source, callback) { var result, value; Index = 0; Source = "" + source; result = get(lex()); // If a JSON string contains multiple tokens, it is invalid. if (lex() != "$") { abort(); } // Reset the parser state. Index = Source = null; return callback && getClass.call(callback) == functionClass ? walk((value = {}, value[""] = result, value), "", callback) : result; }; } } exports["runInContext"] = runInContext; return exports; } if (freeExports && !isLoader) { // Export for CommonJS environments. runInContext(root, freeExports); } else { // Export for web browsers and JavaScript engines. var nativeJSON = root.JSON, previousJSON = root["JSON3"], isRestored = false; var JSON3 = runInContext(root, (root["JSON3"] = { // Public: Restores the original value of the global `JSON` object and // returns a reference to the `JSON3` object. "noConflict": function () { if (!isRestored) { isRestored = true; root.JSON = nativeJSON; root["JSON3"] = previousJSON; nativeJSON = previousJSON = null; } return JSON3; } })); root.JSON = { "parse": JSON3.parse, "stringify": JSON3.stringify }; } // Export for asynchronous module loaders. if (isLoader) { !(__WEBPACK_AMD_DEFINE_RESULT__ = function () { return JSON3; }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } }).call(this); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],55:[function(require,module,exports){ /** * lodash 3.2.0 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` * Copyright 2012-2015 The Dojo Foundation * Based on Underscore.js 1.8.3 * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license */ var baseCopy = require('lodash._basecopy'), keys = require('lodash.keys'); /** * The base implementation of `_.assign` without support for argument juggling, * multiple sources, and `customizer` functions. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @returns {Object} Returns `object`. */ function baseAssign(object, source) { return source == null ? object : baseCopy(source, keys(source), object); } module.exports = baseAssign; },{"lodash._basecopy":56,"lodash.keys":63}],56:[function(require,module,exports){ /** * lodash 3.0.1 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` * Copyright 2012-2015 The Dojo Foundation * Based on Underscore.js 1.8.3 * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license */ /** * Copies properties of `source` to `object`. * * @private * @param {Object} source The object to copy properties from. * @param {Array} props The property names to copy. * @param {Object} [object={}] The object to copy properties to. * @returns {Object} Returns `object`. */ function baseCopy(source, props, object) { object || (object = {}); var index = -1, length = props.length; while (++index < length) { var key = props[index]; object[key] = source[key]; } return object; } module.exports = baseCopy; },{}],57:[function(require,module,exports){ /** * lodash 3.0.3 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` * Copyright 2012-2015 The Dojo Foundation * Based on Underscore.js 1.8.3 * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license */ /** * The base implementation of `_.create` without support for assigning * properties to the created object. * * @private * @param {Object} prototype The object to inherit from. * @returns {Object} Returns the new object. */ var baseCreate = (function() { function object() {} return function(prototype) { if (isObject(prototype)) { object.prototype = prototype; var result = new object; object.prototype = undefined; } return result || {}; }; }()); /** * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(1); * // => false */ function isObject(value) { // Avoid a V8 JIT bug in Chrome 19-20. // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. var type = typeof value; return !!value && (type == 'object' || type == 'function'); } module.exports = baseCreate; },{}],58:[function(require,module,exports){ /** * lodash 3.9.1 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` * Copyright 2012-2015 The Dojo Foundation * Based on Underscore.js 1.8.3 * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license */ /** `Object#toString` result references. */ var funcTag = '[object Function]'; /** Used to detect host constructors (Safari > 5). */ var reIsHostCtor = /^\[object .+?Constructor\]$/; /** * Checks if `value` is object-like. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. */ function isObjectLike(value) { return !!value && typeof value == 'object'; } /** Used for native method references. */ var objectProto = Object.prototype; /** Used to resolve the decompiled source of functions. */ var fnToString = Function.prototype.toString; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) * of values. */ var objToString = objectProto.toString; /** Used to detect if a method is native. */ var reIsNative = RegExp('^' + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' ); /** * Gets the native function at `key` of `object`. * * @private * @param {Object} object The object to query. * @param {string} key The key of the method to get. * @returns {*} Returns the function if it's native, else `undefined`. */ function getNative(object, key) { var value = object == null ? undefined : object[key]; return isNative(value) ? value : undefined; } /** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */ function isFunction(value) { // The use of `Object#toString` avoids issues with the `typeof` operator // in older versions of Chrome and Safari which return 'function' for regexes // and Safari 8 equivalents which return 'object' for typed array constructors. return isObject(value) && objToString.call(value) == funcTag; } /** * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(1); * // => false */ function isObject(value) { // Avoid a V8 JIT bug in Chrome 19-20. // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. var type = typeof value; return !!value && (type == 'object' || type == 'function'); } /** * Checks if `value` is a native function. * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, else `false`. * @example * * _.isNative(Array.prototype.push); * // => true * * _.isNative(_); * // => false */ function isNative(value) { if (value == null) { return false; } if (isFunction(value)) { return reIsNative.test(fnToString.call(value)); } return isObjectLike(value) && reIsHostCtor.test(value); } module.exports = getNative; },{}],59:[function(require,module,exports){ /** * lodash 3.0.9 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` * Copyright 2012-2015 The Dojo Foundation * Based on Underscore.js 1.8.3 * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license */ /** Used to detect unsigned integer values. */ var reIsUint = /^\d+$/; /** * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer) * of an array-like value. */ var MAX_SAFE_INTEGER = 9007199254740991; /** * The base implementation of `_.property` without support for deep paths. * * @private * @param {string} key The key of the property to get. * @returns {Function} Returns the new function. */ function baseProperty(key) { return function(object) { return object == null ? undefined : object[key]; }; } /** * Gets the "length" property value of `object`. * * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) * that affects Safari on at least iOS 8.1-8.3 ARM64. * * @private * @param {Object} object The object to query. * @returns {*} Returns the "length" value. */ var getLength = baseProperty('length'); /** * Checks if `value` is array-like. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. */ function isArrayLike(value) { return value != null && isLength(getLength(value)); } /** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */ function isIndex(value, length) { value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; length = length == null ? MAX_SAFE_INTEGER : length; return value > -1 && value % 1 == 0 && value < length; } /** * Checks if the provided arguments are from an iteratee call. * * @private * @param {*} value The potential iteratee value argument. * @param {*} index The potential iteratee index or key argument. * @param {*} object The potential iteratee object argument. * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. */ function isIterateeCall(value, index, object) { if (!isObject(object)) { return false; } var type = typeof index; if (type == 'number' ? (isArrayLike(object) && isIndex(index, object.length)) : (type == 'string' && index in object)) { var other = object[index]; return value === value ? (value === other) : (other !== other); } return false; } /** * Checks if `value` is a valid array-like length. * * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength). * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. */ function isLength(value) { return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } /** * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(1); * // => false */ function isObject(value) { // Avoid a V8 JIT bug in Chrome 19-20. // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. var type = typeof value; return !!value && (type == 'object' || type == 'function'); } module.exports = isIterateeCall; },{}],60:[function(require,module,exports){ /** * lodash 3.1.1 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` * Copyright 2012-2015 The Dojo Foundation * Based on Underscore.js 1.8.3 * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license */ var baseAssign = require('lodash._baseassign'), baseCreate = require('lodash._basecreate'), isIterateeCall = require('lodash._isiterateecall'); /** * Creates an object that inherits from the given `prototype` object. If a * `properties` object is provided its own enumerable properties are assigned * to the created object. * * @static * @memberOf _ * @category Object * @param {Object} prototype The object to inherit from. * @param {Object} [properties] The properties to assign to the object. * @param- {Object} [guard] Enables use as a callback for functions like `_.map`. * @returns {Object} Returns the new object. * @example * * function Shape() { * this.x = 0; * this.y = 0; * } * * function Circle() { * Shape.call(this); * } * * Circle.prototype = _.create(Shape.prototype, { * 'constructor': Circle * }); * * var circle = new Circle; * circle instanceof Circle; * // => true * * circle instanceof Shape; * // => true */ function create(prototype, properties, guard) { var result = baseCreate(prototype); if (guard && isIterateeCall(prototype, properties, guard)) { properties = undefined; } return properties ? baseAssign(result, properties) : result; } module.exports = create; },{"lodash._baseassign":55,"lodash._basecreate":57,"lodash._isiterateecall":59}],61:[function(require,module,exports){ /** * lodash (Custom Build) * Build: `lodash modularize exports="npm" -o ./` * Copyright jQuery Foundation and other contributors * Released under MIT license * Based on Underscore.js 1.8.3 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors */ /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** `Object#toString` result references. */ var argsTag = '[object Arguments]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]'; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var objectToString = objectProto.toString; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; /** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, * else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */ function isArguments(value) { // Safari 8.1 makes `arguments.callee` enumerable in strict mode. return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); } /** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */ function isArrayLike(value) { return value != null && isLength(value.length) && !isFunction(value); } /** * This method is like `_.isArrayLike` except that it also checks if `value` * is an object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array-like object, * else `false`. * @example * * _.isArrayLikeObject([1, 2, 3]); * // => true * * _.isArrayLikeObject(document.body.children); * // => true * * _.isArrayLikeObject('abc'); * // => false * * _.isArrayLikeObject(_.noop); * // => false */ function isArrayLikeObject(value) { return isObjectLike(value) && isArrayLike(value); } /** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */ function isFunction(value) { // The use of `Object#toString` avoids issues with the `typeof` operator // in Safari 8-9 which returns 'object' for typed array and other constructors. var tag = isObject(value) ? objectToString.call(value) : ''; return tag == funcTag || tag == genTag; } /** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */ function isLength(value) { return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */ function isObject(value) { var type = typeof value; return !!value && (type == 'object' || type == 'function'); } /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */ function isObjectLike(value) { return !!value && typeof value == 'object'; } module.exports = isArguments; },{}],62:[function(require,module,exports){ /** * lodash 3.0.4 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` * Copyright 2012-2015 The Dojo Foundation * Based on Underscore.js 1.8.3 * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license */ /** `Object#toString` result references. */ var arrayTag = '[object Array]', funcTag = '[object Function]'; /** Used to detect host constructors (Safari > 5). */ var reIsHostCtor = /^\[object .+?Constructor\]$/; /** * Checks if `value` is object-like. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. */ function isObjectLike(value) { return !!value && typeof value == 'object'; } /** Used for native method references. */ var objectProto = Object.prototype; /** Used to resolve the decompiled source of functions. */ var fnToString = Function.prototype.toString; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) * of values. */ var objToString = objectProto.toString; /** Used to detect if a method is native. */ var reIsNative = RegExp('^' + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' ); /* Native method references for those with the same name as other `lodash` methods. */ var nativeIsArray = getNative(Array, 'isArray'); /** * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) * of an array-like value. */ var MAX_SAFE_INTEGER = 9007199254740991; /** * Gets the native function at `key` of `object`. * * @private * @param {Object} object The object to query. * @param {string} key The key of the method to get. * @returns {*} Returns the function if it's native, else `undefined`. */ function getNative(object, key) { var value = object == null ? undefined : object[key]; return isNative(value) ? value : undefined; } /** * Checks if `value` is a valid array-like length. * * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. */ function isLength(value) { return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } /** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(function() { return arguments; }()); * // => false */ var isArray = nativeIsArray || function(value) { return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; }; /** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */ function isFunction(value) { // The use of `Object#toString` avoids issues with the `typeof` operator // in older versions of Chrome and Safari which return 'function' for regexes // and Safari 8 equivalents which return 'object' for typed array constructors. return isObject(value) && objToString.call(value) == funcTag; } /** * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(1); * // => false */ function isObject(value) { // Avoid a V8 JIT bug in Chrome 19-20. // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. var type = typeof value; return !!value && (type == 'object' || type == 'function'); } /** * Checks if `value` is a native function. * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, else `false`. * @example * * _.isNative(Array.prototype.push); * // => true * * _.isNative(_); * // => false */ function isNative(value) { if (value == null) { return false; } if (isFunction(value)) { return reIsNative.test(fnToString.call(value)); } return isObjectLike(value) && reIsHostCtor.test(value); } module.exports = isArray; },{}],63:[function(require,module,exports){ /** * lodash 3.1.2 (Custom Build) * Build: `lodash modern modularize exports="npm" -o ./` * Copyright 2012-2015 The Dojo Foundation * Based on Underscore.js 1.8.3 * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license */ var getNative = require('lodash._getnative'), isArguments = require('lodash.isarguments'), isArray = require('lodash.isarray'); /** Used to detect unsigned integer values. */ var reIsUint = /^\d+$/; /** Used for native method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /* Native method references for those with the same name as other `lodash` methods. */ var nativeKeys = getNative(Object, 'keys'); /** * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) * of an array-like value. */ var MAX_SAFE_INTEGER = 9007199254740991; /** * The base implementation of `_.property` without support for deep paths. * * @private * @param {string} key The key of the property to get. * @returns {Function} Returns the new function. */ function baseProperty(key) { return function(object) { return object == null ? undefined : object[key]; }; } /** * Gets the "length" property value of `object`. * * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) * that affects Safari on at least iOS 8.1-8.3 ARM64. * * @private * @param {Object} object The object to query. * @returns {*} Returns the "length" value. */ var getLength = baseProperty('length'); /** * Checks if `value` is array-like. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. */ function isArrayLike(value) { return value != null && isLength(getLength(value)); } /** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */ function isIndex(value, length) { value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; length = length == null ? MAX_SAFE_INTEGER : length; return value > -1 && value % 1 == 0 && value < length; } /** * Checks if `value` is a valid array-like length. * * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. */ function isLength(value) { return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } /** * A fallback implementation of `Object.keys` which creates an array of the * own enumerable property names of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function shimKeys(object) { var props = keysIn(object), propsLength = props.length, length = propsLength && object.length; var allowIndexes = !!length && isLength(length) && (isArray(object) || isArguments(object)); var index = -1, result = []; while (++index < propsLength) { var key = props[index]; if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { result.push(key); } } return result; } /** * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(1); * // => false */ function isObject(value) { // Avoid a V8 JIT bug in Chrome 19-20. // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. var type = typeof value; return !!value && (type == 'object' || type == 'function'); } /** * Creates an array of the own enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. See the * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) * for more details. * * @static * @memberOf _ * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.keys(new Foo); * // => ['a', 'b'] (iteration order is not guaranteed) * * _.keys('hi'); * // => ['0', '1'] */ var keys = !nativeKeys ? shimKeys : function(object) { var Ctor = object == null ? undefined : object.constructor; if ((typeof Ctor == 'function' && Ctor.prototype === object) || (typeof object != 'function' && isArrayLike(object))) { return shimKeys(object); } return isObject(object) ? nativeKeys(object) : []; }; /** * Creates an array of the own and inherited enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. * * @static * @memberOf _ * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.keysIn(new Foo); * // => ['a', 'b', 'c'] (iteration order is not guaranteed) */ function keysIn(object) { if (object == null) { return []; } if (!isObject(object)) { object = Object(object); } var length = object.length; length = (length && isLength(length) && (isArray(object) || isArguments(object)) && length) || 0; var Ctor = object.constructor, index = -1, isProto = typeof Ctor == 'function' && Ctor.prototype === object, result = Array(length), skipIndexes = length > 0; while (++index < length) { result[index] = (index + ''); } for (var key in object) { if (!(skipIndexes && isIndex(key, length)) && !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { result.push(key); } } return result; } module.exports = keys; },{"lodash._getnative":58,"lodash.isarguments":61,"lodash.isarray":62}],64:[function(require,module,exports){ (function (process){ var path = require('path'); var fs = require('fs'); var _0777 = parseInt('0777', 8); module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; function mkdirP (p, opts, f, made) { if (typeof opts === 'function') { f = opts; opts = {}; } else if (!opts || typeof opts !== 'object') { opts = { mode: opts }; } var mode = opts.mode; var xfs = opts.fs || fs; if (mode === undefined) { mode = _0777 & (~process.umask()); } if (!made) made = null; var cb = f || function () {}; p = path.resolve(p); xfs.mkdir(p, mode, function (er) { if (!er) { made = made || p; return cb(null, made); } switch (er.code) { case 'ENOENT': mkdirP(path.dirname(p), opts, function (er, made) { if (er) cb(er, made); else mkdirP(p, opts, cb, made); }); break; // In the case of any other error, just see if there's a dir // there already. If so, then hooray! If not, then something // is borked. default: xfs.stat(p, function (er2, stat) { // if the stat fails, then that's super weird. // let the original error be the failure reason. if (er2 || !stat.isDirectory()) cb(er, made) else cb(null, made); }); break; } }); } mkdirP.sync = function sync (p, opts, made) { if (!opts || typeof opts !== 'object') { opts = { mode: opts }; } var mode = opts.mode; var xfs = opts.fs || fs; if (mode === undefined) { mode = _0777 & (~process.umask()); } if (!made) made = null; p = path.resolve(p); try { xfs.mkdirSync(p, mode); made = made || p; } catch (err0) { switch (err0.code) { case 'ENOENT' : made = sync(path.dirname(p), opts, made); sync(p, opts, made); break; // In the case of any other error, just see if there's a dir // there already. If so, then hooray! If not, then something // is borked. default: var stat; try { stat = xfs.statSync(p); } catch (err1) { throw err0; } if (!stat.isDirectory()) throw err0; break; } } return made; }; }).call(this,require('_process')) },{"_process":67,"fs":42,"path":42}],65:[function(require,module,exports){ exports.endianness = function () { return 'LE' }; exports.hostname = function () { if (typeof location !== 'undefined') { return location.hostname } else return ''; }; exports.loadavg = function () { return [] }; exports.uptime = function () { return 0 }; exports.freemem = function () { return Number.MAX_VALUE; }; exports.totalmem = function () { return Number.MAX_VALUE; }; exports.cpus = function () { return [] }; exports.type = function () { return 'Browser' }; exports.release = function () { if (typeof navigator !== 'undefined') { return navigator.appVersion; } return ''; }; exports.networkInterfaces = exports.getNetworkInterfaces = function () { return {} }; exports.arch = function () { return 'javascript' }; exports.platform = function () { return 'browser' }; exports.tmpdir = exports.tmpDir = function () { return '/tmp'; }; exports.EOL = '\n'; },{}],66:[function(require,module,exports){ (function (process){ 'use strict'; if (!process.version || process.version.indexOf('v0.') === 0 || process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { module.exports = nextTick; } else { module.exports = process.nextTick; } function nextTick(fn, arg1, arg2, arg3) { if (typeof fn !== 'function') { throw new TypeError('"callback" argument must be a function'); } var len = arguments.length; var args, i; switch (len) { case 0: case 1: return process.nextTick(fn); case 2: return process.nextTick(function afterTickOne() { fn.call(null, arg1); }); case 3: return process.nextTick(function afterTickTwo() { fn.call(null, arg1, arg2); }); case 4: return process.nextTick(function afterTickThree() { fn.call(null, arg1, arg2, arg3); }); default: args = new Array(len - 1); i = 0; while (i < args.length) { args[i++] = arguments[i]; } return process.nextTick(function afterTick() { fn.apply(null, args); }); } } }).call(this,require('_process')) },{"_process":67}],67:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it // don't break things. But we need to wrap it in a try catch in case it is // wrapped in strict mode code which doesn't define any globals. It's inside a // function because try/catches deoptimize in certain engines. var cachedSetTimeout; var cachedClearTimeout; function defaultSetTimout() { throw new Error('setTimeout has not been defined'); } function defaultClearTimeout () { throw new Error('clearTimeout has not been defined'); } (function () { try { if (typeof setTimeout === 'function') { cachedSetTimeout = setTimeout; } else { cachedSetTimeout = defaultSetTimout; } } catch (e) { cachedSetTimeout = defaultSetTimout; } try { if (typeof clearTimeout === 'function') { cachedClearTimeout = clearTimeout; } else { cachedClearTimeout = defaultClearTimeout; } } catch (e) { cachedClearTimeout = defaultClearTimeout; } } ()) function runTimeout(fun) { if (cachedSetTimeout === setTimeout) { //normal enviroments in sane situations return setTimeout(fun, 0); } // if setTimeout wasn't available but was latter defined if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { cachedSetTimeout = setTimeout; return setTimeout(fun, 0); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedSetTimeout(fun, 0); } catch(e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedSetTimeout.call(null, fun, 0); } catch(e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) { //normal enviroments in sane situations return clearTimeout(marker); } // if clearTimeout wasn't available but was latter defined if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { cachedClearTimeout = clearTimeout; return clearTimeout(marker); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedClearTimeout(marker); } catch (e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedClearTimeout.call(null, marker); } catch (e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. // Some versions of I.E. have different rules for clearTimeout vs setTimeout return cachedClearTimeout.call(this, marker); } } } var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; while(len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; runClearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; },{}],68:[function(require,module,exports){ module.exports = require("./lib/_stream_duplex.js") },{"./lib/_stream_duplex.js":69}],69:[function(require,module,exports){ // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. 'use strict'; /**/ var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) { keys.push(key); }return keys; }; /**/ module.exports = Duplex; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ var Readable = require('./_stream_readable'); var Writable = require('./_stream_writable'); util.inherits(Duplex, Readable); var keys = objectKeys(Writable.prototype); for (var v = 0; v < keys.length; v++) { var method = keys[v]; if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; } function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); Readable.call(this, options); Writable.call(this, options); if (options && options.readable === false) this.readable = false; if (options && options.writable === false) this.writable = false; this.allowHalfOpen = true; if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; this.once('end', onend); } // the no-half-open enforcer function onend() { // if we allow half-open state, or if the writable side ended, // then we're ok. if (this.allowHalfOpen || this._writableState.ended) return; // no more data can be written. // But allow more writes to happen in this tick. processNextTick(onEndNT, this); } function onEndNT(self) { self.end(); } function forEach(xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } },{"./_stream_readable":71,"./_stream_writable":73,"core-util-is":45,"inherits":51,"process-nextick-args":66}],70:[function(require,module,exports){ // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. 'use strict'; module.exports = PassThrough; var Transform = require('./_stream_transform'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ util.inherits(PassThrough, Transform); function PassThrough(options) { if (!(this instanceof PassThrough)) return new PassThrough(options); Transform.call(this, options); } PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; },{"./_stream_transform":72,"core-util-is":45,"inherits":51}],71:[function(require,module,exports){ (function (process){ 'use strict'; module.exports = Readable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var isArray = require('isarray'); /**/ Readable.ReadableState = ReadableState; /**/ var EE = require('events').EventEmitter; var EElistenerCount = function (emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ var Stream; (function () { try { Stream = require('st' + 'ream'); } catch (_) {} finally { if (!Stream) Stream = require('events').EventEmitter; } })(); /**/ var Buffer = require('buffer').Buffer; /**/ var bufferShim = require('buffer-shims'); /**/ /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var debugUtil = require('util'); var debug = void 0; if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { debug = function () {}; } /**/ var BufferList = require('./internal/streams/BufferList'); var StringDecoder; util.inherits(Readable, Stream); function prependListener(emitter, event, fn) { if (typeof emitter.prependListener === 'function') { return emitter.prependListener(event, fn); } else { // This is a hack to make sure that our error handler is attached before any // userland ones. NEVER DO THIS. This is here only because this code needs // to continue to work with older versions of Node.js that do not include // the prependListener() method. The goal is to eventually remove this hack. if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; } } var Duplex; function ReadableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~ ~this.highWaterMark; // A linked list is used to store data chunks instead of an array because the // linked list can remove elements from the beginning faster than // array.shift() this.buffer = new BufferList(); this.length = 0; this.pipes = null; this.pipesCount = 0; this.flowing = null; this.ended = false; this.endEmitted = false; this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. this.needReadable = false; this.emittedReadable = false; this.readableListening = false; this.resumeScheduled = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen // after read()ing all the bytes and not getting any pushback. this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled this.readingMore = false; this.decoder = null; this.encoding = null; if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } var Duplex; function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); if (!(this instanceof Readable)) return new Readable(options); this._readableState = new ReadableState(options, this); // legacy this.readable = true; if (options && typeof options.read === 'function') this._read = options.read; Stream.call(this); } // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function (chunk, encoding) { var state = this._readableState; if (!state.objectMode && typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; if (encoding !== state.encoding) { chunk = bufferShim.from(chunk, encoding); encoding = ''; } } return readableAddChunk(this, state, chunk, encoding, false); }; // Unshift should *always* be something directly out of read() Readable.prototype.unshift = function (chunk) { var state = this._readableState; return readableAddChunk(this, state, chunk, '', true); }; Readable.prototype.isPaused = function () { return this._readableState.flowing === false; }; function readableAddChunk(stream, state, chunk, encoding, addToFront) { var er = chunkInvalid(state, chunk); if (er) { stream.emit('error', er); } else if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else if (state.objectMode || chunk && chunk.length > 0) { if (state.ended && !addToFront) { var e = new Error('stream.push() after EOF'); stream.emit('error', e); } else if (state.endEmitted && addToFront) { var _e = new Error('stream.unshift() after end event'); stream.emit('error', _e); } else { var skipAdd; if (state.decoder && !addToFront && !encoding) { chunk = state.decoder.write(chunk); skipAdd = !state.objectMode && chunk.length === 0; } if (!addToFront) state.reading = false; // Don't add to the buffer if we've decoded to an empty string chunk and // we're not in object mode if (!skipAdd) { // if we want the data now, just emit it. if (state.flowing && state.length === 0 && !state.sync) { stream.emit('data', chunk); stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); if (state.needReadable) emitReadable(stream); } } maybeReadMore(stream, state); } } else if (!addToFront) { state.reading = false; } return needMoreData(state); } // if it's past the high water mark, we can push in some more. // Also, if we have no data yet, we can stand some // more bytes. This is to work around cases where hwm=0, // such as the repl. Also, if the push() triggered a // readable event, and the user called read(largeNumber) such that // needReadable was set, then we ought to push more, so that another // 'readable' event will be triggered. function needMoreData(state) { return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); } // backwards compatibility. Readable.prototype.setEncoding = function (enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; }; // Don't raise the hwm > 8MB var MAX_HWM = 0x800000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { n = MAX_HWM; } else { // Get the next highest power of 2 to prevent increasing hwm excessively in // tiny amounts n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; n++; } return n; } // This function is designed to be inlinable, so please take care when making // changes to the function body. function howMuchToRead(n, state) { if (n <= 0 || state.length === 0 && state.ended) return 0; if (state.objectMode) return 1; if (n !== n) { // Only flow one buffer at a time if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; } // If we're asking for more than the current hwm, then raise the hwm. if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); if (n <= state.length) return n; // Don't have enough if (!state.ended) { state.needReadable = true; return 0; } return state.length; } // you can override either this method, or the async _read(n) below. Readable.prototype.read = function (n) { debug('read', n); n = parseInt(n, 10); var state = this._readableState; var nOrig = n; if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); return null; } n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change // the state of the read buffer, providing enough data when // before there was *not* enough. // // So, the steps are: // 1. Figure out what the state of things will be after we do // a read from the buffer. // // 2. If that resulting state will trigger a _read, then call _read. // Note that this may be asynchronous, or synchronous. Yes, it is // deeply ugly to write APIs this way, but that still doesn't mean // that the Readable class should behave improperly, as streams are // designed to be sync/async agnostic. // Take note if the _read call is sync or async (ie, if the read call // has returned yet), so that we know whether or not it's safe to emit // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. // if we need a readable event, then we need to do some reading. var doRead = state.needReadable; debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } else if (doRead) { debug('do read'); state.reading = true; state.sync = true; // if the length is currently zero, then we *need* a readable event. if (state.length === 0) state.needReadable = true; // call internal read method this._read(state.highWaterMark); state.sync = false; // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. if (!state.reading) n = howMuchToRead(nOrig, state); } var ret; if (n > 0) ret = fromList(n, state);else ret = null; if (ret === null) { state.needReadable = true; n = 0; } else { state.length -= n; } if (state.length === 0) { // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended) endReadable(this); } if (ret !== null) this.emit('data', ret); return ret; }; function chunkInvalid(state, chunk) { var er = null; if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } return er; } function onEofChunk(stream, state) { if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } state.ended = true; // emit 'readable' now to make sure it gets picked up. emitReadable(stream); } // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); } } function emitReadable_(stream) { debug('emit readable'); stream.emit('readable'); flow(stream); } // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; processNextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { var len = state.length; while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { debug('maybeReadMore read 0'); stream.read(0); if (len === state.length) // didn't get any data, stop spinning. break;else len = state.length; } state.readingMore = false; } // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= n in length. // for virtual (non-string, non-buffer) streams, "length" is somewhat // arbitrary, and perhaps not very meaningful. Readable.prototype._read = function (n) { this.emit('error', new Error('not implemented')); }; Readable.prototype.pipe = function (dest, pipeOpts) { var src = this; var state = this._readableState; switch (state.pipesCount) { case 0: state.pipes = dest; break; case 1: state.pipes = [state.pipes, dest]; break; default: state.pipes.push(dest); break; } state.pipesCount += 1; debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; var endFn = doEnd ? onend : cleanup; if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); dest.on('unpipe', onunpipe); function onunpipe(readable) { debug('onunpipe'); if (readable === src) { cleanup(); } } function onend() { debug('onend'); dest.end(); } // when the dest drains, it reduces the awaitDrain counter // on the source. This would be more elegant with a .once() // handler in flow(), but adding and removing repeatedly is // too slow. var ondrain = pipeOnDrain(src); dest.on('drain', ondrain); var cleanedUp = false; function cleanup() { debug('cleanup'); // cleanup event handlers once the pipe is broken dest.removeListener('close', onclose); dest.removeListener('finish', onfinish); dest.removeListener('drain', ondrain); dest.removeListener('error', onerror); dest.removeListener('unpipe', onunpipe); src.removeListener('end', onend); src.removeListener('end', cleanup); src.removeListener('data', ondata); cleanedUp = true; // if the reader is waiting for a drain event from this // specific writer, then it would cause it to never start // flowing again. // So, if this is awaiting a drain, then we just call it now. // If we don't know, then assume that we are waiting for one. if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); } // If the user pushes more data while we're writing to dest then we'll end up // in ondata again. However, we only want to increase awaitDrain once because // dest will only emit one 'drain' event for the multiple writes. // => Introduce a guard on increasing awaitDrain. var increasedAwaitDrain = false; src.on('data', ondata); function ondata(chunk) { debug('ondata'); increasedAwaitDrain = false; var ret = dest.write(chunk); if (false === ret && !increasedAwaitDrain) { // If the user unpiped during `dest.write()`, it is possible // to get stuck in a permanently paused state if that write // also returned false. // => Check whether `dest` is still a piping destination. if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { debug('false write response, pause', src._readableState.awaitDrain); src._readableState.awaitDrain++; increasedAwaitDrain = true; } src.pause(); } } // if the dest has an error, then stop piping into it. // however, don't suppress the throwing behavior for this. function onerror(er) { debug('onerror', er); unpipe(); dest.removeListener('error', onerror); if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); } // Make sure our error handler is attached before userland ones. prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. function onclose() { dest.removeListener('finish', onfinish); unpipe(); } dest.once('close', onclose); function onfinish() { debug('onfinish'); dest.removeListener('close', onclose); unpipe(); } dest.once('finish', onfinish); function unpipe() { debug('unpipe'); src.unpipe(dest); } // tell the dest that it's being piped to dest.emit('pipe', src); // start the flow if it hasn't been started already. if (!state.flowing) { debug('pipe resume'); src.resume(); } return dest; }; function pipeOnDrain(src) { return function () { var state = src._readableState; debug('pipeOnDrain', state.awaitDrain); if (state.awaitDrain) state.awaitDrain--; if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { state.flowing = true; flow(src); } }; } Readable.prototype.unpipe = function (dest) { var state = this._readableState; // if we're not piping anywhere, then do nothing. if (state.pipesCount === 0) return this; // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. if (dest && dest !== state.pipes) return this; if (!dest) dest = state.pipes; // got a match. state.pipes = null; state.pipesCount = 0; state.flowing = false; if (dest) dest.emit('unpipe', this); return this; } // slow case. multiple pipe destinations. if (!dest) { // remove all. var dests = state.pipes; var len = state.pipesCount; state.pipes = null; state.pipesCount = 0; state.flowing = false; for (var _i = 0; _i < len; _i++) { dests[_i].emit('unpipe', this); }return this; } // try to find the right one. var i = indexOf(state.pipes, dest); if (i === -1) return this; state.pipes.splice(i, 1); state.pipesCount -= 1; if (state.pipesCount === 1) state.pipes = state.pipes[0]; dest.emit('unpipe', this); return this; }; // set up data events if they are asked for // Ensure readable listeners eventually get something Readable.prototype.on = function (ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); if (ev === 'data') { // Start flowing on next tick if stream isn't explicitly paused if (this._readableState.flowing !== false) this.resume(); } else if (ev === 'readable') { var state = this._readableState; if (!state.endEmitted && !state.readableListening) { state.readableListening = state.needReadable = true; state.emittedReadable = false; if (!state.reading) { processNextTick(nReadingNextTick, this); } else if (state.length) { emitReadable(this, state); } } } return res; }; Readable.prototype.addListener = Readable.prototype.on; function nReadingNextTick(self) { debug('readable nexttick read 0'); self.read(0); } // pause() and resume() are remnants of the legacy readable stream API // If the user uses them, then switch into old mode. Readable.prototype.resume = function () { var state = this._readableState; if (!state.flowing) { debug('resume'); state.flowing = true; resume(this, state); } return this; }; function resume(stream, state) { if (!state.resumeScheduled) { state.resumeScheduled = true; processNextTick(resume_, stream, state); } } function resume_(stream, state) { if (!state.reading) { debug('resume read 0'); stream.read(0); } state.resumeScheduled = false; state.awaitDrain = 0; stream.emit('resume'); flow(stream); if (state.flowing && !state.reading) stream.read(0); } Readable.prototype.pause = function () { debug('call pause flowing=%j', this._readableState.flowing); if (false !== this._readableState.flowing) { debug('pause'); this._readableState.flowing = false; this.emit('pause'); } return this; }; function flow(stream) { var state = stream._readableState; debug('flow', state.flowing); while (state.flowing && stream.read() !== null) {} } // wrap an old-style stream as the async data source. // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. Readable.prototype.wrap = function (stream) { var state = this._readableState; var paused = false; var self = this; stream.on('end', function () { debug('wrapped end'); if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) self.push(chunk); } self.push(null); }); stream.on('data', function (chunk) { debug('wrapped data'); if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; var ret = self.push(chunk); if (!ret) { paused = true; stream.pause(); } }); // proxy all the other methods. // important when wrapping filters and duplexes. for (var i in stream) { if (this[i] === undefined && typeof stream[i] === 'function') { this[i] = function (method) { return function () { return stream[method].apply(stream, arguments); }; }(i); } } // proxy certain important events. var events = ['error', 'close', 'destroy', 'pause', 'resume']; forEach(events, function (ev) { stream.on(ev, self.emit.bind(self, ev)); }); // when we try to consume some more bytes, simply unpause the // underlying stream. self._read = function (n) { debug('wrapped _read', n); if (paused) { paused = false; stream.resume(); } }; return self; }; // exposed for testing purposes only. Readable._fromList = fromList; // Pluck off n bytes from an array of buffers. // Length is the combined lengths of all the buffers in the list. // This function is designed to be inlinable, so please take care when making // changes to the function body. function fromList(n, state) { // nothing buffered if (state.length === 0) return null; var ret; if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { // read it all, truncate the list if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); state.buffer.clear(); } else { // read part of list ret = fromListPartial(n, state.buffer, state.decoder); } return ret; } // Extracts only enough buffered data to satisfy the amount requested. // This function is designed to be inlinable, so please take care when making // changes to the function body. function fromListPartial(n, list, hasStrings) { var ret; if (n < list.head.data.length) { // slice is the same for buffers and strings ret = list.head.data.slice(0, n); list.head.data = list.head.data.slice(n); } else if (n === list.head.data.length) { // first chunk is a perfect match ret = list.shift(); } else { // result spans more than one buffer ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); } return ret; } // Copies a specified amount of characters from the list of buffered data // chunks. // This function is designed to be inlinable, so please take care when making // changes to the function body. function copyFromBufferString(n, list) { var p = list.head; var c = 1; var ret = p.data; n -= ret.length; while (p = p.next) { var str = p.data; var nb = n > str.length ? str.length : n; if (nb === str.length) ret += str;else ret += str.slice(0, n); n -= nb; if (n === 0) { if (nb === str.length) { ++c; if (p.next) list.head = p.next;else list.head = list.tail = null; } else { list.head = p; p.data = str.slice(nb); } break; } ++c; } list.length -= c; return ret; } // Copies a specified amount of bytes from the list of buffered data chunks. // This function is designed to be inlinable, so please take care when making // changes to the function body. function copyFromBuffer(n, list) { var ret = bufferShim.allocUnsafe(n); var p = list.head; var c = 1; p.data.copy(ret); n -= p.data.length; while (p = p.next) { var buf = p.data; var nb = n > buf.length ? buf.length : n; buf.copy(ret, ret.length - n, 0, nb); n -= nb; if (n === 0) { if (nb === buf.length) { ++c; if (p.next) list.head = p.next;else list.head = list.tail = null; } else { list.head = p; p.data = buf.slice(nb); } break; } ++c; } list.length -= c; return ret; } function endReadable(stream) { var state = stream._readableState; // If we get here before consuming all the bytes, then that is a // bug in node. Should never happen. if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); if (!state.endEmitted) { state.ended = true; processNextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { // Check that we didn't get one last unshift. if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); } } function forEach(xs, f) { for (var i = 0, l = xs.length; i < l; i++) { f(xs[i], i); } } function indexOf(xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } return -1; } }).call(this,require('_process')) },{"./_stream_duplex":69,"./internal/streams/BufferList":74,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"isarray":53,"process-nextick-args":66,"string_decoder/":80,"util":40}],72:[function(require,module,exports){ // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where // some bits pass through, and others are simply ignored. (That would // be a valid example of a transform, of course.) // // While the output is causally related to the input, it's not a // necessarily symmetric or synchronous transformation. For example, // a zlib stream might take multiple plain-text writes(), and then // emit a single compressed chunk some time in the future. // // Here's how this works: // // The Transform stream has all the aspects of the readable and writable // stream classes. When you write(chunk), that calls _write(chunk,cb) // internally, and returns false if there's a lot of pending writes // buffered up. When you call read(), that calls _read(n) until // there's enough pending readable data buffered up. // // In a transform stream, the written data is placed in a buffer. When // _read(n) is called, it transforms the queued up data, calling the // buffered _write cb's as it consumes chunks. If consuming a single // written chunk would result in multiple output chunks, then the first // outputted bit calls the readcb, and subsequent chunks just go into // the read buffer, and will cause it to emit 'readable' if necessary. // // This way, back-pressure is actually determined by the reading side, // since _read has to be called to start processing a new chunk. However, // a pathological inflate type of transform can cause excessive buffering // here. For example, imagine a stream where every byte of input is // interpreted as an integer from 0-255, and then results in that many // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in // 1kb of data being output. In this case, you could write a very small // amount of input, and end up with a very large amount of output. In // such a pathological inflating mechanism, there'd be no way to tell // the system to stop doing the transform. A single 4MB write could // cause the system to run out of memory. // // However, even in such a pathological case, only a single written chunk // would be consumed, and then the rest would wait (un-transformed) until // the results of the previous transformed chunk were consumed. 'use strict'; module.exports = Transform; var Duplex = require('./_stream_duplex'); /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ util.inherits(Transform, Duplex); function TransformState(stream) { this.afterTransform = function (er, data) { return afterTransform(stream, er, data); }; this.needTransform = false; this.transforming = false; this.writecb = null; this.writechunk = null; this.writeencoding = null; } function afterTransform(stream, er, data) { var ts = stream._transformState; ts.transforming = false; var cb = ts.writecb; if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); ts.writechunk = null; ts.writecb = null; if (data !== null && data !== undefined) stream.push(data); cb(er); var rs = stream._readableState; rs.reading = false; if (rs.needReadable || rs.length < rs.highWaterMark) { stream._read(rs.highWaterMark); } } function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); Duplex.call(this, options); this._transformState = new TransformState(this); // when the writable side finishes, then flush out anything remaining. var stream = this; // start out asking for a readable event once data is transformed. this._readableState.needReadable = true; // we have implemented the _read method, and done the other things // that Readable wants before the first _read call, so unset the // sync guard flag. this._readableState.sync = false; if (options) { if (typeof options.transform === 'function') this._transform = options.transform; if (typeof options.flush === 'function') this._flush = options.flush; } this.once('prefinish', function () { if (typeof this._flush === 'function') this._flush(function (er) { done(stream, er); });else done(stream); }); } Transform.prototype.push = function (chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); }; // This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // // Call `push(newChunk)` to pass along transformed output // to the readable side. You may call 'push' zero or more times. // // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. Transform.prototype._transform = function (chunk, encoding, cb) { throw new Error('Not implemented'); }; Transform.prototype._write = function (chunk, encoding, cb) { var ts = this._transformState; ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } }; // Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. Transform.prototype._read = function (n) { var ts = this._transformState; if (ts.writechunk !== null && ts.writecb && !ts.transforming) { ts.transforming = true; this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in // will get processed, now that we've asked for it. ts.needTransform = true; } }; function done(stream, er) { if (er) return stream.emit('error', er); // if there's nothing in the write buffer, then that means // that nothing more will ever be provided var ws = stream._writableState; var ts = stream._transformState; if (ws.length) throw new Error('Calling transform done when ws.length != 0'); if (ts.transforming) throw new Error('Calling transform done when still transforming'); return stream.push(null); } },{"./_stream_duplex":69,"core-util-is":45,"inherits":51}],73:[function(require,module,exports){ (function (process){ // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all // the drain event emission and buffering. 'use strict'; module.exports = Writable; /**/ var processNextTick = require('process-nextick-args'); /**/ /**/ var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; /**/ Writable.WritableState = WritableState; /**/ var util = require('core-util-is'); util.inherits = require('inherits'); /**/ /**/ var internalUtil = { deprecate: require('util-deprecate') }; /**/ /**/ var Stream; (function () { try { Stream = require('st' + 'ream'); } catch (_) {} finally { if (!Stream) Stream = require('events').EventEmitter; } })(); /**/ var Buffer = require('buffer').Buffer; /**/ var bufferShim = require('buffer-shims'); /**/ util.inherits(Writable, Stream); function nop() {} function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; this.next = null; } var Duplex; function WritableState(options, stream) { Duplex = Duplex || require('./_stream_duplex'); options = options || {}; // object stream flag to indicate whether or not this stream // contains buffers or objects. this.objectMode = !!options.objectMode; if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() var hwm = options.highWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints. this.highWaterMark = ~ ~this.highWaterMark; this.needDrain = false; // at the start of calling end() this.ending = false; // when end() has been called, and returned this.ended = false; // when 'finish' is emitted this.finished = false; // should we decode strings into buffers before passing to _write? // this is here so that some node-core streams can optimize string // handling at a lower level. var noDecode = options.decodeStrings === false; this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement // of how much we're waiting to get pushed to some underlying // socket or file. this.length = 0; // a flag to see when we're in the middle of a write. this.writing = false; // when true all writes will be buffered until .uncork() call this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. this.sync = true; // a flag to know if we're processing previously buffered items, which // may call the _write() callback in the same tick, so that we don't // end up in an overlapped onwrite situation. this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) this.onwrite = function (er) { onwrite(stream, er); }; // the callback that the user supplies to write(chunk,encoding,cb) this.writecb = null; // the amount that is being written when _write is called. this.writelen = 0; this.bufferedRequest = null; this.lastBufferedRequest = null; // number of pending user-supplied write callbacks // this must be 0 before 'finish' can be emitted this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs // This is relevant for synchronous Transform streams this.prefinished = false; // True if the error was already emitted and should not be thrown again this.errorEmitted = false; // count buffered requests this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always // one allocated and free to use, and we maintain at most two this.corkedRequestsFree = new CorkedRequest(this); } WritableState.prototype.getBuffer = function writableStateGetBuffer() { var current = this.bufferedRequest; var out = []; while (current) { out.push(current); current = current.next; } return out; }; (function () { try { Object.defineProperty(WritableState.prototype, 'buffer', { get: internalUtil.deprecate(function () { return this.getBuffer(); }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') }); } catch (_) {} })(); var Duplex; function Writable(options) { Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, though they're not // instanceof Writable, they're instanceof Readable. if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); this._writableState = new WritableState(options, this); // legacy. this.writable = true; if (options) { if (typeof options.write === 'function') this._write = options.write; if (typeof options.writev === 'function') this._writev = options.writev; } Stream.call(this); } // Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function () { this.emit('error', new Error('Cannot pipe, not readable')); }; function writeAfterEnd(stream, cb) { var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb stream.emit('error', er); processNextTick(cb, er); } // If we get something that is not a buffer, string, null, or undefined, // and we're not in objectMode, then that's an error. // Otherwise stream chunks are all considered to be of length=1, and the // watermarks determine how many objects to keep in the buffer, rather than // how many bytes or characters. function validChunk(stream, state, chunk, cb) { var valid = true; var er = false; // Always throw error if a null is written // if we are not in object mode then throw // if it is not a buffer, string, or undefined. if (chunk === null) { er = new TypeError('May not write null values to stream'); } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { er = new TypeError('Invalid non-string/buffer chunk'); } if (er) { stream.emit('error', er); processNextTick(cb, er); valid = false; } return valid; } Writable.prototype.write = function (chunk, encoding, cb) { var state = this._writableState; var ret = false; if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; if (typeof cb !== 'function') cb = nop; if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { state.pendingcb++; ret = writeOrBuffer(this, state, chunk, encoding, cb); } return ret; }; Writable.prototype.cork = function () { var state = this._writableState; state.corked++; }; Writable.prototype.uncork = function () { var state = this._writableState; if (state.corked) { state.corked--; if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); } }; Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { // node::ParseEncoding() requires lower case. if (typeof encoding === 'string') encoding = encoding.toLowerCase(); if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); this._writableState.defaultEncoding = encoding; return this; }; function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { chunk = bufferShim.from(chunk, encoding); } return chunk; } // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. function writeOrBuffer(stream, state, chunk, encoding, cb) { chunk = decodeChunk(state, chunk, encoding); if (Buffer.isBuffer(chunk)) encoding = 'buffer'; var len = state.objectMode ? 1 : chunk.length; state.length += len; var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. if (!ret) state.needDrain = true; if (state.writing || state.corked) { var last = state.lastBufferedRequest; state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); if (last) { last.next = state.lastBufferedRequest; } else { state.bufferedRequest = state.lastBufferedRequest; } state.bufferedRequestCount += 1; } else { doWrite(stream, state, false, len, chunk, encoding, cb); } return ret; } function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writelen = len; state.writecb = cb; state.writing = true; state.sync = true; if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); state.sync = false; } function onwriteError(stream, state, sync, er, cb) { --state.pendingcb; if (sync) processNextTick(cb, er);else cb(er); stream._writableState.errorEmitted = true; stream.emit('error', er); } function onwriteStateUpdate(state) { state.writing = false; state.writecb = null; state.length -= state.writelen; state.writelen = 0; } function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; var cb = state.writecb; onwriteStateUpdate(state); if (er) onwriteError(stream, state, sync, er, cb);else { // Check if we're actually ready to finish, but don't emit yet var finished = needFinish(state); if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { clearBuffer(stream, state); } if (sync) { /**/ asyncWrite(afterWrite, stream, state, finished, cb); /**/ } else { afterWrite(stream, state, finished, cb); } } } function afterWrite(stream, state, finished, cb) { if (!finished) onwriteDrain(stream, state); state.pendingcb--; cb(); finishMaybe(stream, state); } // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } } // if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; var entry = state.bufferedRequest; if (stream._writev && entry && entry.next) { // Fast case, write everything using _writev() var l = state.bufferedRequestCount; var buffer = new Array(l); var holder = state.corkedRequestsFree; holder.entry = entry; var count = 0; while (entry) { buffer[count] = entry; entry = entry.next; count += 1; } doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time // as the hot path ends with doWrite state.pendingcb++; state.lastBufferedRequest = null; if (holder.next) { state.corkedRequestsFree = holder.next; holder.next = null; } else { state.corkedRequestsFree = new CorkedRequest(state); } } else { // Slow case, write chunks one-by-one while (entry) { var chunk = entry.chunk; var encoding = entry.encoding; var cb = entry.callback; var len = state.objectMode ? 1 : chunk.length; doWrite(stream, state, false, len, chunk, encoding, cb); entry = entry.next; // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. if (state.writing) { break; } } if (entry === null) state.lastBufferedRequest = null; } state.bufferedRequestCount = 0; state.bufferedRequest = entry; state.bufferProcessing = false; } Writable.prototype._write = function (chunk, encoding, cb) { cb(new Error('not implemented')); }; Writable.prototype._writev = null; Writable.prototype.end = function (chunk, encoding, cb) { var state = this._writableState; if (typeof chunk === 'function') { cb = chunk; chunk = null; encoding = null; } else if (typeof encoding === 'function') { cb = encoding; encoding = null; } if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks if (state.corked) { state.corked = 1; this.uncork(); } // ignore unnecessary end() calls. if (!state.ending && !state.finished) endWritable(this, state, cb); }; function needFinish(state) { return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; } function prefinish(stream, state) { if (!state.prefinished) { state.prefinished = true; stream.emit('prefinish'); } } function finishMaybe(stream, state) { var need = needFinish(state); if (need) { if (state.pendingcb === 0) { prefinish(stream, state); state.finished = true; stream.emit('finish'); } else { prefinish(stream, state); } } return need; } function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { if (state.finished) processNextTick(cb);else stream.once('finish', cb); } state.ended = true; stream.writable = false; } // It seems a linked list but it is not // there will be only 2 of these for each stream function CorkedRequest(state) { var _this = this; this.next = null; this.entry = null; this.finish = function (err) { var entry = _this.entry; _this.entry = null; while (entry) { var cb = entry.callback; state.pendingcb--; cb(err); entry = entry.next; } if (state.corkedRequestsFree) { state.corkedRequestsFree.next = _this; } else { state.corkedRequestsFree = _this; } }; } }).call(this,require('_process')) },{"./_stream_duplex":69,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"process-nextick-args":66,"util-deprecate":81}],74:[function(require,module,exports){ 'use strict'; var Buffer = require('buffer').Buffer; /**/ var bufferShim = require('buffer-shims'); /**/ module.exports = BufferList; function BufferList() { this.head = null; this.tail = null; this.length = 0; } BufferList.prototype.push = function (v) { var entry = { data: v, next: null }; if (this.length > 0) this.tail.next = entry;else this.head = entry; this.tail = entry; ++this.length; }; BufferList.prototype.unshift = function (v) { var entry = { data: v, next: this.head }; if (this.length === 0) this.tail = entry; this.head = entry; ++this.length; }; BufferList.prototype.shift = function () { if (this.length === 0) return; var ret = this.head.data; if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; --this.length; return ret; }; BufferList.prototype.clear = function () { this.head = this.tail = null; this.length = 0; }; BufferList.prototype.join = function (s) { if (this.length === 0) return ''; var p = this.head; var ret = '' + p.data; while (p = p.next) { ret += s + p.data; }return ret; }; BufferList.prototype.concat = function (n) { if (this.length === 0) return bufferShim.alloc(0); if (this.length === 1) return this.head.data; var ret = bufferShim.allocUnsafe(n >>> 0); var p = this.head; var i = 0; while (p) { p.data.copy(ret, i); i += p.data.length; p = p.next; } return ret; }; },{"buffer":44,"buffer-shims":43}],75:[function(require,module,exports){ module.exports = require("./lib/_stream_passthrough.js") },{"./lib/_stream_passthrough.js":70}],76:[function(require,module,exports){ (function (process){ var Stream = (function (){ try { return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify } catch(_){} }()); exports = module.exports = require('./lib/_stream_readable.js'); exports.Stream = Stream || exports; exports.Readable = exports; exports.Writable = require('./lib/_stream_writable.js'); exports.Duplex = require('./lib/_stream_duplex.js'); exports.Transform = require('./lib/_stream_transform.js'); exports.PassThrough = require('./lib/_stream_passthrough.js'); if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) { module.exports = Stream; } }).call(this,require('_process')) },{"./lib/_stream_duplex.js":69,"./lib/_stream_passthrough.js":70,"./lib/_stream_readable.js":71,"./lib/_stream_transform.js":72,"./lib/_stream_writable.js":73,"_process":67}],77:[function(require,module,exports){ module.exports = require("./lib/_stream_transform.js") },{"./lib/_stream_transform.js":72}],78:[function(require,module,exports){ module.exports = require("./lib/_stream_writable.js") },{"./lib/_stream_writable.js":73}],79:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. module.exports = Stream; var EE = require('events').EventEmitter; var inherits = require('inherits'); inherits(Stream, EE); Stream.Readable = require('readable-stream/readable.js'); Stream.Writable = require('readable-stream/writable.js'); Stream.Duplex = require('readable-stream/duplex.js'); Stream.Transform = require('readable-stream/transform.js'); Stream.PassThrough = require('readable-stream/passthrough.js'); // Backwards-compat with node 0.4.x Stream.Stream = Stream; // old-style streams. Note that the pipe method (the only relevant // part of this class) is overridden in the Readable class. function Stream() { EE.call(this); } Stream.prototype.pipe = function(dest, options) { var source = this; function ondata(chunk) { if (dest.writable) { if (false === dest.write(chunk) && source.pause) { source.pause(); } } } source.on('data', ondata); function ondrain() { if (source.readable && source.resume) { source.resume(); } } dest.on('drain', ondrain); // If the 'end' option is not supplied, dest.end() will be called when // source gets the 'end' or 'close' events. Only dest.end() once. if (!dest._isStdio && (!options || options.end !== false)) { source.on('end', onend); source.on('close', onclose); } var didOnEnd = false; function onend() { if (didOnEnd) return; didOnEnd = true; dest.end(); } function onclose() { if (didOnEnd) return; didOnEnd = true; if (typeof dest.destroy === 'function') dest.destroy(); } // don't leave dangling pipes when there are errors. function onerror(er) { cleanup(); if (EE.listenerCount(this, 'error') === 0) { throw er; // Unhandled stream error in pipe. } } source.on('error', onerror); dest.on('error', onerror); // remove all the event listeners that were added. function cleanup() { source.removeListener('data', ondata); dest.removeListener('drain', ondrain); source.removeListener('end', onend); source.removeListener('close', onclose); source.removeListener('error', onerror); dest.removeListener('error', onerror); source.removeListener('end', cleanup); source.removeListener('close', cleanup); dest.removeListener('close', cleanup); } source.on('end', cleanup); source.on('close', cleanup); dest.on('close', cleanup); dest.emit('pipe', source); // Allow for unix-like usage: A.pipe(B).pipe(C) return dest; }; },{"events":48,"inherits":51,"readable-stream/duplex.js":68,"readable-stream/passthrough.js":75,"readable-stream/readable.js":76,"readable-stream/transform.js":77,"readable-stream/writable.js":78}],80:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var Buffer = require('buffer').Buffer; var isBufferEncoding = Buffer.isEncoding || function(encoding) { switch (encoding && encoding.toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; default: return false; } } function assertEncoding(encoding) { if (encoding && !isBufferEncoding(encoding)) { throw new Error('Unknown encoding: ' + encoding); } } // StringDecoder provides an interface for efficiently splitting a series of // buffers into a series of JS strings without breaking apart multi-byte // characters. CESU-8 is handled as part of the UTF-8 encoding. // // @TODO Handling all encodings inside a single object makes it very difficult // to reason about this code, so it should be split up in the future. // @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code // points as used by CESU-8. var StringDecoder = exports.StringDecoder = function(encoding) { this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); assertEncoding(encoding); switch (this.encoding) { case 'utf8': // CESU-8 represents each of Surrogate Pair by 3-bytes this.surrogateSize = 3; break; case 'ucs2': case 'utf16le': // UTF-16 represents each of Surrogate Pair by 2-bytes this.surrogateSize = 2; this.detectIncompleteChar = utf16DetectIncompleteChar; break; case 'base64': // Base-64 stores 3 bytes in 4 chars, and pads the remainder. this.surrogateSize = 3; this.detectIncompleteChar = base64DetectIncompleteChar; break; default: this.write = passThroughWrite; return; } // Enough space to store all bytes of a single character. UTF-8 needs 4 // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). this.charBuffer = new Buffer(6); // Number of bytes received for the current incomplete multi-byte character. this.charReceived = 0; // Number of bytes expected for the current incomplete multi-byte character. this.charLength = 0; }; // write decodes the given buffer and returns it as JS string that is // guaranteed to not contain any partial multi-byte characters. Any partial // character found at the end of the buffer is buffered up, and will be // returned when calling write again with the remaining bytes. // // Note: Converting a Buffer containing an orphan surrogate to a String // currently works, but converting a String to a Buffer (via `new Buffer`, or // Buffer#write) will replace incomplete surrogates with the unicode // replacement character. See https://codereview.chromium.org/121173009/ . StringDecoder.prototype.write = function(buffer) { var charStr = ''; // if our last write ended with an incomplete multibyte character while (this.charLength) { // determine how many remaining bytes this buffer has to offer for this char var available = (buffer.length >= this.charLength - this.charReceived) ? this.charLength - this.charReceived : buffer.length; // add the new bytes to the char buffer buffer.copy(this.charBuffer, this.charReceived, 0, available); this.charReceived += available; if (this.charReceived < this.charLength) { // still not enough chars in this buffer? wait for more ... return ''; } // remove bytes belonging to the current character from the buffer buffer = buffer.slice(available, buffer.length); // get the character that was split charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character var charCode = charStr.charCodeAt(charStr.length - 1); if (charCode >= 0xD800 && charCode <= 0xDBFF) { this.charLength += this.surrogateSize; charStr = ''; continue; } this.charReceived = this.charLength = 0; // if there are no more bytes in this buffer, just emit our char if (buffer.length === 0) { return charStr; } break; } // determine and set charLength / charReceived this.detectIncompleteChar(buffer); var end = buffer.length; if (this.charLength) { // buffer the incomplete character bytes we got buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); end -= this.charReceived; } charStr += buffer.toString(this.encoding, 0, end); var end = charStr.length - 1; var charCode = charStr.charCodeAt(end); // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character if (charCode >= 0xD800 && charCode <= 0xDBFF) { var size = this.surrogateSize; this.charLength += size; this.charReceived += size; this.charBuffer.copy(this.charBuffer, size, 0, size); buffer.copy(this.charBuffer, 0, 0, size); return charStr.substring(0, end); } // or just emit the charStr return charStr; }; // detectIncompleteChar determines if there is an incomplete UTF-8 character at // the end of the given buffer. If so, it sets this.charLength to the byte // length that character, and sets this.charReceived to the number of bytes // that are available for this character. StringDecoder.prototype.detectIncompleteChar = function(buffer) { // determine how many bytes we have to check at the end of this buffer var i = (buffer.length >= 3) ? 3 : buffer.length; // Figure out if one of the last i bytes of our buffer announces an // incomplete char. for (; i > 0; i--) { var c = buffer[buffer.length - i]; // See http://en.wikipedia.org/wiki/UTF-8#Description // 110XXXXX if (i == 1 && c >> 5 == 0x06) { this.charLength = 2; break; } // 1110XXXX if (i <= 2 && c >> 4 == 0x0E) { this.charLength = 3; break; } // 11110XXX if (i <= 3 && c >> 3 == 0x1E) { this.charLength = 4; break; } } this.charReceived = i; }; StringDecoder.prototype.end = function(buffer) { var res = ''; if (buffer && buffer.length) res = this.write(buffer); if (this.charReceived) { var cr = this.charReceived; var buf = this.charBuffer; var enc = this.encoding; res += buf.slice(0, cr).toString(enc); } return res; }; function passThroughWrite(buffer) { return buffer.toString(this.encoding); } function utf16DetectIncompleteChar(buffer) { this.charReceived = buffer.length % 2; this.charLength = this.charReceived ? 2 : 0; } function base64DetectIncompleteChar(buffer) { this.charReceived = buffer.length % 3; this.charLength = this.charReceived ? 3 : 0; } },{"buffer":44}],81:[function(require,module,exports){ (function (global){ /** * Module exports. */ module.exports = deprecate; /** * Mark that a method should not be used. * Returns a modified function which warns once by default. * * If `localStorage.noDeprecation = true` is set, then it is a no-op. * * If `localStorage.throwDeprecation = true` is set, then deprecated functions * will throw an Error when invoked. * * If `localStorage.traceDeprecation = true` is set, then deprecated functions * will invoke `console.trace()` instead of `console.error()`. * * @param {Function} fn - the function to deprecate * @param {String} msg - the string to print to the console when `fn` is invoked * @returns {Function} a new "deprecated" version of `fn` * @api public */ function deprecate (fn, msg) { if (config('noDeprecation')) { return fn; } var warned = false; function deprecated() { if (!warned) { if (config('throwDeprecation')) { throw new Error(msg); } else if (config('traceDeprecation')) { console.trace(msg); } else { console.warn(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; } /** * Checks `localStorage` for boolean values for the given `name`. * * @param {String} name * @returns {Boolean} * @api private */ function config (name) { // accessing global.localStorage can trigger a DOMException in sandboxed iframes try { if (!global.localStorage) return false; } catch (_) { return false; } var val = global.localStorage[name]; if (null == val) return false; return String(val).toLowerCase() === 'true'; } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],82:[function(require,module,exports){ arguments[4][51][0].apply(exports,arguments) },{"dup":51}],83:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } },{}],84:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var formatRegExp = /%[sdj%]/g; exports.format = function(f) { if (!isString(f)) { var objects = []; for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments[i])); } return objects.join(' '); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function(x) { if (x === '%%') return '%'; if (i >= len) return x; switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); case '%j': try { return JSON.stringify(args[i++]); } catch (_) { return '[Circular]'; } default: return x; } }); for (var x = args[i]; i < len; x = args[++i]) { if (isNull(x) || !isObject(x)) { str += ' ' + x; } else { str += ' ' + inspect(x); } } return str; }; // Mark that a method should not be used. // Returns a modified function which warns once by default. // If --no-deprecation is set, then it is a no-op. exports.deprecate = function(fn, msg) { // Allow for deprecating things in the process of starting up. if (isUndefined(global.process)) { return function() { return exports.deprecate(fn, msg).apply(this, arguments); }; } if (process.noDeprecation === true) { return fn; } var warned = false; function deprecated() { if (!warned) { if (process.throwDeprecation) { throw new Error(msg); } else if (process.traceDeprecation) { console.trace(msg); } else { console.error(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; }; var debugs = {}; var debugEnviron; exports.debuglog = function(set) { if (isUndefined(debugEnviron)) debugEnviron = process.env.NODE_DEBUG || ''; set = set.toUpperCase(); if (!debugs[set]) { if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { var pid = process.pid; debugs[set] = function() { var msg = exports.format.apply(exports, arguments); console.error('%s %d: %s', set, pid, msg); }; } else { debugs[set] = function() {}; } } return debugs[set]; }; /** * Echos the value of a value. Trys to print the value out * in the best way possible given the different types. * * @param {Object} obj The object to print out. * @param {Object} opts Optional options object that alters the output. */ /* legacy: obj, showHidden, depth, colors*/ function inspect(obj, opts) { // default options var ctx = { seen: [], stylize: stylizeNoColor }; // legacy... if (arguments.length >= 3) ctx.depth = arguments[2]; if (arguments.length >= 4) ctx.colors = arguments[3]; if (isBoolean(opts)) { // legacy... ctx.showHidden = opts; } else if (opts) { // got an "options" object exports._extend(ctx, opts); } // set default options if (isUndefined(ctx.showHidden)) ctx.showHidden = false; if (isUndefined(ctx.depth)) ctx.depth = 2; if (isUndefined(ctx.colors)) ctx.colors = false; if (isUndefined(ctx.customInspect)) ctx.customInspect = true; if (ctx.colors) ctx.stylize = stylizeWithColor; return formatValue(ctx, obj, ctx.depth); } exports.inspect = inspect; // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics inspect.colors = { 'bold' : [1, 22], 'italic' : [3, 23], 'underline' : [4, 24], 'inverse' : [7, 27], 'white' : [37, 39], 'grey' : [90, 39], 'black' : [30, 39], 'blue' : [34, 39], 'cyan' : [36, 39], 'green' : [32, 39], 'magenta' : [35, 39], 'red' : [31, 39], 'yellow' : [33, 39] }; // Don't use 'blue' not visible on cmd.exe inspect.styles = { 'special': 'cyan', 'number': 'yellow', 'boolean': 'yellow', 'undefined': 'grey', 'null': 'bold', 'string': 'green', 'date': 'magenta', // "name": intentionally not styling 'regexp': 'red' }; function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { return '\u001b[' + inspect.colors[style][0] + 'm' + str + '\u001b[' + inspect.colors[style][1] + 'm'; } else { return str; } } function stylizeNoColor(str, styleType) { return str; } function arrayToHash(array) { var hash = {}; array.forEach(function(val, idx) { hash[val] = true; }); return hash; } function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value)) { var ret = value.inspect(recurseTimes, ctx); if (!isString(ret)) { ret = formatValue(ctx, ret, recurseTimes); } return ret; } // Primitive types cannot have properties var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } // Look up the keys of the object. var keys = Object.keys(value); var visibleKeys = arrayToHash(keys); if (ctx.showHidden) { keys = Object.getOwnPropertyNames(value); } // IE doesn't make error fields non-enumerable // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx if (isError(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { return formatError(value); } // Some type of object without properties can be shortcutted. if (keys.length === 0) { if (isFunction(value)) { var name = value.name ? ': ' + value.name : ''; return ctx.stylize('[Function' + name + ']', 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } if (isDate(value)) { return ctx.stylize(Date.prototype.toString.call(value), 'date'); } if (isError(value)) { return formatError(value); } } var base = '', array = false, braces = ['{', '}']; // Make Array say that they are Array if (isArray(value)) { array = true; braces = ['[', ']']; } // Make functions say that they are functions if (isFunction(value)) { var n = value.name ? ': ' + value.name : ''; base = ' [Function' + n + ']'; } // Make RegExps say that they are RegExps if (isRegExp(value)) { base = ' ' + RegExp.prototype.toString.call(value); } // Make dates with properties first say the date if (isDate(value)) { base = ' ' + Date.prototype.toUTCString.call(value); } // Make error with message first say the error if (isError(value)) { base = ' ' + formatError(value); } if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function(key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { if (isUndefined(value)) return ctx.stylize('undefined', 'undefined'); if (isString(value)) { var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\''; return ctx.stylize(simple, 'string'); } if (isNumber(value)) return ctx.stylize('' + value, 'number'); if (isBoolean(value)) return ctx.stylize('' + value, 'boolean'); // For some reason typeof null is "object", so special case here. if (isNull(value)) return ctx.stylize('null', 'null'); } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function(key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; if (desc.get) { if (desc.set) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (desc.set) { str = ctx.stylize('[Setter]', 'special'); } } if (!hasOwnProperty(visibleKeys, key)) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('\n') > -1) { if (array) { str = str.split('\n').map(function(line) { return ' ' + line; }).join('\n').substr(2); } else { str = '\n' + str.split('\n').map(function(line) { return ' ' + line; }).join('\n'); } } } else { str = ctx.stylize('[Circular]', 'special'); } } if (isUndefined(name)) { if (array && key.match(/^\d+$/)) { return str; } name = JSON.stringify('' + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.substr(1, name.length - 2); name = ctx.stylize(name, 'name'); } else { name = name.replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'"); name = ctx.stylize(name, 'string'); } } return name + ': ' + str; } function reduceToSingleString(output, base, braces) { var numLinesEst = 0; var length = output.reduce(function(prev, cur) { numLinesEst++; if (cur.indexOf('\n') >= 0) numLinesEst++; return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; }, 0); if (length > 60) { return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1]; } return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; } // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(ar) { return Array.isArray(ar); } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return isObject(re) && objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return isObject(d) && objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = require('./support/isBuffer'); function objectToString(o) { return Object.prototype.toString.call(o); } function pad(n) { return n < 10 ? '0' + n.toString(10) : n.toString(10); } var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34 function timestamp() { var d = new Date(); var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':'); return [d.getDate(), months[d.getMonth()], time].join(' '); } // log is just a thin wrapper to console.log that prepends a timestamp exports.log = function() { console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); }; /** * Inherit the prototype methods from one constructor into another. * * The Function.prototype.inherits from lang.js rewritten as a standalone * function (not on Function.prototype). NOTE: If this file is to be loaded * during bootstrapping this function needs to be rewritten using some native * functions as prototype setup using normal JavaScript does not work as * expected during bootstrapping (see mirror.js in r114903). * * @param {function} ctor Constructor function which needs to inherit the * prototype. * @param {function} superCtor Constructor function to inherit prototype from. */ exports.inherits = require('inherits'); exports._extend = function(origin, add) { // Don't do anything if add isn't an object if (!add || !isObject(add)) return origin; var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; }; function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./support/isBuffer":83,"_process":67,"inherits":82}]},{},[1]); /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(781).Buffer, __webpack_require__(785).setImmediate)) /***/ }, /* 781 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {/*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ /* eslint-disable no-proto */ 'use strict' var base64 = __webpack_require__(782) var ieee754 = __webpack_require__(783) var isArray = __webpack_require__(784) exports.Buffer = Buffer exports.SlowBuffer = SlowBuffer exports.INSPECT_MAX_BYTES = 50 /** * If `Buffer.TYPED_ARRAY_SUPPORT`: * === true Use Uint8Array implementation (fastest) * === false Use Object implementation (most compatible, even IE6) * * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, * Opera 11.6+, iOS 4.2+. * * Due to various browser bugs, sometimes the Object implementation will be used even * when the browser supports typed arrays. * * Note: * * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. * * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. * * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of * incorrect length in some situations. * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they * get the Object implementation, which is slower but behaves correctly. */ Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined ? global.TYPED_ARRAY_SUPPORT : typedArraySupport() /* * Export kMaxLength after typed array support is determined. */ exports.kMaxLength = kMaxLength() function typedArraySupport () { try { var arr = new Uint8Array(1) arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} return arr.foo() === 42 && // typed array instances can be augmented typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` } catch (e) { return false } } function kMaxLength () { return Buffer.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff } function createBuffer (that, length) { if (kMaxLength() < length) { throw new RangeError('Invalid typed array length') } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = new Uint8Array(length) that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class if (that === null) { that = new Buffer(length) } that.length = length } return that } /** * The Buffer constructor returns instances of `Uint8Array` that have their * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of * `Uint8Array`, so the returned instances will have all the node `Buffer` methods * and the `Uint8Array` methods. Square bracket notation works as expected -- it * returns a single octet. * * The `Uint8Array` prototype remains unmodified. */ function Buffer (arg, encodingOrOffset, length) { if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { return new Buffer(arg, encodingOrOffset, length) } // Common case. if (typeof arg === 'number') { if (typeof encodingOrOffset === 'string') { throw new Error( 'If encoding is specified then the first argument must be a string' ) } return allocUnsafe(this, arg) } return from(this, arg, encodingOrOffset, length) } Buffer.poolSize = 8192 // not used by this implementation // TODO: Legacy, not needed anymore. Remove in next major version. Buffer._augment = function (arr) { arr.__proto__ = Buffer.prototype return arr } function from (that, value, encodingOrOffset, length) { if (typeof value === 'number') { throw new TypeError('"value" argument must not be a number') } if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { return fromArrayBuffer(that, value, encodingOrOffset, length) } if (typeof value === 'string') { return fromString(that, value, encodingOrOffset) } return fromObject(that, value) } /** * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError * if value is a number. * Buffer.from(str[, encoding]) * Buffer.from(array) * Buffer.from(buffer) * Buffer.from(arrayBuffer[, byteOffset[, length]]) **/ Buffer.from = function (value, encodingOrOffset, length) { return from(null, value, encodingOrOffset, length) } if (Buffer.TYPED_ARRAY_SUPPORT) { Buffer.prototype.__proto__ = Uint8Array.prototype Buffer.__proto__ = Uint8Array if (typeof Symbol !== 'undefined' && Symbol.species && Buffer[Symbol.species] === Buffer) { // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 Object.defineProperty(Buffer, Symbol.species, { value: null, configurable: true }) } } function assertSize (size) { if (typeof size !== 'number') { throw new TypeError('"size" argument must be a number') } else if (size < 0) { throw new RangeError('"size" argument must not be negative') } } function alloc (that, size, fill, encoding) { assertSize(size) if (size <= 0) { return createBuffer(that, size) } if (fill !== undefined) { // Only pay attention to encoding if it's a string. This // prevents accidentally sending in a number that would // be interpretted as a start offset. return typeof encoding === 'string' ? createBuffer(that, size).fill(fill, encoding) : createBuffer(that, size).fill(fill) } return createBuffer(that, size) } /** * Creates a new filled Buffer instance. * alloc(size[, fill[, encoding]]) **/ Buffer.alloc = function (size, fill, encoding) { return alloc(null, size, fill, encoding) } function allocUnsafe (that, size) { assertSize(size) that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) if (!Buffer.TYPED_ARRAY_SUPPORT) { for (var i = 0; i < size; ++i) { that[i] = 0 } } return that } /** * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. * */ Buffer.allocUnsafe = function (size) { return allocUnsafe(null, size) } /** * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. */ Buffer.allocUnsafeSlow = function (size) { return allocUnsafe(null, size) } function fromString (that, string, encoding) { if (typeof encoding !== 'string' || encoding === '') { encoding = 'utf8' } if (!Buffer.isEncoding(encoding)) { throw new TypeError('"encoding" must be a valid string encoding') } var length = byteLength(string, encoding) | 0 that = createBuffer(that, length) var actual = that.write(string, encoding) if (actual !== length) { // Writing a hex string, for example, that contains invalid characters will // cause everything after the first invalid character to be ignored. (e.g. // 'abxxcd' will be treated as 'ab') that = that.slice(0, actual) } return that } function fromArrayLike (that, array) { var length = array.length < 0 ? 0 : checked(array.length) | 0 that = createBuffer(that, length) for (var i = 0; i < length; i += 1) { that[i] = array[i] & 255 } return that } function fromArrayBuffer (that, array, byteOffset, length) { array.byteLength // this throws if `array` is not a valid ArrayBuffer if (byteOffset < 0 || array.byteLength < byteOffset) { throw new RangeError('\'offset\' is out of bounds') } if (array.byteLength < byteOffset + (length || 0)) { throw new RangeError('\'length\' is out of bounds') } if (byteOffset === undefined && length === undefined) { array = new Uint8Array(array) } else if (length === undefined) { array = new Uint8Array(array, byteOffset) } else { array = new Uint8Array(array, byteOffset, length) } if (Buffer.TYPED_ARRAY_SUPPORT) { // Return an augmented `Uint8Array` instance, for best performance that = array that.__proto__ = Buffer.prototype } else { // Fallback: Return an object instance of the Buffer class that = fromArrayLike(that, array) } return that } function fromObject (that, obj) { if (Buffer.isBuffer(obj)) { var len = checked(obj.length) | 0 that = createBuffer(that, len) if (that.length === 0) { return that } obj.copy(that, 0, 0, len) return that } if (obj) { if ((typeof ArrayBuffer !== 'undefined' && obj.buffer instanceof ArrayBuffer) || 'length' in obj) { if (typeof obj.length !== 'number' || isnan(obj.length)) { return createBuffer(that, 0) } return fromArrayLike(that, obj) } if (obj.type === 'Buffer' && isArray(obj.data)) { return fromArrayLike(that, obj.data) } } throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') } function checked (length) { // Note: cannot use `length < kMaxLength()` here because that fails when // length is NaN (which is otherwise coerced to zero.) if (length >= kMaxLength()) { throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength().toString(16) + ' bytes') } return length | 0 } function SlowBuffer (length) { if (+length != length) { // eslint-disable-line eqeqeq length = 0 } return Buffer.alloc(+length) } Buffer.isBuffer = function isBuffer (b) { return !!(b != null && b._isBuffer) } Buffer.compare = function compare (a, b) { if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { throw new TypeError('Arguments must be Buffers') } if (a === b) return 0 var x = a.length var y = b.length for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i] y = b[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } Buffer.isEncoding = function isEncoding (encoding) { switch (String(encoding).toLowerCase()) { case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'latin1': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return true default: return false } } Buffer.concat = function concat (list, length) { if (!isArray(list)) { throw new TypeError('"list" argument must be an Array of Buffers') } if (list.length === 0) { return Buffer.alloc(0) } var i if (length === undefined) { length = 0 for (i = 0; i < list.length; ++i) { length += list[i].length } } var buffer = Buffer.allocUnsafe(length) var pos = 0 for (i = 0; i < list.length; ++i) { var buf = list[i] if (!Buffer.isBuffer(buf)) { throw new TypeError('"list" argument must be an Array of Buffers') } buf.copy(buffer, pos) pos += buf.length } return buffer } function byteLength (string, encoding) { if (Buffer.isBuffer(string)) { return string.length } if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { return string.byteLength } if (typeof string !== 'string') { string = '' + string } var len = string.length if (len === 0) return 0 // Use a for loop to avoid recursion var loweredCase = false for (;;) { switch (encoding) { case 'ascii': case 'latin1': case 'binary': return len case 'utf8': case 'utf-8': case undefined: return utf8ToBytes(string).length case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return len * 2 case 'hex': return len >>> 1 case 'base64': return base64ToBytes(string).length default: if (loweredCase) return utf8ToBytes(string).length // assume utf8 encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.byteLength = byteLength function slowToString (encoding, start, end) { var loweredCase = false // No need to verify that "this.length <= MAX_UINT32" since it's a read-only // property of a typed array. // This behaves neither like String nor Uint8Array in that we set start/end // to their upper/lower bounds if the value passed is out of range. // undefined is handled specially as per ECMA-262 6th Edition, // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. if (start === undefined || start < 0) { start = 0 } // Return early if start > this.length. Done here to prevent potential uint32 // coercion fail below. if (start > this.length) { return '' } if (end === undefined || end > this.length) { end = this.length } if (end <= 0) { return '' } // Force coersion to uint32. This will also coerce falsey/NaN values to 0. end >>>= 0 start >>>= 0 if (end <= start) { return '' } if (!encoding) encoding = 'utf8' while (true) { switch (encoding) { case 'hex': return hexSlice(this, start, end) case 'utf8': case 'utf-8': return utf8Slice(this, start, end) case 'ascii': return asciiSlice(this, start, end) case 'latin1': case 'binary': return latin1Slice(this, start, end) case 'base64': return base64Slice(this, start, end) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return utf16leSlice(this, start, end) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = (encoding + '').toLowerCase() loweredCase = true } } } // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect // Buffer instances. Buffer.prototype._isBuffer = true function swap (b, n, m) { var i = b[n] b[n] = b[m] b[m] = i } Buffer.prototype.swap16 = function swap16 () { var len = this.length if (len % 2 !== 0) { throw new RangeError('Buffer size must be a multiple of 16-bits') } for (var i = 0; i < len; i += 2) { swap(this, i, i + 1) } return this } Buffer.prototype.swap32 = function swap32 () { var len = this.length if (len % 4 !== 0) { throw new RangeError('Buffer size must be a multiple of 32-bits') } for (var i = 0; i < len; i += 4) { swap(this, i, i + 3) swap(this, i + 1, i + 2) } return this } Buffer.prototype.swap64 = function swap64 () { var len = this.length if (len % 8 !== 0) { throw new RangeError('Buffer size must be a multiple of 64-bits') } for (var i = 0; i < len; i += 8) { swap(this, i, i + 7) swap(this, i + 1, i + 6) swap(this, i + 2, i + 5) swap(this, i + 3, i + 4) } return this } Buffer.prototype.toString = function toString () { var length = this.length | 0 if (length === 0) return '' if (arguments.length === 0) return utf8Slice(this, 0, length) return slowToString.apply(this, arguments) } Buffer.prototype.equals = function equals (b) { if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') if (this === b) return true return Buffer.compare(this, b) === 0 } Buffer.prototype.inspect = function inspect () { var str = '' var max = exports.INSPECT_MAX_BYTES if (this.length > 0) { str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') if (this.length > max) str += ' ... ' } return '' } Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { if (!Buffer.isBuffer(target)) { throw new TypeError('Argument must be a Buffer') } if (start === undefined) { start = 0 } if (end === undefined) { end = target ? target.length : 0 } if (thisStart === undefined) { thisStart = 0 } if (thisEnd === undefined) { thisEnd = this.length } if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { throw new RangeError('out of range index') } if (thisStart >= thisEnd && start >= end) { return 0 } if (thisStart >= thisEnd) { return -1 } if (start >= end) { return 1 } start >>>= 0 end >>>= 0 thisStart >>>= 0 thisEnd >>>= 0 if (this === target) return 0 var x = thisEnd - thisStart var y = end - start var len = Math.min(x, y) var thisCopy = this.slice(thisStart, thisEnd) var targetCopy = target.slice(start, end) for (var i = 0; i < len; ++i) { if (thisCopy[i] !== targetCopy[i]) { x = thisCopy[i] y = targetCopy[i] break } } if (x < y) return -1 if (y < x) return 1 return 0 } // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, // OR the last index of `val` in `buffer` at offset <= `byteOffset`. // // Arguments: // - buffer - a Buffer to search // - val - a string, Buffer, or number // - byteOffset - an index into `buffer`; will be clamped to an int32 // - encoding - an optional encoding, relevant is val is a string // - dir - true for indexOf, false for lastIndexOf function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { // Empty buffer means no match if (buffer.length === 0) return -1 // Normalize byteOffset if (typeof byteOffset === 'string') { encoding = byteOffset byteOffset = 0 } else if (byteOffset > 0x7fffffff) { byteOffset = 0x7fffffff } else if (byteOffset < -0x80000000) { byteOffset = -0x80000000 } byteOffset = +byteOffset // Coerce to Number. if (isNaN(byteOffset)) { // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer byteOffset = dir ? 0 : (buffer.length - 1) } // Normalize byteOffset: negative offsets start from the end of the buffer if (byteOffset < 0) byteOffset = buffer.length + byteOffset if (byteOffset >= buffer.length) { if (dir) return -1 else byteOffset = buffer.length - 1 } else if (byteOffset < 0) { if (dir) byteOffset = 0 else return -1 } // Normalize val if (typeof val === 'string') { val = Buffer.from(val, encoding) } // Finally, search either indexOf (if dir is true) or lastIndexOf if (Buffer.isBuffer(val)) { // Special case: looking for empty string/buffer always fails if (val.length === 0) { return -1 } return arrayIndexOf(buffer, val, byteOffset, encoding, dir) } else if (typeof val === 'number') { val = val & 0xFF // Search for a byte value [0-255] if (Buffer.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf === 'function') { if (dir) { return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) } else { return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) } } return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) } throw new TypeError('val must be string, number or Buffer') } function arrayIndexOf (arr, val, byteOffset, encoding, dir) { var indexSize = 1 var arrLength = arr.length var valLength = val.length if (encoding !== undefined) { encoding = String(encoding).toLowerCase() if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') { if (arr.length < 2 || val.length < 2) { return -1 } indexSize = 2 arrLength /= 2 valLength /= 2 byteOffset /= 2 } } function read (buf, i) { if (indexSize === 1) { return buf[i] } else { return buf.readUInt16BE(i * indexSize) } } var i if (dir) { var foundIndex = -1 for (i = byteOffset; i < arrLength; i++) { if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { if (foundIndex === -1) foundIndex = i if (i - foundIndex + 1 === valLength) return foundIndex * indexSize } else { if (foundIndex !== -1) i -= i - foundIndex foundIndex = -1 } } } else { if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength for (i = byteOffset; i >= 0; i--) { var found = true for (var j = 0; j < valLength; j++) { if (read(arr, i + j) !== read(val, j)) { found = false break } } if (found) return i } } return -1 } Buffer.prototype.includes = function includes (val, byteOffset, encoding) { return this.indexOf(val, byteOffset, encoding) !== -1 } Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, true) } Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { return bidirectionalIndexOf(this, val, byteOffset, encoding, false) } function hexWrite (buf, string, offset, length) { offset = Number(offset) || 0 var remaining = buf.length - offset if (!length) { length = remaining } else { length = Number(length) if (length > remaining) { length = remaining } } // must be an even number of digits var strLen = string.length if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') if (length > strLen / 2) { length = strLen / 2 } for (var i = 0; i < length; ++i) { var parsed = parseInt(string.substr(i * 2, 2), 16) if (isNaN(parsed)) return i buf[offset + i] = parsed } return i } function utf8Write (buf, string, offset, length) { return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) } function asciiWrite (buf, string, offset, length) { return blitBuffer(asciiToBytes(string), buf, offset, length) } function latin1Write (buf, string, offset, length) { return asciiWrite(buf, string, offset, length) } function base64Write (buf, string, offset, length) { return blitBuffer(base64ToBytes(string), buf, offset, length) } function ucs2Write (buf, string, offset, length) { return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) } Buffer.prototype.write = function write (string, offset, length, encoding) { // Buffer#write(string) if (offset === undefined) { encoding = 'utf8' length = this.length offset = 0 // Buffer#write(string, encoding) } else if (length === undefined && typeof offset === 'string') { encoding = offset length = this.length offset = 0 // Buffer#write(string, offset[, length][, encoding]) } else if (isFinite(offset)) { offset = offset | 0 if (isFinite(length)) { length = length | 0 if (encoding === undefined) encoding = 'utf8' } else { encoding = length length = undefined } // legacy write(string, encoding, offset, length) - remove in v0.13 } else { throw new Error( 'Buffer.write(string, encoding, offset[, length]) is no longer supported' ) } var remaining = this.length - offset if (length === undefined || length > remaining) length = remaining if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { throw new RangeError('Attempt to write outside buffer bounds') } if (!encoding) encoding = 'utf8' var loweredCase = false for (;;) { switch (encoding) { case 'hex': return hexWrite(this, string, offset, length) case 'utf8': case 'utf-8': return utf8Write(this, string, offset, length) case 'ascii': return asciiWrite(this, string, offset, length) case 'latin1': case 'binary': return latin1Write(this, string, offset, length) case 'base64': // Warning: maxLength not taken into account in base64Write return base64Write(this, string, offset, length) case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': return ucs2Write(this, string, offset, length) default: if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) encoding = ('' + encoding).toLowerCase() loweredCase = true } } } Buffer.prototype.toJSON = function toJSON () { return { type: 'Buffer', data: Array.prototype.slice.call(this._arr || this, 0) } } function base64Slice (buf, start, end) { if (start === 0 && end === buf.length) { return base64.fromByteArray(buf) } else { return base64.fromByteArray(buf.slice(start, end)) } } function utf8Slice (buf, start, end) { end = Math.min(buf.length, end) var res = [] var i = start while (i < end) { var firstByte = buf[i] var codePoint = null var bytesPerSequence = (firstByte > 0xEF) ? 4 : (firstByte > 0xDF) ? 3 : (firstByte > 0xBF) ? 2 : 1 if (i + bytesPerSequence <= end) { var secondByte, thirdByte, fourthByte, tempCodePoint switch (bytesPerSequence) { case 1: if (firstByte < 0x80) { codePoint = firstByte } break case 2: secondByte = buf[i + 1] if ((secondByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) if (tempCodePoint > 0x7F) { codePoint = tempCodePoint } } break case 3: secondByte = buf[i + 1] thirdByte = buf[i + 2] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { codePoint = tempCodePoint } } break case 4: secondByte = buf[i + 1] thirdByte = buf[i + 2] fourthByte = buf[i + 3] if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { codePoint = tempCodePoint } } } } if (codePoint === null) { // we did not generate a valid codePoint so insert a // replacement char (U+FFFD) and advance only 1 byte codePoint = 0xFFFD bytesPerSequence = 1 } else if (codePoint > 0xFFFF) { // encode to utf16 (surrogate pair dance) codePoint -= 0x10000 res.push(codePoint >>> 10 & 0x3FF | 0xD800) codePoint = 0xDC00 | codePoint & 0x3FF } res.push(codePoint) i += bytesPerSequence } return decodeCodePointsArray(res) } // Based on http://stackoverflow.com/a/22747272/680742, the browser with // the lowest limit is Chrome, with 0x10000 args. // We go 1 magnitude less, for safety var MAX_ARGUMENTS_LENGTH = 0x1000 function decodeCodePointsArray (codePoints) { var len = codePoints.length if (len <= MAX_ARGUMENTS_LENGTH) { return String.fromCharCode.apply(String, codePoints) // avoid extra slice() } // Decode in chunks to avoid "call stack size exceeded". var res = '' var i = 0 while (i < len) { res += String.fromCharCode.apply( String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) ) } return res } function asciiSlice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i] & 0x7F) } return ret } function latin1Slice (buf, start, end) { var ret = '' end = Math.min(buf.length, end) for (var i = start; i < end; ++i) { ret += String.fromCharCode(buf[i]) } return ret } function hexSlice (buf, start, end) { var len = buf.length if (!start || start < 0) start = 0 if (!end || end < 0 || end > len) end = len var out = '' for (var i = start; i < end; ++i) { out += toHex(buf[i]) } return out } function utf16leSlice (buf, start, end) { var bytes = buf.slice(start, end) var res = '' for (var i = 0; i < bytes.length; i += 2) { res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) } return res } Buffer.prototype.slice = function slice (start, end) { var len = this.length start = ~~start end = end === undefined ? len : ~~end if (start < 0) { start += len if (start < 0) start = 0 } else if (start > len) { start = len } if (end < 0) { end += len if (end < 0) end = 0 } else if (end > len) { end = len } if (end < start) end = start var newBuf if (Buffer.TYPED_ARRAY_SUPPORT) { newBuf = this.subarray(start, end) newBuf.__proto__ = Buffer.prototype } else { var sliceLen = end - start newBuf = new Buffer(sliceLen, undefined) for (var i = 0; i < sliceLen; ++i) { newBuf[i] = this[i + start] } } return newBuf } /* * Need to make sure that buffer isn't trying to write out of bounds. */ function checkOffset (offset, ext, length) { if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') } Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } return val } Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { checkOffset(offset, byteLength, this.length) } var val = this[offset + --byteLength] var mul = 1 while (byteLength > 0 && (mul *= 0x100)) { val += this[offset + --byteLength] * mul } return val } Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { if (!noAssert) checkOffset(offset, 1, this.length) return this[offset] } Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return this[offset] | (this[offset + 1] << 8) } Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) return (this[offset] << 8) | this[offset + 1] } Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ((this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16)) + (this[offset + 3] * 0x1000000) } Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] * 0x1000000) + ((this[offset + 1] << 16) | (this[offset + 2] << 8) | this[offset + 3]) } Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var val = this[offset] var mul = 1 var i = 0 while (++i < byteLength && (mul *= 0x100)) { val += this[offset + i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) checkOffset(offset, byteLength, this.length) var i = byteLength var mul = 1 var val = this[offset + --i] while (i > 0 && (mul *= 0x100)) { val += this[offset + --i] * mul } mul *= 0x80 if (val >= mul) val -= Math.pow(2, 8 * byteLength) return val } Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { if (!noAssert) checkOffset(offset, 1, this.length) if (!(this[offset] & 0x80)) return (this[offset]) return ((0xff - this[offset] + 1) * -1) } Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset] | (this[offset + 1] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 2, this.length) var val = this[offset + 1] | (this[offset] << 8) return (val & 0x8000) ? val | 0xFFFF0000 : val } Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset]) | (this[offset + 1] << 8) | (this[offset + 2] << 16) | (this[offset + 3] << 24) } Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return (this[offset] << 24) | (this[offset + 1] << 16) | (this[offset + 2] << 8) | (this[offset + 3]) } Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, true, 23, 4) } Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 4, this.length) return ieee754.read(this, offset, false, 23, 4) } Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, true, 52, 8) } Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { if (!noAssert) checkOffset(offset, 8, this.length) return ieee754.read(this, offset, false, 52, 8) } function checkInt (buf, value, offset, ext, max, min) { if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') if (offset + ext > buf.length) throw new RangeError('Index out of range') } Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) } var mul = 1 var i = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 byteLength = byteLength | 0 if (!noAssert) { var maxBytes = Math.pow(2, 8 * byteLength) - 1 checkInt(this, value, offset, byteLength, maxBytes, 0) } var i = byteLength - 1 var mul = 1 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { this[offset + i] = (value / mul) & 0xFF } return offset + byteLength } Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) this[offset] = (value & 0xff) return offset + 1 } function objectWriteUInt16 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> (littleEndian ? i : 1 - i) * 8 } } Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } return offset + 2 } Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } function objectWriteUInt32 (buf, value, offset, littleEndian) { if (value < 0) value = 0xffffffff + value + 1 for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff } } Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset + 3] = (value >>> 24) this[offset + 2] = (value >>> 16) this[offset + 1] = (value >>> 8) this[offset] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, true) } return offset + 4 } Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } return offset + 4 } Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 if (!noAssert) { var limit = Math.pow(2, 8 * byteLength - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = 0 var mul = 1 var sub = 0 this[offset] = value & 0xFF while (++i < byteLength && (mul *= 0x100)) { if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { sub = 1 } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { value = +value offset = offset | 0 if (!noAssert) { var limit = Math.pow(2, 8 * byteLength - 1) checkInt(this, value, offset, byteLength, limit - 1, -limit) } var i = byteLength - 1 var mul = 1 var sub = 0 this[offset + i] = value & 0xFF while (--i >= 0 && (mul *= 0x100)) { if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { sub = 1 } this[offset + i] = ((value / mul) >> 0) - sub & 0xFF } return offset + byteLength } Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) if (value < 0) value = 0xff + value + 1 this[offset] = (value & 0xff) return offset + 1 } Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) } else { objectWriteUInt16(this, value, offset, true) } return offset + 2 } Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 8) this[offset + 1] = (value & 0xff) } else { objectWriteUInt16(this, value, offset, false) } return offset + 2 } Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value & 0xff) this[offset + 1] = (value >>> 8) this[offset + 2] = (value >>> 16) this[offset + 3] = (value >>> 24) } else { objectWriteUInt32(this, value, offset, true) } return offset + 4 } Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { value = +value offset = offset | 0 if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) if (value < 0) value = 0xffffffff + value + 1 if (Buffer.TYPED_ARRAY_SUPPORT) { this[offset] = (value >>> 24) this[offset + 1] = (value >>> 16) this[offset + 2] = (value >>> 8) this[offset + 3] = (value & 0xff) } else { objectWriteUInt32(this, value, offset, false) } return offset + 4 } function checkIEEE754 (buf, value, offset, ext, max, min) { if (offset + ext > buf.length) throw new RangeError('Index out of range') if (offset < 0) throw new RangeError('Index out of range') } function writeFloat (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) } ieee754.write(buf, value, offset, littleEndian, 23, 4) return offset + 4 } Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { return writeFloat(this, value, offset, true, noAssert) } Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { return writeFloat(this, value, offset, false, noAssert) } function writeDouble (buf, value, offset, littleEndian, noAssert) { if (!noAssert) { checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) } ieee754.write(buf, value, offset, littleEndian, 52, 8) return offset + 8 } Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { return writeDouble(this, value, offset, true, noAssert) } Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { return writeDouble(this, value, offset, false, noAssert) } // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) Buffer.prototype.copy = function copy (target, targetStart, start, end) { if (!start) start = 0 if (!end && end !== 0) end = this.length if (targetStart >= target.length) targetStart = target.length if (!targetStart) targetStart = 0 if (end > 0 && end < start) end = start // Copy 0 bytes; we're done if (end === start) return 0 if (target.length === 0 || this.length === 0) return 0 // Fatal error conditions if (targetStart < 0) { throw new RangeError('targetStart out of bounds') } if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') if (end < 0) throw new RangeError('sourceEnd out of bounds') // Are we oob? if (end > this.length) end = this.length if (target.length - targetStart < end - start) { end = target.length - targetStart + start } var len = end - start var i if (this === target && start < targetStart && targetStart < end) { // descending copy from end for (i = len - 1; i >= 0; --i) { target[i + targetStart] = this[i + start] } } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { // ascending copy from start for (i = 0; i < len; ++i) { target[i + targetStart] = this[i + start] } } else { Uint8Array.prototype.set.call( target, this.subarray(start, start + len), targetStart ) } return len } // Usage: // buffer.fill(number[, offset[, end]]) // buffer.fill(buffer[, offset[, end]]) // buffer.fill(string[, offset[, end]][, encoding]) Buffer.prototype.fill = function fill (val, start, end, encoding) { // Handle string cases: if (typeof val === 'string') { if (typeof start === 'string') { encoding = start start = 0 end = this.length } else if (typeof end === 'string') { encoding = end end = this.length } if (val.length === 1) { var code = val.charCodeAt(0) if (code < 256) { val = code } } if (encoding !== undefined && typeof encoding !== 'string') { throw new TypeError('encoding must be a string') } if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { throw new TypeError('Unknown encoding: ' + encoding) } } else if (typeof val === 'number') { val = val & 255 } // Invalid ranges are not set to a default, so can range check early. if (start < 0 || this.length < start || this.length < end) { throw new RangeError('Out of range index') } if (end <= start) { return this } start = start >>> 0 end = end === undefined ? this.length : end >>> 0 if (!val) val = 0 var i if (typeof val === 'number') { for (i = start; i < end; ++i) { this[i] = val } } else { var bytes = Buffer.isBuffer(val) ? val : utf8ToBytes(new Buffer(val, encoding).toString()) var len = bytes.length for (i = 0; i < end - start; ++i) { this[i + start] = bytes[i % len] } } return this } // HELPER FUNCTIONS // ================ var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g function base64clean (str) { // Node strips out invalid characters like \n and \t from the string, base64-js does not str = stringtrim(str).replace(INVALID_BASE64_RE, '') // Node converts strings with length < 2 to '' if (str.length < 2) return '' // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not while (str.length % 4 !== 0) { str = str + '=' } return str } function stringtrim (str) { if (str.trim) return str.trim() return str.replace(/^\s+|\s+$/g, '') } function toHex (n) { if (n < 16) return '0' + n.toString(16) return n.toString(16) } function utf8ToBytes (string, units) { units = units || Infinity var codePoint var length = string.length var leadSurrogate = null var bytes = [] for (var i = 0; i < length; ++i) { codePoint = string.charCodeAt(i) // is surrogate component if (codePoint > 0xD7FF && codePoint < 0xE000) { // last char was a lead if (!leadSurrogate) { // no lead yet if (codePoint > 0xDBFF) { // unexpected trail if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } else if (i + 1 === length) { // unpaired lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) continue } // valid lead leadSurrogate = codePoint continue } // 2 leads in a row if (codePoint < 0xDC00) { if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) leadSurrogate = codePoint continue } // valid surrogate pair codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 } else if (leadSurrogate) { // valid bmp char, but last char was a lead if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) } leadSurrogate = null // encode utf8 if (codePoint < 0x80) { if ((units -= 1) < 0) break bytes.push(codePoint) } else if (codePoint < 0x800) { if ((units -= 2) < 0) break bytes.push( codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x10000) { if ((units -= 3) < 0) break bytes.push( codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else if (codePoint < 0x110000) { if ((units -= 4) < 0) break bytes.push( codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80 ) } else { throw new Error('Invalid code point') } } return bytes } function asciiToBytes (str) { var byteArray = [] for (var i = 0; i < str.length; ++i) { // Node's code seems to be doing this and not & 0x7F.. byteArray.push(str.charCodeAt(i) & 0xFF) } return byteArray } function utf16leToBytes (str, units) { var c, hi, lo var byteArray = [] for (var i = 0; i < str.length; ++i) { if ((units -= 2) < 0) break c = str.charCodeAt(i) hi = c >> 8 lo = c % 256 byteArray.push(lo) byteArray.push(hi) } return byteArray } function base64ToBytes (str) { return base64.toByteArray(base64clean(str)) } function blitBuffer (src, dst, offset, length) { for (var i = 0; i < length; ++i) { if ((i + offset >= dst.length) || (i >= src.length)) break dst[i + offset] = src[i] } return i } function isnan (val) { return val !== val // eslint-disable-line no-self-compare } /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }, /* 782 */ /***/ function(module, exports) { 'use strict' exports.byteLength = byteLength exports.toByteArray = toByteArray exports.fromByteArray = fromByteArray var lookup = [] var revLookup = [] var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' for (var i = 0, len = code.length; i < len; ++i) { lookup[i] = code[i] revLookup[code.charCodeAt(i)] = i } revLookup['-'.charCodeAt(0)] = 62 revLookup['_'.charCodeAt(0)] = 63 function placeHoldersCount (b64) { var len = b64.length if (len % 4 > 0) { throw new Error('Invalid string. Length must be a multiple of 4') } // the number of equal signs (place holders) // if there are two placeholders, than the two characters before it // represent one byte // if there is only one, then the three characters before it represent 2 bytes // this is just a cheap hack to not do indexOf twice return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 } function byteLength (b64) { // base64 is 4/3 + up to two characters of the original data return b64.length * 3 / 4 - placeHoldersCount(b64) } function toByteArray (b64) { var i, j, l, tmp, placeHolders, arr var len = b64.length placeHolders = placeHoldersCount(b64) arr = new Arr(len * 3 / 4 - placeHolders) // if there are placeholders, only get up to the last complete 4 chars l = placeHolders > 0 ? len - 4 : len var L = 0 for (i = 0, j = 0; i < l; i += 4, j += 3) { tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] arr[L++] = (tmp >> 16) & 0xFF arr[L++] = (tmp >> 8) & 0xFF arr[L++] = tmp & 0xFF } if (placeHolders === 2) { tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) arr[L++] = tmp & 0xFF } else if (placeHolders === 1) { tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) arr[L++] = (tmp >> 8) & 0xFF arr[L++] = tmp & 0xFF } return arr } function tripletToBase64 (num) { return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] } function encodeChunk (uint8, start, end) { var tmp var output = [] for (var i = start; i < end; i += 3) { tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) output.push(tripletToBase64(tmp)) } return output.join('') } function fromByteArray (uint8) { var tmp var len = uint8.length var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes var output = '' var parts = [] var maxChunkLength = 16383 // must be multiple of 3 // go through the array every three bytes, we'll deal with trailing stuff later for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) } // pad the end with zeros, but make sure to not forget the extra bytes if (extraBytes === 1) { tmp = uint8[len - 1] output += lookup[tmp >> 2] output += lookup[(tmp << 4) & 0x3F] output += '==' } else if (extraBytes === 2) { tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) output += lookup[tmp >> 10] output += lookup[(tmp >> 4) & 0x3F] output += lookup[(tmp << 2) & 0x3F] output += '=' } parts.push(output) return parts.join('') } /***/ }, /* 783 */ /***/ function(module, exports) { exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = nBytes * 8 - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var nBits = -7 var i = isLE ? (nBytes - 1) : 0 var d = isLE ? -1 : 1 var s = buffer[offset + i] i += d e = s & ((1 << (-nBits)) - 1) s >>= (-nBits) nBits += eLen for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1) e >>= (-nBits) nBits += mLen for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} if (e === 0) { e = 1 - eBias } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity) } else { m = m + Math.pow(2, mLen) e = e - eBias } return (s ? -1 : 1) * m * Math.pow(2, e - mLen) } exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { var e, m, c var eLen = nBytes * 8 - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) var i = isLE ? 0 : (nBytes - 1) var d = isLE ? 1 : -1 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 value = Math.abs(value) if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0 e = eMax } else { e = Math.floor(Math.log(value) / Math.LN2) if (value * (c = Math.pow(2, -e)) < 1) { e-- c *= 2 } if (e + eBias >= 1) { value += rt / c } else { value += rt * Math.pow(2, 1 - eBias) } if (value * c >= 2) { e++ c /= 2 } if (e + eBias >= eMax) { m = 0 e = eMax } else if (e + eBias >= 1) { m = (value * c - 1) * Math.pow(2, mLen) e = e + eBias } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) e = 0 } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} e = (e << mLen) | m eLen += mLen for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} buffer[offset + i - d] |= s * 128 } /***/ }, /* 784 */ /***/ function(module, exports) { var toString = {}.toString; module.exports = Array.isArray || function (arr) { return toString.call(arr) == '[object Array]'; }; /***/ }, /* 785 */ /***/ function(module, exports, __webpack_require__) { var apply = Function.prototype.apply; // DOM APIs, for completeness exports.setTimeout = function() { return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); }; exports.setInterval = function() { return new Timeout(apply.call(setInterval, window, arguments), clearInterval); }; exports.clearTimeout = exports.clearInterval = function(timeout) { if (timeout) { timeout.close(); } }; function Timeout(id, clearFn) { this._id = id; this._clearFn = clearFn; } Timeout.prototype.unref = Timeout.prototype.ref = function() {}; Timeout.prototype.close = function() { this._clearFn.call(window, this._id); }; // Does not start the time, just sets up the members needed. exports.enroll = function(item, msecs) { clearTimeout(item._idleTimeoutId); item._idleTimeout = msecs; }; exports.unenroll = function(item) { clearTimeout(item._idleTimeoutId); item._idleTimeout = -1; }; exports._unrefActive = exports.active = function(item) { clearTimeout(item._idleTimeoutId); var msecs = item._idleTimeout; if (msecs >= 0) { item._idleTimeoutId = setTimeout(function onTimeout() { if (item._onTimeout) item._onTimeout(); }, msecs); } }; // setimmediate attaches itself to the global object __webpack_require__(786); exports.setImmediate = setImmediate; exports.clearImmediate = clearImmediate; /***/ }, /* 786 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) { "use strict"; if (global.setImmediate) { return; } var nextHandle = 1; // Spec says greater than zero var tasksByHandle = {}; var currentlyRunningATask = false; var doc = global.document; var registerImmediate; function setImmediate(callback) { // Callback can either be a function or a string if (typeof callback !== "function") { callback = new Function("" + callback); } // Copy function arguments var args = new Array(arguments.length - 1); for (var i = 0; i < args.length; i++) { args[i] = arguments[i + 1]; } // Store and register the task var task = { callback: callback, args: args }; tasksByHandle[nextHandle] = task; registerImmediate(nextHandle); return nextHandle++; } function clearImmediate(handle) { delete tasksByHandle[handle]; } function run(task) { var callback = task.callback; var args = task.args; switch (args.length) { case 0: callback(); break; case 1: callback(args[0]); break; case 2: callback(args[0], args[1]); break; case 3: callback(args[0], args[1], args[2]); break; default: callback.apply(undefined, args); break; } } function runIfPresent(handle) { // From the spec: "Wait until any invocations of this algorithm started before this one have completed." // So if we're currently running a task, we'll need to delay this invocation. if (currentlyRunningATask) { // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a // "too much recursion" error. setTimeout(runIfPresent, 0, handle); } else { var task = tasksByHandle[handle]; if (task) { currentlyRunningATask = true; try { run(task); } finally { clearImmediate(handle); currentlyRunningATask = false; } } } } function installNextTickImplementation() { registerImmediate = function(handle) { process.nextTick(function () { runIfPresent(handle); }); }; } function canUsePostMessage() { // The test against `importScripts` prevents this implementation from being installed inside a web worker, // where `global.postMessage` means something completely different and can't be used for this purpose. if (global.postMessage && !global.importScripts) { var postMessageIsAsynchronous = true; var oldOnMessage = global.onmessage; global.onmessage = function() { postMessageIsAsynchronous = false; }; global.postMessage("", "*"); global.onmessage = oldOnMessage; return postMessageIsAsynchronous; } } function installPostMessageImplementation() { // Installs an event handler on `global` for the `message` event: see // * https://developer.mozilla.org/en/DOM/window.postMessage // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages var messagePrefix = "setImmediate$" + Math.random() + "$"; var onGlobalMessage = function(event) { if (event.source === global && typeof event.data === "string" && event.data.indexOf(messagePrefix) === 0) { runIfPresent(+event.data.slice(messagePrefix.length)); } }; if (global.addEventListener) { global.addEventListener("message", onGlobalMessage, false); } else { global.attachEvent("onmessage", onGlobalMessage); } registerImmediate = function(handle) { global.postMessage(messagePrefix + handle, "*"); }; } function installMessageChannelImplementation() { var channel = new MessageChannel(); channel.port1.onmessage = function(event) { var handle = event.data; runIfPresent(handle); }; registerImmediate = function(handle) { channel.port2.postMessage(handle); }; } function installReadyStateChangeImplementation() { var html = doc.documentElement; registerImmediate = function(handle) { // Create a