Spamworldpro Mini Shell
Spamworldpro


Server : Apache
System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64
User : corals ( 1002)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/corals/vreg/node_modules/@bugsnag/browser/dist/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/vreg/node_modules/@bugsnag/browser/dist/bugsnag.js
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Bugsnag = f()}})(function(){var define,module,exports;
var _$breadcrumbTypes_8 = ['navigation', 'request', 'process', 'log', 'user', 'state', 'error', 'manual'];

// Array#reduce
var _$reduce_17 = function (arr, fn, accum) {
  var val = accum;

  for (var i = 0, len = arr.length; i < len; i++) {
    val = fn(val, arr[i], i, arr);
  }

  return val;
};

/* removed: var _$reduce_17 = require('./reduce'); */; // Array#filter


var _$filter_12 = function (arr, fn) {
  return _$reduce_17(arr, function (accum, item, i, arr) {
    return !fn(item, i, arr) ? accum : accum.concat(item);
  }, []);
};

/* removed: var _$reduce_17 = require('./reduce'); */; // Array#includes


var _$includes_13 = function (arr, x) {
  return _$reduce_17(arr, function (accum, item, i, arr) {
    return accum === true || item === x;
  }, false);
};

// Array#isArray
var _$isArray_14 = function (obj) {
  return Object.prototype.toString.call(obj) === '[object Array]';
};

/* eslint-disable-next-line no-prototype-builtins */
var _hasDontEnumBug = !{
  toString: null
}.propertyIsEnumerable('toString');

var _dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor']; // Object#keys

var _$keys_15 = function (obj) {
  // stripped down version of
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/Keys
  var result = [];
  var prop;

  for (prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) result.push(prop);
  }

  if (!_hasDontEnumBug) return result;

  for (var i = 0, len = _dontEnums.length; i < len; i++) {
    if (Object.prototype.hasOwnProperty.call(obj, _dontEnums[i])) result.push(_dontEnums[i]);
  }

  return result;
};

var _$intRange_23 = function (min, max) {
  if (min === void 0) {
    min = 1;
  }

  if (max === void 0) {
    max = Infinity;
  }

  return function (value) {
    return typeof value === 'number' && parseInt('' + value, 10) === value && value >= min && value <= max;
  };
};

/* removed: var _$filter_12 = require('../es-utils/filter'); */;

/* removed: var _$isArray_14 = require('../es-utils/is-array'); */;

var _$listOfFunctions_24 = function (value) {
  return typeof value === 'function' || _$isArray_14(value) && _$filter_12(value, function (f) {
    return typeof f === 'function';
  }).length === value.length;
};

var _$stringWithLength_25 = function (value) {
  return typeof value === 'string' && !!value.length;
};

var _$config_5 = {};
/* removed: var _$filter_12 = require('./lib/es-utils/filter'); */;

/* removed: var _$reduce_17 = require('./lib/es-utils/reduce'); */;

/* removed: var _$keys_15 = require('./lib/es-utils/keys'); */;

/* removed: var _$isArray_14 = require('./lib/es-utils/is-array'); */;

/* removed: var _$includes_13 = require('./lib/es-utils/includes'); */;

/* removed: var _$intRange_23 = require('./lib/validators/int-range'); */;

/* removed: var _$stringWithLength_25 = require('./lib/validators/string-with-length'); */;

/* removed: var _$listOfFunctions_24 = require('./lib/validators/list-of-functions'); */;

/* removed: var _$breadcrumbTypes_8 = require('./lib/breadcrumb-types'); */;

var defaultErrorTypes = function () {
  return {
    unhandledExceptions: true,
    unhandledRejections: true
  };
};

_$config_5.schema = {
  apiKey: {
    defaultValue: function () {
      return null;
    },
    message: 'is required',
    validate: _$stringWithLength_25
  },
  appVersion: {
    defaultValue: function () {
      return undefined;
    },
    message: 'should be a string',
    validate: function (value) {
      return value === undefined || _$stringWithLength_25(value);
    }
  },
  appType: {
    defaultValue: function () {
      return undefined;
    },
    message: 'should be a string',
    validate: function (value) {
      return value === undefined || _$stringWithLength_25(value);
    }
  },
  autoDetectErrors: {
    defaultValue: function () {
      return true;
    },
    message: 'should be true|false',
    validate: function (value) {
      return value === true || value === false;
    }
  },
  enabledErrorTypes: {
    defaultValue: function () {
      return defaultErrorTypes();
    },
    message: 'should be an object containing the flags { unhandledExceptions:true|false, unhandledRejections:true|false }',
    allowPartialObject: true,
    validate: function (value) {
      // ensure we have an object
      if (typeof value !== 'object' || !value) return false;
      var providedKeys = _$keys_15(value);
      var defaultKeys = _$keys_15(defaultErrorTypes()); // ensure it only has a subset of the allowed keys

      if (_$filter_12(providedKeys, function (k) {
        return _$includes_13(defaultKeys, k);
      }).length < providedKeys.length) return false; // ensure all of the values are boolean

      if (_$filter_12(_$keys_15(value), function (k) {
        return typeof value[k] !== 'boolean';
      }).length > 0) return false;
      return true;
    }
  },
  onError: {
    defaultValue: function () {
      return [];
    },
    message: 'should be a function or array of functions',
    validate: _$listOfFunctions_24
  },
  onSession: {
    defaultValue: function () {
      return [];
    },
    message: 'should be a function or array of functions',
    validate: _$listOfFunctions_24
  },
  onBreadcrumb: {
    defaultValue: function () {
      return [];
    },
    message: 'should be a function or array of functions',
    validate: _$listOfFunctions_24
  },
  endpoints: {
    defaultValue: function () {
      return {
        notify: 'https://notify.bugsnag.com',
        sessions: 'https://sessions.bugsnag.com'
      };
    },
    message: 'should be an object containing endpoint URLs { notify, sessions }',
    validate: function (val) {
      return (// first, ensure it's an object
        val && typeof val === 'object' && // notify and sessions must always be set
        _$stringWithLength_25(val.notify) && _$stringWithLength_25(val.sessions) && // ensure no keys other than notify/session are set on endpoints object
        _$filter_12(_$keys_15(val), function (k) {
          return !_$includes_13(['notify', 'sessions'], k);
        }).length === 0
      );
    }
  },
  autoTrackSessions: {
    defaultValue: function (val) {
      return true;
    },
    message: 'should be true|false',
    validate: function (val) {
      return val === true || val === false;
    }
  },
  enabledReleaseStages: {
    defaultValue: function () {
      return null;
    },
    message: 'should be an array of strings',
    validate: function (value) {
      return value === null || _$isArray_14(value) && _$filter_12(value, function (f) {
        return typeof f === 'string';
      }).length === value.length;
    }
  },
  releaseStage: {
    defaultValue: function () {
      return 'production';
    },
    message: 'should be a string',
    validate: function (value) {
      return typeof value === 'string' && value.length;
    }
  },
  maxBreadcrumbs: {
    defaultValue: function () {
      return 25;
    },
    message: 'should be a number ≤100',
    validate: function (value) {
      return _$intRange_23(0, 100)(value);
    }
  },
  enabledBreadcrumbTypes: {
    defaultValue: function () {
      return _$breadcrumbTypes_8;
    },
    message: "should be null or a list of available breadcrumb types (" + _$breadcrumbTypes_8.join(',') + ")",
    validate: function (value) {
      return value === null || _$isArray_14(value) && _$reduce_17(value, function (accum, maybeType) {
        if (accum === false) return accum;
        return _$includes_13(_$breadcrumbTypes_8, maybeType);
      }, true);
    }
  },
  context: {
    defaultValue: function () {
      return undefined;
    },
    message: 'should be a string',
    validate: function (value) {
      return value === undefined || typeof value === 'string';
    }
  },
  user: {
    defaultValue: function () {
      return {};
    },
    message: 'should be an object with { id, email, name } properties',
    validate: function (value) {
      return value === null || value && _$reduce_17(_$keys_15(value), function (accum, key) {
        return accum && _$includes_13(['id', 'email', 'name'], key);
      }, true);
    }
  },
  metadata: {
    defaultValue: function () {
      return {};
    },
    message: 'should be an object',
    validate: function (value) {
      return typeof value === 'object' && value !== null;
    }
  },
  logger: {
    defaultValue: function () {
      return undefined;
    },
    message: 'should be null or an object with methods { debug, info, warn, error }',
    validate: function (value) {
      return !value || value && _$reduce_17(['debug', 'info', 'warn', 'error'], function (accum, method) {
        return accum && typeof value[method] === 'function';
      }, true);
    }
  },
  redactedKeys: {
    defaultValue: function () {
      return ['password'];
    },
    message: 'should be an array of strings|regexes',
    validate: function (value) {
      return _$isArray_14(value) && value.length === _$filter_12(value, function (s) {
        return typeof s === 'string' || s && typeof s.test === 'function';
      }).length;
    }
  },
  plugins: {
    defaultValue: function () {
      return [];
    },
    message: 'should be an array of plugin objects',
    validate: function (value) {
      return _$isArray_14(value) && value.length === _$filter_12(value, function (p) {
        return p && typeof p === 'object' && typeof p.load === 'function';
      }).length;
    }
  }
};

// extends helper from babel
// https://github.com/babel/babel/blob/916429b516e6466fd06588ee820e40e025d7f3a3/packages/babel-helpers/src/helpers.js#L377-L393
var _$assign_11 = function (target) {
  for (var i = 1; i < arguments.length; i++) {
    var source = arguments[i];

    for (var key in source) {
      if (Object.prototype.hasOwnProperty.call(source, key)) {
        target[key] = source[key];
      }
    }
  }

  return target;
};

/* removed: var _$reduce_17 = require('./reduce'); */; // Array#map


var _$map_16 = function (arr, fn) {
  return _$reduce_17(arr, function (accum, item, i, arr) {
    return accum.concat(fn(item, i, arr));
  }, []);
};

function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }

var schema = _$config_5.schema;

/* removed: var _$map_16 = require('@bugsnag/core/lib/es-utils/map'); */;

/* removed: var _$assign_11 = require('@bugsnag/core/lib/es-utils/assign'); */;

var _$config_1 = {
  releaseStage: _$assign_11({}, schema.releaseStage, {
    defaultValue: function () {
      if (/^localhost(:\d+)?$/.test(window.location.host)) return 'development';
      return 'production';
    }
  }),
  appType: _extends({}, schema.appType, {
    defaultValue: function () {
      return 'browser';
    }
  }),
  logger: _$assign_11({}, schema.logger, {
    defaultValue: function () {
      return (// set logger based on browser capability
        typeof console !== 'undefined' && typeof console.debug === 'function' ? getPrefixedConsole() : undefined
      );
    }
  })
};

var getPrefixedConsole = function () {
  var logger = {};
  var consoleLog = console.log;
  _$map_16(['debug', 'info', 'warn', 'error'], function (method) {
    var consoleMethod = console[method];
    logger[method] = typeof consoleMethod === 'function' ? consoleMethod.bind(console, '[bugsnag]') : consoleLog.bind(console, '[bugsnag]');
  });
  return logger;
};

var Breadcrumb = /*#__PURE__*/function () {
  function Breadcrumb(message, metadata, type, timestamp) {
    if (timestamp === void 0) {
      timestamp = new Date();
    }

    this.type = type;
    this.message = message;
    this.metadata = metadata;
    this.timestamp = timestamp;
  }

  var _proto = Breadcrumb.prototype;

  _proto.toJSON = function toJSON() {
    return {
      type: this.type,
      name: this.message,
      timestamp: this.timestamp,
      metaData: this.metadata
    };
  };

  return Breadcrumb;
}();

var _$Breadcrumb_3 = Breadcrumb;

var _$stackframe_33 = {};
(function (root, factory) {
  'use strict'; // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.

  /* istanbul ignore next */

  if (typeof define === 'function' && define.amd) {
    define('stackframe', [], factory);
  } else if (typeof _$stackframe_33 === 'object') {
    _$stackframe_33 = factory();
  } else {
    root.StackFrame = factory();
  }
})(this, function () {
  'use strict';

  function _isNumber(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
  }

  function _capitalize(str) {
    return str.charAt(0).toUpperCase() + str.substring(1);
  }

  function _getter(p) {
    return function () {
      return this[p];
    };
  }

  var booleanProps = ['isConstructor', 'isEval', 'isNative', 'isToplevel'];
  var numericProps = ['columnNumber', 'lineNumber'];
  var stringProps = ['fileName', 'functionName', 'source'];
  var arrayProps = ['args'];
  var props = booleanProps.concat(numericProps, stringProps, arrayProps);

  function StackFrame(obj) {
    if (obj instanceof Object) {
      for (var i = 0; i < props.length; i++) {
        if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) {
          this['set' + _capitalize(props[i])](obj[props[i]]);
        }
      }
    }
  }

  StackFrame.prototype = {
    getArgs: function () {
      return this.args;
    },
    setArgs: function (v) {
      if (Object.prototype.toString.call(v) !== '[object Array]') {
        throw new TypeError('Args must be an Array');
      }

      this.args = v;
    },
    getEvalOrigin: function () {
      return this.evalOrigin;
    },
    setEvalOrigin: function (v) {
      if (v instanceof StackFrame) {
        this.evalOrigin = v;
      } else if (v instanceof Object) {
        this.evalOrigin = new StackFrame(v);
      } else {
        throw new TypeError('Eval Origin must be an Object or StackFrame');
      }
    },
    toString: function () {
      var functionName = this.getFunctionName() || '{anonymous}';
      var args = '(' + (this.getArgs() || []).join(',') + ')';
      var fileName = this.getFileName() ? '@' + this.getFileName() : '';
      var lineNumber = _isNumber(this.getLineNumber()) ? ':' + this.getLineNumber() : '';
      var columnNumber = _isNumber(this.getColumnNumber()) ? ':' + this.getColumnNumber() : '';
      return functionName + args + fileName + lineNumber + columnNumber;
    }
  };

  for (var i = 0; i < booleanProps.length; i++) {
    StackFrame.prototype['get' + _capitalize(booleanProps[i])] = _getter(booleanProps[i]);

    StackFrame.prototype['set' + _capitalize(booleanProps[i])] = function (p) {
      return function (v) {
        this[p] = Boolean(v);
      };
    }(booleanProps[i]);
  }

  for (var j = 0; j < numericProps.length; j++) {
    StackFrame.prototype['get' + _capitalize(numericProps[j])] = _getter(numericProps[j]);

    StackFrame.prototype['set' + _capitalize(numericProps[j])] = function (p) {
      return function (v) {
        if (!_isNumber(v)) {
          throw new TypeError(p + ' must be a Number');
        }

        this[p] = Number(v);
      };
    }(numericProps[j]);
  }

  for (var k = 0; k < stringProps.length; k++) {
    StackFrame.prototype['get' + _capitalize(stringProps[k])] = _getter(stringProps[k]);

    StackFrame.prototype['set' + _capitalize(stringProps[k])] = function (p) {
      return function (v) {
        this[p] = String(v);
      };
    }(stringProps[k]);
  }

  return StackFrame;
});

var _$errorStackParser_30 = {};
(function (root, factory) {
  'use strict'; // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.

  /* istanbul ignore next */

  if (typeof define === 'function' && define.amd) {
    define('error-stack-parser', ['stackframe'], factory);
  } else if (typeof _$errorStackParser_30 === 'object') {
    _$errorStackParser_30 = factory(_$stackframe_33);
  } else {
    root.ErrorStackParser = factory(root.StackFrame);
  }
})(this, function ErrorStackParser(StackFrame) {
  'use strict';

  var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\S+\:\d+/;
  var CHROME_IE_STACK_REGEXP = /^\s*at .*(\S+\:\d+|\(native\))/m;
  var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\[native code\])?$/;
  return {
    /**
     * Given an Error object, extract the most information from it.
     *
     * @param {Error} error object
     * @return {Array} of StackFrames
     */
    parse: function ErrorStackParser$$parse(error) {
      if (typeof error.stacktrace !== 'undefined' || typeof error['opera#sourceloc'] !== 'undefined') {
        return this.parseOpera(error);
      } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {
        return this.parseV8OrIE(error);
      } else if (error.stack) {
        return this.parseFFOrSafari(error);
      } else {
        throw new Error('Cannot parse given Error object');
      }
    },
    // Separate line and column numbers from a string of the form: (URI:Line:Column)
    extractLocation: function ErrorStackParser$$extractLocation(urlLike) {
      // Fail-fast but return locations like "(native)"
      if (urlLike.indexOf(':') === -1) {
        return [urlLike];
      }

      var regExp = /(.+?)(?:\:(\d+))?(?:\:(\d+))?$/;
      var parts = regExp.exec(urlLike.replace(/[\(\)]/g, ''));
      return [parts[1], parts[2] || undefined, parts[3] || undefined];
    },
    parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) {
      var filtered = error.stack.split('\n').filter(function (line) {
        return !!line.match(CHROME_IE_STACK_REGEXP);
      }, this);
      return filtered.map(function (line) {
        if (line.indexOf('(eval ') > -1) {
          // Throw away eval information until we implement stacktrace.js/stackframe#8
          line = line.replace(/eval code/g, 'eval').replace(/(\(eval at [^\()]*)|(\)\,.*$)/g, '');
        }

        var sanitizedLine = line.replace(/^\s+/, '').replace(/\(eval code/g, '('); // capture and preseve the parenthesized location "(/foo/my bar.js:12:87)" in
        // case it has spaces in it, as the string is split on \s+ later on

        var location = sanitizedLine.match(/ (\((.+):(\d+):(\d+)\)$)/); // remove the parenthesized location from the line, if it was matched

        sanitizedLine = location ? sanitizedLine.replace(location[0], '') : sanitizedLine;
        var tokens = sanitizedLine.split(/\s+/).slice(1); // if a location was matched, pass it to extractLocation() otherwise pop the last token

        var locationParts = this.extractLocation(location ? location[1] : tokens.pop());
        var functionName = tokens.join(' ') || undefined;
        var fileName = ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0];
        return new StackFrame({
          functionName: functionName,
          fileName: fileName,
          lineNumber: locationParts[1],
          columnNumber: locationParts[2],
          source: line
        });
      }, this);
    },
    parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) {
      var filtered = error.stack.split('\n').filter(function (line) {
        return !line.match(SAFARI_NATIVE_CODE_REGEXP);
      }, this);
      return filtered.map(function (line) {
        // Throw away eval information until we implement stacktrace.js/stackframe#8
        if (line.indexOf(' > eval') > -1) {
          line = line.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g, ':$1');
        }

        if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {
          // Safari eval frames only have function names and nothing else
          return new StackFrame({
            functionName: line
          });
        } else {
          var functionNameRegex = /((.*".+"[^@]*)?[^@]*)(?:@)/;
          var matches = line.match(functionNameRegex);
          var functionName = matches && matches[1] ? matches[1] : undefined;
          var locationParts = this.extractLocation(line.replace(functionNameRegex, ''));
          return new StackFrame({
            functionName: functionName,
            fileName: locationParts[0],
            lineNumber: locationParts[1],
            columnNumber: locationParts[2],
            source: line
          });
        }
      }, this);
    },
    parseOpera: function ErrorStackParser$$parseOpera(e) {
      if (!e.stacktrace || e.message.indexOf('\n') > -1 && e.message.split('\n').length > e.stacktrace.split('\n').length) {
        return this.parseOpera9(e);
      } else if (!e.stack) {
        return this.parseOpera10(e);
      } else {
        return this.parseOpera11(e);
      }
    },
    parseOpera9: function ErrorStackParser$$parseOpera9(e) {
      var lineRE = /Line (\d+).*script (?:in )?(\S+)/i;
      var lines = e.message.split('\n');
      var result = [];

      for (var i = 2, len = lines.length; i < len; i += 2) {
        var match = lineRE.exec(lines[i]);

        if (match) {
          result.push(new StackFrame({
            fileName: match[2],
            lineNumber: match[1],
            source: lines[i]
          }));
        }
      }

      return result;
    },
    parseOpera10: function ErrorStackParser$$parseOpera10(e) {
      var lineRE = /Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i;
      var lines = e.stacktrace.split('\n');
      var result = [];

      for (var i = 0, len = lines.length; i < len; i += 2) {
        var match = lineRE.exec(lines[i]);

        if (match) {
          result.push(new StackFrame({
            functionName: match[3] || undefined,
            fileName: match[2],
            lineNumber: match[1],
            source: lines[i]
          }));
        }
      }

      return result;
    },
    // Opera 10.65+ Error.stack very similar to FF/Safari
    parseOpera11: function ErrorStackParser$$parseOpera11(error) {
      var filtered = error.stack.split('\n').filter(function (line) {
        return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);
      }, this);
      return filtered.map(function (line) {
        var tokens = line.split('@');
        var locationParts = this.extractLocation(tokens.pop());
        var functionCall = tokens.shift() || '';
        var functionName = functionCall.replace(/<anonymous function(: (\w+))?>/, '$2').replace(/\([^\)]*\)/g, '') || undefined;
        var argsRaw;

        if (functionCall.match(/\(([^\)]*)\)/)) {
          argsRaw = functionCall.replace(/^[^\(]+\(([^\)]*)\)$/, '$1');
        }

        var args = argsRaw === undefined || argsRaw === '[arguments not available]' ? undefined : argsRaw.split(',');
        return new StackFrame({
          functionName: functionName,
          args: args,
          fileName: locationParts[0],
          lineNumber: locationParts[1],
          columnNumber: locationParts[2],
          source: line
        });
      }, this);
    }
  };
});

var _$errorStackParser_10 = _$errorStackParser_30;

// Given `err` which may be an error, does it have a stack property which is a string?
var _$hasStack_18 = function (err) {
  return !!err && (!!err.stack || !!err.stacktrace || !!err['opera#sourceloc']) && typeof (err.stack || err.stacktrace || err['opera#sourceloc']) === 'string' && err.stack !== err.name + ": " + err.message;
};

/**
 * Expose `isError`.
 */
var _$isError_31 = isError;
/**
 * Test whether `value` is error object.
 *
 * @param {*} value
 * @returns {boolean}
 */

function isError(value) {
  switch (Object.prototype.toString.call(value)) {
    case '[object Error]':
      return true;

    case '[object Exception]':
      return true;

    case '[object DOMException]':
      return true;

    default:
      return value instanceof Error;
  }
}

var _$iserror_19 = _$isError_31;

/* removed: var _$assign_11 = require('./es-utils/assign'); */;

var add = function (state, section, keyOrObj, maybeVal) {
  var _updates;

  if (!section) return;
  var updates; // addMetadata("section", null) -> clears section

  if (keyOrObj === null) return clear(state, section); // normalise the two supported input types into object form

  if (typeof keyOrObj === 'object') updates = keyOrObj;
  if (typeof keyOrObj === 'string') updates = (_updates = {}, _updates[keyOrObj] = maybeVal, _updates); // exit if we don't have an updates object at this point

  if (!updates) return; // ensure a section with this name exists

  if (!state[section]) state[section] = {}; // merge the updates with the existing section

  state[section] = _$assign_11({}, state[section], updates);
};

var get = function (state, section, key) {
  if (typeof section !== 'string') return undefined;

  if (!key) {
    return state[section];
  }

  if (state[section]) {
    return state[section][key];
  }

  return undefined;
};

var clear = function (state, section, key) {
  if (typeof section !== 'string') return; // clear an entire section

  if (!key) {
    delete state[section];
    return;
  } // clear a single value from a section


  if (state[section]) {
    delete state[section][key];
  }
};

var _$metadataDelegate_21 = {
  add: add,
  get: get,
  clear: clear
};

var _$stackGenerator_32 = {};
(function (root, factory) {
  'use strict'; // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.

  /* istanbul ignore next */

  if (typeof define === 'function' && define.amd) {
    define('stack-generator', ['stackframe'], factory);
  } else if (typeof _$stackGenerator_32 === 'object') {
    _$stackGenerator_32 = factory(_$stackframe_33);
  } else {
    root.StackGenerator = factory(root.StackFrame);
  }
})(this, function (StackFrame) {
  return {
    backtrace: function StackGenerator$$backtrace(opts) {
      var stack = [];
      var maxStackSize = 10;

      if (typeof opts === 'object' && typeof opts.maxStackSize === 'number') {
        maxStackSize = opts.maxStackSize;
      }

      var curr = arguments.callee;

      while (curr && stack.length < maxStackSize && curr['arguments']) {
        // Allow V8 optimizations
        var args = new Array(curr['arguments'].length);

        for (var i = 0; i < args.length; ++i) {
          args[i] = curr['arguments'][i];
        }

        if (/function(?:\s+([\w$]+))+\s*\(/.test(curr.toString())) {
          stack.push(new StackFrame({
            functionName: RegExp.$1 || undefined,
            args: args
          }));
        } else {
          stack.push(new StackFrame({
            args: args
          }));
        }

        try {
          curr = curr.caller;
        } catch (e) {
          break;
        }
      }

      return stack;
    }
  };
});

/* removed: var _$errorStackParser_10 = require('./lib/error-stack-parser'); */;

/* removed: var _$stackGenerator_32 = require('stack-generator'); */;

/* removed: var _$hasStack_18 = require('./lib/has-stack'); */;

/* removed: var _$map_16 = require('./lib/es-utils/map'); */;

/* removed: var _$reduce_17 = require('./lib/es-utils/reduce'); */;

/* removed: var _$filter_12 = require('./lib/es-utils/filter'); */;

/* removed: var _$assign_11 = require('./lib/es-utils/assign'); */;

/* removed: var _$metadataDelegate_21 = require('./lib/metadata-delegate'); */;

/* removed: var _$iserror_19 = require('./lib/iserror'); */;

var Event = /*#__PURE__*/function () {
  function Event(errorClass, errorMessage, stacktrace, handledState, originalError) {
    if (stacktrace === void 0) {
      stacktrace = [];
    }

    if (handledState === void 0) {
      handledState = defaultHandledState();
    }

    this.apiKey = undefined;
    this.context = undefined;
    this.groupingHash = undefined;
    this.originalError = originalError;
    this._handledState = handledState;
    this.severity = this._handledState.severity;
    this.unhandled = this._handledState.unhandled;
    this.app = {};
    this.device = {};
    this.request = {};
    this.breadcrumbs = [];
    this.threads = [];
    this._metadata = {};
    this._user = {};
    this._session = undefined;
    this.errors = [{
      errorClass: ensureString(errorClass),
      errorMessage: ensureString(errorMessage),
      type: Event.__type,
      stacktrace: _$reduce_17(stacktrace, function (accum, frame) {
        var f = formatStackframe(frame); // don't include a stackframe if none of its properties are defined

        try {
          if (JSON.stringify(f) === '{}') return accum;
          return accum.concat(f);
        } catch (e) {
          return accum;
        }
      }, [])
    }]; // Flags.
    // Note these are not initialised unless they are used
    // to save unnecessary bytes in the browser bundle

    /* this.attemptImmediateDelivery, default: true */
  }

  var _proto = Event.prototype;

  _proto.addMetadata = function addMetadata(section, keyOrObj, maybeVal) {
    return _$metadataDelegate_21.add(this._metadata, section, keyOrObj, maybeVal);
  };

  _proto.getMetadata = function getMetadata(section, key) {
    return _$metadataDelegate_21.get(this._metadata, section, key);
  };

  _proto.clearMetadata = function clearMetadata(section, key) {
    return _$metadataDelegate_21.clear(this._metadata, section, key);
  };

  _proto.getUser = function getUser() {
    return this._user;
  };

  _proto.setUser = function setUser(id, email, name) {
    this._user = {
      id: id,
      email: email,
      name: name
    };
  };

  _proto.toJSON = function toJSON() {
    return {
      payloadVersion: '4',
      exceptions: _$map_16(this.errors, function (er) {
        return _$assign_11({}, er, {
          message: er.errorMessage
        });
      }),
      severity: this.severity,
      unhandled: this._handledState.unhandled,
      severityReason: this._handledState.severityReason,
      app: this.app,
      device: this.device,
      request: this.request,
      breadcrumbs: this.breadcrumbs,
      context: this.context,
      groupingHash: this.groupingHash,
      metaData: this._metadata,
      user: this._user,
      session: this._session
    };
  };

  return Event;
}(); // takes a stacktrace.js style stackframe (https://github.com/stacktracejs/stackframe)
// and returns a Bugsnag compatible stackframe (https://docs.bugsnag.com/api/error-reporting/#json-payload)


var formatStackframe = function (frame) {
  var f = {
    file: frame.fileName,
    method: normaliseFunctionName(frame.functionName),
    lineNumber: frame.lineNumber,
    columnNumber: frame.columnNumber,
    code: undefined,
    inProject: undefined
  }; // Some instances result in no file:
  // - calling notify() from chrome's terminal results in no file/method.
  // - non-error exception thrown from global code in FF
  // This adds one.

  if (f.lineNumber > -1 && !f.file && !f.method) {
    f.file = 'global code';
  }

  return f;
};

var normaliseFunctionName = function (name) {
  return /^global code$/i.test(name) ? 'global code' : name;
};

var defaultHandledState = function () {
  return {
    unhandled: false,
    severity: 'warning',
    severityReason: {
      type: 'handledException'
    }
  };
};

var ensureString = function (str) {
  return typeof str === 'string' ? str : '';
}; // Helpers


Event.getStacktrace = function (error, errorFramesToSkip, backtraceFramesToSkip) {
  if (_$hasStack_18(error)) return _$errorStackParser_10.parse(error).slice(errorFramesToSkip); // error wasn't provided or didn't have a stacktrace so try to walk the callstack

  try {
    return _$filter_12(_$stackGenerator_32.backtrace(), function (frame) {
      return (frame.functionName || '').indexOf('StackGenerator$$') === -1;
    }).slice(1 + backtraceFramesToSkip);
  } catch (e) {
    return [];
  }
};

Event.create = function (maybeError, tolerateNonErrors, handledState, component, errorFramesToSkip, logger) {
  if (errorFramesToSkip === void 0) {
    errorFramesToSkip = 0;
  }

  var _normaliseError = normaliseError(maybeError, tolerateNonErrors, component, logger),
      error = _normaliseError[0],
      internalFrames = _normaliseError[1];

  var event;

  try {
    var stacktrace = Event.getStacktrace(error, // if an error was created/throw in the normaliseError() function, we need to
    // tell the getStacktrace() function to skip the number of frames we know will
    // be from our own functions. This is added to the number of frames deep we
    // were told about
    internalFrames > 0 ? 1 + internalFrames + errorFramesToSkip : 0, // if there's no stacktrace, the callstack may be walked to generated one.
    // this is how many frames should be removed because they come from our library
    1 + errorFramesToSkip);
    event = new Event(error.name, error.message, stacktrace, handledState, maybeError);
  } catch (e) {
    event = new Event(error.name, error.message, [], handledState, maybeError);
  }

  if (error.name === 'InvalidError') {
    event.addMetadata("" + component, 'non-error parameter', makeSerialisable(maybeError));
  }

  return event;
};

var makeSerialisable = function (err) {
  if (err === null) return 'null';
  if (err === undefined) return 'undefined';
  return err;
};

var normaliseError = function (maybeError, tolerateNonErrors, component, logger) {
  var error;
  var internalFrames = 0;

  var createAndLogInputError = function (reason) {
    if (logger) logger.warn(component + " received a non-error: \"" + reason + "\"");
    var err = new Error(component + " received a non-error. See \"" + component + "\" tab for more detail.");
    err.name = 'InvalidError';
    return err;
  }; // In some cases:
  //
  //  - the promise rejection handler (both in the browser and node)
  //  - the node uncaughtException handler
  //
  // We are really limited in what we can do to get a stacktrace. So we use the
  // tolerateNonErrors option to ensure that the resulting error communicates as
  // such.


  if (!tolerateNonErrors) {
    if (_$iserror_19(maybeError)) {
      error = maybeError;
    } else {
      error = createAndLogInputError(typeof maybeError);
      internalFrames += 2;
    }
  } else {
    switch (typeof maybeError) {
      case 'string':
      case 'number':
      case 'boolean':
        error = new Error(String(maybeError));
        internalFrames += 1;
        break;

      case 'function':
        error = createAndLogInputError('function');
        internalFrames += 2;
        break;

      case 'object':
        if (maybeError !== null && _$iserror_19(maybeError)) {
          error = maybeError;
        } else if (maybeError !== null && hasNecessaryFields(maybeError)) {
          error = new Error(maybeError.message || maybeError.errorMessage);
          error.name = maybeError.name || maybeError.errorClass;
          internalFrames += 1;
        } else {
          error = createAndLogInputError(maybeError === null ? 'null' : 'unsupported object');
          internalFrames += 2;
        }

        break;

      default:
        error = createAndLogInputError('nothing');
        internalFrames += 2;
    }
  }

  if (!_$hasStack_18(error)) {
    // in IE10/11 a new Error() doesn't have a stacktrace until you throw it, so try that here
    try {
      throw error;
    } catch (e) {
      if (_$hasStack_18(e)) {
        error = e; // if the error only got a stacktrace after we threw it here, we know it
        // will only have one extra internal frame from this function, regardless
        // of whether it went through createAndLogInputError() or not

        internalFrames = 1;
      }
    }
  }

  return [error, internalFrames];
}; // default value for stacktrace.type


Event.__type = 'browserjs';

var hasNecessaryFields = function (error) {
  return (typeof error.name === 'string' || typeof error.errorClass === 'string') && (typeof error.message === 'string' || typeof error.errorMessage === 'string');
};

var _$Event_6 = Event;

// This is a heavily modified/simplified version of
//   https://github.com/othiym23/async-some
// with the logic flipped so that it is akin to the
// synchronous "every" method instead of "some".
// run the asynchronous test function (fn) over each item in the array (arr)
// in series until:
//   - fn(item, cb) => calls cb(null, false)
//   - or the end of the array is reached
// the callback (cb) will be passed (null, false) if any of the items in arr
// caused fn to call back with false, otherwise it will be passed (null, true)
var _$asyncEvery_7 = function (arr, fn, cb) {
  var index = 0;

  var next = function () {
    if (index >= arr.length) return cb(null, true);
    fn(arr[index], function (err, result) {
      if (err) return cb(err);
      if (result === false) return cb(null, false);
      index++;
      next();
    });
  };

  next();
};

/* removed: var _$asyncEvery_7 = require('./async-every'); */;

var _$callbackRunner_9 = function (callbacks, event, onCallbackError, cb) {
  // This function is how we support different kinds of callback:
  //  - synchronous - return value
  //  - node-style async with callback - cb(err, value)
  //  - promise/thenable - resolve(value)
  // It normalises each of these into the lowest common denominator – a node-style callback
  var runMaybeAsyncCallback = function (fn, cb) {
    if (typeof fn !== 'function') return cb(null);

    try {
      // if function appears sync…
      if (fn.length !== 2) {
        var ret = fn(event); // check if it returned a "thenable" (promise)

        if (ret && typeof ret.then === 'function') {
          return ret.then( // resolve
          function (val) {
            return setTimeout(function () {
              return cb(null, val);
            });
          }, // reject
          function (err) {
            setTimeout(function () {
              onCallbackError(err);
              return cb(null, true);
            });
          });
        }

        return cb(null, ret);
      } // if function is async…


      fn(event, function (err, result) {
        if (err) {
          onCallbackError(err);
          return cb(null);
        }

        cb(null, result);
      });
    } catch (e) {
      onCallbackError(e);
      cb(null);
    }
  };

  _$asyncEvery_7(callbacks, runMaybeAsyncCallback, cb);
};

var _$syncCallbackRunner_22 = function (callbacks, callbackArg, callbackType, logger) {
  var ignore = false;
  var cbs = callbacks.slice();

  while (!ignore) {
    if (!cbs.length) break;

    try {
      ignore = cbs.pop()(callbackArg) === false;
    } catch (e) {
      logger.error("Error occurred in " + callbackType + " callback, continuing anyway\u2026");
      logger.error(e);
    }
  }

  return ignore;
};

var _$pad_28 = function pad(num, size) {
  var s = '000000000' + num;
  return s.substr(s.length - size);
};

/* removed: var _$pad_28 = require('./pad.js'); */;

var env = typeof window === 'object' ? window : self;
var globalCount = 0;

for (var prop in env) {
  if (Object.hasOwnProperty.call(env, prop)) globalCount++;
}

var mimeTypesLength = navigator.mimeTypes ? navigator.mimeTypes.length : 0;
var clientId = _$pad_28((mimeTypesLength + navigator.userAgent.length).toString(36) + globalCount.toString(36), 4);

var _$fingerprint_27 = function fingerprint() {
  return clientId;
};

/**
 * cuid.js
 * Collision-resistant UID generator for browsers and node.
 * Sequential for fast db lookups and recency sorting.
 * Safe for element IDs and server-side lookups.
 *
 * Extracted from CLCTR
 *
 * Copyright (c) Eric Elliott 2012
 * MIT License
 */
/* removed: var _$fingerprint_27 = require('./lib/fingerprint.js'); */;

/* removed: var _$pad_28 = require('./lib/pad.js'); */;

var c = 0,
    blockSize = 4,
    base = 36,
    discreteValues = Math.pow(base, blockSize);

function randomBlock() {
  return _$pad_28((Math.random() * discreteValues << 0).toString(base), blockSize);
}

function safeCounter() {
  c = c < discreteValues ? c : 0;
  c++; // this is not subliminal

  return c - 1;
}

function cuid() {
  // Starting with a lowercase letter makes
  // it HTML element ID friendly.
  var letter = 'c',
      // hard-coded allows for sequential access
  // timestamp
  // warning: this exposes the exact date and time
  // that the uid was created.
  timestamp = new Date().getTime().toString(base),
      // Prevent same-machine collisions.
  counter = _$pad_28(safeCounter().toString(base), blockSize),
      // A few chars to generate distinct ids for different
  // clients (so different computers are far less
  // likely to generate the same id)
  print = _$fingerprint_27(),
      // Grab some more chars from Math.random()
  random = randomBlock() + randomBlock();
  return letter + timestamp + counter + print + random;
}

cuid.fingerprint = _$fingerprint_27;
var _$cuid_26 = cuid;

/* removed: var _$cuid_26 = require('@bugsnag/cuid'); */;

var Session = /*#__PURE__*/function () {
  function Session() {
    this.id = _$cuid_26();
    this.startedAt = new Date();
    this._handled = 0;
    this._unhandled = 0;
    this._user = {};
    this.app = {};
    this.device = {};
  }

  var _proto = Session.prototype;

  _proto.getUser = function getUser() {
    return this._user;
  };

  _proto.setUser = function setUser(id, email, name) {
    this._user = {
      id: id,
      email: email,
      name: name
    };
  };

  _proto.toJSON = function toJSON() {
    return {
      id: this.id,
      startedAt: this.startedAt,
      events: {
        handled: this._handled,
        unhandled: this._unhandled
      }
    };
  };

  _proto._track = function _track(event) {
    this[event._handledState.unhandled ? '_unhandled' : '_handled'] += 1;
  };

  return Session;
}();

var _$Session_34 = Session;

/* removed: var _$config_5 = require('./config'); */;

/* removed: var _$Event_6 = require('./event'); */;

/* removed: var _$Breadcrumb_3 = require('./breadcrumb'); */;

/* removed: var _$Session_34 = require('./session'); */;

/* removed: var _$map_16 = require('./lib/es-utils/map'); */;

/* removed: var _$includes_13 = require('./lib/es-utils/includes'); */;

/* removed: var _$filter_12 = require('./lib/es-utils/filter'); */;

/* removed: var _$reduce_17 = require('./lib/es-utils/reduce'); */;

/* removed: var _$keys_15 = require('./lib/es-utils/keys'); */;

/* removed: var _$assign_11 = require('./lib/es-utils/assign'); */;

/* removed: var _$callbackRunner_9 = require('./lib/callback-runner'); */;

/* removed: var _$metadataDelegate_21 = require('./lib/metadata-delegate'); */;

/* removed: var _$syncCallbackRunner_22 = require('./lib/sync-callback-runner'); */;

/* removed: var _$breadcrumbTypes_8 = require('./lib/breadcrumb-types'); */;

var noop = function () {};

var Client = /*#__PURE__*/function () {
  function Client(configuration, schema, internalPlugins, notifier) {
    var _this = this;

    if (schema === void 0) {
      schema = _$config_5.schema;
    }

    if (internalPlugins === void 0) {
      internalPlugins = [];
    }

    // notifier id
    this._notifier = notifier; // intialise opts and config

    this._config = {};
    this._schema = schema; // i/o

    this._delivery = {
      sendSession: noop,
      sendEvent: noop
    };
    this._logger = {
      debug: noop,
      info: noop,
      warn: noop,
      error: noop
    }; // plugins

    this._plugins = {}; // state

    this._breadcrumbs = [];
    this._session = null;
    this._metadata = {};
    this._context = undefined;
    this._user = {}; // callbacks:
    //  e: onError
    //  s: onSession
    //  sp: onSessionPayload
    //  b: onBreadcrumb
    // (note these names are minified by hand because object
    // properties are not safe to minify automatically)

    this._cbs = {
      e: [],
      s: [],
      sp: [],
      b: []
    }; // expose internal constructors

    this.Client = Client;
    this.Event = _$Event_6;
    this.Breadcrumb = _$Breadcrumb_3;
    this.Session = _$Session_34;
    this._config = this._configure(configuration, internalPlugins);
    _$map_16(internalPlugins.concat(this._config.plugins), function (pl) {
      if (pl) _this._loadPlugin(pl);
    }); // when notify() is called we need to know how many frames are from our own source
    // this inital value is 1 not 0 because we wrap notify() to ensure it is always
    // bound to have the client as its `this` value – see below.

    this._depth = 1;
    var self = this;
    var notify = this.notify;

    this.notify = function () {
      return notify.apply(self, arguments);
    };
  }

  var _proto = Client.prototype;

  _proto.addMetadata = function addMetadata(section, keyOrObj, maybeVal) {
    return _$metadataDelegate_21.add(this._metadata, section, keyOrObj, maybeVal);
  };

  _proto.getMetadata = function getMetadata(section, key) {
    return _$metadataDelegate_21.get(this._metadata, section, key);
  };

  _proto.clearMetadata = function clearMetadata(section, key) {
    return _$metadataDelegate_21.clear(this._metadata, section, key);
  };

  _proto.getContext = function getContext() {
    return this._context;
  };

  _proto.setContext = function setContext(c) {
    this._context = c;
  };

  _proto._configure = function _configure(opts, internalPlugins) {
    var schema = _$reduce_17(internalPlugins, function (schema, plugin) {
      if (plugin && plugin.configSchema) return _$assign_11({}, schema, plugin.configSchema);
      return schema;
    }, this._schema); // accumulate configuration and error messages

    var _reduce = _$reduce_17(_$keys_15(schema), function (accum, key) {
      var defaultValue = schema[key].defaultValue(opts[key]);

      if (opts[key] !== undefined) {
        var valid = schema[key].validate(opts[key]);

        if (!valid) {
          accum.errors[key] = schema[key].message;
          accum.config[key] = defaultValue;
        } else {
          if (schema[key].allowPartialObject) {
            accum.config[key] = _$assign_11(defaultValue, opts[key]);
          } else {
            accum.config[key] = opts[key];
          }
        }
      } else {
        accum.config[key] = defaultValue;
      }

      return accum;
    }, {
      errors: {},
      config: {}
    }),
        errors = _reduce.errors,
        config = _reduce.config;

    if (schema.apiKey) {
      // missing api key is the only fatal error
      if (!config.apiKey) throw new Error('No Bugsnag API Key set'); // warn about an apikey that is not of the expected format

      if (!/^[0-9a-f]{32}$/i.test(config.apiKey)) errors.apiKey = 'should be a string of 32 hexadecimal characters';
    } // update and elevate some options


    this._metadata = _$assign_11({}, config.metadata);
    this._user = _$assign_11({}, config.user);
    this._context = config.context;
    if (config.logger) this._logger = config.logger; // add callbacks

    if (config.onError) this._cbs.e = this._cbs.e.concat(config.onError);
    if (config.onBreadcrumb) this._cbs.b = this._cbs.b.concat(config.onBreadcrumb);
    if (config.onSession) this._cbs.s = this._cbs.s.concat(config.onSession); // finally warn about any invalid config where we fell back to the default

    if (_$keys_15(errors).length) {
      this._logger.warn(generateConfigErrorMessage(errors, opts));
    }

    return config;
  };

  _proto.getUser = function getUser() {
    return this._user;
  };

  _proto.setUser = function setUser(id, email, name) {
    this._user = {
      id: id,
      email: email,
      name: name
    };
  };

  _proto._loadPlugin = function _loadPlugin(plugin) {
    var result = plugin.load(this); // JS objects are not the safest way to store arbitrarily keyed values,
    // so bookend the key with some characters that prevent tampering with
    // stuff like __proto__ etc. (only store the result if the plugin had a
    // name)

    if (plugin.name) this._plugins["~" + plugin.name + "~"] = result;
    return this;
  };

  _proto.getPlugin = function getPlugin(name) {
    return this._plugins["~" + name + "~"];
  };

  _proto._setDelivery = function _setDelivery(d) {
    this._delivery = d(this);
  };

  _proto.startSession = function startSession() {
    var session = new _$Session_34();
    session.app.releaseStage = this._config.releaseStage;
    session.app.version = this._config.appVersion;
    session.app.type = this._config.appType;
    session._user = _$assign_11({}, this._user); // run onSession callbacks

    var ignore = _$syncCallbackRunner_22(this._cbs.s, session, 'onSession', this._logger);

    if (ignore) {
      this._logger.debug('Session not started due to onSession callback');

      return this;
    }

    return this._sessionDelegate.startSession(this, session);
  };

  _proto.addOnError = function addOnError(fn, front) {
    if (front === void 0) {
      front = false;
    }

    this._cbs.e[front ? 'unshift' : 'push'](fn);
  };

  _proto.removeOnError = function removeOnError(fn) {
    this._cbs.e = _$filter_12(this._cbs.e, function (f) {
      return f !== fn;
    });
  };

  _proto._addOnSessionPayload = function _addOnSessionPayload(fn) {
    this._cbs.sp.push(fn);
  };

  _proto.addOnSession = function addOnSession(fn) {
    this._cbs.s.push(fn);
  };

  _proto.removeOnSession = function removeOnSession(fn) {
    this._cbs.s = _$filter_12(this._cbs.s, function (f) {
      return f !== fn;
    });
  };

  _proto.addOnBreadcrumb = function addOnBreadcrumb(fn, front) {
    if (front === void 0) {
      front = false;
    }

    this._cbs.b[front ? 'unshift' : 'push'](fn);
  };

  _proto.removeOnBreadcrumb = function removeOnBreadcrumb(fn) {
    this._cbs.b = _$filter_12(this._cbs.b, function (f) {
      return f !== fn;
    });
  };

  _proto.pauseSession = function pauseSession() {
    return this._sessionDelegate.pauseSession(this);
  };

  _proto.resumeSession = function resumeSession() {
    return this._sessionDelegate.resumeSession(this);
  };

  _proto.leaveBreadcrumb = function leaveBreadcrumb(message, metadata, type) {
    // coerce bad values so that the defaults get set
    message = typeof message === 'string' ? message : '';
    type = typeof type === 'string' && _$includes_13(_$breadcrumbTypes_8, type) ? type : 'manual';
    metadata = typeof metadata === 'object' && metadata !== null ? metadata : {}; // if no message, discard

    if (!message) return;
    var crumb = new _$Breadcrumb_3(message, metadata, type); // run onBreadcrumb callbacks

    var ignore = _$syncCallbackRunner_22(this._cbs.b, crumb, 'onBreadcrumb', this._logger);

    if (ignore) {
      this._logger.debug('Breadcrumb not attached due to onBreadcrumb callback');

      return;
    } // push the valid crumb onto the queue and maintain the length


    this._breadcrumbs.push(crumb);

    if (this._breadcrumbs.length > this._config.maxBreadcrumbs) {
      this._breadcrumbs = this._breadcrumbs.slice(this._breadcrumbs.length - this._config.maxBreadcrumbs);
    }
  };

  _proto._isBreadcrumbTypeEnabled = function _isBreadcrumbTypeEnabled(type) {
    var types = this._config.enabledBreadcrumbTypes;
    return types === null || _$includes_13(types, type);
  };

  _proto.notify = function notify(maybeError, onError, cb) {
    if (cb === void 0) {
      cb = noop;
    }

    var event = _$Event_6.create(maybeError, true, undefined, 'notify()', this._depth + 1, this._logger);

    this._notify(event, onError, cb);
  };

  _proto._notify = function _notify(event, onError, cb) {
    var _this2 = this;

    if (cb === void 0) {
      cb = noop;
    }

    event.app = _$assign_11({}, event.app, {
      releaseStage: this._config.releaseStage,
      version: this._config.appVersion,
      type: this._config.appType
    });
    event.context = event.context || this._context;
    event._metadata = _$assign_11({}, event._metadata, this._metadata);
    event._user = _$assign_11({}, event._user, this._user);
    event.breadcrumbs = this._breadcrumbs.slice(); // exit early if events should not be sent on the current releaseStage

    if (this._config.enabledReleaseStages !== null && !_$includes_13(this._config.enabledReleaseStages, this._config.releaseStage)) {
      this._logger.warn('Event not sent due to releaseStage/enabledReleaseStages configuration');

      return cb(null, event);
    }

    var originalSeverity = event.severity;

    var onCallbackError = function (err) {
      // errors in callbacks are tolerated but we want to log them out
      _this2._logger.error('Error occurred in onError callback, continuing anyway…');

      _this2._logger.error(err);
    };

    var callbacks = [].concat(this._cbs.e).concat(onError);
    _$callbackRunner_9(callbacks, event, onCallbackError, function (err, shouldSend) {
      if (err) onCallbackError(err);

      if (!shouldSend) {
        _this2._logger.debug('Event not sent due to onError callback');

        return cb(null, event);
      }

      if (_this2._isBreadcrumbTypeEnabled('error')) {
        // only leave a crumb for the error if actually got sent
        Client.prototype.leaveBreadcrumb.call(_this2, event.errors[0].errorClass, {
          errorClass: event.errors[0].errorClass,
          errorMessage: event.errors[0].errorMessage,
          severity: event.severity
        }, 'error');
      }

      if (originalSeverity !== event.severity) {
        event._handledState.severityReason = {
          type: 'userCallbackSetSeverity'
        };
      }

      if (event.unhandled !== event._handledState.unhandled) {
        event._handledState.severityReason.unhandledOverridden = true;
        event._handledState.unhandled = event.unhandled;
      }

      if (_this2._session) {
        _this2._session._track(event);

        event._session = _this2._session;
      }

      _this2._delivery.sendEvent({
        apiKey: event.apiKey || _this2._config.apiKey,
        notifier: _this2._notifier,
        events: [event]
      }, function (err) {
        return cb(err, event);
      });
    });
  };

  return Client;
}();

var generateConfigErrorMessage = function (errors, rawInput) {
  var er = new Error("Invalid configuration\n" + _$map_16(_$keys_15(errors), function (key) {
    return "  - " + key + " " + errors[key] + ", got " + stringify(rawInput[key]);
  }).join('\n\n'));
  return er;
};

var stringify = function (val) {
  switch (typeof val) {
    case 'string':
    case 'number':
    case 'object':
      return JSON.stringify(val);

    default:
      return String(val);
  }
};

var _$Client_4 = Client;

var _$safeJsonStringify_29 = function (data, replacer, space, opts) {
  var redactedKeys = opts && opts.redactedKeys ? opts.redactedKeys : [];
  var redactedPaths = opts && opts.redactedPaths ? opts.redactedPaths : [];
  return JSON.stringify(prepareObjForSerialization(data, redactedKeys, redactedPaths), replacer, space);
};

var MAX_DEPTH = 20;
var MAX_EDGES = 25000;
var MIN_PRESERVED_DEPTH = 8;
var REPLACEMENT_NODE = '...';

function __isError_29(o) {
  return o instanceof Error || /^\[object (Error|(Dom)?Exception)\]$/.test(Object.prototype.toString.call(o));
}

function throwsMessage(err) {
  return '[Throws: ' + (err ? err.message : '?') + ']';
}

function find(haystack, needle) {
  for (var i = 0, len = haystack.length; i < len; i++) {
    if (haystack[i] === needle) return true;
  }

  return false;
} // returns true if the string `path` starts with any of the provided `paths`


function isDescendent(paths, path) {
  for (var i = 0, len = paths.length; i < len; i++) {
    if (path.indexOf(paths[i]) === 0) return true;
  }

  return false;
}

function shouldRedact(patterns, key) {
  for (var i = 0, len = patterns.length; i < len; i++) {
    if (typeof patterns[i] === 'string' && patterns[i].toLowerCase() === key.toLowerCase()) return true;
    if (patterns[i] && typeof patterns[i].test === 'function' && patterns[i].test(key)) return true;
  }

  return false;
}

function __isArray_29(obj) {
  return Object.prototype.toString.call(obj) === '[object Array]';
}

function safelyGetProp(obj, prop) {
  try {
    return obj[prop];
  } catch (err) {
    return throwsMessage(err);
  }
}

function prepareObjForSerialization(obj, redactedKeys, redactedPaths) {
  var seen = []; // store references to objects we have seen before

  var edges = 0;

  function visit(obj, path) {
    function edgesExceeded() {
      return path.length > MIN_PRESERVED_DEPTH && edges > MAX_EDGES;
    }

    edges++;
    if (path.length > MAX_DEPTH) return REPLACEMENT_NODE;
    if (edgesExceeded()) return REPLACEMENT_NODE;
    if (obj === null || typeof obj !== 'object') return obj;
    if (find(seen, obj)) return '[Circular]';
    seen.push(obj);

    if (typeof obj.toJSON === 'function') {
      try {
        // we're not going to count this as an edge because it
        // replaces the value of the currently visited object
        edges--;
        var fResult = visit(obj.toJSON(), path);
        seen.pop();
        return fResult;
      } catch (err) {
        return throwsMessage(err);
      }
    }

    var er = __isError_29(obj);

    if (er) {
      edges--;
      var eResult = visit({
        name: obj.name,
        message: obj.message
      }, path);
      seen.pop();
      return eResult;
    }

    if (__isArray_29(obj)) {
      var aResult = [];

      for (var i = 0, len = obj.length; i < len; i++) {
        if (edgesExceeded()) {
          aResult.push(REPLACEMENT_NODE);
          break;
        }

        aResult.push(visit(obj[i], path.concat('[]')));
      }

      seen.pop();
      return aResult;
    }

    var result = {};

    try {
      for (var prop in obj) {
        if (!Object.prototype.hasOwnProperty.call(obj, prop)) continue;

        if (isDescendent(redactedPaths, path.join('.')) && shouldRedact(redactedKeys, prop)) {
          result[prop] = '[REDACTED]';
          continue;
        }

        if (edgesExceeded()) {
          result[prop] = REPLACEMENT_NODE;
          break;
        }

        result[prop] = visit(safelyGetProp(obj, prop), path.concat(prop));
      }
    } catch (e) {}

    seen.pop();
    return result;
  }

  return visit(obj, []);
}

var _$jsonPayload_20 = {};
/* removed: var _$safeJsonStringify_29 = require('@bugsnag/safe-json-stringify'); */;

var EVENT_REDACTION_PATHS = ['events.[].metaData', 'events.[].breadcrumbs.[].metaData', 'events.[].request'];

_$jsonPayload_20.event = function (event, redactedKeys) {
  var payload = _$safeJsonStringify_29(event, null, null, {
    redactedPaths: EVENT_REDACTION_PATHS,
    redactedKeys: redactedKeys
  });

  if (payload.length > 10e5) {
    event.events[0]._metadata = {
      notifier: "WARNING!\nSerialized payload was " + payload.length / 10e5 + "MB (limit = 1MB)\nmetadata was removed"
    };
    payload = _$safeJsonStringify_29(event, null, null, {
      redactedPaths: EVENT_REDACTION_PATHS,
      redactedKeys: redactedKeys
    });
    if (payload.length > 10e5) throw new Error('payload exceeded 1MB limit');
  }

  return payload;
};

_$jsonPayload_20.session = function (event, redactedKeys) {
  var payload = _$safeJsonStringify_29(event, null, null);
  if (payload.length > 10e5) throw new Error('payload exceeded 1MB limit');
  return payload;
};

var _$delivery_35 = {};
/* removed: var _$jsonPayload_20 = require('@bugsnag/core/lib/json-payload'); */;

_$delivery_35 = function (client, win) {
  if (win === void 0) {
    win = window;
  }

  return {
    sendEvent: function (event, cb) {
      if (cb === void 0) {
        cb = function () {};
      }

      var url = getApiUrl(client._config, 'notify', '4', win);
      var req = new win.XDomainRequest();

      req.onload = function () {
        cb(null);
      };

      req.open('POST', url);
      setTimeout(function () {
        try {
          req.send(_$jsonPayload_20.event(event, client._config.redactedKeys));
        } catch (e) {
          client._logger.error(e);

          cb(e);
        }
      }, 0);
    },
    sendSession: function (session, cb) {
      if (cb === void 0) {
        cb = function () {};
      }

      var url = getApiUrl(client._config, 'sessions', '1', win);
      var req = new win.XDomainRequest();

      req.onload = function () {
        cb(null);
      };

      req.open('POST', url);
      setTimeout(function () {
        try {
          req.send(_$jsonPayload_20.session(session, client._config.redactedKeys));
        } catch (e) {
          client._logger.error(e);

          cb(e);
        }
      }, 0);
    }
  };
};

var getApiUrl = function (config, endpoint, version, win) {
  // IE8 doesn't support Date.prototype.toISOstring(), but it does convert a date
  // to an ISO string when you use JSON stringify. Simply parsing the result of
  // JSON.stringify is smaller than using a toISOstring() polyfill.
  var isoDate = JSON.parse(JSON.stringify(new Date()));
  var url = matchPageProtocol(config.endpoints[endpoint], win.location.protocol);
  return url + "?apiKey=" + encodeURIComponent(config.apiKey) + "&payloadVersion=" + version + "&sentAt=" + encodeURIComponent(isoDate);
};

var matchPageProtocol = _$delivery_35._matchPageProtocol = function (endpoint, pageProtocol) {
  return pageProtocol === 'http:' ? endpoint.replace(/^https:/, 'http:') : endpoint;
};

/* removed: var _$jsonPayload_20 = require('@bugsnag/core/lib/json-payload'); */;

var _$delivery_36 = function (client, win) {
  if (win === void 0) {
    win = window;
  }

  return {
    sendEvent: function (event, cb) {
      if (cb === void 0) {
        cb = function () {};
      }

      try {
        var url = client._config.endpoints.notify;
        var req = new win.XMLHttpRequest();

        req.onreadystatechange = function () {
          if (req.readyState === win.XMLHttpRequest.DONE) cb(null);
        };

        req.open('POST', url);
        req.setRequestHeader('Content-Type', 'application/json');
        req.setRequestHeader('Bugsnag-Api-Key', event.apiKey || client._config.apiKey);
        req.setRequestHeader('Bugsnag-Payload-Version', '4');
        req.setRequestHeader('Bugsnag-Sent-At', new Date().toISOString());
        req.send(_$jsonPayload_20.event(event, client._config.redactedKeys));
      } catch (e) {
        client._logger.error(e);
      }
    },
    sendSession: function (session, cb) {
      if (cb === void 0) {
        cb = function () {};
      }

      try {
        var url = client._config.endpoints.sessions;
        var req = new win.XMLHttpRequest();

        req.onreadystatechange = function () {
          if (req.readyState === win.XMLHttpRequest.DONE) cb(null);
        };

        req.open('POST', url);
        req.setRequestHeader('Content-Type', 'application/json');
        req.setRequestHeader('Bugsnag-Api-Key', client._config.apiKey);
        req.setRequestHeader('Bugsnag-Payload-Version', '1');
        req.setRequestHeader('Bugsnag-Sent-At', new Date().toISOString());
        req.send(_$jsonPayload_20.session(session, client._config.redactedKeys));
      } catch (e) {
        client._logger.error(e);
      }
    }
  };
};

var appStart = new Date();

var reset = function () {
  appStart = new Date();
};

var _$app_37 = {
  name: 'appDuration',
  load: function (client) {
    client.addOnError(function (event) {
      var now = new Date();
      event.app.duration = now - appStart;
    }, true);
    return {
      reset: reset
    };
  }
};

/*
 * Sets the default context to be the current URL
 */
var _$context_38 = function (win) {
  if (win === void 0) {
    win = window;
  }

  return {
    load: function (client) {
      client.addOnError(function (event) {
        if (event.context !== undefined) return;
        event.context = win.location.pathname;
      }, true);
    }
  };
};

var _$pad_42 = function pad(num, size) {
  var s = '000000000' + num;
  return s.substr(s.length - size);
};

/* removed: var _$pad_42 = require('./pad.js'); */;

var __env_41 = typeof window === 'object' ? window : self;
var __globalCount_41 = 0;

for (var __prop_41 in __env_41) {
  if (Object.hasOwnProperty.call(__env_41, __prop_41)) __globalCount_41++;
}

var __mimeTypesLength_41 = navigator.mimeTypes ? navigator.mimeTypes.length : 0;
var __clientId_41 = _$pad_42((__mimeTypesLength_41 + navigator.userAgent.length).toString(36) + __globalCount_41.toString(36), 4);

var _$fingerprint_41 = function fingerprint() {
  return __clientId_41;
};

/**
 * cuid.js
 * Collision-resistant UID generator for browsers and node.
 * Sequential for fast db lookups and recency sorting.
 * Safe for element IDs and server-side lookups.
 *
 * Extracted from CLCTR
 *
 * Copyright (c) Eric Elliott 2012
 * MIT License
 */
/* removed: var _$fingerprint_41 = require('./lib/fingerprint.js'); */;

/* removed: var _$pad_42 = require('./lib/pad.js'); */;

var __c_40 = 0,
    __blockSize_40 = 4,
    __base_40 = 36,
    __discreteValues_40 = Math.pow(__base_40, __blockSize_40);

function __randomBlock_40() {
  return _$pad_42((Math.random() * __discreteValues_40 << 0).toString(__base_40), __blockSize_40);
}

function __safeCounter_40() {
  __c_40 = __c_40 < __discreteValues_40 ? __c_40 : 0;
  __c_40++; // this is not subliminal

  return __c_40 - 1;
}

function __cuid_40() {
  // Starting with a lowercase letter makes
  // it HTML element ID friendly.
  var letter = 'c',
      // hard-coded allows for sequential access
  // timestamp
  // warning: this exposes the exact date and time
  // that the uid was created.
  timestamp = new Date().getTime().toString(__base_40),
      // Prevent same-machine collisions.
  counter = _$pad_42(__safeCounter_40().toString(__base_40), __blockSize_40),
      // A few chars to generate distinct ids for different
  // clients (so different computers are far less
  // likely to generate the same id)
  print = _$fingerprint_41(),
      // Grab some more chars from Math.random()
  random = __randomBlock_40() + __randomBlock_40();
  return letter + timestamp + counter + print + random;
}

__cuid_40.fingerprint = _$fingerprint_41;
var _$cuid_40 = __cuid_40;

/* removed: var _$cuid_40 = require('@bugsnag/cuid'); */;

/* removed: var _$assign_11 = require('@bugsnag/core/lib/es-utils/assign'); */;

var BUGSNAG_ANONYMOUS_ID_KEY = 'bugsnag-anonymous-id';

var getDeviceId = function () {
  try {
    var storage = window.localStorage;
    var id = storage.getItem(BUGSNAG_ANONYMOUS_ID_KEY); // If we get an ID, make sure it looks like a valid cuid. The length can
    // fluctuate slightly, so some leeway is built in

    if (id && /^c[a-z0-9]{20,32}$/.test(id)) {
      return id;
    }

    id = _$cuid_40();
    storage.setItem(BUGSNAG_ANONYMOUS_ID_KEY, id);
    return id;
  } catch (err) {// If localStorage is not available (e.g. because it's disabled) then give up
  }
};
/*
 * Automatically detects browser device details
 */


var _$device_39 = function (nav, screen) {
  if (nav === void 0) {
    nav = navigator;
  }

  if (screen === void 0) {
    screen = window.screen;
  }

  return {
    load: function (client) {
      var device = {
        locale: nav.browserLanguage || nav.systemLanguage || nav.userLanguage || nav.language,
        userAgent: nav.userAgent
      };

      if (screen && screen.orientation && screen.orientation.type) {
        device.orientation = screen.orientation.type;
      } else {
        device.orientation = document.documentElement.clientWidth > document.documentElement.clientHeight ? 'landscape' : 'portrait';
      }

      if (client._config.generateAnonymousId) {
        device.id = getDeviceId();
      }

      client.addOnSession(function (session) {
        session.device = _$assign_11({}, session.device, device); // only set device id if collectUserIp is false

        if (!client._config.collectUserIp) setDefaultUserId(session);
      }); // add time just as the event is sent

      client.addOnError(function (event) {
        event.device = _$assign_11({}, event.device, device, {
          time: new Date()
        });
        if (!client._config.collectUserIp) setDefaultUserId(event);
      }, true);
    },
    configSchema: {
      generateAnonymousId: {
        validate: function (value) {
          return value === true || value === false;
        },
        defaultValue: function () {
          return true;
        },
        message: 'should be true|false'
      }
    }
  };
};

var setDefaultUserId = function (eventOrSession) {
  // device id is also used to populate the user id field, if it's not already set
  var user = eventOrSession.getUser();

  if (!user || !user.id) {
    eventOrSession.setUser(eventOrSession.device.id);
  }
};

/* removed: var _$assign_11 = require('@bugsnag/core/lib/es-utils/assign'); */;
/*
 * Sets the event request: { url } to be the current href
 */


var _$request_43 = function (win) {
  if (win === void 0) {
    win = window;
  }

  return {
    load: function (client) {
      client.addOnError(function (event) {
        if (event.request && event.request.url) return;
        event.request = _$assign_11({}, event.request, {
          url: win.location.href
        });
      }, true);
    }
  };
};

/* removed: var _$includes_13 = require('@bugsnag/core/lib/es-utils/includes'); */;

var _$session_44 = {
  load: function (client) {
    client._sessionDelegate = sessionDelegate;
  }
};
var sessionDelegate = {
  startSession: function (client, session) {
    var sessionClient = client;
    sessionClient._session = session;
    sessionClient._pausedSession = null; // exit early if the current releaseStage is not enabled

    if (sessionClient._config.enabledReleaseStages !== null && !_$includes_13(sessionClient._config.enabledReleaseStages, sessionClient._config.releaseStage)) {
      sessionClient._logger.warn('Session not sent due to releaseStage/enabledReleaseStages configuration');

      return sessionClient;
    }

    sessionClient._delivery.sendSession({
      notifier: sessionClient._notifier,
      device: session.device,
      app: session.app,
      sessions: [{
        id: session.id,
        startedAt: session.startedAt,
        user: session._user
      }]
    });

    return sessionClient;
  },
  resumeSession: function (client) {
    // Do nothing if there's already an active session
    if (client._session) {
      return client;
    } // If we have a paused session then make it the active session


    if (client._pausedSession) {
      client._session = client._pausedSession;
      client._pausedSession = null;
      return client;
    } // Otherwise start a new session


    return client.startSession();
  },
  pauseSession: function (client) {
    client._pausedSession = client._session;
    client._session = null;
  }
};

/* removed: var _$assign_11 = require('@bugsnag/core/lib/es-utils/assign'); */;
/*
 * Prevent collection of user IPs
 */


var _$clientIp_45 = {
  load: function (client) {
    if (client._config.collectUserIp) return;
    client.addOnError(function (event) {
      // If user.id is explicitly undefined, it will be missing from the payload. It needs
      // removing so that the following line replaces it
      if (event._user && typeof event._user.id === 'undefined') delete event._user.id;
      event._user = _$assign_11({
        id: '[REDACTED]'
      }, event._user);
      event.request = _$assign_11({
        clientIp: '[REDACTED]'
      }, event.request);
    });
  },
  configSchema: {
    collectUserIp: {
      defaultValue: function () {
        return true;
      },
      message: 'should be true|false',
      validate: function (value) {
        return value === true || value === false;
      }
    }
  }
};

var _$consoleBreadcrumbs_46 = {};
/* removed: var _$map_16 = require('@bugsnag/core/lib/es-utils/map'); */;

/* removed: var _$reduce_17 = require('@bugsnag/core/lib/es-utils/reduce'); */;

/* removed: var _$filter_12 = require('@bugsnag/core/lib/es-utils/filter'); */;
/*
 * Leaves breadcrumbs when console log methods are called
 */


_$consoleBreadcrumbs_46.load = function (client) {
  var isDev = /^(local-)?dev(elopment)?$/.test(client._config.releaseStage);
  if (isDev || !client._isBreadcrumbTypeEnabled('log')) return;
  _$map_16(CONSOLE_LOG_METHODS, function (method) {
    var original = console[method];

    console[method] = function () {
      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
        args[_key] = arguments[_key];
      }

      client.leaveBreadcrumb('Console output', _$reduce_17(args, function (accum, arg, i) {
        // do the best/simplest stringification of each argument
        var stringified = '[Unknown value]'; // this may fail if the input is:
        // - an object whose [[Prototype]] is null (no toString)
        // - an object with a broken toString or @@toPrimitive implementation

        try {
          stringified = String(arg);
        } catch (e) {} // if it stringifies to [object Object] attempt to JSON stringify


        if (stringified === '[object Object]') {
          // catch stringify errors and fallback to [object Object]
          try {
            stringified = JSON.stringify(arg);
          } catch (e) {}
        }

        accum["[" + i + "]"] = stringified;
        return accum;
      }, {
        severity: method.indexOf('group') === 0 ? 'log' : method
      }), 'log');
      original.apply(console, args);
    };

    console[method]._restore = function () {
      console[method] = original;
    };
  });
};

if ("production" !== 'production') {
  _$consoleBreadcrumbs_46.destroy = function () {
    return CONSOLE_LOG_METHODS.forEach(function (method) {
      if (typeof console[method]._restore === 'function') console[method]._restore();
    });
  };
}

var CONSOLE_LOG_METHODS = _$filter_12(['log', 'debug', 'info', 'warn', 'error'], function (method) {
  return typeof console !== 'undefined' && typeof console[method] === 'function';
});

/* removed: var _$map_16 = require('@bugsnag/core/lib/es-utils/map'); */;

/* removed: var _$reduce_17 = require('@bugsnag/core/lib/es-utils/reduce'); */;

/* removed: var _$filter_12 = require('@bugsnag/core/lib/es-utils/filter'); */;

var MAX_LINE_LENGTH = 200;
var MAX_SCRIPT_LENGTH = 500000;

var _$inlineScriptContent_47 = function (doc, win) {
  if (doc === void 0) {
    doc = document;
  }

  if (win === void 0) {
    win = window;
  }

  return {
    load: function (client) {
      if (!client._config.trackInlineScripts) return;
      var originalLocation = win.location.href;
      var html = ''; // in IE8-10 the 'interactive' state can fire too soon (before scripts have finished executing), so in those
      // we wait for the 'complete' state before assuming that synchronous scripts are no longer executing

      var isOldIe = !!doc.attachEvent;
      var DOMContentLoaded = isOldIe ? doc.readyState === 'complete' : doc.readyState !== 'loading';

      var getHtml = function () {
        return doc.documentElement.outerHTML;
      }; // get whatever HTML exists at this point in time


      html = getHtml();
      var prev = doc.onreadystatechange; // then update it when the DOM content has loaded

      doc.onreadystatechange = function () {
        // IE8 compatible alternative to document#DOMContentLoaded
        if (doc.readyState === 'interactive') {
          html = getHtml();
          DOMContentLoaded = true;
        }

        try {
          prev.apply(this, arguments);
        } catch (e) {}
      };

      var _lastScript = null;

      var updateLastScript = function (script) {
        _lastScript = script;
      };

      var getCurrentScript = function () {
        var script = doc.currentScript || _lastScript;

        if (!script && !DOMContentLoaded) {
          var scripts = doc.scripts || doc.getElementsByTagName('script');
          script = scripts[scripts.length - 1];
        }

        return script;
      };

      var addSurroundingCode = function (lineNumber) {
        // get whatever html has rendered at this point
        if (!DOMContentLoaded || !html) html = getHtml(); // simulate the raw html

        var htmlLines = ['<!-- DOC START -->'].concat(html.split('\n'));
        var zeroBasedLine = lineNumber - 1;
        var start = Math.max(zeroBasedLine - 3, 0);
        var end = Math.min(zeroBasedLine + 3, htmlLines.length);
        return _$reduce_17(htmlLines.slice(start, end), function (accum, line, i) {
          accum[start + 1 + i] = line.length <= MAX_LINE_LENGTH ? line : line.substr(0, MAX_LINE_LENGTH);
          return accum;
        }, {});
      };

      client.addOnError(function (event) {
        // remove any of our own frames that may be part the stack this
        // happens before the inline script check as it happens for all errors
        event.errors[0].stacktrace = _$filter_12(event.errors[0].stacktrace, function (f) {
          return !/__trace__$/.test(f.method);
        });
        var frame = event.errors[0].stacktrace[0]; // if frame.file exists and is not the original location of the page, this can't be an inline script

        if (frame && frame.file && frame.file.replace(/#.*$/, '') !== originalLocation.replace(/#.*$/, '')) return; // grab the last script known to have run

        var currentScript = getCurrentScript();

        if (currentScript) {
          var content = currentScript.innerHTML;
          event.addMetadata('script', 'content', content.length <= MAX_SCRIPT_LENGTH ? content : content.substr(0, MAX_SCRIPT_LENGTH)); // only attempt to grab some surrounding code if we have a line number

          if (frame && frame.lineNumber) {
            frame.code = addSurroundingCode(frame.lineNumber);
          }
        }
      }, true); // Proxy all the timer functions whose callback is their 0th argument.
      // Keep a reference to the original setTimeout because we need it later

      var _map = _$map_16(['setTimeout', 'setInterval', 'setImmediate', 'requestAnimationFrame'], function (fn) {
        return __proxy(win, fn, function (original) {
          return __traceOriginalScript(original, function (args) {
            return {
              get: function () {
                return args[0];
              },
              replace: function (fn) {
                args[0] = fn;
              }
            };
          });
        });
      }),
          _setTimeout = _map[0]; // Proxy all the host objects whose prototypes have an addEventListener function


      _$map_16(['EventTarget', 'Window', 'Node', 'ApplicationCache', 'AudioTrackList', 'ChannelMergerNode', 'CryptoOperation', 'EventSource', 'FileReader', 'HTMLUnknownElement', 'IDBDatabase', 'IDBRequest', 'IDBTransaction', 'KeyOperation', 'MediaController', 'MessagePort', 'ModalWindow', 'Notification', 'SVGElementInstance', 'Screen', 'TextTrack', 'TextTrackCue', 'TextTrackList', 'WebSocket', 'WebSocketWorker', 'Worker', 'XMLHttpRequest', 'XMLHttpRequestEventTarget', 'XMLHttpRequestUpload'], function (o) {
        if (!win[o] || !win[o].prototype || !Object.prototype.hasOwnProperty.call(win[o].prototype, 'addEventListener')) return;

        __proxy(win[o].prototype, 'addEventListener', function (original) {
          return __traceOriginalScript(original, eventTargetCallbackAccessor);
        });

        __proxy(win[o].prototype, 'removeEventListener', function (original) {
          return __traceOriginalScript(original, eventTargetCallbackAccessor, true);
        });
      });

      function __traceOriginalScript(fn, callbackAccessor, alsoCallOriginal) {
        if (alsoCallOriginal === void 0) {
          alsoCallOriginal = false;
        }

        return function () {
          // this is required for removeEventListener to remove anything added with
          // addEventListener before the functions started being wrapped by Bugsnag
          var args = [].slice.call(arguments);

          try {
            var cba = callbackAccessor(args);
            var cb = cba.get();
            if (alsoCallOriginal) fn.apply(this, args);
            if (typeof cb !== 'function') return fn.apply(this, args);

            if (cb.__trace__) {
              cba.replace(cb.__trace__);
            } else {
              var script = getCurrentScript(); // this function mustn't be annonymous due to a bug in the stack
              // generation logic, meaning it gets tripped up
              // see: https://github.com/stacktracejs/stack-generator/issues/6

              cb.__trace__ = function __trace__() {
                // set the script that called this function
                updateLastScript(script); // immediately unset the currentScript synchronously below, however
                // if this cb throws an error the line after will not get run so schedule
                // an almost-immediate aysnc update too

                _setTimeout(function () {
                  updateLastScript(null);
                }, 0);

                var ret = cb.apply(this, arguments);
                updateLastScript(null);
                return ret;
              };

              cb.__trace__.__trace__ = cb.__trace__;
              cba.replace(cb.__trace__);
            }
          } catch (e) {// swallow these errors on Selenium:
            // Permission denied to access property '__trace__'
            // WebDriverException: Message: Permission denied to access property "handleEvent"
          } // IE8 doesn't let you call .apply() on setTimeout/setInterval


          if (fn.apply) return fn.apply(this, args);

          switch (args.length) {
            case 1:
              return fn(args[0]);

            case 2:
              return fn(args[0], args[1]);

            default:
              return fn();
          }
        };
      }
    },
    configSchema: {
      trackInlineScripts: {
        validate: function (value) {
          return value === true || value === false;
        },
        defaultValue: function () {
          return true;
        },
        message: 'should be true|false'
      }
    }
  };
};

function __proxy(host, name, replacer) {
  var original = host[name];
  if (!original) return original;
  var replacement = replacer(original);
  host[name] = replacement;
  return original;
}

function eventTargetCallbackAccessor(args) {
  var isEventHandlerObj = !!args[1] && typeof args[1].handleEvent === 'function';
  return {
    get: function () {
      return isEventHandlerObj ? args[1].handleEvent : args[1];
    },
    replace: function (fn) {
      if (isEventHandlerObj) {
        args[1].handleEvent = fn;
      } else {
        args[1] = fn;
      }
    }
  };
}

/*
 * Leaves breadcrumbs when the user interacts with the DOM
 */
var _$interactionBreadcrumbs_48 = function (win) {
  if (win === void 0) {
    win = window;
  }

  return {
    load: function (client) {
      if (!('addEventListener' in win)) return;
      if (!client._isBreadcrumbTypeEnabled('user')) return;
      win.addEventListener('click', function (event) {
        var targetText, targetSelector;

        try {
          targetText = getNodeText(event.target);
          targetSelector = getNodeSelector(event.target, win);
        } catch (e) {
          targetText = '[hidden]';
          targetSelector = '[hidden]';

          client._logger.error('Cross domain error when tracking click event. See docs: https://tinyurl.com/yy3rn63z');
        }

        client.leaveBreadcrumb('UI click', {
          targetText: targetText,
          targetSelector: targetSelector
        }, 'user');
      }, true);
    }
  };
}; // extract text content from a element


var getNodeText = function (el) {
  var text = el.textContent || el.innerText || '';
  if (!text && (el.type === 'submit' || el.type === 'button')) text = el.value;
  text = text.replace(/^\s+|\s+$/g, ''); // trim whitespace

  return truncate(text, 140);
}; // Create a label from tagname, id and css class of the element


function getNodeSelector(el, win) {
  var parts = [el.tagName];
  if (el.id) parts.push('#' + el.id);
  if (el.className && el.className.length) parts.push("." + el.className.split(' ').join('.')); // Can't get much more advanced with the current browser

  if (!win.document.querySelectorAll || !Array.prototype.indexOf) return parts.join('');

  try {
    if (win.document.querySelectorAll(parts.join('')).length === 1) return parts.join('');
  } catch (e) {
    // Sometimes the query selector can be invalid just return it as-is
    return parts.join('');
  } // try to get a more specific selector if this one matches more than one element


  if (el.parentNode.childNodes.length > 1) {
    var index = Array.prototype.indexOf.call(el.parentNode.childNodes, el) + 1;
    parts.push(":nth-child(" + index + ")");
  }

  if (win.document.querySelectorAll(parts.join('')).length === 1) return parts.join(''); // try prepending the parent node selector

  if (el.parentNode) return getNodeSelector(el.parentNode, win) + " > " + parts.join('');
  return parts.join('');
}

function truncate(value, length) {
  var ommision = '(...)';
  if (value && value.length <= length) return value;
  return value.slice(0, length - ommision.length) + ommision;
}

var _$navigationBreadcrumbs_49 = {};
/*
* Leaves breadcrumbs when navigation methods are called or events are emitted
*/
_$navigationBreadcrumbs_49 = function (win) {
  if (win === void 0) {
    win = window;
  }

  var plugin = {
    load: function (client) {
      if (!('addEventListener' in win)) return;
      if (!client._isBreadcrumbTypeEnabled('navigation')) return; // returns a function that will drop a breadcrumb with a given name

      var drop = function (name) {
        return function () {
          return client.leaveBreadcrumb(name, {}, 'navigation');
        };
      }; // simple drops – just names, no meta


      win.addEventListener('pagehide', drop('Page hidden'), true);
      win.addEventListener('pageshow', drop('Page shown'), true);
      win.addEventListener('load', drop('Page loaded'), true);
      win.document.addEventListener('DOMContentLoaded', drop('DOMContentLoaded'), true); // some browsers like to emit popstate when the page loads, so only add the popstate listener after that

      win.addEventListener('load', function () {
        return win.addEventListener('popstate', drop('Navigated back'), true);
      }); // hashchange has some metadata that we care about

      win.addEventListener('hashchange', function (event) {
        var metadata = event.oldURL ? {
          from: relativeLocation(event.oldURL, win),
          to: relativeLocation(event.newURL, win),
          state: getCurrentState(win)
        } : {
          to: relativeLocation(win.location.href, win)
        };
        client.leaveBreadcrumb('Hash changed', metadata, 'navigation');
      }, true); // the only way to know about replaceState/pushState is to wrap them… >_<

      if (win.history.replaceState) wrapHistoryFn(client, win.history, 'replaceState', win);
      if (win.history.pushState) wrapHistoryFn(client, win.history, 'pushState', win);
    }
  };

  if ("production" !== 'production') {
    plugin.destroy = function (win) {
      if (win === void 0) {
        win = window;
      }

      win.history.replaceState._restore();

      win.history.pushState._restore();
    };
  }

  return plugin;
};

if ("production" !== 'production') {
  _$navigationBreadcrumbs_49.destroy = function (win) {
    if (win === void 0) {
      win = window;
    }

    win.history.replaceState._restore();

    win.history.pushState._restore();
  };
} // takes a full url like http://foo.com:1234/pages/01.html?yes=no#section-2 and returns
// just the path and hash parts, e.g. /pages/01.html?yes=no#section-2


var relativeLocation = function (url, win) {
  var a = win.document.createElement('A');
  a.href = url;
  return "" + a.pathname + a.search + a.hash;
};

var stateChangeToMetadata = function (win, state, title, url) {
  var currentPath = relativeLocation(win.location.href, win);
  return {
    title: title,
    state: state,
    prevState: getCurrentState(win),
    to: url || currentPath,
    from: currentPath
  };
};

var wrapHistoryFn = function (client, target, fn, win) {
  var orig = target[fn];

  target[fn] = function (state, title, url) {
    client.leaveBreadcrumb("History " + fn, stateChangeToMetadata(win, state, title, url), 'navigation'); // if throttle plugin is in use, reset the event sent count

    if (typeof client.resetEventCount === 'function') client.resetEventCount(); // if the client is operating in auto session-mode, a new route should trigger a new session

    if (client._config.autoTrackSessions) client.startSession(); // Internet Explorer will convert `undefined` to a string when passed, causing an unintended redirect
    // to '/undefined'. therefore we only pass the url if it's not undefined.

    orig.apply(target, [state, title].concat(url !== undefined ? url : []));
  };

  if ("production" !== 'production') {
    target[fn]._restore = function () {
      target[fn] = orig;
    };
  }
};

var getCurrentState = function (win) {
  try {
    return win.history.state;
  } catch (e) {}
};

var BREADCRUMB_TYPE = 'request'; // keys to safely store metadata on the request object

var REQUEST_SETUP_KEY = 'BS~~S';
var REQUEST_URL_KEY = 'BS~~U';
var REQUEST_METHOD_KEY = 'BS~~M';

/* removed: var _$includes_13 = require('@bugsnag/core/lib/es-utils/includes'); */;
/*
 * Leaves breadcrumbs when network requests occur
 */


var _$networkBreadcrumbs_50 = function (_ignoredUrls, win) {
  if (_ignoredUrls === void 0) {
    _ignoredUrls = [];
  }

  if (win === void 0) {
    win = window;
  }

  var restoreFunctions = [];
  var plugin = {
    load: function (client) {
      if (!client._isBreadcrumbTypeEnabled('request')) return;
      var ignoredUrls = [client._config.endpoints.notify, client._config.endpoints.sessions].concat(_ignoredUrls);
      monkeyPatchXMLHttpRequest();
      monkeyPatchFetch(); // XMLHttpRequest monkey patch

      function monkeyPatchXMLHttpRequest() {
        if (!('addEventListener' in win.XMLHttpRequest.prototype)) return;
        var nativeOpen = win.XMLHttpRequest.prototype.open; // override native open()

        win.XMLHttpRequest.prototype.open = function open(method, url) {
          // store url and HTTP method for later
          this[REQUEST_URL_KEY] = url;
          this[REQUEST_METHOD_KEY] = method; // if we have already setup listeners, it means open() was called twice, we need to remove
          // the listeners and recreate them

          if (this[REQUEST_SETUP_KEY]) {
            this.removeEventListener('load', handleXHRLoad);
            this.removeEventListener('error', handleXHRError);
          } // attach load event listener


          this.addEventListener('load', handleXHRLoad); // attach error event listener

          this.addEventListener('error', handleXHRError);
          this[REQUEST_SETUP_KEY] = true;
          nativeOpen.apply(this, arguments);
        };

        if ("production" !== 'production') {
          restoreFunctions.push(function () {
            win.XMLHttpRequest.prototype.open = nativeOpen;
          });
        }
      }

      function handleXHRLoad() {
        if (_$includes_13(ignoredUrls, this[REQUEST_URL_KEY].replace(/\?.*$/, ''))) {
          // don't leave a network breadcrumb from bugsnag notify calls
          return;
        }

        var metadata = {
          status: this.status,
          request: this[REQUEST_METHOD_KEY] + " " + this[REQUEST_URL_KEY]
        };

        if (this.status >= 400) {
          // contacted server but got an error response
          client.leaveBreadcrumb('XMLHttpRequest failed', metadata, BREADCRUMB_TYPE);
        } else {
          client.leaveBreadcrumb('XMLHttpRequest succeeded', metadata, BREADCRUMB_TYPE);
        }
      }

      function handleXHRError() {
        if (_$includes_13(ignoredUrls, this[REQUEST_URL_KEY].replace(/\?.*$/, ''))) {
          // don't leave a network breadcrumb from bugsnag notify calls
          return;
        } // failed to contact server


        client.leaveBreadcrumb('XMLHttpRequest error', {
          request: this[REQUEST_METHOD_KEY] + " " + this[REQUEST_URL_KEY]
        }, BREADCRUMB_TYPE);
      } // window.fetch monkey patch


      function monkeyPatchFetch() {
        // only patch it if it exists and if it is not a polyfill (patching a polyfilled
        // fetch() results in duplicate breadcrumbs for the same request because the
        // implementation uses XMLHttpRequest which is also patched)
        if (!('fetch' in win) || win.fetch.polyfill) return;
        var oldFetch = win.fetch;

        win.fetch = function fetch() {
          var _arguments = arguments;
          var urlOrRequest = arguments[0];
          var options = arguments[1];
          var method;
          var url = null;

          if (urlOrRequest && typeof urlOrRequest === 'object') {
            url = urlOrRequest.url;

            if (options && 'method' in options) {
              method = options.method;
            } else if (urlOrRequest && 'method' in urlOrRequest) {
              method = urlOrRequest.method;
            }
          } else {
            url = urlOrRequest;

            if (options && 'method' in options) {
              method = options.method;
            }
          }

          if (method === undefined) {
            method = 'GET';
          }

          return new Promise(function (resolve, reject) {
            // pass through to native fetch
            oldFetch.apply(void 0, _arguments).then(function (response) {
              handleFetchSuccess(response, method, url);
              resolve(response);
            })["catch"](function (error) {
              handleFetchError(method, url);
              reject(error);
            });
          });
        };

        if ("production" !== 'production') {
          restoreFunctions.push(function () {
            win.fetch = oldFetch;
          });
        }
      }

      var handleFetchSuccess = function (response, method, url) {
        var metadata = {
          status: response.status,
          request: method + " " + url
        };

        if (response.status >= 400) {
          // when the request comes back with a 4xx or 5xx status it does not reject the fetch promise,
          client.leaveBreadcrumb('fetch() failed', metadata, BREADCRUMB_TYPE);
        } else {
          client.leaveBreadcrumb('fetch() succeeded', metadata, BREADCRUMB_TYPE);
        }
      };

      var handleFetchError = function (method, url) {
        client.leaveBreadcrumb('fetch() error', {
          request: method + " " + url
        }, BREADCRUMB_TYPE);
      };
    }
  };

  if ("production" !== 'production') {
    plugin.destroy = function () {
      restoreFunctions.forEach(function (fn) {
        return fn();
      });
      restoreFunctions = [];
    };
  }

  return plugin;
};

/* removed: var _$intRange_23 = require('@bugsnag/core/lib/validators/int-range'); */;
/*
 * Throttles and dedupes events
 */


var _$throttle_51 = {
  load: function (client) {
    // track sent events for each init of the plugin
    var n = 0; // add onError hook

    client.addOnError(function (event) {
      // have max events been sent already?
      if (n >= client._config.maxEvents) return false;
      n++;
    });

    client.resetEventCount = function () {
      n = 0;
    };
  },
  configSchema: {
    maxEvents: {
      defaultValue: function () {
        return 10;
      },
      message: 'should be a positive integer ≤100',
      validate: function (val) {
        return _$intRange_23(1, 100)(val);
      }
    }
  }
};

var _$stripQueryString_52 = {};
/*
 * Remove query strings (and fragments) from stacktraces
 */
/* removed: var _$map_16 = require('@bugsnag/core/lib/es-utils/map'); */;

/* removed: var _$reduce_17 = require('@bugsnag/core/lib/es-utils/reduce'); */;

_$stripQueryString_52 = {
  load: function (client) {
    client.addOnError(function (event) {
      var allFrames = _$reduce_17(event.errors, function (accum, er) {
        return accum.concat(er.stacktrace);
      }, []);
      _$map_16(allFrames, function (frame) {
        frame.file = strip(frame.file);
      });
    });
  }
};

var strip = _$stripQueryString_52._strip = function (str) {
  return typeof str === 'string' ? str.replace(/\?.*$/, '').replace(/#.*$/, '') : str;
};

/*
 * Automatically notifies Bugsnag when window.onerror is called
 */
var _$onerror_53 = function (win) {
  if (win === void 0) {
    win = window;
  }

  return {
    load: function (client) {
      if (!client._config.autoDetectErrors) return;
      if (!client._config.enabledErrorTypes.unhandledExceptions) return;

      function onerror(messageOrEvent, url, lineNo, charNo, error) {
        // Ignore errors with no info due to CORS settings
        if (lineNo === 0 && /Script error\.?/.test(messageOrEvent)) {
          client._logger.warn('Ignoring cross-domain or eval script error. See docs: https://tinyurl.com/yy3rn63z');
        } else {
          // any error sent to window.onerror is unhandled and has severity=error
          var handledState = {
            severity: 'error',
            unhandled: true,
            severityReason: {
              type: 'unhandledException'
            }
          };
          var event; // window.onerror can be called in a number of ways. This big if-else is how we
          // figure out which arguments were supplied, and what kind of values it received.

          if (error) {
            // if the last parameter (error) was supplied, this is a modern browser's
            // way of saying "this value was thrown and not caught"
            event = client.Event.create(error, true, handledState, 'window onerror', 1);
            decorateStack(event.errors[0].stacktrace, url, lineNo, charNo);
          } else if ( // This complex case detects "error" events that are typically synthesised
          // by jquery's trigger method (although can be created in other ways). In
          // order to detect this:
          // - the first argument (message) must exist and be an object (most likely it's a jQuery event)
          // - the second argument (url) must either not exist or be something other than a string (if it
          //    exists and is not a string, it'll be the extraParameters argument from jQuery's trigger()
          //    function)
          // - the third, fourth and fifth arguments must not exist (lineNo, charNo and error)
          typeof messageOrEvent === 'object' && messageOrEvent !== null && (!url || typeof url !== 'string') && !lineNo && !charNo && !error) {
            // The jQuery event may have a "type" property, if so use it as part of the error message
            var name = messageOrEvent.type ? "Event: " + messageOrEvent.type : 'Error'; // attempt to find a message from one of the conventional properties, but
            // default to empty string (the event will fill it with a placeholder)

            var message = messageOrEvent.message || messageOrEvent.detail || '';
            event = client.Event.create({
              name: name,
              message: message
            }, true, handledState, 'window onerror', 1); // provide the original thing onerror received – not our error-like object we passed to _notify

            event.originalError = messageOrEvent; // include the raw input as metadata – it might contain more info than we extracted

            event.addMetadata('window onerror', {
              event: messageOrEvent,
              extraParameters: url
            });
          } else {
            // Lastly, if there was no "error" parameter this event was probably from an old
            // browser that doesn't support that. Instead we need to generate a stacktrace.
            event = client.Event.create(messageOrEvent, true, handledState, 'window onerror', 1);
            decorateStack(event.errors[0].stacktrace, url, lineNo, charNo);
          }

          client._notify(event);
        }

        if (typeof prevOnError === 'function') prevOnError.apply(this, arguments);
      }

      var prevOnError = win.onerror;
      win.onerror = onerror;
    }
  };
}; // Sometimes the stacktrace has less information than was passed to window.onerror.
// This function will augment the first stackframe with any useful info that was
// received as arguments to the onerror callback.


var decorateStack = function (stack, url, lineNo, charNo) {
  if (!stack[0]) stack.push({});
  var culprit = stack[0];
  if (!culprit.file && typeof url === 'string') culprit.file = url;
  if (!culprit.lineNumber && isActualNumber(lineNo)) culprit.lineNumber = lineNo;

  if (!culprit.columnNumber) {
    if (isActualNumber(charNo)) {
      culprit.columnNumber = charNo;
    } else if (window.event && isActualNumber(window.event.errorCharacter)) {
      culprit.columnNumber = window.event.errorCharacter;
    }
  }
};

var isActualNumber = function (n) {
  return typeof n === 'number' && String.call(n) !== 'NaN';
};

/* removed: var _$map_16 = require('@bugsnag/core/lib/es-utils/map'); */;

/* removed: var _$iserror_19 = require('@bugsnag/core/lib/iserror'); */;

var _listener;
/*
 * Automatically notifies Bugsnag when window.onunhandledrejection is called
 */


var _$unhandledRejection_54 = function (win) {
  if (win === void 0) {
    win = window;
  }

  var plugin = {
    load: function (client) {
      if (!client._config.autoDetectErrors || !client._config.enabledErrorTypes.unhandledRejections) return;

      var listener = function (evt) {
        var error = evt.reason;
        var isBluebird = false; // accessing properties on evt.detail can throw errors (see #394)

        try {
          if (evt.detail && evt.detail.reason) {
            error = evt.detail.reason;
            isBluebird = true;
          }
        } catch (e) {}

        var event = client.Event.create(error, false, {
          severity: 'error',
          unhandled: true,
          severityReason: {
            type: 'unhandledPromiseRejection'
          }
        }, 'unhandledrejection handler', 1, client._logger);

        if (isBluebird) {
          _$map_16(event.errors[0].stacktrace, fixBluebirdStacktrace(error));
        }

        client._notify(event, function (event) {
          if (_$iserror_19(event.originalError) && !event.originalError.stack) {
            var _event$addMetadata;

            event.addMetadata('unhandledRejection handler', (_event$addMetadata = {}, _event$addMetadata[Object.prototype.toString.call(event.originalError)] = {
              name: event.originalError.name,
              message: event.originalError.message,
              code: event.originalError.code
            }, _event$addMetadata));
          }
        });
      };

      if ('addEventListener' in win) {
        win.addEventListener('unhandledrejection', listener);
      } else {
        win.onunhandledrejection = function (reason, promise) {
          listener({
            detail: {
              reason: reason,
              promise: promise
            }
          });
        };
      }

      _listener = listener;
    }
  };

  if ("production" !== 'production') {
    plugin.destroy = function (win) {
      if (win === void 0) {
        win = window;
      }

      if (_listener) {
        if ('addEventListener' in win) {
          win.removeEventListener('unhandledrejection', _listener);
        } else {
          win.onunhandledrejection = null;
        }
      }

      _listener = null;
    };
  }

  return plugin;
}; // The stack parser on bluebird stacks in FF get a suprious first frame:
//
// Error: derp
//   b@http://localhost:5000/bluebird.html:22:24
//   a@http://localhost:5000/bluebird.html:18:9
//   @http://localhost:5000/bluebird.html:14:9
//
// results in
//   […]
//     0: Object { file: "Error: derp", method: undefined, lineNumber: undefined, … }
//     1: Object { file: "http://localhost:5000/bluebird.html", method: "b", lineNumber: 22, … }
//     2: Object { file: "http://localhost:5000/bluebird.html", method: "a", lineNumber: 18, … }
//     3: Object { file: "http://localhost:5000/bluebird.html", lineNumber: 14, columnNumber: 9, … }
//
// so the following reduce/accumulator function removes such frames
//
// Bluebird pads method names with spaces so trim that too…
// https://github.com/petkaantonov/bluebird/blob/b7f21399816d02f979fe434585334ce901dcaf44/src/debuggability.js#L568-L571


var fixBluebirdStacktrace = function (error) {
  return function (frame) {
    if (frame.file === error.toString()) return;

    if (frame.method) {
      frame.method = frame.method.replace(/^\s+/, '');
    }
  };
};

var _$notifier_2 = {};
var name = 'Bugsnag JavaScript';
var version = '7.11.0';
var url = 'https://github.com/bugsnag/bugsnag-js';

/* removed: var _$Client_4 = require('@bugsnag/core/client'); */;

/* removed: var _$Event_6 = require('@bugsnag/core/event'); */;

/* removed: var _$Session_34 = require('@bugsnag/core/session'); */;

/* removed: var _$Breadcrumb_3 = require('@bugsnag/core/breadcrumb'); */;

/* removed: var _$map_16 = require('@bugsnag/core/lib/es-utils/map'); */;

/* removed: var _$keys_15 = require('@bugsnag/core/lib/es-utils/keys'); */;

/* removed: var _$assign_11 = require('@bugsnag/core/lib/es-utils/assign'); */; // extend the base config schema with some browser-specific options


var __schema_2 = _$assign_11({}, _$config_5.schema, _$config_1);

/* removed: var _$onerror_53 = require('@bugsnag/plugin-window-onerror'); */;

/* removed: var _$unhandledRejection_54 = require('@bugsnag/plugin-window-unhandled-rejection'); */;

/* removed: var _$app_37 = require('@bugsnag/plugin-app-duration'); */;

/* removed: var _$device_39 = require('@bugsnag/plugin-browser-device'); */;

/* removed: var _$context_38 = require('@bugsnag/plugin-browser-context'); */;

/* removed: var _$request_43 = require('@bugsnag/plugin-browser-request'); */;

/* removed: var _$throttle_51 = require('@bugsnag/plugin-simple-throttle'); */;

/* removed: var _$consoleBreadcrumbs_46 = require('@bugsnag/plugin-console-breadcrumbs'); */;

/* removed: var _$networkBreadcrumbs_50 = require('@bugsnag/plugin-network-breadcrumbs'); */;

/* removed: var _$navigationBreadcrumbs_49 = require('@bugsnag/plugin-navigation-breadcrumbs'); */;

/* removed: var _$interactionBreadcrumbs_48 = require('@bugsnag/plugin-interaction-breadcrumbs'); */;

/* removed: var _$inlineScriptContent_47 = require('@bugsnag/plugin-inline-script-content'); */;

/* removed: var _$session_44 = require('@bugsnag/plugin-browser-session'); */;

/* removed: var _$clientIp_45 = require('@bugsnag/plugin-client-ip'); */;

/* removed: var _$stripQueryString_52 = require('@bugsnag/plugin-strip-query-string'); */; // delivery mechanisms


/* removed: var _$delivery_35 = require('@bugsnag/delivery-x-domain-request'); */;

/* removed: var _$delivery_36 = require('@bugsnag/delivery-xml-http-request'); */;

var Bugsnag = {
  _client: null,
  createClient: function (opts) {
    // handle very simple use case where user supplies just the api key as a string
    if (typeof opts === 'string') opts = {
      apiKey: opts
    };
    if (!opts) opts = {};
    var internalPlugins = [// add browser-specific plugins
    _$app_37, _$device_39(), _$context_38(), _$request_43(), _$throttle_51, _$session_44, _$clientIp_45, _$stripQueryString_52, _$onerror_53(), _$unhandledRejection_54(), _$navigationBreadcrumbs_49(), _$interactionBreadcrumbs_48(), _$networkBreadcrumbs_50(), _$consoleBreadcrumbs_46, // this one added last to avoid wrapping functionality before bugsnag uses it
    _$inlineScriptContent_47()]; // configure a client with user supplied options

    var bugsnag = new _$Client_4(opts, __schema_2, internalPlugins, {
      name: name,
      version: version,
      url: url
    }); // set delivery based on browser capability (IE 8+9 have an XDomainRequest object)

    bugsnag._setDelivery(window.XDomainRequest ? _$delivery_35 : _$delivery_36);

    bugsnag._logger.debug('Loaded!');

    bugsnag.leaveBreadcrumb('Bugsnag loaded', {}, 'state');
    return bugsnag._config.autoTrackSessions ? bugsnag.startSession() : bugsnag;
  },
  start: function (opts) {
    if (Bugsnag._client) {
      Bugsnag._client._logger.warn('Bugsnag.start() was called more than once. Ignoring.');

      return Bugsnag._client;
    }

    Bugsnag._client = Bugsnag.createClient(opts);
    return Bugsnag._client;
  }
};
_$map_16(['resetEventCount'].concat(_$keys_15(_$Client_4.prototype)), function (m) {
  if (/^_/.test(m)) return;

  Bugsnag[m] = function () {
    if (!Bugsnag._client) return console.log("Bugsnag." + m + "() was called before Bugsnag.start()");
    Bugsnag._client._depth += 1;

    var ret = Bugsnag._client[m].apply(Bugsnag._client, arguments);

    Bugsnag._client._depth -= 1;
    return ret;
  };
});
_$notifier_2 = Bugsnag;
_$notifier_2.Client = _$Client_4;
_$notifier_2.Event = _$Event_6;
_$notifier_2.Session = _$Session_34;
_$notifier_2.Breadcrumb = _$Breadcrumb_3; // Export a "default" property for compatibility with ESM imports

_$notifier_2["default"] = Bugsnag;

return _$notifier_2;

});
//# sourceMappingURL=bugsnag.js.map

Spamworldpro Mini