text: 'use strict';
  
  /* eslint no-unused-vars: off */
  /* eslint-env commonjs */
  
  /**
   * Shim process.stdout.
   */
  
  process.stdout = require('browser-stdout')({label: false});
  
  var Mocha = require('./lib/mocha');
  
  /**
   * Create a Mocha instance.
   *
   * @return {undefined}
   */
  
  var mocha = new Mocha({reporter: 'html'});
  
  /**
   * Save timer references to avoid Sinon interfering (see GH-237).
   */
  
  var Date = global.Date;
  var setTimeout = global.setTimeout;
  var setInterval = global.setInterval;
  var clearTimeout = global.clearTimeout;
  var clearInterval = global.clearInterval;
  
  var uncaughtExceptionHandlers = [];
  
  var originalOnerrorHandler = global.onerror;
  
  /**
   * Remove uncaughtException listener.
   * Revert to original onerror handler if previously defined.
   */
  
  process.removeListener = function(e, fn) {
    if (e === 'uncaughtException') {
      if (originalOnerrorHandler) {
        global.onerror = originalOnerrorHandler;
      } else {
        global.onerror = function() {};
      }
      var i = uncaughtExceptionHandlers.indexOf(fn);
      if (i !== -1) {
        uncaughtExceptionHandlers.splice(i, 1);
      }
    }
  };
  
  /**
   * Implements uncaughtException listener.
   */
  
  process.on = function(e, fn) {
    if (e === 'uncaughtException') {
      global.onerror = function(err, url, line) {
        fn(new Error(err + ' (' + url + ':' + line + ')'));
        return !mocha.allowUncaught;
      };
      uncaughtExceptionHandlers.push(fn);
    }
  };
  
  // The BDD UI is registered by default, but no UI will be functional in the
  // browser without an explicit call to the overridden `mocha.ui` (see below).
  // Ensure that this default UI does not expose its methods to the global scope.
  mocha.suite.removeAllListeners('pre-require');
  
  var immediateQueue = [];
  var immediateTimeout;
  
  function timeslice() {
    var immediateStart = new Date().getTime();
    while (immediateQueue.length && new Date().getTime() - immediateStart < 100) {
      immediateQueue.shift()();
    }
    if (immediateQueue.length) {
      immediateTimeout = setTimeout(timeslice, 0);
    } else {
      immediateTimeout = null;
    }
  }
  
  /**
   * High-performance override of Runner.immediately.
   */
  
  Mocha.Runner.immediately = function(callback) {
    immediateQueue.push(callback);
    if (!immediateTimeout) {
      immediateTimeout = setTimeout(timeslice, 0);
    }
  };
  
  /**
   * Function to allow assertion libraries to throw errors directly into mocha.
   * This is useful when running tests in a browser because window.onerror will
   * only receive the 'message' attribute of the Error.
   */
  mocha.throwError = function(err) {
    uncaughtExceptionHandlers.forEach(function(fn) {
      fn(err);
    });
    throw err;
  };
  
  /**
   * Override ui to ensure that the ui functions are initialized.
   * Normally this would happen in Mocha.prototype.loadFiles.
   */
  
  mocha.ui = function(ui) {
    Mocha.prototype.ui.call(this, ui);
    this.suite.emit('pre-require', global, null, this);
    return this;
  };
  
  /**
   * Setup mocha with the given setting options.
   */
  
  mocha.setup = function(opts) {
    if (typeof opts === 'string') {
      opts = {ui: opts};
    }
    for (var opt in opts) {
      if (opts.hasOwnProperty(opt)) {
        this[opt](opts[opt]);
      }
    }
    return this;
  };
  
  /**
   * Run mocha, returning the Runner.
   */
  
  mocha.run = function(fn) {
    var options = mocha.options;
    mocha.globals('location');
  
    var query = Mocha.utils.parseQuery(global.location.search || '');
    if (query.grep) {
      mocha.grep(query.grep);
    }
    if (query.fgrep) {
      mocha.fgrep(query.fgrep);
    }
    if (query.invert) {
      mocha.invert();
    }
  
    return Mocha.prototype.run.call(mocha, function(err) {
      // The DOM Document is not available in Web Workers.
      var document = global.document;
      if (
        document &&
        document.getElementById('mocha') &&
        options.noHighlighting !== true
      ) {
        Mocha.utils.highlightTags('code');
      }
      if (fn) {
        fn(err);
      }
    });
  };
  
  /**
   * Expose the process shim.
   * https://github.com/mochajs/mocha/pull/916
   */
  
  Mocha.process = process;
  
  /**
   * Expose mocha.
   */
  
  global.Mocha = Mocha;
  global.mocha = mocha;
  
  // this allows test/acceptance/required-tokens.js to pass; thus,
  // you can now do `const describe = require('mocha').describe` in a
  // browser context (assuming browserification).  should fix #880
  module.exports = global;
  