nl_tokens: Note : must declare params as optional .
pl_tokens: function packRanges ( fromIndex , toIndex , bucketThreshold , sparseIterationThreshold , getOwnPropertyNamesThreshold ) { var ownPropertyNames = null ; var consecutiveRange = ( toIndex - fromIndex >= sparseIterationThreshold ) && ArrayBuffer . isView ( this ) ; var skipGetOwnPropertyNames = consecutiveRange && ( toIndex - fromIndex >= getOwnPropertyNamesThreshold ) ; function * arrayIndexes ( object ) { if ( toIndex - fromIndex < sparseIterationThreshold ) { for ( var i = fromIndex ; i <= toIndex ; ++ i ) { if ( i in object ) yield i ; } } else { ownPropertyNames = ownPropertyNames || Object . getOwnPropertyNames ( object ) ; for ( var i = 0 ; i < ownPropertyNames . length ; ++ i ) { var name = ownPropertyNames [ i ] ; var index = name >>> 0 ; if ( ( "" + index ) === name && fromIndex <= index && index <= toIndex ) yield index ; } } } var count = 0 ; if ( consecutiveRange ) { count = toIndex - fromIndex + 1 ; } else { for ( var i of arrayIndexes ( this ) ) ++ count ; } var bucketSize = count ; if ( count <= bucketThreshold ) bucketSize = count ; else bucketSize = Math . pow ( bucketThreshold , Math . ceil ( Math . log ( count ) / Math . log ( bucketThreshold ) ) - 1 ) ; var ranges = [ ] ; if ( consecutiveRange ) { for ( var i = fromIndex ; i <= toIndex ; i += bucketSize ) { var groupStart = i ; var groupEnd = groupStart + bucketSize - 1 ; if ( groupEnd > toIndex ) groupEnd = toIndex ; ranges . push ( [ groupStart , groupEnd , groupEnd - groupStart + 1 ] ) ; } } else { count = 0 ; var groupStart = - 1 ; var groupEnd = 0 ; for ( var i of arrayIndexes ( this ) ) { if ( groupStart === - 1 ) groupStart = i ; groupEnd = i ; if ( ++ count === bucketSize ) { ranges . push ( [ groupStart , groupEnd , count ] ) ; count = 0 ; groupStart = - 1 ; } } if ( <mask> > 0 ) ranges . push ( [ groupStart , groupEnd , count ] ) ; } return { ranges : ranges , skipGetOwnPropertyNames : skipGetOwnPropertyNames } ; }