docs: function deepAssign(target, source) {
  	//if they aren't both objects, use target if it is defined (null/0/false/etc. are OK), otherwise use source
  	if (!(target && source && typeof target==='object' && typeof source==='object')) {
  		return typeof target !== 'undefined' ? target : source;
  	}
  
  	let out = assign({}, target);
  	for (let i in source) {
  		if (source.hasOwnProperty(i)) {
  			out[i] = deepAssign(target[i], source[i]);
  		}
  	}
  	return out;
  }