(function(n,t){"object"==typeofmodule&&module.exports?module.exports=t(require("underscore"),this):"function"==typeofdefine&&define.amd?define(["underscore"],function(i){returnt(i,n)}):n.postal=t(n._,n)})(this,function(n,t){vari,e=t.postal,s=function(n){this.channel=n||i.configuration.DEFAULT_CHANNEL,this.initialize()};s.prototype.initialize=function(){},s.prototype.subscribe=function(){returni.subscribe({channel:this.channel,topic:1===arguments.length?arguments[0].topic:arguments[0],callback:1===arguments.length?arguments[0].callback:arguments[1]})},s.prototype.publish=function(){varn=1===arguments.length?"[object String]"===Object.prototype.toString.call(arguments[0])?{topic:arguments[0]}:arguments[0]:{topic:arguments[0],data:arguments[1]};n.channel=this.channel,i.publish(n)};varc=function(n,t,i){if(3!==arguments.length)thrownewError("You must provide a channel, topic and callback when creating a SubscriptionDefinition instance.");if(0===t.length)thrownewError("Topics cannot be empty");this.channel=n,this.topic=t,this.subscribe(i)};c.prototype={unsubscribe:function(){this.inactive||(this.inactive=!0,i.unsubscribe(this))},subscribe:function(n){returnthis.callback=n,this},withContext:function(n){returnthis.context=n,this}};varo={cache:{},regex:{},compare:function(t,i){vare,s,c,o=this.cache[i]&&this.cache[i][t];return"undefined"!=typeofo?o:((s=this.regex[t])||(e="^"+n.map(t.split("."),function(n){vart="";returnc&&(t="#"!==c?"\\.\\b":"\\b"),t+="#"===n?"[\\s\\S]*":"*"===n?"[^.]+":n,c=n,t}).join("")+"$",s=this.regex[t]=newRegExp(e)),this.cache[i]=this.cache[i]||{},this.cache[i][t]=o=s.test(i),o)},reset:function(){this.cache={},this.regex={}}},r=function(n,t){!n.inactive&&i.configuration.resolver.compare(n.topic,t.topic)&&n.callback.call(n.context||this,t.data,t)},a=0,u=[],h=function(){for(;u.length;)i.unsubscribe(u.shift())};if(i={configuration:{resolver:o,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},subscriptions:{},wireTaps:[],ChannelDefinition:s,SubscriptionDefinition:c,channel:function(n){returnnews(n)},subscribe:function(n){vart,i=newc(n.channel||this.configuration.DEFAULT_CHANNEL,n.topic,n.callback),e=this.subscriptions[i.channel];returnthis.publish({channel:this.configuration.SYSTEM_CHANNEL,topic:"subscription.created",data:{event:"subscription.created",channel:i.channel,topic:i.topic}}),e||(e=this.subscriptions[i.channel]={}),t=this.subscriptions[i.channel][i.topic],t||(t=this.subscriptions[i.channel][i.topic]=[]),t.push(i),i},publish:function(t){++a,t.channel=t.channel||this.configuration.DEFAULT_CHANNEL,t.timeStamp=newDate,n.each(this.wireTaps,function(n){n(t.data,t)}),this.subscriptions[t.channel]&&n.each(this.subscriptions[t.channel],function(n){for(vari,e=0,s=n.length;s>e;)(i=n[e++])&&r(i,t)}),0===--a&&h()},unsubscribe:function(n){if(a)returnvoidu.push(n);if(this.subscriptions[n.channel]&&this.subscriptions[n.channel][n.topic])for(vart=this.subscriptions[n.channel][n.topic].length,i=0;t>i;){if(this.subscriptions[n.channel][n.topic][i]===n){this.subscriptions[n.channel][n.topic].splice(i,1);break}i+=1}this.publish({channel:this.configuration.SYSTEM_CHANNEL,topic:"subscription.removed",data:{event:"subscription.removed",channel:n.channel,topic:n.topic}})},addWireTap:function(n){vart=this;returnt.wireTaps.push(n),function(){vari=t.wireTaps.indexOf(n);-1!==i&&t.wireTaps.splice(i,1)}},noConflict:function(){if("undefined"==typeofwindow||"undefined"!=typeofwindow&&"function"==typeofdefine&&define.amd)thrownewError("noConflict can only be used in browser clients which aren't using AMD modules");returnt.postal=e,this},getSubscribersFor:function(){varn=arguments[0],t=arguments[1];return1===arguments.length&&(n=arguments[0].channel||this.configuration.DEFAULT_CHANNEL,t=arguments[0].topic),this.subscriptions[n]&&Object.prototype.hasOwnProperty.call(this.subscriptions[n],t)?this.subscriptions[n][t]:[]},reset:function(){this.subscriptions&&(n.each(this.subscriptions,function(t){n.each(t,function(n){for(;n.length;)n.pop().unsubscribe()})}),this.subscriptions={}),this.configuration.resol