define(['underscore','domReady!'],function(_){'use strict';var context=require.s.contexts._,execCb=context.execCb,registry=context.registry,callbacks=[],retries=10,updateDelay=1,ready,update;function isSubscribed(callback){return!!_.findWhere(callbacks,callback);}
function isRejected(module){return registry[module.id]&&(registry[module.id].inited||registry[module.id].error);}
function isPathFallback(module){return registry[module.id]&®istry[module.id].events.error;}
function isPending(module){if(!module.depCount){return false;}
return module.depCount>_.filter(module.depMaps,isRejected).length+_.filter(module.depMaps,isPathFallback).length;}
function hasPending(){return _.some(registry,isPending);}
function isReady(){return ready&&!hasPending();}
function invoke(callback){callback.handler.call(callback.ctx);}
function resolve(){ready=true;callbacks.splice(0).forEach(invoke);}
function tick(){ready=false;update(retries);}
function subscribe(handler,ctx){var callback={handler:handler,ctx:ctx};if(!isSubscribed(callback)){callbacks.push(callback);if(isReady()){_.defer(tick);}}}
update=_.debounce(function(retry){if(!hasPending()){retry?update(--retry):resolve();}},updateDelay);context.execCb=function(){var exported=execCb.apply(context,arguments);tick();return exported;};return subscribe;});