'use strict'; 
 | 
var $ = require('../internals/export'); 
 | 
var toObject = require('../internals/to-object'); 
 | 
var toAbsoluteIndex = require('../internals/to-absolute-index'); 
 | 
var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); 
 | 
var lengthOfArrayLike = require('../internals/length-of-array-like'); 
 | 
var setArrayLength = require('../internals/array-set-length'); 
 | 
var doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer'); 
 | 
var arraySpeciesCreate = require('../internals/array-species-create'); 
 | 
var createProperty = require('../internals/create-property'); 
 | 
var deletePropertyOrThrow = require('../internals/delete-property-or-throw'); 
 | 
var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support'); 
 | 
  
 | 
var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice'); 
 | 
  
 | 
var max = Math.max; 
 | 
var min = Math.min; 
 | 
  
 | 
// `Array.prototype.splice` method 
 | 
// https://tc39.es/ecma262/#sec-array.prototype.splice 
 | 
// with adding support of @@species 
 | 
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, { 
 | 
  splice: function splice(start, deleteCount /* , ...items */) { 
 | 
    var O = toObject(this); 
 | 
    var len = lengthOfArrayLike(O); 
 | 
    var actualStart = toAbsoluteIndex(start, len); 
 | 
    var argumentsLength = arguments.length; 
 | 
    var insertCount, actualDeleteCount, A, k, from, to; 
 | 
    if (argumentsLength === 0) { 
 | 
      insertCount = actualDeleteCount = 0; 
 | 
    } else if (argumentsLength === 1) { 
 | 
      insertCount = 0; 
 | 
      actualDeleteCount = len - actualStart; 
 | 
    } else { 
 | 
      insertCount = argumentsLength - 2; 
 | 
      actualDeleteCount = min(max(toIntegerOrInfinity(deleteCount), 0), len - actualStart); 
 | 
    } 
 | 
    doesNotExceedSafeInteger(len + insertCount - actualDeleteCount); 
 | 
    A = arraySpeciesCreate(O, actualDeleteCount); 
 | 
    for (k = 0; k < actualDeleteCount; k++) { 
 | 
      from = actualStart + k; 
 | 
      if (from in O) createProperty(A, k, O[from]); 
 | 
    } 
 | 
    A.length = actualDeleteCount; 
 | 
    if (insertCount < actualDeleteCount) { 
 | 
      for (k = actualStart; k < len - actualDeleteCount; k++) { 
 | 
        from = k + actualDeleteCount; 
 | 
        to = k + insertCount; 
 | 
        if (from in O) O[to] = O[from]; 
 | 
        else deletePropertyOrThrow(O, to); 
 | 
      } 
 | 
      for (k = len; k > len - actualDeleteCount + insertCount; k--) deletePropertyOrThrow(O, k - 1); 
 | 
    } else if (insertCount > actualDeleteCount) { 
 | 
      for (k = len - actualDeleteCount; k > actualStart; k--) { 
 | 
        from = k + actualDeleteCount - 1; 
 | 
        to = k + insertCount - 1; 
 | 
        if (from in O) O[to] = O[from]; 
 | 
        else deletePropertyOrThrow(O, to); 
 | 
      } 
 | 
    } 
 | 
    for (k = 0; k < insertCount; k++) { 
 | 
      O[k + actualStart] = arguments[k + 2]; 
 | 
    } 
 | 
    setArrayLength(O, len - actualDeleteCount + insertCount); 
 | 
    return A; 
 | 
  } 
 | 
}); 
 |