(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,c=function(n){vart=n.owner[n.prop];if("function"!=typeoft)thrownewError("Strategies can only target methods.");vari=[],e=n.context||n.owner,c=function(){varn=0,c=functionr(){varc,s=Array.prototype.slice.call(arguments,0),o=n;n+=1,o<i.length?(c=i[o],c.fn.apply(c.context||e,[r].concat(s))):t.apply(e,s)};c.apply(this,arguments)};returnc.target=function(){returnt},c.context=function(n){return0===arguments.length?e:void(e=n)},c.strategies=function(){returni},c.useStrategy=function(n){for(vart=0,e=!1;t<i.length;){if(i[t].name===n.name){i[t]=n,e=!0;break}t+=1}e||i.push(n)},c.reset=function(){i=[]},n.lazyInit?(t.useStrategy=function(){n.owner[n.prop]=c,c.useStrategy.apply(c,arguments)},t.context=function(){returnn.owner[n.prop]=c,c.context.apply(c,arguments)},t):c},r=function(n){this.channel=n||i.configuration.DEFAULT_CHANNEL};r.prototype.subscribe=function(){returni.subscribe(1===arguments.length?news(this.channel,arguments[0].topic,arguments[0].callback):news(this.channel,arguments[0],arguments[1]))},r.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]};returnn.channel=this.channel,i.publish(n)};vars=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)};s.prototype={unsubscribe:function(){this.inactive||(this.inactive=!0,i.unsubscribe(this))},subscribe:function(n){returnthis.callback=n,this.callback=newc({owner:this,prop:"callback",context:this,lazyInit:!0}),this},withContext:function(n){returnthis.callback.context(n),this}};varo={cache:{},regex:{},compare:function(t,i){vare,c,r,s=this.cache[i]&&this.cache[i][t];return"undefined"!=typeofs?s:((c=this.regex[t])||(e="^"+n.map(t.split("."),function(n){vart="";returnr&&(t="#"!==r?"\\.\\b":"\\b"),t+="#"===n?"[\\s\\S]*":"*"===n?"[^.]+":n,r=n,t}).join("")+"$",c=this.regex[t]=newRegExp(e)),this.cache[i]=this.cache[i]||{},this.cache[i][t]=s=c.test(i),s)},reset:function(){this.cache={},this.regex={}}},a=function(t,e){!t.inactive&&i.configuration.resolver.compare(t.topic,e.topic)&&n.all(t.constraints,function(n){returnn.call(t.context,e.data,e)})&&"function"==typeoft.callback&&t.callback.call(t.context,e.data,e)},u=0,h=[],p=function(){for(;h.length;)i.unsubscribe(h.shift())};if(i={configuration:{resolver:o,DEFAULT_CHANNEL:"/",SYSTEM_CHANNEL:"postal"},subscriptions:{},wireTaps:[],ChannelDefinition:r,SubscriptionDefinition:s,channel:function(n){returnnewr(n)},subscribe:function(n){vart,i=news(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){return++u,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,c=n.length;c>e;)(i=n[e++])&&a(i,t)}),0===--u&&p(),t},unsubscribe:function(n){if(u)returnvoidh.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:"