!function(global,factory){"object"==typeof exports?module.exports=factory():"function"==typeof define&&define.amd?define(factory):global.printStackTrace=factory()}(this,function(){function printStackTrace(options){options=options||{guess:!0};var ex=options.e||null,guess=!!options.guess,mode=options.mode||null,p=new printStackTrace.implementation,result=p.run(ex,mode);return guess?p.guessAnonymousFunctions(result):result}return printStackTrace.implementation=function(){},printStackTrace.implementation.prototype={run:function(ex,mode){return ex=ex||this.createException(),mode=mode||this.mode(ex),"other"===mode?this.other(arguments.callee):this[mode](ex)},createException:function(){try{this.undef()}catch(e){return e}},mode:function(e){return"undefined"!=typeof window&&window.navigator.userAgent.indexOf("PhantomJS")>-1?"phantomjs":e.arguments&&e.stack?"chrome":e.stack&&e.sourceURL?"safari":e.stack&&e.number?"ie":e.stack&&e.fileName?"firefox":e.message&&e["opera#sourceloc"]?e.stacktrace?e.message.indexOf("\n")>-1&&e.message.split("\n").length>e.stacktrace.split("\n").length?"opera9":"opera10a":"opera9":e.message&&e.stack&&e.stacktrace?e.stacktrace.indexOf("called from line")<0?"opera10b":"opera11":e.stack&&!e.fileName?"chrome":"other"},instrumentFunction:function(context,functionName,callback){context=context||window;var original=context[functionName];context[functionName]=function(){return callback.call(this,printStackTrace().slice(4)),context[functionName]._instrumented.apply(this,arguments)},context[functionName]._instrumented=original},deinstrumentFunction:function(context,functionName){context[functionName].constructor===Function&&context[functionName]._instrumented&&context[functionName]._instrumented.constructor===Function&&(context[functionName]=context[functionName]._instrumented)},chrome:function(e){return(e.stack+"\n").replace(/^[\s\S]+?\s+at\s+/," at ").replace(/^\s+(at eval )?at\s+/gm,"").replace(/^([^\(]+?)([\n$])/gm,"{anonymous}() ($1)$2").replace(/^Object.\s*\(([^\)]+)\)/gm,"{anonymous}() ($1)").replace(/^(.+) \((.+)\)$/gm,"$1@$2").split("\n").slice(0,-1)},safari:function(e){return e.stack.replace(/\[native code\]\n/m,"").replace(/^(?=\w+Error\:).*$\n/m,"").replace(/^@/gm,"{anonymous}()@").split("\n")},ie:function(e){return e.stack.replace(/^\s*at\s+(.*)$/gm,"$1").replace(/^Anonymous function\s+/gm,"{anonymous}() ").replace(/^(.+)\s+\((.+)\)$/gm,"$1@$2").split("\n").slice(1)},firefox:function(e){return e.stack.replace(/(?:\n@:0)?\s+$/m,"").replace(/^(?:\((\S*)\))?@/gm,"{anonymous}($1)@").split("\n")},opera11:function(e){for(var ANON="{anonymous}",lineRE=/^.*line (\d+), column (\d+)(?: in (.+))? in (\S+):$/,lines=e.stacktrace.split("\n"),result=[],i=0,len=lines.length;i/,"$1").replace(//,ANON),result.push(fnName+"@"+location+" -- "+lines[i+1].replace(/^\s+/,""))}}return result},opera10b:function(e){for(var lineRE=/^(.*)@(.+):(\d+)$/,lines=e.stacktrace.split("\n"),result=[],i=0,len=lines.length;i=0&&(line=line.substr(0,commentPos)),line){if(code=line+code,m=reFunctionExpression.exec(code),m&&m[1])return m[1];if(m=reFunctionDeclaration.exec(code),m&&m[1])return m[1];if(m=reFunctionEvaluation.exec(code),m&&m[1])return m[1]}return"(?)"}},printStackTrace});