docs: function deepCopy(source) {
  	let result;
  	let type = typeof source;
  	if (type !== 'object' || source === null) {
  		result = source;
  	} else if (source instanceof Array) {
  		result = [];
  		for (let i = 0, l = source.length; i < l; i++) {
  			result[i] = typeof source[i] === 'object' ? deepCopy(source[i]) : source[i];
  		}
  	} else {
  		result = {};
  		for (let k in source) {
  			result[k] = typeof source[k] === 'object' ? deepCopy(source[k]) : source[k];
  		}
  	}
  	return result;
  }