text: define([], function() {
      // Joins path segments.  Preserves initial "/" and resolves ".." and "."
      // Does not support using ".." to go above/outside the root.
      // This means that join("foo", "../../bar") will not resolve to "../bar"
      function join(/* path segments */) {
          // Split the inputs into a list of path commands.
          var parts = [];
          for (var i = 0, l = arguments.length; i < l; i++) {
              parts = parts.concat(arguments[i].split("/"));
          }
          // Interpret the path commands to get the new resolved path.
          var newParts = [];
          for (i = 0, l = parts.length; i < l; i++) {
              var part = parts[i];
              // Remove leading and trailing slashes
              // Also remove "." segments
              if (!part || part === ".") continue;
              // Interpret ".." to pop the last segment
              if (part === "..") newParts.pop();
              // Push new path segments.
              else newParts.push(part);
          }
          // Preserve the initial slash if there was one.
          if (parts[0] === "") newParts.unshift("");
          // Turn back into a single string path.
          return newParts.join("/") || (newParts.length ? "/" : ".");
      }
       
      // A simple function to get the dirname of a path
      // Trailing slashes are ignored. Leading slash is preserved.
      function dirname(path) {
          return join(path, "..");
      }
  
      // test if a path or url is absolute
      function isAbsolute(path) {
          if (!path) return false;
  
          return (path[0] == "/" || path.indexOf("http://") == 0 || path.indexOf("https://") == 0);
      }
  
      return {
          dirname: dirname,
          join: join,
          isAbsolute: isAbsolute
      };
  })