code: function mergeHeavy(object, ...sources) {
  	var customizer, lastSource = sources[sources.length - 1];
  	var source;
  	if (typeof lastSource === 'function') {
  		customizer = sources.pop();
  		lastSource = sources[sources.length - 1];
  	}
  	// check if merge is being used w/ map, reduce or similar
  	if (sources.length > 1 && _.isArray(lastSource) && lastSource.indexOf(sources[0]) >= 0) {
  		baseMergeHeavy(object, sources[0], customizer);
  	} else {
  		for (source of sources) {
  			baseMergeHeavy(object, source, customizer);
  		}
  	}
  	return object;
  }
docs: This is the "heavy" version of `merge()`, which is significantly less performant than
  the light version, but supports customizers and being used as a lodash iterator.
  
  @method mergeHeavy
  @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