code: function matchRoutes(routes, location, callback, remainingPathname) {
    var paramNames = arguments.length <= 4 || arguments[4] === undefined ? [] : arguments[4];
    var paramValues = arguments.length <= 5 || arguments[5] === undefined ? [] : arguments[5];
  
    if (remainingPathname === undefined) {
      // TODO: This is a little bit ugly, but it works around a quirk in history
      // that strips the leading slash from pathnames when using basenames with
      // trailing slashes.
      if (location.pathname.charAt(0) !== '/') {
        location = _extends({}, location, {
          pathname: '/' + location.pathname
        });
      }
      remainingPathname = location.pathname;
    }
  
    (0, _AsyncUtils.loopAsync)(routes.length, function (index, next, done) {
      matchRouteDeep(routes[index], location, remainingPathname, paramNames, paramValues, function (error, match) {
        if (error || match) {
          done(error, match);
        } else {
          next();
        }
      });
    }, callback);
  }
docs: Asynchronously matches the given location to a set of routes and calls
  callback(error, state) when finished. The state object will have the
  following properties:
  
  - routes       An array of routes that matched, in hierarchical order
  - params       An object of URL parameters
  
  Note: This operation may finish synchronously if no routes have an
  asynchronous getChildRoutes method.