define(function(require,exports,module){function doInParallel(items,beginProcessItem,failFast){var promises=[],masterDeferred=new $.Deferred;if(0===items.length)masterDeferred.resolve();else{var numCompleted=0,hasFailed=!1;items.forEach(function(item,i){var itemPromise=beginProcessItem(item,i);promises.push(itemPromise),itemPromise.fail(function(){failFast?masterDeferred.reject():hasFailed=!0}),itemPromise.always(function(){++numCompleted===items.length&&(hasFailed?masterDeferred.reject():masterDeferred.resolve())})})}return masterDeferred.promise()}function doSequentially(items,beginProcessItem,failAndStopFast){var masterDeferred=new $.Deferred,hasFailed=!1;function doItem(i){if(i>=items.length)hasFailed?masterDeferred.reject():masterDeferred.resolve();else{var itemPromise=beginProcessItem(items[i],i);itemPromise.done(function(){doItem(i+1)}),itemPromise.fail(function(){failAndStopFast?masterDeferred.reject():(hasFailed=!0,doItem(i+1))})}}return doItem(0),masterDeferred.promise()}function doSequentiallyInBackground(items,fnProcessItem,maxBlockingTime,idleTime){maxBlockingTime=maxBlockingTime||15,idleTime=idleTime||30;var sliceStartTime=(new Date).getTime();return doSequentially(items,function(item,i){var result=new $.Deferred;return fnProcessItem(item,i),(new Date).getTime()-sliceStartTime>=maxBlockingTime?window.setTimeout(function(){sliceStartTime=(new Date).getTime(),result.resolve()},idleTime):result.resolve(),result},!1)}function firstSequentially(items,beginProcessItem){var masterDeferred=new $.Deferred;function doItem(i){i>=items.length?masterDeferred.reject():beginProcessItem(items[i],i).fail(function(){doItem(i+1)}).done(function(){masterDeferred.resolve(items[i])})}return doItem(0),masterDeferred.promise()}function doInParallel_aggregateErrors(items,beginProcessItem){var errors=[],masterDeferred=new $.Deferred,parallelResult;return doInParallel(items,function(item,i){var itemResult=beginProcessItem(item,i);return itemResult.fail(function(error){errors.push({item:item,error:error})}),itemResult},!1).done(function(){masterDeferred.resolve()}).fail(function(){masterDeferred.reject(errors)}),masterDeferred.promise()}var ERROR_TIMEOUT={};function withTimeout(promise,timeout,resolveTimeout){var wrapper=new $.Deferred,timer=window.setTimeout(function(){resolveTimeout?wrapper.resolve():wrapper.reject(ERROR_TIMEOUT)},timeout);return promise.always(function(){window.clearTimeout(timer)}),promise.then(wrapper.resolve,wrapper.reject),wrapper.promise()}const RETRY_DEFAULT_DELAYS_MS=[5e3,15e3,3e4,6e4],RETRY_DEFAULT_ATTEMPTS=5,RETRY_DEFAULT_JITTER=.25;function retry(operation,options){const settings=options||{},attempts=Math.max(1,settings.attempts||RETRY_DEFAULT_ATTEMPTS),jitter="number"==typeof settings.jitter?Math.max(0,settings.jitter):RETRY_DEFAULT_JITTER;let delays=void 0===settings.delaysMs?RETRY_DEFAULT_DELAYS_MS:settings.delaysMs;Array.isArray(delays)||(delays=[delays]),delays.length||(delays=[0]);const signal=settings.signal;function waitFor(retryIndex){const base=delays[Math.min(retryIndex,delays.length-1)],spread=base*jitter;return Math.max(0,Math.round(base+(2*Math.random()-1)*spread))}function attemptOnce(attempt){let result;try{result=operation(attempt)}catch(err){return Promise.reject(err)}const promise=Promise.resolve(result);return settings.timeoutMs?new Promise(function(resolve,reject){const timer=window.setTimeout(function(){reject(ERROR_TIMEOUT)},settings.timeoutMs);promise.then(function(value){window.clearTimeout(timer),resolve(value)},function(err){window.clearTimeout(timer),reject(err)})}):promise}return new Promise(function(resolve,reject){if(signal&&signal.aborted)return void reject(signal.reason);let timer=null;function onAbort(){window.clearTimeout(timer),reject(signal.reason)}function finish(settle,value){signal&&signal.removeEventListener("abort",onAbort),settle(value)}function run(attempt){attemptOnce(attempt).then(function(value){finish(resolve,value)},function(err){if(signal&&signal.aborted)return;const more=attempt