function parseDuration( str ) {
	var parts;
	var out;
	var u;

	out = {
		'days': 0,
		'hours': 0,
		'minutes': 0,
		'seconds': 0,
		'milliseconds': 0
	};
	if ( str.length === 0 ) {
		return out;
	}
	str = lowercase( str );
	parts = RE_TIME_UNIT.exec( str );
	while ( parts ) {
		u = UNITS[ parts[ 2 ] ];
		if ( u ) {
			out[ u ] = parseInt( parts[ 1 ], 10 );
		}
		parts = RE_TIME_UNIT.exec( str );
	}
	return out;
}
Parses a duration string into an object.

## Notes

-   A duration string is a string containing a sequence of time units. A time unit is a nonnegative integer followed by a unit identifier. The following unit identifiers are supported:

    -   `d`: days
    -   `h`: hours
    -   `m`: minutes
    -   `s`: seconds
    -   `ms`: milliseconds

    For example, the string `1m3s10ms` is a duration string containing three time units: `1m` (1 minute), `3s` (3 seconds), and `10ms` (10 milliseconds). The string `60m` is a duration string containing a single time unit: `60m` (60 minutes).

-   Duration strings are case insensitive. For example, the string `1M3S10MS` is equivalent to `1m3s10ms`.

-   If a duration string does not contain a time unit, the respective property is set to `0`.

-   An empty string is considered a valid duration string and is parsed as `0d0h0m0s0ms`.

@param {string} str - duration string
@returns {Object} duration object

@example
var obj = parseDuration( '1m3s10ms' );
// returns { 'days': 0, 'hours': 0, 'minutes': 1, 'seconds': 3, 'milliseconds': 10 }

@example
var obj = parseDuration( '1m3s' );
// returns { 'days': 0, 'hours': 0, 'minutes': 1, 'seconds': 3, 'milliseconds': 0 }