'use strict'; 
 | 
/* eslint-disable es/no-string-prototype-matchall -- safe */ 
 | 
var $ = require('../internals/export'); 
 | 
var call = require('../internals/function-call'); 
 | 
var uncurryThis = require('../internals/function-uncurry-this-clause'); 
 | 
var createIteratorConstructor = require('../internals/iterator-create-constructor'); 
 | 
var createIterResultObject = require('../internals/create-iter-result-object'); 
 | 
var requireObjectCoercible = require('../internals/require-object-coercible'); 
 | 
var toLength = require('../internals/to-length'); 
 | 
var toString = require('../internals/to-string'); 
 | 
var anObject = require('../internals/an-object'); 
 | 
var isNullOrUndefined = require('../internals/is-null-or-undefined'); 
 | 
var classof = require('../internals/classof-raw'); 
 | 
var isRegExp = require('../internals/is-regexp'); 
 | 
var getRegExpFlags = require('../internals/regexp-get-flags'); 
 | 
var getMethod = require('../internals/get-method'); 
 | 
var defineBuiltIn = require('../internals/define-built-in'); 
 | 
var fails = require('../internals/fails'); 
 | 
var wellKnownSymbol = require('../internals/well-known-symbol'); 
 | 
var speciesConstructor = require('../internals/species-constructor'); 
 | 
var advanceStringIndex = require('../internals/advance-string-index'); 
 | 
var regExpExec = require('../internals/regexp-exec-abstract'); 
 | 
var InternalStateModule = require('../internals/internal-state'); 
 | 
var IS_PURE = require('../internals/is-pure'); 
 | 
  
 | 
var MATCH_ALL = wellKnownSymbol('matchAll'); 
 | 
var REGEXP_STRING = 'RegExp String'; 
 | 
var REGEXP_STRING_ITERATOR = REGEXP_STRING + ' Iterator'; 
 | 
var setInternalState = InternalStateModule.set; 
 | 
var getInternalState = InternalStateModule.getterFor(REGEXP_STRING_ITERATOR); 
 | 
var RegExpPrototype = RegExp.prototype; 
 | 
var $TypeError = TypeError; 
 | 
var stringIndexOf = uncurryThis(''.indexOf); 
 | 
var nativeMatchAll = uncurryThis(''.matchAll); 
 | 
  
 | 
var WORKS_WITH_NON_GLOBAL_REGEX = !!nativeMatchAll && !fails(function () { 
 | 
  nativeMatchAll('a', /./); 
 | 
}); 
 | 
  
 | 
var $RegExpStringIterator = createIteratorConstructor(function RegExpStringIterator(regexp, string, $global, fullUnicode) { 
 | 
  setInternalState(this, { 
 | 
    type: REGEXP_STRING_ITERATOR, 
 | 
    regexp: regexp, 
 | 
    string: string, 
 | 
    global: $global, 
 | 
    unicode: fullUnicode, 
 | 
    done: false 
 | 
  }); 
 | 
}, REGEXP_STRING, function next() { 
 | 
  var state = getInternalState(this); 
 | 
  if (state.done) return createIterResultObject(undefined, true); 
 | 
  var R = state.regexp; 
 | 
  var S = state.string; 
 | 
  var match = regExpExec(R, S); 
 | 
  if (match === null) { 
 | 
    state.done = true; 
 | 
    return createIterResultObject(undefined, true); 
 | 
  } 
 | 
  if (state.global) { 
 | 
    if (toString(match[0]) === '') R.lastIndex = advanceStringIndex(S, toLength(R.lastIndex), state.unicode); 
 | 
    return createIterResultObject(match, false); 
 | 
  } 
 | 
  state.done = true; 
 | 
  return createIterResultObject(match, false); 
 | 
}); 
 | 
  
 | 
var $matchAll = function (string) { 
 | 
  var R = anObject(this); 
 | 
  var S = toString(string); 
 | 
  var C = speciesConstructor(R, RegExp); 
 | 
  var flags = toString(getRegExpFlags(R)); 
 | 
  var matcher, $global, fullUnicode; 
 | 
  matcher = new C(C === RegExp ? R.source : R, flags); 
 | 
  $global = !!~stringIndexOf(flags, 'g'); 
 | 
  fullUnicode = !!~stringIndexOf(flags, 'u'); 
 | 
  matcher.lastIndex = toLength(R.lastIndex); 
 | 
  return new $RegExpStringIterator(matcher, S, $global, fullUnicode); 
 | 
}; 
 | 
  
 | 
// `String.prototype.matchAll` method 
 | 
// https://tc39.es/ecma262/#sec-string.prototype.matchall 
 | 
$({ target: 'String', proto: true, forced: WORKS_WITH_NON_GLOBAL_REGEX }, { 
 | 
  matchAll: function matchAll(regexp) { 
 | 
    var O = requireObjectCoercible(this); 
 | 
    var flags, S, matcher, rx; 
 | 
    if (!isNullOrUndefined(regexp)) { 
 | 
      if (isRegExp(regexp)) { 
 | 
        flags = toString(requireObjectCoercible(getRegExpFlags(regexp))); 
 | 
        if (!~stringIndexOf(flags, 'g')) throw new $TypeError('`.matchAll` does not allow non-global regexes'); 
 | 
      } 
 | 
      if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll(O, regexp); 
 | 
      matcher = getMethod(regexp, MATCH_ALL); 
 | 
      if (matcher === undefined && IS_PURE && classof(regexp) === 'RegExp') matcher = $matchAll; 
 | 
      if (matcher) return call(matcher, regexp, O); 
 | 
    } else if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll(O, regexp); 
 | 
    S = toString(O); 
 | 
    rx = new RegExp(regexp, 'g'); 
 | 
    return IS_PURE ? call($matchAll, rx, S) : rx[MATCH_ALL](S); 
 | 
  } 
 | 
}); 
 | 
  
 | 
IS_PURE || MATCH_ALL in RegExpPrototype || defineBuiltIn(RegExpPrototype, MATCH_ALL, $matchAll); 
 |