function baseMergeDeep$1(object, source, key, srcIndex, mergeFunc, customizer, stack) {
  var objValue = object[key],
      srcValue = source[key],
      stacked = stack.get(srcValue);

  if (stacked) {
    assignMergeValue$2(object, key, stacked);
    return;
  }
  var newValue = customizer
    ? customizer(objValue, srcValue, (key + ''), object, source, stack)
    : undefined;

  var isCommon = newValue === undefined;

  if (isCommon) {
    var isArr = isArray$14(srcValue),
        isBuff = !isArr && isBuffer$3(srcValue),
        isTyped = !isArr && !isBuff && isTypedArray$3(srcValue);

    newValue = srcValue;
    if (isArr || isBuff || isTyped) {
      if (isArray$14(objValue)) {
        newValue = objValue;
      }
      else if (isArrayLikeObject(objValue)) {
        newValue = copyArray$2(objValue);
      }
      else if (isBuff) {
        isCommon = false;
        newValue = cloneBuffer$1(srcValue, true);
      }
      else if (isTyped) {
        isCommon = false;
        newValue = cloneTypedArray$2(srcValue, true);
      }
      else {
        newValue = [];
      }
    }
    else if (isPlainObject(srcValue) || isArguments$3(srcValue)) {
      newValue = objValue;
      if (isArguments$3(objValue)) {
        newValue = toPlainObject(objValue);
      }
      else if (!isObject$9(objValue) || (srcIndex && isFunction$4(objValue))) {
        newValue = initCloneObject$2(srcValue);
      }
    }
    else {
      isCommon = false;
    }
  }
  if (isCommon) {
    // Recursively merge objects and arrays (susceptible to call stack limits).
    stack.set(srcValue, newValue);
    mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
    stack['delete'](srcValue);
  }
  assignMergeValue$2(object, key, newValue);
}
/**
 * A specialized version of `baseMerge` for arrays and objects which performs
 * deep merges and tracks traversed objects enabling objects with circular
 * references to be merged.
 *
 * @private
 * @param {Object} object The destination object.
 * @param {Object} source The source object.
 * @param {string} key The key of the value to merge.
 * @param {number} srcIndex The index of `source`.
 * @param {Function} mergeFunc The function to merge values.
 * @param {Function} [customizer] The function to customize assigned values.
 * @param {Object} [stack] Tracks traversed source values and their merged
 *  counterparts.
 */
A specialized version of `baseMerge` for arrays and objects which performs
deep merges and tracks traversed objects enabling objects with circular
references to be merged.

@private
@param {Object} object The destination object.
@param {Object} source The source object.
@param {string} key The key of the value to merge.
@param {number} srcIndex The index of `source`.
@param {Function} mergeFunc The function to merge values.
@param {Function} [customizer] The function to customize assigned values.
@param {Object} [stack] Tracks traversed source values and their merged
counterparts.
A specialized version of ` baseMerge ` for arrays and objects which performs deep merges and tracks traversed objects enabling objects with circular references to be merged . @private @param { Object } object The destination object . @param { Object } source The source object . @param { string } key The key of the value to merge . @param { number } srcIndex The index of ` source ` . @param { Function } mergeFunc The function to merge values . @param { Function } [ customizer ] The function to customize assigned values . @param { Object } [ stack ] Tracks traversed source values and their merged counterparts .
function baseMergeDeep$1(object, source, key, srcIndex, mergeFunc, customizer, stack) {
  var objValue = object[key],
      srcValue = source[key],
      stacked = stack.get(srcValue);
  if (stacked) {
    assignMergeValue$2(object, key, stacked);
    return;
  }
  var newValue = customizer
    ? customizer(objValue, srcValue, (key + ''), object, source, stack)
    : undefined;
  var isCommon = newValue === undefined;
  if (isCommon) {
    var isArr = isArray$14(srcValue),
        isBuff = !isArr && isBuffer$3(srcValue),
        isTyped = !isArr && !isBuff && isTypedArray$3(srcValue);
    newValue = srcValue;
    if (isArr || isBuff || isTyped) {
      if (isArray$14(objValue)) {
        newValue = objValue;
      }
      else if (isArrayLikeObject(objValue)) {
        newValue = copyArray$2(objValue);
      }
      else if (isBuff) {
        isCommon = false;
        newValue = cloneBuffer$1(srcValue, true);
      }
      else if (isTyped) {
        isCommon = false;
        newValue = cloneTypedArray$2(srcValue, true);
      }
      else {
        newValue = [];
      }
    }
    else if (isPlainObject(srcValue) || isArguments$3(srcValue)) {
      newValue = objValue;
      if (isArguments$3(objValue)) {
        newValue = toPlainObject(objValue);
      }
      else if (!isObject$9(objValue) || (srcIndex && isFunction$4(objValue))) {
        newValue = initCloneObject$2(srcValue);
      }
    }
    else {
      isCommon = false;
    }
  }
  if (isCommon) {
    stack.set(srcValue, newValue);
    mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
    stack['delete'](srcValue);
  }
  assignMergeValue$2(object, key, newValue);
}
function baseMergeDeep$1 ( object , source , key , srcIndex , mergeFunc , customizer , stack ) { var objValue = object [ key ] , srcValue = source [ key ] , stacked = stack . get ( srcValue ) ; if ( stacked ) { assignMergeValue$2 ( object , key , stacked ) ; return ; } var newValue = customizer ? customizer ( objValue , srcValue , ( key + '' ) , object , source , stack ) : undefined ; var isCommon = newValue === undefined ; if ( isCommon ) { var isArr = isArray$14 ( srcValue ) , isBuff = ! isArr && isBuffer$3 ( srcValue ) , isTyped = ! isArr && ! isBuff && isTypedArray$3 ( srcValue ) ; newValue = srcValue ; if ( isArr || isBuff || isTyped ) { if ( isArray$14 ( objValue ) ) { newValue = objValue ; } else if ( isArrayLikeObject ( objValue ) ) { newValue = copyArray$2 ( objValue ) ; } else if ( isBuff ) { isCommon = false ; newValue = cloneBuffer$1 ( srcValue , true ) ; } else if ( isTyped ) { isCommon = false ; newValue = cloneTypedArray$2 ( srcValue , true ) ; } else { newValue = [ ] ; } } else if ( isPlainObject ( srcValue ) || isArguments$3 ( srcValue ) ) { newValue = objValue ; if ( isArguments$3 ( objValue ) ) { newValue = toPlainObject ( objValue ) ; } else if ( ! isObject$9 ( objValue ) || ( srcIndex && isFunction$4 ( objValue ) ) ) { newValue = initCloneObject$2 ( srcValue ) ; } } else { isCommon = false ; } } if ( isCommon ) { stack . set ( srcValue , newValue ) ; mergeFunc ( newValue , srcValue , srcIndex , customizer , stack ) ; stack [ 'delete' ] ( srcValue ) ; } assignMergeValue$2 ( object , key , newValue ) ; }
A specialized version of `baseMerge` for arrays and objects which performs
 deep merges and tracks traversed objects enabling objects with circular
 references to be merged.
A specialized version of ` baseMerge ` for arrays and objects which performs deep merges and tracks traversed objects enabling objects with circular references to be merged .
// Recursively merge objects and arrays (susceptible to call stack limits).