code: function merge(/* object, sources */) {
  	var lastSource = arguments[arguments.length - 1];
  	if (
  		typeof lastSource === 'function' ||
  		(
  			arguments.length > 2 &&
  			Array.isArray(lastSource) &&
  			lastSource.indexOf(arguments[1]) >= 0
  		)
  	) {
  		return mergeHeavy.apply(null, arguments);
  	} else {
  		return mergeLight.apply(null, arguments);
  	}
  }
docs: Merges n objects together.
  
  @method merge
  @static
  @param {Object} object - the destination object
  @param {Object} sources - the source object
  @param {Function} customizer - the function to customize merging properties
  If provided, customizer is invoked to produce the merged values of the destination and source
  properties. If customizer returns undefined, merging is handled by the method instead.
  @param {Mixed} customizer.objectValue - the value at `key` in the base object
  @param {Mixed} customizer.sourceValue - the value at `key` in the source object
  @param {Mixed} customizer.key - the key currently being merged
  @param {Mixed} customizer.object - the base object
  @param {Mixed} customizer.source - the source object
  @return {Object} - the merged object