var isFunction = require('./isFunction'),

isMasked = require('./_isMasked'),
isObject = require('./isObject'),
toSource = require('./_toSource');

/**

* Used to match `RegExp`
* [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
*/

var reRegExpChar = /[\^$.*+?()[]{}|]/g;

/** Used to detect host constructors (Safari). */ var reIsHostCtor = /^[object .+?Constructor]$/;

/** Used for built-in method references. */ var funcProto = Function.prototype,

objectProto = Object.prototype;

/** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString;

/** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty;

/** Used to detect if a method is native. */ var reIsNative = RegExp('^' +

funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'

);

/**

* The base implementation of `_.isNative` without bad shim checks.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a native function,
*  else `false`.
*/

function baseIsNative(value) {

if (!isObject(value) || isMasked(value)) {
  return false;
}
var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
return pattern.test(toSource(value));

}

module.exports = baseIsNative;