text: function printStackTrace(options){options=options||{guess:!0};var ex=options.e||null,guess=!!options.guess,p=new printStackTrace.implementation,result=p.run(ex);return guess?p.guessAnonymousFunctions(result):result}"undefined"!=typeof module&&module.exports&&(module.exports=printStackTrace),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 e.arguments&&e.stack?"chrome":e.stack&&e.sourceURL?"safari":e.stack&&e.number?"ie":"string"==typeof e.message&&"undefined"!=typeof window&&window.opera?e.stacktrace?e.message.indexOf("\n")>-1&&e.message.split("\n").length>e.stacktrace.split("\n").length?"opera9":e.stack?0>e.stacktrace.indexOf("called from line")?"opera10b":"opera11":"opera10a":"opera9":e.stack?"firefox":"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){var stack=(e.stack+"\n").replace(/^\S[^\(]+?[\n$]/gm,"").replace(/^\s+(at eval )?at\s+/gm,"").replace(/^([^\(]+?)([\n$])/gm,"{anonymous}()@$1$2").replace(/^Object.<anonymous>\s*\(([^\)]+)\)/gm,"{anonymous}()@$1").split("\n");return stack.pop(),stack},safari:function(e){return e.stack.replace(/\[native code\]\n/m,"").replace(/^(?=\w+Error\:).*$\n/m,"").replace(/^@/gm,"{anonymous}()@").split("\n")},ie:function(e){var lineRE=/^.*at (\w+) \(([^\)]+)\)$/gm;return e.stack.replace(/at Anonymous function /gm,"{anonymous}()@").replace(/^(?=\w+Error\:).*$\n/m,"").replace(lineRE,"$1@$2").split("\n")},firefox:function(e){return e.stack.replace(/(?:\n@:0)?\s+$/m,"").replace(/^[\(@]/gm,"{anonymous}()@").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;len>i;i+=2){var match=lineRE.exec(lines[i]);if(match){var location=match[4]+":"+match[1]+":"+match[2],fnName=match[3]||"global code";fnName=fnName.replace(/<anonymous function: (\S+)>/,"$1").replace(/<anonymous function>/,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;len>i;i++){var match=lineRE.exec(lines[i]);if(match){var fnName=match[1]?match[1]+"()":"global code";result.push(fnName+"@"+match[2]+":"+match[3])}}return result},opera10a:function(e){for(var ANON="{anonymous}",lineRE=/Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i,lines=e.stacktrace.split("\n"),result=[],i=0,len=lines.length;len>i;i+=2){var match=lineRE.exec(lines[i]);if(match){var fnName=match[3]||ANON;result.push(fnName+"()@"+match[2]+":"+match[1]+" -- "+lines[i+1].replace(/^\s+/,""))}}return result},opera9:function(e){for(var ANON="{anonymous}",lineRE=/Line (\d+).*script (?:in )?(\S+)/i,lines=e.message.split("\n"),result=[],i=2,len=lines.length;len>i;i+=2){var match=lineRE.exec(lines[i]);match&&result.push(ANON+"()@"+match[2]+":"+match[1]+" -- "+lines[i+1].replace(/^\s+/,""))}return result},other:function(curr){for(var fn,args,ANON="{anonymous}",fnRE=/function\s*([\w\-$]+)?\s*\(/i,stack=[],maxStackSize=10;curr&&curr.arguments&&maxStackSize>stack.length;)fn=fnRE.test(""+curr)?RegExp.$1||ANON:ANON,args=Array.prototype.slice.call(curr.arguments||[]),stack[stack.length]=fn+"("+this.stringifyArguments(args)+")",curr=curr.caller;return stack},stringifyArguments:function(args){for(var result=[],slice=Array.prototype.slice,i=0;args.length>i;++i){var arg=args[i];void 0===arg?result[i]="undefined":null===arg?result[i]="null":arg.constructor&&(arg.constructor===Array?result[i]=3>arg.length?"["+this.stringifyArguments(arg)+"]":"["+this.stringifyArguments(slice.call(arg,0,1))+"..."+this.stringifyArguments(slice.call(arg,-1))+"]":arg.constructor===Object?result[i]="#object":arg.constructor===Function?result[i]="#function":arg.constructor===String?result[i]='"'+arg+'"':arg.constructor===Number&&(result[i]=arg))}return result.join(",")},sourceCache:{},ajax:function(url){var req=this.createXMLHTTPObject();if(req)try{return req.open("GET",url,!1),req.send(null),req.responseText}catch(e){}return""},createXMLHTTPObject:function(){for(var xmlhttp,XMLHttpFactories=[function(){return new XMLHttpRequest},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml3.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")}],i=0;XMLHttpFactories.length>i;i++)try{return xmlhttp=XMLHttpFactories[i](),this.createXMLHTTPObject=XMLHttpFactories[i],xmlhttp}catch(e){}},isSameDomain:function(url){return"undefined"!=typeof location&&-1!==url.indexOf(location.hostname)},getSource:function(url){return url in this.sourceCache||(this.sourceCache[url]=this.ajax(url).split("\n")),this.sourceCache[url]},guessAnonymousFunctions:function(stack){for(var i=0;stack.length>i;++i){var reStack=/\{anonymous\}\(.*\)@(.*)/,reRef=/^(.*?)(?::(\d+))(?::(\d+))?(?: -- .+)?$/,frame=stack[i],ref=reStack.exec(frame);if(ref){var m=reRef.exec(ref[1]);if(m){var file=m[1],lineno=m[2],charno=m[3]||0;if(file&&this.isSameDomain(file)&&lineno){var functionName=this.guessAnonymousFunction(file,lineno,charno);stack[i]=frame.replace("{anonymous}",functionName)}}}}return stack},guessAnonymousFunction:function(url,lineNo){var ret;try{ret=this.findFunctionName(this.getSource(url),lineNo)}catch(e){ret="getSource failed with url: "+url+", exception: "+(""+e)}return ret},findFunctionName:function(source,lineNo){for(var line,m,commentPos,reFunctionDeclaration=/function\s+([^(]*?)\s*\(([^)]*)\)/,reFunctionExpression=/['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*function\b/,reFunctionEvaluation=/['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*(?:eval|new Function)\b/,code="",maxLines=Math.min(lineNo,20),i=0;maxLines>i;++i)if(line=source[lineNo-i-1],commentPos=line.indexOf("//"),commentPos>=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"(?)"}};