| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048 | 
							- 'use strict';
 
- // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
 
- require('../modules/es.string.iterator');
 
- var $ = require('../internals/export');
 
- var DESCRIPTORS = require('../internals/descriptors');
 
- var USE_NATIVE_URL = require('../internals/url-constructor-detection');
 
- var global = require('../internals/global');
 
- var bind = require('../internals/function-bind-context');
 
- var uncurryThis = require('../internals/function-uncurry-this');
 
- var defineBuiltIn = require('../internals/define-built-in');
 
- var defineBuiltInAccessor = require('../internals/define-built-in-accessor');
 
- var anInstance = require('../internals/an-instance');
 
- var hasOwn = require('../internals/has-own-property');
 
- var assign = require('../internals/object-assign');
 
- var arrayFrom = require('../internals/array-from');
 
- var arraySlice = require('../internals/array-slice-simple');
 
- var codeAt = require('../internals/string-multibyte').codeAt;
 
- var toASCII = require('../internals/string-punycode-to-ascii');
 
- var $toString = require('../internals/to-string');
 
- var setToStringTag = require('../internals/set-to-string-tag');
 
- var validateArgumentsLength = require('../internals/validate-arguments-length');
 
- var URLSearchParamsModule = require('../modules/web.url-search-params.constructor');
 
- var InternalStateModule = require('../internals/internal-state');
 
- var setInternalState = InternalStateModule.set;
 
- var getInternalURLState = InternalStateModule.getterFor('URL');
 
- var URLSearchParams = URLSearchParamsModule.URLSearchParams;
 
- var getInternalSearchParamsState = URLSearchParamsModule.getState;
 
- var NativeURL = global.URL;
 
- var TypeError = global.TypeError;
 
- var parseInt = global.parseInt;
 
- var floor = Math.floor;
 
- var pow = Math.pow;
 
- var charAt = uncurryThis(''.charAt);
 
- var exec = uncurryThis(/./.exec);
 
- var join = uncurryThis([].join);
 
- var numberToString = uncurryThis(1.0.toString);
 
- var pop = uncurryThis([].pop);
 
- var push = uncurryThis([].push);
 
- var replace = uncurryThis(''.replace);
 
- var shift = uncurryThis([].shift);
 
- var split = uncurryThis(''.split);
 
- var stringSlice = uncurryThis(''.slice);
 
- var toLowerCase = uncurryThis(''.toLowerCase);
 
- var unshift = uncurryThis([].unshift);
 
- var INVALID_AUTHORITY = 'Invalid authority';
 
- var INVALID_SCHEME = 'Invalid scheme';
 
- var INVALID_HOST = 'Invalid host';
 
- var INVALID_PORT = 'Invalid port';
 
- var ALPHA = /[a-z]/i;
 
- // eslint-disable-next-line regexp/no-obscure-range -- safe
 
- var ALPHANUMERIC = /[\d+-.a-z]/i;
 
- var DIGIT = /\d/;
 
- var HEX_START = /^0x/i;
 
- var OCT = /^[0-7]+$/;
 
- var DEC = /^\d+$/;
 
- var HEX = /^[\da-f]+$/i;
 
- /* eslint-disable regexp/no-control-character -- safe */
 
- var FORBIDDEN_HOST_CODE_POINT = /[\0\t\n\r #%/:<>?@[\\\]^|]/;
 
- var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\0\t\n\r #/:<>?@[\\\]^|]/;
 
- var LEADING_C0_CONTROL_OR_SPACE = /^[\u0000-\u0020]+/;
 
- var TRAILING_C0_CONTROL_OR_SPACE = /(^|[^\u0000-\u0020])[\u0000-\u0020]+$/;
 
- var TAB_AND_NEW_LINE = /[\t\n\r]/g;
 
- /* eslint-enable regexp/no-control-character -- safe */
 
- var EOF;
 
- // https://url.spec.whatwg.org/#ipv4-number-parser
 
- var parseIPv4 = function (input) {
 
-   var parts = split(input, '.');
 
-   var partsLength, numbers, index, part, radix, number, ipv4;
 
-   if (parts.length && parts[parts.length - 1] === '') {
 
-     parts.length--;
 
-   }
 
-   partsLength = parts.length;
 
-   if (partsLength > 4) return input;
 
-   numbers = [];
 
-   for (index = 0; index < partsLength; index++) {
 
-     part = parts[index];
 
-     if (part === '') return input;
 
-     radix = 10;
 
-     if (part.length > 1 && charAt(part, 0) === '0') {
 
-       radix = exec(HEX_START, part) ? 16 : 8;
 
-       part = stringSlice(part, radix === 8 ? 1 : 2);
 
-     }
 
-     if (part === '') {
 
-       number = 0;
 
-     } else {
 
-       if (!exec(radix === 10 ? DEC : radix === 8 ? OCT : HEX, part)) return input;
 
-       number = parseInt(part, radix);
 
-     }
 
-     push(numbers, number);
 
-   }
 
-   for (index = 0; index < partsLength; index++) {
 
-     number = numbers[index];
 
-     if (index === partsLength - 1) {
 
-       if (number >= pow(256, 5 - partsLength)) return null;
 
-     } else if (number > 255) return null;
 
-   }
 
-   ipv4 = pop(numbers);
 
-   for (index = 0; index < numbers.length; index++) {
 
-     ipv4 += numbers[index] * pow(256, 3 - index);
 
-   }
 
-   return ipv4;
 
- };
 
- // https://url.spec.whatwg.org/#concept-ipv6-parser
 
- // eslint-disable-next-line max-statements -- TODO
 
- var parseIPv6 = function (input) {
 
-   var address = [0, 0, 0, 0, 0, 0, 0, 0];
 
-   var pieceIndex = 0;
 
-   var compress = null;
 
-   var pointer = 0;
 
-   var value, length, numbersSeen, ipv4Piece, number, swaps, swap;
 
-   var chr = function () {
 
-     return charAt(input, pointer);
 
-   };
 
-   if (chr() === ':') {
 
-     if (charAt(input, 1) !== ':') return;
 
-     pointer += 2;
 
-     pieceIndex++;
 
-     compress = pieceIndex;
 
-   }
 
-   while (chr()) {
 
-     if (pieceIndex === 8) return;
 
-     if (chr() === ':') {
 
-       if (compress !== null) return;
 
-       pointer++;
 
-       pieceIndex++;
 
-       compress = pieceIndex;
 
-       continue;
 
-     }
 
-     value = length = 0;
 
-     while (length < 4 && exec(HEX, chr())) {
 
-       value = value * 16 + parseInt(chr(), 16);
 
-       pointer++;
 
-       length++;
 
-     }
 
-     if (chr() === '.') {
 
-       if (length === 0) return;
 
-       pointer -= length;
 
-       if (pieceIndex > 6) return;
 
-       numbersSeen = 0;
 
-       while (chr()) {
 
-         ipv4Piece = null;
 
-         if (numbersSeen > 0) {
 
-           if (chr() === '.' && numbersSeen < 4) pointer++;
 
-           else return;
 
-         }
 
-         if (!exec(DIGIT, chr())) return;
 
-         while (exec(DIGIT, chr())) {
 
-           number = parseInt(chr(), 10);
 
-           if (ipv4Piece === null) ipv4Piece = number;
 
-           else if (ipv4Piece === 0) return;
 
-           else ipv4Piece = ipv4Piece * 10 + number;
 
-           if (ipv4Piece > 255) return;
 
-           pointer++;
 
-         }
 
-         address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;
 
-         numbersSeen++;
 
-         if (numbersSeen === 2 || numbersSeen === 4) pieceIndex++;
 
-       }
 
-       if (numbersSeen !== 4) return;
 
-       break;
 
-     } else if (chr() === ':') {
 
-       pointer++;
 
-       if (!chr()) return;
 
-     } else if (chr()) return;
 
-     address[pieceIndex++] = value;
 
-   }
 
-   if (compress !== null) {
 
-     swaps = pieceIndex - compress;
 
-     pieceIndex = 7;
 
-     while (pieceIndex !== 0 && swaps > 0) {
 
-       swap = address[pieceIndex];
 
-       address[pieceIndex--] = address[compress + swaps - 1];
 
-       address[compress + --swaps] = swap;
 
-     }
 
-   } else if (pieceIndex !== 8) return;
 
-   return address;
 
- };
 
- var findLongestZeroSequence = function (ipv6) {
 
-   var maxIndex = null;
 
-   var maxLength = 1;
 
-   var currStart = null;
 
-   var currLength = 0;
 
-   var index = 0;
 
-   for (; index < 8; index++) {
 
-     if (ipv6[index] !== 0) {
 
-       if (currLength > maxLength) {
 
-         maxIndex = currStart;
 
-         maxLength = currLength;
 
-       }
 
-       currStart = null;
 
-       currLength = 0;
 
-     } else {
 
-       if (currStart === null) currStart = index;
 
-       ++currLength;
 
-     }
 
-   }
 
-   if (currLength > maxLength) {
 
-     maxIndex = currStart;
 
-     maxLength = currLength;
 
-   }
 
-   return maxIndex;
 
- };
 
- // https://url.spec.whatwg.org/#host-serializing
 
- var serializeHost = function (host) {
 
-   var result, index, compress, ignore0;
 
-   // ipv4
 
-   if (typeof host == 'number') {
 
-     result = [];
 
-     for (index = 0; index < 4; index++) {
 
-       unshift(result, host % 256);
 
-       host = floor(host / 256);
 
-     } return join(result, '.');
 
-   // ipv6
 
-   } else if (typeof host == 'object') {
 
-     result = '';
 
-     compress = findLongestZeroSequence(host);
 
-     for (index = 0; index < 8; index++) {
 
-       if (ignore0 && host[index] === 0) continue;
 
-       if (ignore0) ignore0 = false;
 
-       if (compress === index) {
 
-         result += index ? ':' : '::';
 
-         ignore0 = true;
 
-       } else {
 
-         result += numberToString(host[index], 16);
 
-         if (index < 7) result += ':';
 
-       }
 
-     }
 
-     return '[' + result + ']';
 
-   } return host;
 
- };
 
- var C0ControlPercentEncodeSet = {};
 
- var fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {
 
-   ' ': 1, '"': 1, '<': 1, '>': 1, '`': 1
 
- });
 
- var pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {
 
-   '#': 1, '?': 1, '{': 1, '}': 1
 
- });
 
- var userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {
 
-   '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\': 1, ']': 1, '^': 1, '|': 1
 
- });
 
- var percentEncode = function (chr, set) {
 
-   var code = codeAt(chr, 0);
 
-   return code > 0x20 && code < 0x7F && !hasOwn(set, chr) ? chr : encodeURIComponent(chr);
 
- };
 
- // https://url.spec.whatwg.org/#special-scheme
 
- var specialSchemes = {
 
-   ftp: 21,
 
-   file: null,
 
-   http: 80,
 
-   https: 443,
 
-   ws: 80,
 
-   wss: 443
 
- };
 
- // https://url.spec.whatwg.org/#windows-drive-letter
 
- var isWindowsDriveLetter = function (string, normalized) {
 
-   var second;
 
-   return string.length === 2 && exec(ALPHA, charAt(string, 0))
 
-     && ((second = charAt(string, 1)) === ':' || (!normalized && second === '|'));
 
- };
 
- // https://url.spec.whatwg.org/#start-with-a-windows-drive-letter
 
- var startsWithWindowsDriveLetter = function (string) {
 
-   var third;
 
-   return string.length > 1 && isWindowsDriveLetter(stringSlice(string, 0, 2)) && (
 
-     string.length === 2 ||
 
-     ((third = charAt(string, 2)) === '/' || third === '\\' || third === '?' || third === '#')
 
-   );
 
- };
 
- // https://url.spec.whatwg.org/#single-dot-path-segment
 
- var isSingleDot = function (segment) {
 
-   return segment === '.' || toLowerCase(segment) === '%2e';
 
- };
 
- // https://url.spec.whatwg.org/#double-dot-path-segment
 
- var isDoubleDot = function (segment) {
 
-   segment = toLowerCase(segment);
 
-   return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';
 
- };
 
- // States:
 
- var SCHEME_START = {};
 
- var SCHEME = {};
 
- var NO_SCHEME = {};
 
- var SPECIAL_RELATIVE_OR_AUTHORITY = {};
 
- var PATH_OR_AUTHORITY = {};
 
- var RELATIVE = {};
 
- var RELATIVE_SLASH = {};
 
- var SPECIAL_AUTHORITY_SLASHES = {};
 
- var SPECIAL_AUTHORITY_IGNORE_SLASHES = {};
 
- var AUTHORITY = {};
 
- var HOST = {};
 
- var HOSTNAME = {};
 
- var PORT = {};
 
- var FILE = {};
 
- var FILE_SLASH = {};
 
- var FILE_HOST = {};
 
- var PATH_START = {};
 
- var PATH = {};
 
- var CANNOT_BE_A_BASE_URL_PATH = {};
 
- var QUERY = {};
 
- var FRAGMENT = {};
 
- var URLState = function (url, isBase, base) {
 
-   var urlString = $toString(url);
 
-   var baseState, failure, searchParams;
 
-   if (isBase) {
 
-     failure = this.parse(urlString);
 
-     if (failure) throw new TypeError(failure);
 
-     this.searchParams = null;
 
-   } else {
 
-     if (base !== undefined) baseState = new URLState(base, true);
 
-     failure = this.parse(urlString, null, baseState);
 
-     if (failure) throw new TypeError(failure);
 
-     searchParams = getInternalSearchParamsState(new URLSearchParams());
 
-     searchParams.bindURL(this);
 
-     this.searchParams = searchParams;
 
-   }
 
- };
 
- URLState.prototype = {
 
-   type: 'URL',
 
-   // https://url.spec.whatwg.org/#url-parsing
 
-   // eslint-disable-next-line max-statements -- TODO
 
-   parse: function (input, stateOverride, base) {
 
-     var url = this;
 
-     var state = stateOverride || SCHEME_START;
 
-     var pointer = 0;
 
-     var buffer = '';
 
-     var seenAt = false;
 
-     var seenBracket = false;
 
-     var seenPasswordToken = false;
 
-     var codePoints, chr, bufferCodePoints, failure;
 
-     input = $toString(input);
 
-     if (!stateOverride) {
 
-       url.scheme = '';
 
-       url.username = '';
 
-       url.password = '';
 
-       url.host = null;
 
-       url.port = null;
 
-       url.path = [];
 
-       url.query = null;
 
-       url.fragment = null;
 
-       url.cannotBeABaseURL = false;
 
-       input = replace(input, LEADING_C0_CONTROL_OR_SPACE, '');
 
-       input = replace(input, TRAILING_C0_CONTROL_OR_SPACE, '$1');
 
-     }
 
-     input = replace(input, TAB_AND_NEW_LINE, '');
 
-     codePoints = arrayFrom(input);
 
-     while (pointer <= codePoints.length) {
 
-       chr = codePoints[pointer];
 
-       switch (state) {
 
-         case SCHEME_START:
 
-           if (chr && exec(ALPHA, chr)) {
 
-             buffer += toLowerCase(chr);
 
-             state = SCHEME;
 
-           } else if (!stateOverride) {
 
-             state = NO_SCHEME;
 
-             continue;
 
-           } else return INVALID_SCHEME;
 
-           break;
 
-         case SCHEME:
 
-           if (chr && (exec(ALPHANUMERIC, chr) || chr === '+' || chr === '-' || chr === '.')) {
 
-             buffer += toLowerCase(chr);
 
-           } else if (chr === ':') {
 
-             if (stateOverride && (
 
-               (url.isSpecial() !== hasOwn(specialSchemes, buffer)) ||
 
-               (buffer === 'file' && (url.includesCredentials() || url.port !== null)) ||
 
-               (url.scheme === 'file' && !url.host)
 
-             )) return;
 
-             url.scheme = buffer;
 
-             if (stateOverride) {
 
-               if (url.isSpecial() && specialSchemes[url.scheme] === url.port) url.port = null;
 
-               return;
 
-             }
 
-             buffer = '';
 
-             if (url.scheme === 'file') {
 
-               state = FILE;
 
-             } else if (url.isSpecial() && base && base.scheme === url.scheme) {
 
-               state = SPECIAL_RELATIVE_OR_AUTHORITY;
 
-             } else if (url.isSpecial()) {
 
-               state = SPECIAL_AUTHORITY_SLASHES;
 
-             } else if (codePoints[pointer + 1] === '/') {
 
-               state = PATH_OR_AUTHORITY;
 
-               pointer++;
 
-             } else {
 
-               url.cannotBeABaseURL = true;
 
-               push(url.path, '');
 
-               state = CANNOT_BE_A_BASE_URL_PATH;
 
-             }
 
-           } else if (!stateOverride) {
 
-             buffer = '';
 
-             state = NO_SCHEME;
 
-             pointer = 0;
 
-             continue;
 
-           } else return INVALID_SCHEME;
 
-           break;
 
-         case NO_SCHEME:
 
-           if (!base || (base.cannotBeABaseURL && chr !== '#')) return INVALID_SCHEME;
 
-           if (base.cannotBeABaseURL && chr === '#') {
 
-             url.scheme = base.scheme;
 
-             url.path = arraySlice(base.path);
 
-             url.query = base.query;
 
-             url.fragment = '';
 
-             url.cannotBeABaseURL = true;
 
-             state = FRAGMENT;
 
-             break;
 
-           }
 
-           state = base.scheme === 'file' ? FILE : RELATIVE;
 
-           continue;
 
-         case SPECIAL_RELATIVE_OR_AUTHORITY:
 
-           if (chr === '/' && codePoints[pointer + 1] === '/') {
 
-             state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
 
-             pointer++;
 
-           } else {
 
-             state = RELATIVE;
 
-             continue;
 
-           } break;
 
-         case PATH_OR_AUTHORITY:
 
-           if (chr === '/') {
 
-             state = AUTHORITY;
 
-             break;
 
-           } else {
 
-             state = PATH;
 
-             continue;
 
-           }
 
-         case RELATIVE:
 
-           url.scheme = base.scheme;
 
-           if (chr === EOF) {
 
-             url.username = base.username;
 
-             url.password = base.password;
 
-             url.host = base.host;
 
-             url.port = base.port;
 
-             url.path = arraySlice(base.path);
 
-             url.query = base.query;
 
-           } else if (chr === '/' || (chr === '\\' && url.isSpecial())) {
 
-             state = RELATIVE_SLASH;
 
-           } else if (chr === '?') {
 
-             url.username = base.username;
 
-             url.password = base.password;
 
-             url.host = base.host;
 
-             url.port = base.port;
 
-             url.path = arraySlice(base.path);
 
-             url.query = '';
 
-             state = QUERY;
 
-           } else if (chr === '#') {
 
-             url.username = base.username;
 
-             url.password = base.password;
 
-             url.host = base.host;
 
-             url.port = base.port;
 
-             url.path = arraySlice(base.path);
 
-             url.query = base.query;
 
-             url.fragment = '';
 
-             state = FRAGMENT;
 
-           } else {
 
-             url.username = base.username;
 
-             url.password = base.password;
 
-             url.host = base.host;
 
-             url.port = base.port;
 
-             url.path = arraySlice(base.path);
 
-             url.path.length--;
 
-             state = PATH;
 
-             continue;
 
-           } break;
 
-         case RELATIVE_SLASH:
 
-           if (url.isSpecial() && (chr === '/' || chr === '\\')) {
 
-             state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
 
-           } else if (chr === '/') {
 
-             state = AUTHORITY;
 
-           } else {
 
-             url.username = base.username;
 
-             url.password = base.password;
 
-             url.host = base.host;
 
-             url.port = base.port;
 
-             state = PATH;
 
-             continue;
 
-           } break;
 
-         case SPECIAL_AUTHORITY_SLASHES:
 
-           state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
 
-           if (chr !== '/' || charAt(buffer, pointer + 1) !== '/') continue;
 
-           pointer++;
 
-           break;
 
-         case SPECIAL_AUTHORITY_IGNORE_SLASHES:
 
-           if (chr !== '/' && chr !== '\\') {
 
-             state = AUTHORITY;
 
-             continue;
 
-           } break;
 
-         case AUTHORITY:
 
-           if (chr === '@') {
 
-             if (seenAt) buffer = '%40' + buffer;
 
-             seenAt = true;
 
-             bufferCodePoints = arrayFrom(buffer);
 
-             for (var i = 0; i < bufferCodePoints.length; i++) {
 
-               var codePoint = bufferCodePoints[i];
 
-               if (codePoint === ':' && !seenPasswordToken) {
 
-                 seenPasswordToken = true;
 
-                 continue;
 
-               }
 
-               var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);
 
-               if (seenPasswordToken) url.password += encodedCodePoints;
 
-               else url.username += encodedCodePoints;
 
-             }
 
-             buffer = '';
 
-           } else if (
 
-             chr === EOF || chr === '/' || chr === '?' || chr === '#' ||
 
-             (chr === '\\' && url.isSpecial())
 
-           ) {
 
-             if (seenAt && buffer === '') return INVALID_AUTHORITY;
 
-             pointer -= arrayFrom(buffer).length + 1;
 
-             buffer = '';
 
-             state = HOST;
 
-           } else buffer += chr;
 
-           break;
 
-         case HOST:
 
-         case HOSTNAME:
 
-           if (stateOverride && url.scheme === 'file') {
 
-             state = FILE_HOST;
 
-             continue;
 
-           } else if (chr === ':' && !seenBracket) {
 
-             if (buffer === '') return INVALID_HOST;
 
-             failure = url.parseHost(buffer);
 
-             if (failure) return failure;
 
-             buffer = '';
 
-             state = PORT;
 
-             if (stateOverride === HOSTNAME) return;
 
-           } else if (
 
-             chr === EOF || chr === '/' || chr === '?' || chr === '#' ||
 
-             (chr === '\\' && url.isSpecial())
 
-           ) {
 
-             if (url.isSpecial() && buffer === '') return INVALID_HOST;
 
-             if (stateOverride && buffer === '' && (url.includesCredentials() || url.port !== null)) return;
 
-             failure = url.parseHost(buffer);
 
-             if (failure) return failure;
 
-             buffer = '';
 
-             state = PATH_START;
 
-             if (stateOverride) return;
 
-             continue;
 
-           } else {
 
-             if (chr === '[') seenBracket = true;
 
-             else if (chr === ']') seenBracket = false;
 
-             buffer += chr;
 
-           } break;
 
-         case PORT:
 
-           if (exec(DIGIT, chr)) {
 
-             buffer += chr;
 
-           } else if (
 
-             chr === EOF || chr === '/' || chr === '?' || chr === '#' ||
 
-             (chr === '\\' && url.isSpecial()) ||
 
-             stateOverride
 
-           ) {
 
-             if (buffer !== '') {
 
-               var port = parseInt(buffer, 10);
 
-               if (port > 0xFFFF) return INVALID_PORT;
 
-               url.port = (url.isSpecial() && port === specialSchemes[url.scheme]) ? null : port;
 
-               buffer = '';
 
-             }
 
-             if (stateOverride) return;
 
-             state = PATH_START;
 
-             continue;
 
-           } else return INVALID_PORT;
 
-           break;
 
-         case FILE:
 
-           url.scheme = 'file';
 
-           if (chr === '/' || chr === '\\') state = FILE_SLASH;
 
-           else if (base && base.scheme === 'file') {
 
-             switch (chr) {
 
-               case EOF:
 
-                 url.host = base.host;
 
-                 url.path = arraySlice(base.path);
 
-                 url.query = base.query;
 
-                 break;
 
-               case '?':
 
-                 url.host = base.host;
 
-                 url.path = arraySlice(base.path);
 
-                 url.query = '';
 
-                 state = QUERY;
 
-                 break;
 
-               case '#':
 
-                 url.host = base.host;
 
-                 url.path = arraySlice(base.path);
 
-                 url.query = base.query;
 
-                 url.fragment = '';
 
-                 state = FRAGMENT;
 
-                 break;
 
-               default:
 
-                 if (!startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {
 
-                   url.host = base.host;
 
-                   url.path = arraySlice(base.path);
 
-                   url.shortenPath();
 
-                 }
 
-                 state = PATH;
 
-                 continue;
 
-             }
 
-           } else {
 
-             state = PATH;
 
-             continue;
 
-           } break;
 
-         case FILE_SLASH:
 
-           if (chr === '/' || chr === '\\') {
 
-             state = FILE_HOST;
 
-             break;
 
-           }
 
-           if (base && base.scheme === 'file' && !startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {
 
-             if (isWindowsDriveLetter(base.path[0], true)) push(url.path, base.path[0]);
 
-             else url.host = base.host;
 
-           }
 
-           state = PATH;
 
-           continue;
 
-         case FILE_HOST:
 
-           if (chr === EOF || chr === '/' || chr === '\\' || chr === '?' || chr === '#') {
 
-             if (!stateOverride && isWindowsDriveLetter(buffer)) {
 
-               state = PATH;
 
-             } else if (buffer === '') {
 
-               url.host = '';
 
-               if (stateOverride) return;
 
-               state = PATH_START;
 
-             } else {
 
-               failure = url.parseHost(buffer);
 
-               if (failure) return failure;
 
-               if (url.host === 'localhost') url.host = '';
 
-               if (stateOverride) return;
 
-               buffer = '';
 
-               state = PATH_START;
 
-             } continue;
 
-           } else buffer += chr;
 
-           break;
 
-         case PATH_START:
 
-           if (url.isSpecial()) {
 
-             state = PATH;
 
-             if (chr !== '/' && chr !== '\\') continue;
 
-           } else if (!stateOverride && chr === '?') {
 
-             url.query = '';
 
-             state = QUERY;
 
-           } else if (!stateOverride && chr === '#') {
 
-             url.fragment = '';
 
-             state = FRAGMENT;
 
-           } else if (chr !== EOF) {
 
-             state = PATH;
 
-             if (chr !== '/') continue;
 
-           } break;
 
-         case PATH:
 
-           if (
 
-             chr === EOF || chr === '/' ||
 
-             (chr === '\\' && url.isSpecial()) ||
 
-             (!stateOverride && (chr === '?' || chr === '#'))
 
-           ) {
 
-             if (isDoubleDot(buffer)) {
 
-               url.shortenPath();
 
-               if (chr !== '/' && !(chr === '\\' && url.isSpecial())) {
 
-                 push(url.path, '');
 
-               }
 
-             } else if (isSingleDot(buffer)) {
 
-               if (chr !== '/' && !(chr === '\\' && url.isSpecial())) {
 
-                 push(url.path, '');
 
-               }
 
-             } else {
 
-               if (url.scheme === 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {
 
-                 if (url.host) url.host = '';
 
-                 buffer = charAt(buffer, 0) + ':'; // normalize windows drive letter
 
-               }
 
-               push(url.path, buffer);
 
-             }
 
-             buffer = '';
 
-             if (url.scheme === 'file' && (chr === EOF || chr === '?' || chr === '#')) {
 
-               while (url.path.length > 1 && url.path[0] === '') {
 
-                 shift(url.path);
 
-               }
 
-             }
 
-             if (chr === '?') {
 
-               url.query = '';
 
-               state = QUERY;
 
-             } else if (chr === '#') {
 
-               url.fragment = '';
 
-               state = FRAGMENT;
 
-             }
 
-           } else {
 
-             buffer += percentEncode(chr, pathPercentEncodeSet);
 
-           } break;
 
-         case CANNOT_BE_A_BASE_URL_PATH:
 
-           if (chr === '?') {
 
-             url.query = '';
 
-             state = QUERY;
 
-           } else if (chr === '#') {
 
-             url.fragment = '';
 
-             state = FRAGMENT;
 
-           } else if (chr !== EOF) {
 
-             url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet);
 
-           } break;
 
-         case QUERY:
 
-           if (!stateOverride && chr === '#') {
 
-             url.fragment = '';
 
-             state = FRAGMENT;
 
-           } else if (chr !== EOF) {
 
-             if (chr === "'" && url.isSpecial()) url.query += '%27';
 
-             else if (chr === '#') url.query += '%23';
 
-             else url.query += percentEncode(chr, C0ControlPercentEncodeSet);
 
-           } break;
 
-         case FRAGMENT:
 
-           if (chr !== EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet);
 
-           break;
 
-       }
 
-       pointer++;
 
-     }
 
-   },
 
-   // https://url.spec.whatwg.org/#host-parsing
 
-   parseHost: function (input) {
 
-     var result, codePoints, index;
 
-     if (charAt(input, 0) === '[') {
 
-       if (charAt(input, input.length - 1) !== ']') return INVALID_HOST;
 
-       result = parseIPv6(stringSlice(input, 1, -1));
 
-       if (!result) return INVALID_HOST;
 
-       this.host = result;
 
-     // opaque host
 
-     } else if (!this.isSpecial()) {
 
-       if (exec(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT, input)) return INVALID_HOST;
 
-       result = '';
 
-       codePoints = arrayFrom(input);
 
-       for (index = 0; index < codePoints.length; index++) {
 
-         result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);
 
-       }
 
-       this.host = result;
 
-     } else {
 
-       input = toASCII(input);
 
-       if (exec(FORBIDDEN_HOST_CODE_POINT, input)) return INVALID_HOST;
 
-       result = parseIPv4(input);
 
-       if (result === null) return INVALID_HOST;
 
-       this.host = result;
 
-     }
 
-   },
 
-   // https://url.spec.whatwg.org/#cannot-have-a-username-password-port
 
-   cannotHaveUsernamePasswordPort: function () {
 
-     return !this.host || this.cannotBeABaseURL || this.scheme === 'file';
 
-   },
 
-   // https://url.spec.whatwg.org/#include-credentials
 
-   includesCredentials: function () {
 
-     return this.username !== '' || this.password !== '';
 
-   },
 
-   // https://url.spec.whatwg.org/#is-special
 
-   isSpecial: function () {
 
-     return hasOwn(specialSchemes, this.scheme);
 
-   },
 
-   // https://url.spec.whatwg.org/#shorten-a-urls-path
 
-   shortenPath: function () {
 
-     var path = this.path;
 
-     var pathSize = path.length;
 
-     if (pathSize && (this.scheme !== 'file' || pathSize !== 1 || !isWindowsDriveLetter(path[0], true))) {
 
-       path.length--;
 
-     }
 
-   },
 
-   // https://url.spec.whatwg.org/#concept-url-serializer
 
-   serialize: function () {
 
-     var url = this;
 
-     var scheme = url.scheme;
 
-     var username = url.username;
 
-     var password = url.password;
 
-     var host = url.host;
 
-     var port = url.port;
 
-     var path = url.path;
 
-     var query = url.query;
 
-     var fragment = url.fragment;
 
-     var output = scheme + ':';
 
-     if (host !== null) {
 
-       output += '//';
 
-       if (url.includesCredentials()) {
 
-         output += username + (password ? ':' + password : '') + '@';
 
-       }
 
-       output += serializeHost(host);
 
-       if (port !== null) output += ':' + port;
 
-     } else if (scheme === 'file') output += '//';
 
-     output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';
 
-     if (query !== null) output += '?' + query;
 
-     if (fragment !== null) output += '#' + fragment;
 
-     return output;
 
-   },
 
-   // https://url.spec.whatwg.org/#dom-url-href
 
-   setHref: function (href) {
 
-     var failure = this.parse(href);
 
-     if (failure) throw new TypeError(failure);
 
-     this.searchParams.update();
 
-   },
 
-   // https://url.spec.whatwg.org/#dom-url-origin
 
-   getOrigin: function () {
 
-     var scheme = this.scheme;
 
-     var port = this.port;
 
-     if (scheme === 'blob') try {
 
-       return new URLConstructor(scheme.path[0]).origin;
 
-     } catch (error) {
 
-       return 'null';
 
-     }
 
-     if (scheme === 'file' || !this.isSpecial()) return 'null';
 
-     return scheme + '://' + serializeHost(this.host) + (port !== null ? ':' + port : '');
 
-   },
 
-   // https://url.spec.whatwg.org/#dom-url-protocol
 
-   getProtocol: function () {
 
-     return this.scheme + ':';
 
-   },
 
-   setProtocol: function (protocol) {
 
-     this.parse($toString(protocol) + ':', SCHEME_START);
 
-   },
 
-   // https://url.spec.whatwg.org/#dom-url-username
 
-   getUsername: function () {
 
-     return this.username;
 
-   },
 
-   setUsername: function (username) {
 
-     var codePoints = arrayFrom($toString(username));
 
-     if (this.cannotHaveUsernamePasswordPort()) return;
 
-     this.username = '';
 
-     for (var i = 0; i < codePoints.length; i++) {
 
-       this.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);
 
-     }
 
-   },
 
-   // https://url.spec.whatwg.org/#dom-url-password
 
-   getPassword: function () {
 
-     return this.password;
 
-   },
 
-   setPassword: function (password) {
 
-     var codePoints = arrayFrom($toString(password));
 
-     if (this.cannotHaveUsernamePasswordPort()) return;
 
-     this.password = '';
 
-     for (var i = 0; i < codePoints.length; i++) {
 
-       this.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);
 
-     }
 
-   },
 
-   // https://url.spec.whatwg.org/#dom-url-host
 
-   getHost: function () {
 
-     var host = this.host;
 
-     var port = this.port;
 
-     return host === null ? ''
 
-       : port === null ? serializeHost(host)
 
-       : serializeHost(host) + ':' + port;
 
-   },
 
-   setHost: function (host) {
 
-     if (this.cannotBeABaseURL) return;
 
-     this.parse(host, HOST);
 
-   },
 
-   // https://url.spec.whatwg.org/#dom-url-hostname
 
-   getHostname: function () {
 
-     var host = this.host;
 
-     return host === null ? '' : serializeHost(host);
 
-   },
 
-   setHostname: function (hostname) {
 
-     if (this.cannotBeABaseURL) return;
 
-     this.parse(hostname, HOSTNAME);
 
-   },
 
-   // https://url.spec.whatwg.org/#dom-url-port
 
-   getPort: function () {
 
-     var port = this.port;
 
-     return port === null ? '' : $toString(port);
 
-   },
 
-   setPort: function (port) {
 
-     if (this.cannotHaveUsernamePasswordPort()) return;
 
-     port = $toString(port);
 
-     if (port === '') this.port = null;
 
-     else this.parse(port, PORT);
 
-   },
 
-   // https://url.spec.whatwg.org/#dom-url-pathname
 
-   getPathname: function () {
 
-     var path = this.path;
 
-     return this.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';
 
-   },
 
-   setPathname: function (pathname) {
 
-     if (this.cannotBeABaseURL) return;
 
-     this.path = [];
 
-     this.parse(pathname, PATH_START);
 
-   },
 
-   // https://url.spec.whatwg.org/#dom-url-search
 
-   getSearch: function () {
 
-     var query = this.query;
 
-     return query ? '?' + query : '';
 
-   },
 
-   setSearch: function (search) {
 
-     search = $toString(search);
 
-     if (search === '') {
 
-       this.query = null;
 
-     } else {
 
-       if (charAt(search, 0) === '?') search = stringSlice(search, 1);
 
-       this.query = '';
 
-       this.parse(search, QUERY);
 
-     }
 
-     this.searchParams.update();
 
-   },
 
-   // https://url.spec.whatwg.org/#dom-url-searchparams
 
-   getSearchParams: function () {
 
-     return this.searchParams.facade;
 
-   },
 
-   // https://url.spec.whatwg.org/#dom-url-hash
 
-   getHash: function () {
 
-     var fragment = this.fragment;
 
-     return fragment ? '#' + fragment : '';
 
-   },
 
-   setHash: function (hash) {
 
-     hash = $toString(hash);
 
-     if (hash === '') {
 
-       this.fragment = null;
 
-       return;
 
-     }
 
-     if (charAt(hash, 0) === '#') hash = stringSlice(hash, 1);
 
-     this.fragment = '';
 
-     this.parse(hash, FRAGMENT);
 
-   },
 
-   update: function () {
 
-     this.query = this.searchParams.serialize() || null;
 
-   }
 
- };
 
- // `URL` constructor
 
- // https://url.spec.whatwg.org/#url-class
 
- var URLConstructor = function URL(url /* , base */) {
 
-   var that = anInstance(this, URLPrototype);
 
-   var base = validateArgumentsLength(arguments.length, 1) > 1 ? arguments[1] : undefined;
 
-   var state = setInternalState(that, new URLState(url, false, base));
 
-   if (!DESCRIPTORS) {
 
-     that.href = state.serialize();
 
-     that.origin = state.getOrigin();
 
-     that.protocol = state.getProtocol();
 
-     that.username = state.getUsername();
 
-     that.password = state.getPassword();
 
-     that.host = state.getHost();
 
-     that.hostname = state.getHostname();
 
-     that.port = state.getPort();
 
-     that.pathname = state.getPathname();
 
-     that.search = state.getSearch();
 
-     that.searchParams = state.getSearchParams();
 
-     that.hash = state.getHash();
 
-   }
 
- };
 
- var URLPrototype = URLConstructor.prototype;
 
- var accessorDescriptor = function (getter, setter) {
 
-   return {
 
-     get: function () {
 
-       return getInternalURLState(this)[getter]();
 
-     },
 
-     set: setter && function (value) {
 
-       return getInternalURLState(this)[setter](value);
 
-     },
 
-     configurable: true,
 
-     enumerable: true
 
-   };
 
- };
 
- if (DESCRIPTORS) {
 
-   // `URL.prototype.href` accessors pair
 
-   // https://url.spec.whatwg.org/#dom-url-href
 
-   defineBuiltInAccessor(URLPrototype, 'href', accessorDescriptor('serialize', 'setHref'));
 
-   // `URL.prototype.origin` getter
 
-   // https://url.spec.whatwg.org/#dom-url-origin
 
-   defineBuiltInAccessor(URLPrototype, 'origin', accessorDescriptor('getOrigin'));
 
-   // `URL.prototype.protocol` accessors pair
 
-   // https://url.spec.whatwg.org/#dom-url-protocol
 
-   defineBuiltInAccessor(URLPrototype, 'protocol', accessorDescriptor('getProtocol', 'setProtocol'));
 
-   // `URL.prototype.username` accessors pair
 
-   // https://url.spec.whatwg.org/#dom-url-username
 
-   defineBuiltInAccessor(URLPrototype, 'username', accessorDescriptor('getUsername', 'setUsername'));
 
-   // `URL.prototype.password` accessors pair
 
-   // https://url.spec.whatwg.org/#dom-url-password
 
-   defineBuiltInAccessor(URLPrototype, 'password', accessorDescriptor('getPassword', 'setPassword'));
 
-   // `URL.prototype.host` accessors pair
 
-   // https://url.spec.whatwg.org/#dom-url-host
 
-   defineBuiltInAccessor(URLPrototype, 'host', accessorDescriptor('getHost', 'setHost'));
 
-   // `URL.prototype.hostname` accessors pair
 
-   // https://url.spec.whatwg.org/#dom-url-hostname
 
-   defineBuiltInAccessor(URLPrototype, 'hostname', accessorDescriptor('getHostname', 'setHostname'));
 
-   // `URL.prototype.port` accessors pair
 
-   // https://url.spec.whatwg.org/#dom-url-port
 
-   defineBuiltInAccessor(URLPrototype, 'port', accessorDescriptor('getPort', 'setPort'));
 
-   // `URL.prototype.pathname` accessors pair
 
-   // https://url.spec.whatwg.org/#dom-url-pathname
 
-   defineBuiltInAccessor(URLPrototype, 'pathname', accessorDescriptor('getPathname', 'setPathname'));
 
-   // `URL.prototype.search` accessors pair
 
-   // https://url.spec.whatwg.org/#dom-url-search
 
-   defineBuiltInAccessor(URLPrototype, 'search', accessorDescriptor('getSearch', 'setSearch'));
 
-   // `URL.prototype.searchParams` getter
 
-   // https://url.spec.whatwg.org/#dom-url-searchparams
 
-   defineBuiltInAccessor(URLPrototype, 'searchParams', accessorDescriptor('getSearchParams'));
 
-   // `URL.prototype.hash` accessors pair
 
-   // https://url.spec.whatwg.org/#dom-url-hash
 
-   defineBuiltInAccessor(URLPrototype, 'hash', accessorDescriptor('getHash', 'setHash'));
 
- }
 
- // `URL.prototype.toJSON` method
 
- // https://url.spec.whatwg.org/#dom-url-tojson
 
- defineBuiltIn(URLPrototype, 'toJSON', function toJSON() {
 
-   return getInternalURLState(this).serialize();
 
- }, { enumerable: true });
 
- // `URL.prototype.toString` method
 
- // https://url.spec.whatwg.org/#URL-stringification-behavior
 
- defineBuiltIn(URLPrototype, 'toString', function toString() {
 
-   return getInternalURLState(this).serialize();
 
- }, { enumerable: true });
 
- if (NativeURL) {
 
-   var nativeCreateObjectURL = NativeURL.createObjectURL;
 
-   var nativeRevokeObjectURL = NativeURL.revokeObjectURL;
 
-   // `URL.createObjectURL` method
 
-   // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
 
-   if (nativeCreateObjectURL) defineBuiltIn(URLConstructor, 'createObjectURL', bind(nativeCreateObjectURL, NativeURL));
 
-   // `URL.revokeObjectURL` method
 
-   // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL
 
-   if (nativeRevokeObjectURL) defineBuiltIn(URLConstructor, 'revokeObjectURL', bind(nativeRevokeObjectURL, NativeURL));
 
- }
 
- setToStringTag(URLConstructor, 'URL');
 
- $({ global: true, constructor: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {
 
-   URL: URLConstructor
 
- });
 
 
  |