var hasOwn = Object.prototype.hasOwnProperty;
var objToStr = Object.prototype.toString;
var objStr = objToStr.call({});

function isPlainObject(value) {
  return objToStr.call(value) === objStr;
}
exports.isPlainObject = isPlainObject;

exports.shallowObjEqual = function(a, b) {
  if (a === b) {
    return true;
  }

  if (! isPlainObject(a) ||
      ! isPlainObject(b)) {
    return false;
  }

  var aKeys = Object.keys(a);
  var bKeys = Object.keys(b);

  if (aKeys.length !== bKeys.length) {
    return false;
  }

  return aKeys.every(function (key) {
    return hasOwn.call(b, key) &&
      a[key] === b[key];
  });
};

exports.getNamesFromPattern = function (pattern) {
  var queue = [pattern];
  var names = [];

  for (var i = 0; i < queue.length; ++i) {
    var pattern = queue[i];
    if (! pattern) {
      continue;
    }

    switch (pattern.type) {
    case "Identifier":
      names.push(pattern.name);
      break;
    case "Property":
    case "ObjectProperty":
      queue.push(pattern.value);
      break;
    case "AssignmentPattern":
      queue.push(pattern.left);
      break;
    case "ObjectPattern":
      queue.push.apply(queue, pattern.properties);
      break;
    case "ArrayPattern":
      queue.push.apply(queue, pattern.elements);
      break;
    case "RestElement":
      queue.push(pattern.argument);
      break;
    }
  }

  return names;
};

@@ -1,50 +1,4 @@
-var hasOwn = Object.prototype.hasOwnProperty;%0A
 var 
@@ -188,399 +188,8 @@
 t;%0A%0A
-exports.shallowObjEqual = function(a, b) %7B%0A  if (a === b) %7B%0A    return true;%0A  %7D%0A%0A  if (! isPlainObject(a) %7C%7C%0A      ! isPlainObject(b)) %7B%0A    return false;%0A  %7D%0A%0A  var aKeys = Object.keys(a);%0A  var bKeys = Object.keys(b);%0A%0A  if (aKeys.length !== bKeys.length) %7B%0A    return false;%0A  %7D%0A%0A  return aKeys.every(function (key) %7B%0A    return hasOwn.call(b, key) &&%0A      a%5Bkey%5D === b%5Bkey%5D;%0A  %7D);%0A%7D;%0A%0A
 expo

Remove unused utils.shallowObjEqual helper function.