resolver/path.js
function normalizeStringPosix(path, allowAboveRoot) {
	var res = '';
	var lastSlash = -1;
	var dots = 0;
	var code;
	for (var i = 0; i <= path.length; ++i) {
		if (i < path.length) code = path.charCodeAt(i);else if (code === 47 /*/*/) break;else code = 47 /*/*/;
		if (code === 47 /*/*/) {
				if (lastSlash === i - 1 || dots === 1) {
					// NOOP
				} else if (lastSlash !== i - 1 && dots === 2) {
						if (res.length < 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {
								if (res.length > 2) {
									var start = res.length - 1;
									var j = start;
									for (; j >= 0; --j) {
										if (res.charCodeAt(j) === 47 /*/*/) break;
									}
									if (j !== start) {
										if (j === -1) res = '';else res = res.slice(0, j);
										lastSlash = i;
										dots = 0;
										continue;
									}
								} else if (res.length === 2 || res.length === 1) {
									res = '';
									lastSlash = i;
									dots = 0;
									continue;
								}
							}
						if (allowAboveRoot) {
							if (res.length > 0) res += '/..';else res = '..';
						}
					} else {
						if (res.length > 0) res += '/' + path.slice(lastSlash + 1, i);else res = path.slice(lastSlash + 1, i);
					}
				lastSlash = i;
				dots = 0;
			} else if (code === 46 /*.*/ && dots !== -1) {
			++dots;
		} else {
			dots = -1;
		}
	}
	return res;
}
function normalizeStringPosix(path, allowAboveRoot) {
	var res = '';
	var lastSlash = -1;
	var dots = 0;
	var code;
	for (var i = 0; i <= path.length; ++i) {
		if (i < path.length) code = path.charCodeAt(i);else if (code === 47 /*/*/) break;else code = 47 /*/*/;
		if (code === 47 /*/*/) {
				if (lastSlash === i - 1 || dots === 1) {
					// NOOP
				} else if (lastSlash !== i - 1 && dots === 2) {
						if (res.length < 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {
								if (res.length > 2) {
									var start = res.length - 1;
									var j = start;
									for (; j >= 0; --j) {
										if (res.charCodeAt(j) === 47 /*/*/) break;
									}
									if (j !== start) {
										if (j === -1) res = '';else res = res.slice(0, j);
										lastSlash = i;
										dots = 0;
										continue;
									}
								} else if (res.length === 2 || res.length === 1) {
									res = '';
									lastSlash = i;
									dots = 0;
									continue;
								}
							}
						if (allowAboveRoot) {
							if (res.length > 0) res += '/..';else res = '..';
						}
					} else {
						if (res.length > 0) res += '/' + path.slice(lastSlash + 1, i);else res = path.slice(lastSlash + 1, i);
					}
				lastSlash = i;
				dots = 0;
			} else if (code === 46 /*.*/ && dots !== -1) {
			++dots;
		} else {
			dots = -1;
		}
	}
	return res;
}
Resolves . and .. elements in a path with directory names