Skip to content

Instantly share code, notes, and snippets.

@dcramer
Created February 12, 2013 01:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dcramer/4759217 to your computer and use it in GitHub Desktop.
Save dcramer/4759217 to your computer and use it in GitHub Desktop.
sourcemap bug
/*! Raven.js a75cbab | github.com/getsentry/raven-js */
/*
* Includes TraceKit
* https://github.com/getsentry/TraceKit
*
* Copyright 2013 Matt Robenolt and other contributors
* Released under the BSD license
* https://github.com/getsentry/raven-js/blob/master/LICENSE
*
*/
/*
TraceKit - Cross brower stack traces - github.com/occ/TraceKit
MIT license
*/
;(function(window, undefined) {
var TraceKit = {};
var _oldTraceKit = window.TraceKit;
/**
* TraceKit.noConflict: Export TraceKit out to another variable
* Example: var TK = TraceKit.noConflict()
*/
TraceKit.noConflict = function noConflict() {
window.TraceKit = _oldTraceKit;
return TraceKit;
};
/**
* TraceKit._has, a better form of hasOwnProperty
* Example: TraceKit._has(MainHostObject, property) === true/false
*
* @param {Object} host object to check property
* @param {string} key to check
*/
TraceKit._has = function _has(object, key) {
return Object.prototype.hasOwnProperty.call(object, key);
};
/**
* TraceKit.report: cross-browser processing of unhandled exceptions
*
* Syntax:
* TraceKit.report.subscribe(function(stackInfo) { ... })
* TraceKit.report.unsubscribe(function(stackInfo) { ... })
* TraceKit.report(exception)
* try { ...code... } catch(ex) { TraceKit.report(ex); }
*
* Supports:
* - Firefox: full stack trace with line numbers, plus column number
* on top frame; column number is not guaranteed
* - Opera: full stack trace with line and column numbers
* - Chrome: full stack trace with line and column numbers
* - Safari: line and column number for the top frame only; some frames
* may be missing, and column number is not guaranteed
* - IE: line and column number for the top frame only; some frames
* may be missing, and column number is not guaranteed
*
* In theory, TraceKit should work on all of the following versions:
* - IE5.5+ (only 8.0 tested)
* - Firefox 0.9+ (only 3.5+ tested)
* - Opera 7+ (only 10.50 tested; versions 9 and earlier may require
* Exceptions Have Stacktrace to be enabled in opera:config)
* - Safari 3+ (only 4+ tested)
* - Chrome 1+ (only 5+ tested)
* - Konqueror 3.5+ (untested)
*
* Requires TraceKit.computeStackTrace.
*
* Tries to catch all unhandled exceptions and report them to the
* subscribed handlers. Please note that TraceKit.report will rethrow the
* exception. This is REQUIRED in order to get a useful stack trace in IE.
* If the exception does not reach the top of the browser, you will only
* get a stack trace from the point where TraceKit.report was called.
*
* Handlers receive a stackInfo object as described in the
* TraceKit.computeStackTrace docs.
*/
TraceKit.report = (function reportModuleWrapper() {
var handlers = [],
lastException = null,
lastExceptionStack = null;
/**
* Add a crash handler.
* @param {Function} handler
*/
function subscribe(handler) {
handlers.push(handler);
}
/**
* Remove a crash handler.
* @param {Function} handler
*/
function unsubscribe(handler) {
for (var i = handlers.length - 1; i >= 0; --i) {
if (handlers[i] === handler) {
handlers.splice(i, 1);
}
}
}
/**
* Dispatch stack information to all handlers.
* @param {Object.<string, *>} stack
*/
function notifyHandlers(stack, windowError) {
var exception = null;
if (windowError && !TraceKit.collectWindowErrors) {
return;
}
for (var i in handlers) {
if (TraceKit._has(handlers, i)) {
try {
handlers[i].apply(null, [stack].concat(Array.prototype.slice.call(arguments, 2)));
} catch (inner) {
exception = inner;
}
}
}
if (exception) {
throw exception;
}
}
var _oldOnerrorHandler = window.onerror;
/**
* Ensures all global unhandled exceptions are recorded.
* Supported by Gecko and IE.
* @param {string} message Error message.
* @param {string} url URL of script that generated the exception.
* @param {(number|string)} lineNo The line number at which the error
* occurred.
*/
window.onerror = function traceKitWindowOnError(message, url, lineNo) {
var stack = null;
if (lastExceptionStack) {
TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message);
stack = lastExceptionStack;
lastExceptionStack = null;
lastException = null;
} else {
var location = {
'url': url,
'line': lineNo
};
location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line);
location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line);
stack = {
'mode': 'onerror',
'message': message,
'url': document.location.href,
'stack': [location],
'useragent': navigator.userAgent
};
}
notifyHandlers(stack, 'from window.onerror');
if (_oldOnerrorHandler) {
return _oldOnerrorHandler.apply(this, arguments);
}
return false;
};
/**
* Reports an unhandled Error to TraceKit.
* @param {Error} ex
*/
function report(ex) {
var args = Array.prototype.slice.call(arguments, 1);
if (lastExceptionStack) {
if (lastException === ex) {
return; // already caught by an inner catch block, ignore
} else {
var s = lastExceptionStack;
lastExceptionStack = null;
lastException = null;
notifyHandlers.apply(null, [s, null].concat(args));
}
}
var stack = TraceKit.computeStackTrace(ex);
lastExceptionStack = stack;
lastException = ex;
// If the stack trace is incomplete, wait for 2 seconds for
// slow slow IE to see if onerror occurs or not before reporting
// this exception; otherwise, we will end up with an incomplete
// stack trace
window.setTimeout(function () {
if (lastException === ex) {
lastExceptionStack = null;
lastException = null;
notifyHandlers.apply(null, [stack, null].concat(args));
}
}, (stack.incomplete ? 2000 : 0));
throw ex; // re-throw to propagate to the top level (and cause window.onerror)
}
report.subscribe = subscribe;
report.unsubscribe = unsubscribe;
return report;
}());
/**
* TraceKit.computeStackTrace: cross-browser stack traces in JavaScript
*
* Syntax:
* s = TraceKit.computeStackTrace.ofCaller([depth])
* s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)
* Returns:
* s.name - exception name
* s.message - exception message
* s.stack[i].url - JavaScript or HTML file URL
* s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)
* s.stack[i].args - arguments passed to the function, if known
* s.stack[i].line - line number, if known
* s.stack[i].column - column number, if known
* s.stack[i].context - an array of source code lines; the middle element corresponds to the correct line#
* s.mode - 'stack', 'stacktrace', 'multiline', 'callers', 'onerror', or 'failed' -- method used to collect the stack trace
*
* Supports:
* - Firefox: full stack trace with line numbers and unreliable column
* number on top frame
* - Opera 10: full stack trace with line and column numbers
* - Opera 9-: full stack trace with line numbers
* - Chrome: full stack trace with line and column numbers
* - Safari: line and column number for the topmost stacktrace element
* only
* - IE: no line numbers whatsoever
*
* Tries to guess names of anonymous functions by looking for assignments
* in the source code. In IE and Safari, we have to guess source file names
* by searching for function bodies inside all page scripts. This will not
* work for scripts that are loaded cross-domain.
* Here be dragons: some function names may be guessed incorrectly, and
* duplicate functions may be mismatched.
*
* TraceKit.computeStackTrace should only be used for tracing purposes.
* Logging of unhandled exceptions should be done with TraceKit.report,
* which builds on top of TraceKit.computeStackTrace and provides better
* IE support by utilizing the window.onerror event to retrieve information
* about the top of the stack.
*
* Note: In IE and Safari, no stack trace is recorded on the Error object,
* so computeStackTrace instead walks its *own* chain of callers.
* This means that:
* * in Safari, some methods may be missing from the stack trace;
* * in IE, the topmost function in the stack trace will always be the
* caller of computeStackTrace.
*
* This is okay for tracing (because you are likely to be calling
* computeStackTrace from the function you want to be the topmost element
* of the stack trace anyway), but not okay for logging unhandled
* exceptions (because your catch block will likely be far away from the
* inner function that actually caused the exception).
*
* Tracing example:
* function trace(message) {
* var stackInfo = TraceKit.computeStackTrace.ofCaller();
* var data = message + "\n";
* for(var i in stackInfo.stack) {
* var item = stackInfo.stack[i];
* data += (item.func || '[anonymous]') + "() in " + item.url + ":" + (item.line || '0') + "\n";
* }
* if (window.console)
* console.info(data);
* else
* alert(data);
* }
*/
TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
var debug = false,
sourceCache = {};
/**
* Attempts to retrieve source code via XMLHttpRequest, which is used
* to look up anonymous function names.
* @param {string} url URL of source code.
* @return {string} Source contents.
*/
function loadSource(url) {
if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on.
return '';
}
try {
function getXHR() {
try {
return new window.XMLHttpRequest();
} catch (e) {
// explicitly bubble up the exception if not found
return new window.ActiveXObject('Microsoft.XMLHTTP');
}
}
var request = getXHR();
request.open('GET', url, false);
request.send('');
return request.responseText;
} catch (e) {
return '';
}
}
/**
* Retrieves source code from the source code cache.
* @param {string} url URL of source code.
* @return {Array.<string>} Source contents.
*/
function getSource(url) {
if (!TraceKit._has(sourceCache, url)) {
// URL needs to be able to fetched within the acceptable domain. Otherwise,
// cross-domain errors will be triggered.
var source;
if (url.indexOf(document.domain) !== -1) {
source = loadSource(url);
} else {
source = [];
}
sourceCache[url] = source.length ? source.split('\n') : [];
}
return sourceCache[url];
}
/**
* Tries to use an externally loaded copy of source code to determine
* the name of a function by looking at the name of the variable it was
* assigned to, if any.
* @param {string} url URL of source code.
* @param {(string|number)} lineNo Line number in source code.
* @return {string} The function name, if discoverable.
*/
function guessFunctionName(url, lineNo) {
var reFunctionArgNames = /function ([^(]*)\(([^)]*)\)/,
reGuessFunction = /['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/,
line = '',
maxLines = 10,
source = getSource(url),
m;
if (!source.length) {
return '?';
}
// Walk backwards from the first line in the function until we find the line which
// matches the pattern above, which is the function definition
for (var i = 0; i < maxLines; ++i) {
line = source[lineNo - i] + line;
if (line !== undefined) {
if ((m = reGuessFunction.exec(line))) {
return m[1];
} else if ((m = reFunctionArgNames.exec(line))) {
return m[1];
}
}
}
return '?';
}
/**
* Retrieves the surrounding lines from where an exception occurred.
* @param {string} url URL of source code.
* @param {(string|number)} line Line number in source code to centre
* around for context.
* @return {?Array.<string>} Lines of source code.
*/
function gatherContext(url, line) {
var source = getSource(url);
if (!source.length) {
return null;
}
var context = [],
// linesBefore & linesAfter are inclusive with the offending line.
// if linesOfContext is even, there will be one extra line
// *before* the offending line.
linesBefore = Math.floor(TraceKit.linesOfContext / 2),
// Add one extra line if linesOfContext is odd
linesAfter = linesBefore + (TraceKit.linesOfContext % 2),
start = Math.max(0, line - linesBefore - 1),
end = Math.min(source.length, line + linesAfter - 1);
line -= 1; // convert to 0-based index
for (var i = start; i < end; ++i) {
if (typeof (source[i]) !== 'undefined') {
context.push(source[i]);
}
}
return context.length > 0 ? context : null;
}
/**
* Escapes special characters, except for whitespace, in a string to be
* used inside a regular expression as a string literal.
* @param {string} text The string.
* @return {string} The escaped string literal.
*/
function escapeRegExp(text) {
return text.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g, '\\$&');
}
/**
* Escapes special characters in a string to be used inside a regular
* expression as a string literal. Also ensures that HTML entities will
* be matched the same as their literal friends.
* @param {string} body The string.
* @return {string} The escaped string.
*/
function escapeCodeAsRegExpForMatchingInsideHTML(body) {
return escapeRegExp(body).replace('<', '(?:<|&lt;)').replace('>', '(?:>|&gt;)').replace('&', '(?:&|&amp;)').replace('"', '(?:"|&quot;)').replace(/\s+/g, '\\s+');
}
/**
* Determines where a code fragment occurs in the source code.
* @param {RegExp} re The function definition.
* @param {Array.<string>} urls A list of URLs to search.
* @return {?Object.<string, (string|number)>} An object containing
* the url, line, and column number of the defined function.
*/
function findSourceInUrls(re, urls) {
var source, m;
for (var i = 0, j = urls.length; i < j; ++i) {
// console.log('searching', urls[i]);
if ((source = getSource(urls[i])).length) {
source = source.join('\n');
if ((m = re.exec(source))) {
// console.log('Found function in ' + urls[i]);
return {
'url': urls[i],
'line': source.substring(0, m.index).split('\n').length,
'column': m.index - source.lastIndexOf('\n', m.index) - 1
};
}
}
}
// console.log('no match');
return null;
}
/**
* Determines at which column a code fragment occurs on a line of the
* source code.
* @param {string} fragment The code fragment.
* @param {string} url The URL to search.
* @param {(string|number)} line The line number to examine.
* @return {?number} The column number.
*/
function findSourceInLine(fragment, url, line) {
var source = getSource(url),
re = new RegExp('\\b' + escapeRegExp(fragment) + '\\b'),
m;
line -= 1;
if (source && source.length > line && (m = re.exec(source[line]))) {
return m.index;
}
return null;
}
/**
* Determines where a function was defined within the source code.
* @param {(Function|string)} func A function reference or serialized
* function definition.
* @return {?Object.<string, (string|number)>} An object containing
* the url, line, and column number of the defined function.
*/
function findSourceByFunctionBody(func) {
var urls = [window.location.href],
scripts = document.getElementsByTagName('script'),
body,
code = '' + func,
codeRE = /^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,
eventRE = /^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,
re,
parts,
result;
for (var i = 0; i < scripts.length; ++i) {
var script = scripts[i];
if (script.src) {
urls.push(script.src);
}
}
if (!(parts = codeRE.exec(code))) {
re = new RegExp(escapeRegExp(code).replace(/\s+/g, '\\s+'));
}
// not sure if this is really necessary, but I don’t have a test
// corpus large enough to confirm that and it was in the original.
else {
var name = parts[1] ? '\\s+' + parts[1] : '',
args = parts[2].split(',').join('\\s*,\\s*');
body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\s+/g, '\\s+');
re = new RegExp('function' + name + '\\s*\\(\\s*' + args + '\\s*\\)\\s*{\\s*' + body + '\\s*}');
}
// look for a normal function definition
if ((result = findSourceInUrls(re, urls))) {
return result;
}
// look for an old-school event handler function
if ((parts = eventRE.exec(code))) {
var event = parts[1];
body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]);
// look for a function defined in HTML as an onXXX handler
re = new RegExp('on' + event + '=[\\\'"]\\s*' + body + '\\s*[\\\'"]', 'i');
if ((result = findSourceInUrls(re, urls[0]))) {
return result;
}
// look for ???
re = new RegExp(body);
if ((result = findSourceInUrls(re, urls))) {
return result;
}
}
return null;
}
// Contents of Exception in various browsers.
//
// SAFARI:
// ex.message = Can't find variable: qq
// ex.line = 59
// ex.sourceId = 580238192
// ex.sourceURL = http://...
// ex.expressionBeginOffset = 96
// ex.expressionCaretOffset = 98
// ex.expressionEndOffset = 98
// ex.name = ReferenceError
//
// FIREFOX:
// ex.message = qq is not defined
// ex.fileName = http://...
// ex.lineNumber = 59
// ex.stack = ...stack trace... (see the example below)
// ex.name = ReferenceError
//
// CHROME:
// ex.message = qq is not defined
// ex.name = ReferenceError
// ex.type = not_defined
// ex.arguments = ['aa']
// ex.stack = ...stack trace...
//
// INTERNET EXPLORER:
// ex.message = ...
// ex.name = ReferenceError
//
// OPERA:
// ex.message = ...message... (see the example below)
// ex.name = ReferenceError
// ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)
// ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'
/**
* Computes stack trace information from the stack property.
* Chrome and Gecko use this property.
* @param {Error} ex
* @return {?Object.<string, *>} Stack trace information.
*/
function computeStackTraceFromStackProp(ex) {
if (!ex.stack) {
return null;
}
var chrome = /^\s*at (?:((?:\[object object\])?\S+) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i,
gecko = /^\s*(\S*)(?:\((.*?)\))?@((?:file|http|https).*?):(\d+)(?::(\d+))?\s*$/i,
lines = ex.stack.split('\n'),
stack = [],
parts,
element,
reference = /^(.*) is undefined$/.exec(ex.message);
for (var i = 0, j = lines.length; i < j; ++i) {
if ((parts = gecko.exec(lines[i]))) {
element = {
'url': parts[3],
'func': parts[1] || '?',
'args': parts[2] ? parts[2].split(',') : '',
'line': +parts[4],
'column': parts[5] ? +parts[5] : null
};
} else if ((parts = chrome.exec(lines[i]))) {
element = {
'url': parts[2],
'func': parts[1] || '?',
'line': +parts[3],
'column': parts[4] ? +parts[4] : null
};
} else {
continue;
}
if (!element.func && element.line) {
element.func = guessFunctionName(element.url, element.line);
}
if (element.line) {
element.context = gatherContext(element.url, element.line);
}
stack.push(element);
}
if (stack[0] && stack[0].line && !stack[0].column && reference) {
stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line);
}
if (!stack.length) {
return null;
}
return {
'mode': 'stack',
'name': ex.name,
'message': ex.message,
'url': document.location.href,
'stack': stack,
'useragent': navigator.userAgent
};
}
/**
* Computes stack trace information from the stacktrace property.
* Opera 10 uses this property.
* @param {Error} ex
* @return {?Object.<string, *>} Stack trace information.
*/
function computeStackTraceFromStacktraceProp(ex) {
// Access and store the stacktrace property before doing ANYTHING
// else to it because Opera is not very good at providing it
// reliably in other circumstances.
var stacktrace = ex.stacktrace;
var testRE = / line (\d+), column (\d+) in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i,
lines = stacktrace.split('\n'),
stack = [],
parts;
for (var i = 0, j = lines.length; i < j; i += 2) {
if ((parts = testRE.exec(lines[i]))) {
var element = {
'line': +parts[1],
'column': +parts[2],
'func': parts[3] || parts[4],
'args': parts[5] ? parts[5].split(',') : [],
'url': parts[6]
};
if (!element.func && element.line) {
element.func = guessFunctionName(element.url, element.line);
}
if (element.line) {
try {
element.context = gatherContext(element.url, element.line);
} catch (exc) {}
}
if (!element.context) {
element.context = [lines[i + 1]];
}
stack.push(element);
}
}
if (!stack.length) {
return null;
}
return {
'mode': 'stacktrace',
'name': ex.name,
'message': ex.message,
'url': document.location.href,
'stack': stack,
'useragent': navigator.userAgent
};
}
/**
* NOT TESTED.
* Computes stack trace information from an error message that includes
* the stack trace.
* Opera 9 and earlier use this method if the option to show stack
* traces is turned on in opera:config.
* @param {Error} ex
* @return {?Object.<string, *>} Stack information.
*/
function computeStackTraceFromOperaMultiLineMessage(ex) {
// Opera includes a stack trace into the exception message. An example is:
//
// Statement on line 3: Undefined variable: undefinedFunc
// Backtrace:
// Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz
// undefinedFunc(a);
// Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy
// zzz(x, y, z);
// Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx
// yyy(a, a, a);
// Line 1 of function script
// try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); }
// ...
var lines = ex.message.split('\n');
if (lines.length < 4) {
return null;
}
var lineRE1 = /^\s*Line (\d+) of linked script ((?:file|http|https)\S+)(?:: in function (\S+))?\s*$/i,
lineRE2 = /^\s*Line (\d+) of inline#(\d+) script in ((?:file|http|https)\S+)(?:: in function (\S+))?\s*$/i,
lineRE3 = /^\s*Line (\d+) of function script\s*$/i,
stack = [],
scripts = document.getElementsByTagName('script'),
inlineScriptBlocks = [],
parts,
i,
len,
source;
for (i in scripts) {
if (TraceKit._has(scripts, i) && !scripts[i].src) {
inlineScriptBlocks.push(scripts[i]);
}
}
for (i = 2, len = lines.length; i < len; i += 2) {
var item = null;
if ((parts = lineRE1.exec(lines[i]))) {
item = {
'url': parts[2],
'func': parts[3],
'line': +parts[1]
};
} else if ((parts = lineRE2.exec(lines[i]))) {
item = {
'url': parts[3],
'func': parts[4]
};
var relativeLine = (+parts[1]); // relative to the start of the <SCRIPT> block
var script = inlineScriptBlocks[parts[2] - 1];
if (script) {
source = getSource(item.url);
if (source) {
source = source.join('\n');
var pos = source.indexOf(script.innerText);
if (pos >= 0) {
item.line = relativeLine + source.substring(0, pos).split('\n').length;
}
}
}
} else if ((parts = lineRE3.exec(lines[i]))) {
var url = window.location.href.replace(/#.*$/, ''),
line = parts[1];
var re = new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[i + 1]));
source = findSourceInUrls(re, [url]);
item = {
'url': url,
'line': source ? source.line : line,
'func': ''
};
}
if (item) {
if (!item.func) {
item.func = guessFunctionName(item.url, item.line);
}
var context = gatherContext(item.url, item.line);
var midline = (context ? context[Math.floor(context.length / 2)] : null);
if (context && midline.replace(/^\s*/, '') === lines[i + 1].replace(/^\s*/, '')) {
item.context = context;
} else {
// if (context) alert("Context mismatch. Correct midline:\n" + lines[i+1] + "\n\nMidline:\n" + midline + "\n\nContext:\n" + context.join("\n") + "\n\nURL:\n" + item.url);
item.context = [lines[i + 1]];
}
stack.push(item);
}
}
if (!stack.length) {
return null; // could not parse multiline exception message as Opera stack trace
}
return {
'mode': 'multiline',
'name': ex.name,
'message': lines[0],
'url': document.location.href,
'stack': stack,
'useragent': navigator.userAgent
};
}
/**
* Adds information about the first frame to incomplete stack traces.
* Safari and IE require this to get complete data on the first frame.
* @param {Object.<string, *>} stackInfo Stack trace information from
* one of the compute* methods.
* @param {string} url The URL of the script that caused an error.
* @param {(number|string)} lineNo The line number of the script that
* caused an error.
* @param {string=} message The error generated by the browser, which
* hopefully contains the name of the object that caused the error.
* @return {boolean} Whether or not the stack information was
* augmented.
*/
function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) {
var initial = {
'url': url,
'line': lineNo
};
if (initial.url && initial.line) {
stackInfo.incomplete = false;
if (!initial.func) {
initial.func = guessFunctionName(initial.url, initial.line);
}
if (!initial.context) {
initial.context = gatherContext(initial.url, initial.line);
}
var reference = / '([^']+)' /.exec(message);
if (reference) {
initial.column = findSourceInLine(reference[1], initial.url, initial.line);
}
if (stackInfo.stack.length > 0) {
if (stackInfo.stack[0].url === initial.url) {
if (stackInfo.stack[0].line === initial.line) {
return false; // already in stack trace
} else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) {
stackInfo.stack[0].line = initial.line;
stackInfo.stack[0].context = initial.context;
return false;
}
}
}
stackInfo.stack.unshift(initial);
stackInfo.partial = true;
return true;
} else {
stackInfo.incomplete = true;
}
return false;
}
/**
* Computes stack trace information by walking the arguments.caller
* chain at the time the exception occurred. This will cause earlier
* frames to be missed but is the only way to get any stack trace in
* Safari and IE. The top frame is restored by
* {@link augmentStackTraceWithInitialElement}.
* @param {Error} ex
* @return {?Object.<string, *>} Stack trace information.
*/
function computeStackTraceByWalkingCallerChain(ex, depth) {
var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,
stack = [],
funcs = {},
recursion = false,
parts,
item,
source;
for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) {
if (curr === computeStackTrace || curr === TraceKit.report) {
// console.log('skipping internal function');
continue;
}
item = {
'url': null,
'func': '?',
'line': null,
'column': null
};
if (curr.name) {
item.func = curr.name;
} else if ((parts = functionName.exec(curr.toString()))) {
item.func = parts[1];
}
if ((source = findSourceByFunctionBody(curr))) {
item.url = source.url;
item.line = source.line;
if (item.func === '?') {
item.func = guessFunctionName(item.url, item.line);
}
var reference = / '([^']+)' /.exec(ex.message || ex.description);
if (reference) {
item.column = findSourceInLine(reference[1], source.url, source.line);
}
}
if (funcs['' + curr]) {
recursion = true;
}else{
funcs['' + curr] = true;
}
stack.push(item);
}
if (depth) {
// console.log('depth is ' + depth);
// console.log('stack is ' + stack.length);
stack.splice(0, depth);
}
var result = {
'mode': 'callers',
'name': ex.name,
'message': ex.message,
'url': document.location.href,
'stack': stack,
'useragent': navigator.userAgent
};
augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description);
return result;
}
/**
* Computes a stack trace for an exception.
* @param {Error} ex
* @param {(string|number)=} depth
*/
function computeStackTrace(ex, depth) {
var stack = null;
depth = (depth == null ? 0 : +depth);
try {
// This must be tried first because Opera 10 *destroys*
// its stacktrace property if you try to access the stack
// property first!!
stack = computeStackTraceFromStacktraceProp(ex);
if (stack) {
return stack;
}
} catch (e) {
if (debug) {
throw e;
}
}
try {
stack = computeStackTraceFromStackProp(ex);
if (stack) {
return stack;
}
} catch (e) {
if (debug) {
throw e;
}
}
try {
stack = computeStackTraceFromOperaMultiLineMessage(ex);
if (stack) {
return stack;
}
} catch (e) {
if (debug) {
throw e;
}
}
try {
stack = computeStackTraceByWalkingCallerChain(ex, depth + 1);
if (stack) {
return stack;
}
} catch (e) {
if (debug) {
throw e;
}
}
return {
'mode': 'failed'
};
}
/**
* Logs a stacktrace starting from the previous call and working down.
* @param {(number|string)=} depth How many frames deep to trace.
* @return {Object.<string, *>} Stack trace information.
*/
function computeStackTraceOfCaller(depth) {
depth = (depth == null ? 0 : +depth) + 1; // "+ 1" because "ofCaller" should drop one frame
try {
throw new Error();
} catch (ex) {
return computeStackTrace(ex, depth + 1);
}
return null;
}
computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement;
computeStackTrace.guessFunctionName = guessFunctionName;
computeStackTrace.gatherContext = gatherContext;
computeStackTrace.ofCaller = computeStackTraceOfCaller;
return computeStackTrace;
}());
/**
* Extends support for global error handling for asynchronous browser
* functions. Adopted from Closure Library's errorhandler.js
*/
(function extendToAsynchronousCallbacks(w) {
var _helper = function _helper(fnName) {
var originalFn = w[fnName];
w[fnName] = function traceKitAsyncExtension() {
// Make a copy of the arguments
var args = Array.prototype.slice.call(arguments, 0);
var originalCallback = args[0];
if (typeof (originalCallback) === 'function') {
args[0] = function traceKitArgsZero() {
try {
originalCallback.apply(this, arguments);
} catch (e) {
TraceKit.report(e);
throw e;
}
};
}
// IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it
// also only supports 2 argument and doesn't care what "this" is, so we
// can just call the original function directly.
if (originalFn.apply) {
return originalFn.apply(this, args);
} else {
return originalFn(args[0], args[1]);
}
};
};
_helper('setTimeout');
_helper('setInterval');
}(window));
/**
* Extended support for backtraces and global error handling for most
* asynchronous jQuery functions.
*/
(function traceKitAsyncForjQuery($) {
// quit if jQuery isn't on the page
if (!$) {
return;
}
var _oldEventAdd = $.event.add;
$.event.add = function traceKitEventAdd(elem, types, handler, data, selector) {
var _handler;
if (handler.handler) {
_handler = handler.handler;
handler.handler = function traceKitHandler() {
try {
return _handler.apply(this, arguments);
} catch (e) {
TraceKit.report(e);
throw e;
}
};
} else {
_handler = handler;
handler = function apply_handler() {
try {
return _handler.apply(this, arguments);
} catch (e) {
TraceKit.report(e);
throw e;
}
};
}
// If the handler we are attaching doesn’t have the same guid as
// the original, it will never be removed when someone tries to
// unbind the original function later. Technically as a result of
// this our guids are no longer globally unique, but whatever, that
// never hurt anybody RIGHT?!
if (_handler.guid) {
handler.guid = _handler.guid;
} else {
handler.guid = _handler.guid = $.guid++;
}
return _oldEventAdd.call(this, elem, types, handler, data, selector);
};
var _oldReady = $.fn.ready;
$.fn.ready = function traceKitjQueryReadyWrapper(fn) {
var _fn = function () {
try {
return fn.apply(this, arguments);
} catch (e) {
TraceKit.report(e);
throw e;
}
};
return _oldReady.call(this, _fn);
};
var _oldAjax = $.ajax;
$.ajax = function traceKitAjaxWrapper(s) {
if ($.isFunction(s.complete)) {
var _oldComplete = s.complete;
s.complete = function traceKitjQueryComplete() {
try {
return _oldComplete.apply(this, arguments);
} catch (e) {
TraceKit.report(e);
throw e;
}
};
}
if ($.isFunction(s.error)) {
var _oldError = s.error;
s.error = function traceKitjQueryError() {
try {
return _oldError.apply(this, arguments);
} catch (e) {
TraceKit.report(e);
throw e;
}
};
}
if ($.isFunction(s.success)) {
var _oldSuccess = s.success;
s.success = function traceKitjQuerySuccess() {
try {
return _oldSuccess.apply(this, arguments);
} catch (e) {
TraceKit.report(e);
throw e;
}
};
}
try {
return _oldAjax.call(this, s);
} catch (e) {
TraceKit.report(e);
throw e;
}
};
}(window.jQuery));
//Default options:
if (!TraceKit.remoteFetching) {
TraceKit.remoteFetching = true;
}
if (!TraceKit.collectWindowErrors) {
TraceKit.collectWindowErrors = true;
}
if (!TraceKit.linesOfContext || TraceKit.linesOfContext < 1) {
// 5 lines before, the offending line, 5 lines after
TraceKit.linesOfContext = 11;
}
// Export to global object
window.TraceKit = TraceKit;
}(window));
;(function(window, undefined){
'use strict';
// First, check for JSON support
// If there is no JSON, we no-op the core features of Raven
// since JSON is required to encode the payload
var _Raven = window.Raven,
hasJSON = !!(window.JSON && window.JSON.stringify),
globalServer,
globalUser,
globalKey,
globalProject,
globalOptions = {
logger: 'javascript',
ignoreErrors: [],
ignoreUrls: []
};
var TK = TraceKit.noConflict();
// Disable Tracekit's remote fetching by default
TK.remoteFetching = false;
/*
* The core Raven singleton
*
* @this {Raven}
*/
var Raven = {
VERSION: 'a75cbab',
/*
* Allow multiple versions of Raven to be installed.
* Strip Raven from the global context and returns the instance.
*
* @return {Raven}
*/
noConflict: function() {
window.Raven = _Raven;
return Raven;
},
/*
* Configure Raven with a DSN and extra options
*
* @param {string} dsn The public Sentry DSN
* @param {object} options Optional set of of global options [optional]
* @return {Raven}
*/
config: function(dsn, options) {
var uri = parseUri(dsn),
lastSlash = uri.path.lastIndexOf('/'),
path = uri.path.substr(1, lastSlash);
// merge in options
if (options) {
each(options, function(key, value){
globalOptions[key] = value;
});
}
// "Script error." is hard coded into browsers for errors that it can't read.
// this is the result of a script being pulled in from an external domain and CORS.
globalOptions.ignoreErrors.push('Script error.');
globalKey = uri.user;
globalProject = ~~uri.path.substr(lastSlash + 1);
// assemble the endpoint from the uri pieces
globalServer = '//' + uri.host +
(uri.port ? ':' + uri.port : '') +
'/' + path + 'api/' + globalProject + '/store/';
if (uri.protocol) {
globalServer = uri.protocol + ':' + globalServer;
}
if (globalOptions.fetchContext) {
TK.remoteFetching = true;
}
// return for chaining
return Raven;
},
/*
* Installs a global window.onerror error handler
* to capture and report uncaught exceptions.
* At this point, install() is required to be called due
* to the way TraceKit is set up.
*
* @return {Raven}
*/
install: function() {
if (!isSetup()) return;
TK.report.subscribe(handleStackInfo);
return Raven;
},
/*
* Wrap code within a context so Raven can capture errors
* reliably across domains that is executed immediately.
*
* @param {object} options A specific set of options for this context [optional]
* @param {function} func The callback to be immediately executed within the context
* @param {array} args An array of arguments to be called with the callback [optional]
*/
context: function(options, func, args) {
if (isFunction(options)) {
args = func || [];
func = options;
options = undefined;
}
Raven.wrap(options, func).apply(this, args);
},
/*
* Wrap code within a context and returns back a new function to be executed
*
* @param {object} options A specific set of options for this context [optional]
* @param {function} func The function to be wrapped in a new context
* @return {function} The newly wrapped functions with a context
*/
wrap: function(options, func) {
// options is optional
if (isFunction(options)) {
func = options;
options = undefined;
}
return function() {
try {
func.apply(this, arguments);
} catch(e) {
Raven.captureException(e, options);
}
};
},
/*
* Uninstalls the global error handler.
*
* @return {Raven}
*/
uninstall: function() {
TK.report.unsubscribe(handleStackInfo);
return Raven;
},
/*
* Manually capture an exception and send it over to Sentry
*
* @param {error} ex An exception to be logged
* @param {object} options A specific set of options for this error [optional]
* @return {Raven}
*/
captureException: function(ex, options) {
// If a string is passed through, recall as a message
if (typeof ex === 'string') {
return Raven.captureMessage(ex, options);
}
// TraceKit.report will re-raise any exception passed to it,
// which means you have to wrap it in try/catch. Instead, we
// can wrap it here and only re-raise if TraceKit.report
// raises an exception different from the one we asked to
// report on.
try {
TK.report(ex, options);
} catch(ex1) {
if(ex !== ex1) {
throw ex1;
}
}
return Raven;
},
/*
* Manually send a message to Sentry
*
* @param {string} msg A plain message to be captured in Sentry
* @param {object} options A specific set of options for this message [optional]
* @return {Raven}
*/
captureMessage: function(msg, options) {
// Fire away!
send(
arrayMerge({
message: msg
}, options)
);
return Raven;
},
/*
* Set/clear a user to be sent along with the payload.
*
* @param {object} user An object representing user data [optional]
* @return {Raven}
*/
setUser: function(user) {
globalUser = user;
return Raven;
}
};
var uriKeys = 'source protocol authority userInfo user password host port relative path directory file query anchor'.split(' '),
uriPattern = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;
/**** Private functions ****/
function parseUri(str) {
var m = uriPattern.exec(str),
uri = {},
i = 14;
while (i--) uri[uriKeys[i]] = m[i] || '';
return uri;
}
function isUndefined(what) {
return typeof what === 'undefined';
}
function isFunction(what) {
return typeof what === 'function';
}
function each(obj, callback) {
var i, j;
if (isUndefined(obj.length)) {
for (i in obj) {
if (obj.hasOwnProperty(i)) {
callback.call(null, i, obj[i]);
}
}
} else {
j = obj.length;
if (j) {
for (i = 0; i < j; i++) {
callback.call(null, i, obj[i]);
}
}
}
}
var cachedAuth;
function getAuthQueryString() {
if (cachedAuth) return cachedAuth;
var qs = [
'sentry_version=2.0',
'sentry_client=raven-js/' + Raven.VERSION
];
if (globalKey) {
qs.push('sentry_key=' + globalKey);
}
cachedAuth = '?' + qs.join('&');
return cachedAuth;
}
function handleStackInfo(stackInfo, options) {
var frames = [];
if (stackInfo.stack && stackInfo.stack.length) {
each(stackInfo.stack, function(i, stack) {
var frame = normalizeFrame(stack);
if (frame) {
frames.push(frame);
}
});
}
processException(
stackInfo.name,
stackInfo.message,
stackInfo.url,
stackInfo.lineno,
frames,
options
);
}
function normalizeFrame(frame) {
if (!frame.url) return;
// normalize the frames data
var normalized = {
filename: frame.url,
lineno: frame.line,
colno: frame.column,
'function': frame.func || '?'
}, context = extractContextFromFrame(frame);
if (context) {
var i = 3, keys = ['pre_context', 'context_line', 'post_context'];
while (i--) normalized[keys[i]] = context[i];
}
normalized.in_app = !/(Raven|TraceKit)\./.test(normalized['function']);
return normalized;
}
function extractContextFromFrame(frame) {
// immediately check if we should even attempt to parse a context
if (!frame.context || !globalOptions.fetchContext) return;
var context = frame.context,
pivot = ~~(context.length / 2),
i = context.length, isMinified = false;
while (i--) {
// We're making a guess to see if the source is minified or not.
// To do that, we make the assumption if *any* of the lines passed
// in are greater than 300 characters long, we bail.
// Sentry will see that there isn't a context
if (context[i].length > 300) {
isMinified = true;
break;
}
}
if (isMinified) {
// The source is minified and we don't know which column. Fuck it.
if (isUndefined(frame.column)) return;
// If the source is minified and has a frame column
// we take a chunk of the offending line to hopefully shed some light
return [
[], // no pre_context
context[pivot].substr(frame.column, 50), // grab 50 characters, starting at the offending column
[] // no post_context
];
}
return [
context.slice(0, pivot), // pre_context
context[pivot], // context_line
context.slice(pivot + 1) // post_context
];
}
function processException(type, message, fileurl, lineno, frames, options) {
var stacktrace, label, i;
// IE8 really doesn't have Array.prototype.indexOf
// Filter out a message that matches our ignore list
i = globalOptions.ignoreErrors.length;
while (i--) {
if (message === globalOptions.ignoreErrors[i]) {
return;
}
}
if (frames && frames.length) {
stacktrace = {frames: frames};
fileurl = fileurl || frames[0].filename;
} else if (fileurl) {
stacktrace = {
frames: [{
filename: fileurl,
lineno: lineno
}]
};
}
i = globalOptions.ignoreUrls.length;
while (i--) {
if (globalOptions.ignoreUrls[i].test(fileurl)) {
return;
}
}
label = lineno ? message + ' at ' + lineno : message;
// Fire away!
send(
arrayMerge({
'sentry.interfaces.Exception': {
type: type,
value: message
},
'sentry.interfaces.Stacktrace': stacktrace,
culprit: fileurl,
message: label
}, options)
);
}
function arrayMerge(arr1, arr2) {
if (!arr2) {
return arr1;
}
each(arr2, function(key, value){
arr1[key] = value;
});
return arr1;
}
function getHttpData() {
var http = {
url: document.location.href,
headers: {
'User-Agent': navigator.userAgent
}
};
if (document.referrer) {
http.headers.Referer = document.referrer;
}
return http;
}
function send(data) {
if (!isSetup()) return;
data = arrayMerge({
project: globalProject,
logger: globalOptions.logger,
site: globalOptions.site,
platform: 'javascript',
'sentry.interfaces.Http': getHttpData()
}, data);
if (globalUser) data['sentry.interfaces.User'] = globalUser;
if (isFunction(globalOptions.dataCallback)) {
data = globalOptions.dataCallback(data);
}
makeRequest(data);
}
function makeRequest(data) {
new Image().src = globalServer + getAuthQueryString() + '&sentry_data=' + encodeURIComponent(JSON.stringify(data));
}
function isSetup() {
if (!hasJSON) return false; // needs JSON support
if (!globalServer) {
if (window.console && console.error) {
console.error("Error: Raven has not been configured.");
}
return false;
}
return true;
}
// Expose Raven to the world
window.Raven = Raven;
// AMD
if (typeof define === 'function' && define.amd) {
define(function() { return Raven; });
}
})(window);
/*! Raven.js a75cbab | github.com/getsentry/raven-js */
(function(n,e){var t={},r=n.TraceKit;t.noConflict=function(){return n.TraceKit=r,t},t._has=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.report=function(){function e(n){u.push(n)}function r(n){for(var e=u.length-1;e>=0;--e)u[e]===n&&u.splice(e,1)}function i(n,e){var r=null;if(!e||t.collectWindowErrors){for(var i in u)if(t._has(u,i))try{u[i].apply(null,[n].concat(Array.prototype.slice.call(arguments,2)))}catch(c){r=c}if(r)throw r}}function c(e){var r=Array.prototype.slice.call(arguments,1);if(l){if(o===e)return;var c=l;l=null,o=null,i.apply(null,[c,null].concat(r))}var u=t.computeStackTrace(e);throw l=u,o=e,n.setTimeout(function(){o===e&&(l=null,o=null,i.apply(null,[u,null].concat(r)))},u.incomplete?2e3:0),e}var u=[],o=null,l=null,a=n.onerror;return n.onerror=function(n,e,r){var c=null;if(l)t.computeStackTrace.augmentStackTraceWithInitialElement(l,e,r,n),c=l,l=null,o=null;else{var u={url:e,line:r};u.func=t.computeStackTrace.guessFunctionName(u.url,u.line),u.context=t.computeStackTrace.gatherContext(u.url,u.line),c={mode:"onerror",message:n,url:document.location.href,stack:[u],useragent:navigator.userAgent}}return i(c,"from window.onerror"),a?a.apply(this,arguments):!1},c.subscribe=e,c.unsubscribe=r,c}(),t.computeStackTrace=function(){function r(e){function r(){try{return new n.XMLHttpRequest}catch(e){return new n.ActiveXObject("Microsoft.XMLHTTP")}}if(!t.remoteFetching)return"";try{var i=r();return i.open("GET",e,!1),i.send(""),i.responseText}catch(c){return""}}function i(n){if(!t._has(w,n)){var e;e=-1!==n.indexOf(document.domain)?r(n):[],w[n]=e.length?e.split("\n"):[]}return w[n]}function c(n,t){var r,c=/function ([^(]*)\(([^)]*)\)/,u=/['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/,o="",l=10,a=i(n);if(!a.length)return"?";for(var s=0;l>s;++s)if(o=a[t-s]+o,o!==e){if(r=u.exec(o))return r[1];if(r=c.exec(o))return r[1]}return"?"}function u(n,r){var c=i(n);if(!c.length)return null;var u=[],o=Math.floor(t.linesOfContext/2),l=o+t.linesOfContext%2,a=Math.max(0,r-o-1),s=Math.min(c.length,r+l-1);r-=1;for(var f=a;s>f;++f)c[f]!==e&&u.push(c[f]);return u.length>0?u:null}function o(n){return n.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g,"\\$&")}function l(n){return o(n).replace("<","(?:<|&lt;)").replace(">","(?:>|&gt;)").replace("&","(?:&|&amp;)").replace('"','(?:"|&quot;)').replace(/\s+/g,"\\s+")}function a(n,e){for(var t,r,c=0,u=e.length;u>c;++c)if((t=i(e[c])).length&&(t=t.join("\n"),r=n.exec(t)))return{url:e[c],line:t.substring(0,r.index).split("\n").length,column:r.index-t.lastIndexOf("\n",r.index)-1};return null}function s(n,e,t){var r,c=i(e),u=RegExp("\\b"+o(n)+"\\b");return t-=1,c&&c.length>t&&(r=u.exec(c[t]))?r.index:null}function f(e){for(var t,r,i,c,u=[n.location.href],s=document.getElementsByTagName("script"),f=""+e,p=/^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,h=/^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,g=0;s.length>g;++g){var m=s[g];m.src&&u.push(m.src)}if(i=p.exec(f)){var v=i[1]?"\\s+"+i[1]:"",d=i[2].split(",").join("\\s*,\\s*");t=o(i[3]).replace(/;$/,";?"),r=RegExp("function"+v+"\\s*\\(\\s*"+d+"\\s*\\)\\s*{\\s*"+t+"\\s*}")}else r=RegExp(o(f).replace(/\s+/g,"\\s+"));if(c=a(r,u))return c;if(i=h.exec(f)){var y=i[1];if(t=l(i[2]),r=RegExp("on"+y+"=[\\'\"]\\s*"+t+"\\s*[\\'\"]","i"),c=a(r,u[0]))return c;if(r=RegExp(t),c=a(r,u))return c}return null}function p(n){if(!n.stack)return null;for(var e,t,r=/^\s*at (?:((?:\[object object\])?\S+) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i,i=/^\s*(\S*)(?:\((.*?)\))?@((?:file|http|https).*?):(\d+)(?::(\d+))?\s*$/i,o=n.stack.split("\n"),l=[],a=/^(.*) is undefined$/.exec(n.message),f=0,p=o.length;p>f;++f){if(e=i.exec(o[f]))t={url:e[3],func:e[1]||"?",args:e[2]?e[2].split(","):"",line:+e[4],column:e[5]?+e[5]:null};else{if(!(e=r.exec(o[f])))continue;t={url:e[2],func:e[1]||"?",line:+e[3],column:e[4]?+e[4]:null}}!t.func&&t.line&&(t.func=c(t.url,t.line)),t.line&&(t.context=u(t.url,t.line)),l.push(t)}return l[0]&&l[0].line&&!l[0].column&&a&&(l[0].column=s(a[1],l[0].url,l[0].line)),l.length?{mode:"stack",name:n.name,message:n.message,url:document.location.href,stack:l,useragent:navigator.userAgent}:null}function h(n){for(var e,t=n.stacktrace,r=/ line (\d+), column (\d+) in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i,i=t.split("\n"),o=[],l=0,a=i.length;a>l;l+=2)if(e=r.exec(i[l])){var s={line:+e[1],column:+e[2],func:e[3]||e[4],args:e[5]?e[5].split(","):[],url:e[6]};if(!s.func&&s.line&&(s.func=c(s.url,s.line)),s.line)try{s.context=u(s.url,s.line)}catch(f){}s.context||(s.context=[i[l+1]]),o.push(s)}return o.length?{mode:"stacktrace",name:n.name,message:n.message,url:document.location.href,stack:o,useragent:navigator.userAgent}:null}function g(e){var r=e.message.split("\n");if(4>r.length)return null;var o,s,f,p,h=/^\s*Line (\d+) of linked script ((?:file|http|https)\S+)(?:: in function (\S+))?\s*$/i,g=/^\s*Line (\d+) of inline#(\d+) script in ((?:file|http|https)\S+)(?:: in function (\S+))?\s*$/i,m=/^\s*Line (\d+) of function script\s*$/i,v=[],d=document.getElementsByTagName("script"),y=[];for(s in d)t._has(d,s)&&!d[s].src&&y.push(d[s]);for(s=2,f=r.length;f>s;s+=2){var x=null;if(o=h.exec(r[s]))x={url:o[2],func:o[3],line:+o[1]};else if(o=g.exec(r[s])){x={url:o[3],func:o[4]};var w=+o[1],k=y[o[2]-1];if(k&&(p=i(x.url))){p=p.join("\n");var b=p.indexOf(k.innerText);b>=0&&(x.line=w+p.substring(0,b).split("\n").length)}}else if(o=m.exec(r[s])){var S=n.location.href.replace(/#.*$/,""),E=o[1],T=RegExp(l(r[s+1]));p=a(T,[S]),x={url:S,line:p?p.line:E,func:""}}if(x){x.func||(x.func=c(x.url,x.line));var F=u(x.url,x.line),$=F?F[Math.floor(F.length/2)]:null;x.context=F&&$.replace(/^\s*/,"")===r[s+1].replace(/^\s*/,"")?F:[r[s+1]],v.push(x)}}return v.length?{mode:"multiline",name:e.name,message:r[0],url:document.location.href,stack:v,useragent:navigator.userAgent}:null}function m(n,e,t,r){var i={url:e,line:t};if(i.url&&i.line){n.incomplete=!1,i.func||(i.func=c(i.url,i.line)),i.context||(i.context=u(i.url,i.line));var o=/ '([^']+)' /.exec(r);if(o&&(i.column=s(o[1],i.url,i.line)),n.stack.length>0&&n.stack[0].url===i.url){if(n.stack[0].line===i.line)return!1;if(!n.stack[0].line&&n.stack[0].func===i.func)return n.stack[0].line=i.line,n.stack[0].context=i.context,!1}return n.stack.unshift(i),n.partial=!0,!0}return n.incomplete=!0,!1}function v(n,e){for(var r,i,u,o=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,l=[],a={},p=!1,h=v.caller;h&&!p;h=h.caller)if(h!==d&&h!==t.report){if(i={url:null,func:"?",line:null,column:null},h.name?i.func=h.name:(r=o.exec(""+h))&&(i.func=r[1]),u=f(h)){i.url=u.url,i.line=u.line,"?"===i.func&&(i.func=c(i.url,i.line));var g=/ '([^']+)' /.exec(n.message||n.description);g&&(i.column=s(g[1],u.url,u.line))}a[""+h]?p=!0:a[""+h]=!0,l.push(i)}e&&l.splice(0,e);var y={mode:"callers",name:n.name,message:n.message,url:document.location.href,stack:l,useragent:navigator.userAgent};return m(y,n.sourceURL||n.fileName,n.line||n.lineNumber,n.message||n.description),y}function d(n,e){var t=null;e=null==e?0:+e;try{if(t=h(n))return t}catch(r){if(x)throw r}try{if(t=p(n))return t}catch(r){if(x)throw r}try{if(t=g(n))return t}catch(r){if(x)throw r}try{if(t=v(n,e+1))return t}catch(r){if(x)throw r}return{mode:"failed"}}function y(n){n=(null==n?0:+n)+1;try{throw Error()}catch(e){return d(e,n+1)}return null}var x=!1,w={};return d.augmentStackTraceWithInitialElement=m,d.guessFunctionName=c,d.gatherContext=u,d.ofCaller=y,d}(),function(n){var e=function e(e){var r=n[e];n[e]=function(){var n=Array.prototype.slice.call(arguments,0),e=n[0];return"function"==typeof e&&(n[0]=function(){try{e.apply(this,arguments)}catch(n){throw t.report(n),n}}),r.apply?r.apply(this,n):r(n[0],n[1])}};e("setTimeout"),e("setInterval")}(n),function(n){if(n){var e=n.event.add;n.event.add=function(r,i,c,u,o){var l;return c.handler?(l=c.handler,c.handler=function(){try{return l.apply(this,arguments)}catch(n){throw t.report(n),n}}):(l=c,c=function(){try{return l.apply(this,arguments)}catch(n){throw t.report(n),n}}),c.guid=l.guid?l.guid:l.guid=n.guid++,e.call(this,r,i,c,u,o)};var r=n.fn.ready;n.fn.ready=function(n){var e=function(){try{return n.apply(this,arguments)}catch(e){throw t.report(e),e}};return r.call(this,e)};var i=n.ajax;n.ajax=function(e){if(n.isFunction(e.complete)){var r=e.complete;e.complete=function(){try{return r.apply(this,arguments)}catch(n){throw t.report(n),n}}}if(n.isFunction(e.error)){var c=e.error;e.error=function(){try{return c.apply(this,arguments)}catch(n){throw t.report(n),n}}}if(n.isFunction(e.success)){var u=e.success;e.success=function(){try{return u.apply(this,arguments)}catch(n){throw t.report(n),n}}}try{return i.call(this,e)}catch(o){throw t.report(o),o}}}}(n.jQuery),t.remoteFetching||(t.remoteFetching=!0),t.collectWindowErrors||(t.collectWindowErrors=!0),(!t.linesOfContext||1>t.linesOfContext)&&(t.linesOfContext=11),n.TraceKit=t})(window),function(n,e){"use strict";function t(n){for(var e=$.exec(n),t={},r=14;r--;)t[F[r]]=e[r]||"";return t}function r(n){return n===e}function i(n){return"function"==typeof n}function c(n,e){var t,i;if(r(n.length))for(t in n)n.hasOwnProperty(t)&&e.call(null,t,n[t]);else if(i=n.length)for(t=0;i>t;t++)e.call(null,t,n[t])}function u(){if(E)return E;var n=["sentry_version=2.0","sentry_client=raven-js/"+T.VERSION];return y&&n.push("sentry_key="+y),E="?"+n.join("&")}function o(n,e){var t=[];n.stack&&n.stack.length&&c(n.stack,function(n,e){var r=l(e);r&&t.push(r)}),s(n.name,n.message,n.url,n.lineno,t,e)}function l(n){if(n.url){var e={filename:n.url,lineno:n.line,colno:n.column,"function":n.func||"?"},t=a(n);if(t)for(var r=3,i=["pre_context","context_line","post_context"];r--;)e[i[r]]=t[r];return e.in_app=!/(Raven|TraceKit)\./.test(e["function"]),e}}function a(n){if(n.context&&b.fetchContext){for(var e=n.context,t=~~(e.length/2),i=e.length,c=!1;i--;)if(e[i].length>300){c=!0;break}if(c){if(r(n.column))return;return[[],e[t].substr(n.column,50),[]]}return[e.slice(0,t),e[t],e.slice(t+1)]}}function s(n,e,t,r,i,c){var u,o,l;for(l=b.ignoreErrors.length;l--;)if(e===b.ignoreErrors[l])return;for(i&&i.length?(u={frames:i},t=t||i[0].filename):t&&(u={frames:[{filename:t,lineno:r}]}),l=b.ignoreUrls.length;l--;)if(b.ignoreUrls[l].test(t))return;o=r?e+" at "+r:e,h(f({"sentry.interfaces.Exception":{type:n,value:e},"sentry.interfaces.Stacktrace":u,culprit:t,message:o},c))}function f(n,e){return e?(c(e,function(e,t){n[e]=t}),n):n}function p(){var n={url:document.location.href,headers:{"User-Agent":navigator.userAgent}};return document.referrer&&(n.headers.Referer=document.referrer),n}function h(n){m()&&(n=f({project:x,logger:b.logger,site:b.site,platform:"javascript","sentry.interfaces.Http":p()},n),d&&(n["sentry.interfaces.User"]=d),i(b.dataCallback)&&(n=b.dataCallback(n)),g(n))}function g(n){(new Image).src=v+u()+"&sentry_data="+encodeURIComponent(JSON.stringify(n))}function m(){return k?v?!0:(n.console&&console.error&&console.error("Error: Raven has not been configured."),!1):!1}var v,d,y,x,w=n.Raven,k=!(!n.JSON||!n.JSON.stringify),b={logger:"javascript",ignoreErrors:[],ignoreUrls:[]},S=TraceKit.noConflict();S.remoteFetching=!1;var E,T={VERSION:"a75cbab",noConflict:function(){return n.Raven=w,T},config:function(n,e){var r=t(n),i=r.path.lastIndexOf("/"),u=r.path.substr(1,i);return e&&c(e,function(n,e){b[n]=e}),b.ignoreErrors.push("Script error."),y=r.user,x=~~r.path.substr(i+1),v="//"+r.host+(r.port?":"+r.port:"")+"/"+u+"api/"+x+"/store/",r.protocol&&(v=r.protocol+":"+v),b.fetchContext&&(S.remoteFetching=!0),T},install:function(){return m()?(S.report.subscribe(o),T):e},context:function(n,t,r){i(n)&&(r=t||[],t=n,n=e),T.wrap(n,t).apply(this,r)},wrap:function(n,t){return i(n)&&(t=n,n=e),function(){try{t.apply(this,arguments)}catch(e){T.captureException(e,n)}}},uninstall:function(){return S.report.unsubscribe(o),T},captureException:function(n,e){if("string"==typeof n)return T.captureMessage(n,e);try{S.report(n,e)}catch(t){if(n!==t)throw t}return T},captureMessage:function(n,e){return h(f({message:n},e)),T},setUser:function(n){return d=n,T}},F="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),$=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;n.Raven=T,"function"==typeof define&&define.amd&&define(function(){return T})}(window);
/*
//@ sourceMappingURL=raven.min.map
*/
{"version":3,"file":"raven.min.js","sources":["raven.js"],"names":["window","undefined","TraceKit","_oldTraceKit","noConflict","_has","object","key","Object","prototype","hasOwnProperty","call","report","subscribe","handler","handlers","push","unsubscribe","i","length","splice","notifyHandlers","stack","windowError","exception","collectWindowErrors","apply","concat","Array","slice","arguments","inner","ex","args","lastExceptionStack","lastException","s","computeStackTrace","setTimeout","incomplete","_oldOnerrorHandler","onerror","message","url","lineNo","augmentStackTraceWithInitialElement","location","line","func","guessFunctionName","context","gatherContext","mode","document","href","useragent","navigator","userAgent","this","loadSource","getXHR","XMLHttpRequest","e","ActiveXObject","remoteFetching","request","open","send","responseText","getSource","sourceCache","source","indexOf","domain","split","m","reFunctionArgNames","reGuessFunction","maxLines","exec","linesBefore","Math","floor","linesOfContext","linesAfter","start","max","end","min","escapeRegExp","text","replace","escapeCodeAsRegExpForMatchingInsideHTML","body","findSourceInUrls","re","urls","j","join","substring","index","column","lastIndexOf","findSourceInLine","fragment","RegExp","findSourceByFunctionBody","parts","result","scripts","getElementsByTagName","code","codeRE","eventRE","script","src","name","event","computeStackTraceFromStackProp","element","chrome","gecko","lines","reference","computeStackTraceFromStacktraceProp","stacktrace","testRE","exc","computeStackTraceFromOperaMultiLineMessage","len","lineRE1","lineRE2","lineRE3","inlineScriptBlocks","item","relativeLine","pos","innerText","midline","stackInfo","initial","unshift","partial","computeStackTraceByWalkingCallerChain","depth","functionName","funcs","recursion","curr","caller","description","sourceURL","fileName","lineNumber","debug","computeStackTraceOfCaller","Error","ofCaller","w","_helper","fnName","originalFn","originalCallback","$","_oldEventAdd","add","elem","types","data","selector","_handler","guid","_oldReady","fn","ready","_fn","_oldAjax","ajax","isFunction","complete","_oldComplete","error","_oldError","success","_oldSuccess","jQuery","parseUri","str","uriPattern","uri","uriKeys","isUndefined","what","each","obj","callback","getAuthQueryString","cachedAuth","qs","Raven","VERSION","globalKey","handleStackInfo","options","frames","frame","normalizeFrame","processException","lineno","normalized","filename","colno","function","extractContextFromFrame","keys","in_app","test","globalOptions","fetchContext","pivot","isMinified","substr","type","fileurl","label","ignoreErrors","ignoreUrls","arrayMerge","sentry.interfaces.Exception","value","sentry.interfaces.Stacktrace","culprit","arr1","arr2","getHttpData","http","headers","User-Agent","referrer","Referer","isSetup","project","globalProject","logger","site","platform","sentry.interfaces.Http","globalUser","dataCallback","makeRequest","Image","globalServer","encodeURIComponent","JSON","stringify","hasJSON","console","_Raven","TK","config","dsn","lastSlash","path","user","host","port","protocol","install","wrap","captureException","uninstall","captureMessage","ex1","msg","setUser","define","amd"],"mappings":";CAgBE,SAASA,EAAQC,GAGnB,GAAIC,MACAC,EAAeH,EAAOE,QAM1BA,GAASE,WAAa,WAElB,MADAJ,GAAOE,SAAWC,EACXD,GAUXA,EAASG,KAAO,SAAcC,EAAQC,GAClC,MAAOC,QAAOC,UAAUC,eAAeC,KAAKL,EAAQC,IA0CxDL,EAASU,OAAU,WASf,QAASC,GAAUC,GACfC,EAASC,KAAKF,GAOlB,QAASG,GAAYH,GACjB,IAAK,GAAII,GAAIH,EAASI,OAAS,EAAGD,GAAK,IAAKA,EACpCH,EAASG,KAAOJ,GAChBC,EAASK,OAAOF,EAAG,GAS/B,QAASG,GAAeC,EAAOC,GAC3B,GAAIC,GAAY,IAChB,KAAID,GAAgBrB,EAASuB,oBAA7B,CAGA,IAAK,GAAIP,KAAKH,GACV,GAAIb,EAASG,KAAKU,EAAUG,GACxB,IACIH,EAASG,GAAGQ,MAAM,MAAOJ,GAAOK,OAAOC,MAAMnB,UAAUoB,MAAMlB,KAAKmB,UAAW,KAC/E,MAAOC,GACLP,EAAYO,EAKxB,GAAIP,EACA,KAAMA,IAmDd,QAASZ,GAAOoB,GACZ,GAAIC,GAAOL,MAAMnB,UAAUoB,MAAMlB,KAAKmB,UAAW,EACjD,IAAII,EAAoB,CACpB,GAAIC,IAAkBH,EAClB,MAEA,IAAII,GAAIF,CACRA,GAAqB,KACrBC,EAAgB,KAChBd,EAAeK,MAAM,MAAOU,EAAG,MAAMT,OAAOM,IAIpD,GAAIX,GAAQpB,EAASmC,kBAAkBL,EAgBvC,MAfAE,GAAqBZ,EACrBa,EAAgBH,EAMhBhC,EAAOsC,WAAW,WACVH,IAAkBH,IAClBE,EAAqB,KACrBC,EAAgB,KAChBd,EAAeK,MAAM,MAAOJ,EAAO,MAAMK,OAAOM,MAEpDX,EAAMiB,WAAa,IAAO,GAExBP,EA5HV,GAAIjB,MACAoB,EAAgB,KAChBD,EAAqB,KA8CrBM,EAAqBxC,EAAOyC,OAiFhC,OAvEAzC,GAAOyC,QAAU,SAA+BC,EAASC,EAAKC,GAC1D,GAAItB,GAAQ,IAEZ,IAAIY,EACAhC,EAASmC,kBAAkBQ,oCAAoCX,EAAoBS,EAAKC,EAAQF,GAChGpB,EAAQY,EACRA,EAAqB,KACrBC,EAAgB,SACb,CACH,GAAIW,IACAH,IAAOA,EACPI,KAAQH,EAEZE,GAASE,KAAO9C,EAASmC,kBAAkBY,kBAAkBH,EAASH,IAAKG,EAASC,MACpFD,EAASI,QAAUhD,EAASmC,kBAAkBc,cAAcL,EAASH,IAAKG,EAASC,MACnFzB,GACI8B,KAAQ,UACRV,QAAWA,EACXC,IAAOU,SAASP,SAASQ,KACzBhC,OAAUwB,GACVS,UAAaC,UAAUC,WAM/B,MAFApC,GAAeC,EAAO,uBAElBkB,EACOA,EAAmBd,MAAMgC,KAAM5B,YAGnC,GAuCXlB,EAAOC,UAAYA,EACnBD,EAAOK,YAAcA,EACdL,KAsEXV,EAASmC,kBAAqB,WAU1B,QAASsB,GAAWhB,GAKZ,QAASiB,KACL,IACI,MAAO,IAAI5D,GAAO6D,eACpB,MAAOC,GAEL,MAAO,IAAI9D,GAAO+D,cAAc,sBAT5C,IAAK7D,EAAS8D,eACV,MAAO,EAEX,KAUI,GAAIC,GAAUL,GAGd,OAFAK,GAAQC,KAAK,MAAOvB,GAAK,GACzBsB,EAAQE,KAAK,IACNF,EAAQG,aACjB,MAAON,GACL,MAAO,IASf,QAASO,GAAU1B,GACf,IAAKzC,EAASG,KAAKiE,EAAa3B,GAAM,CAGlC,GAAI4B,EAEAA,GADiC,KAAjC5B,EAAI6B,QAAQnB,SAASoB,QACZd,EAAWhB,MAIxB2B,EAAY3B,GAAO4B,EAAOpD,OAASoD,EAAOG,MAAM,SAGpD,MAAOJ,GAAY3B,GAWvB,QAASM,GAAkBN,EAAKC,GAC5B,GAKI+B,GALAC,EAAqB,8BACrBC,EAAkB,mEAClB9B,EAAO,GACP+B,EAAW,GACXP,EAASF,EAAU1B,EAGvB,KAAK4B,EAAOpD,OACR,MAAO,GAKX,KAAK,GAAID,GAAI,EAAO4D,EAAJ5D,IAAgBA,EAG5B,GAFA6B,EAAOwB,EAAO3B,EAAS1B,GAAK6B,EAExBA,IAAS9C,EAAW,CACpB,GAAK0E,EAAIE,EAAgBE,KAAKhC,GAC1B,MAAO4B,GAAE,EACN,IAAKA,EAAIC,EAAmBG,KAAKhC,GACpC,MAAO4B,GAAE,GAKrB,MAAO,IAUX,QAASxB,GAAcR,EAAKI,GACxB,GAAIwB,GAASF,EAAU1B,EAEvB,KAAK4B,EAAOpD,OACR,MAAO,KAGX,IAAI+B,MAIA8B,EAAcC,KAAKC,MAAMhF,EAASiF,eAAiB,GAEnDC,EAAaJ,EAAe9E,EAASiF,eAAiB,EACtDE,EAAQJ,KAAKK,IAAI,EAAGvC,EAAOiC,EAAc,GACzCO,EAAMN,KAAKO,IAAIjB,EAAOpD,OAAQ4B,EAAOqC,EAAa,EAEtDrC,IAAQ,CAER,KAAK,GAAI7B,GAAImE,EAAWE,EAAJrE,IAAWA,EACfqD,EAAOrD,KAAR,GACPgC,EAAQlC,KAAKuD,EAAOrD,GAI5B,OAAOgC,GAAQ/B,OAAS,EAAI+B,EAAU,KAS1C,QAASuC,GAAaC,GAClB,MAAOA,GAAKC,QAAQ,4BAA6B,QAUrD,QAASC,GAAwCC,GAC7C,MAAOJ,GAAaI,GAAMF,QAAQ,IAAK,cAAcA,QAAQ,IAAK,cAAcA,QAAQ,IAAK,eAAeA,QAAQ,IAAK,gBAAgBA,QAAQ,OAAQ,QAU7J,QAASG,GAAiBC,EAAIC,GAE1B,IAAK,GADDzB,GAAQI,EACHzD,EAAI,EAAG+E,EAAID,EAAK7E,OAAY8E,EAAJ/E,IAASA,EAEtC,IAAKqD,EAASF,EAAU2B,EAAK9E,KAAKC,SAC9BoD,EAASA,EAAO2B,KAAK,MAChBvB,EAAIoB,EAAGhB,KAAKR,IAGb,OACI5B,IAAOqD,EAAK9E,GACZ6B,KAAQwB,EAAO4B,UAAU,EAAGxB,EAAEyB,OAAO1B,MAAM,MAAMvD,OACjDkF,OAAU1B,EAAEyB,MAAQ7B,EAAO+B,YAAY,KAAM3B,EAAEyB,OAAS,EAQxE,OAAO,MAWX,QAASG,GAAiBC,EAAU7D,EAAKI,GACrC,GAEI4B,GAFAJ,EAASF,EAAU1B,GACnBoD,EAASU,OAAO,MAAQhB,EAAae,GAAY,MAKrD,OAFAzD,IAAQ,EAEJwB,GAAUA,EAAOpD,OAAS4B,IAAS4B,EAAIoB,EAAGhB,KAAKR,EAAOxB,KAC/C4B,EAAEyB,MAGN,KAUX,QAASM,GAAyB1D,GAW9B,IAAK,GARD6C,GAIAE,EACAY,EACAC,EARAZ,GAAQhG,EAAO8C,SAASQ,MACxBuD,EAAUxD,SAASyD,qBAAqB,UAExCC,EAAO,GAAK/D,EACZgE,EAAS,2EACTC,EAAU,iEAKL/F,EAAI,EAAO2F,EAAQ1F,OAAZD,IAAsBA,EAAG,CACrC,GAAIgG,GAASL,EAAQ3F,EACjBgG,GAAOC,KACPnB,EAAKhF,KAAKkG,EAAOC,KAIzB,GAAMR,EAAQK,EAAOjC,KAAKgC,GAMrB,CACD,GAAIK,GAAOT,EAAM,GAAK,OAASA,EAAM,GAAK,GACtC1E,EAAO0E,EAAM,GAAGjC,MAAM,KAAKwB,KAAK,YAEpCL,GAAOJ,EAAakB,EAAM,IAAIhB,QAAQ,KAAM,MAC5CI,EAASU,OAAO,WAAaW,EAAO,cAAgBnF,EAAO,mBAAqB4D,EAAO,aAVvFE,GAASU,OAAOhB,EAAasB,GAAMpB,QAAQ,OAAQ,QAcvD,IAAKiB,EAASd,EAAiBC,EAAIC,GAC/B,MAAOY,EAIX,IAAKD,EAAQM,EAAQlC,KAAKgC,GAAQ,CAC9B,GAAIM,GAAQV,EAAM,EAMlB,IALAd,EAAOD,EAAwCe,EAAM,IAGrDZ,EAASU,OAAO,KAAOY,EAAQ,eAAiBxB,EAAO,cAAe,KAEjEe,EAASd,EAAiBC,EAAIC,EAAK,IACpC,MAAOY,EAMX,IAFAb,EAASU,OAAOZ,GAEXe,EAASd,EAAiBC,EAAIC,GAC/B,MAAOY,GAIf,MAAO,MA6CX,QAASU,GAA+BtF,GACpC,IAAKA,EAAGV,MACJ,MAAO,KAWX,KAAK,GAJDqF,GACAY,EALAC,EAAS,gGACTC,EAAQ,yEACRC,EAAQ1F,EAAGV,MAAMoD,MAAM,MACvBpD,KAGAqG,EAAY,sBAAsB5C,KAAK/C,EAAGU,SAErCxB,EAAI,EAAG+E,EAAIyB,EAAMvG,OAAY8E,EAAJ/E,IAASA,EAAG,CAC1C,GAAKyF,EAAQc,EAAM1C,KAAK2C,EAAMxG,IAC1BqG,GACI5E,IAAOgE,EAAM,GACb3D,KAAQ2D,EAAM,IAAM,IACpB1E,KAAQ0E,EAAM,GAAKA,EAAM,GAAGjC,MAAM,KAAO,GACzC3B,MAAS4D,EAAM,GACfN,OAAUM,EAAM,IAAMA,EAAM,GAAK,UAElC,CAAA,KAAKA,EAAQa,EAAOzC,KAAK2C,EAAMxG,KAQlC,QAPAqG,IACI5E,IAAOgE,EAAM,GACb3D,KAAQ2D,EAAM,IAAM,IACpB5D,MAAS4D,EAAM,GACfN,OAAUM,EAAM,IAAMA,EAAM,GAAK,OAMpCY,EAAQvE,MAAQuE,EAAQxE,OACzBwE,EAAQvE,KAAOC,EAAkBsE,EAAQ5E,IAAK4E,EAAQxE,OAGtDwE,EAAQxE,OACRwE,EAAQrE,QAAUC,EAAcoE,EAAQ5E,IAAK4E,EAAQxE,OAGzDzB,EAAMN,KAAKuG,GAOf,MAJIjG,GAAM,IAAMA,EAAM,GAAGyB,OAASzB,EAAM,GAAG+E,QAAUsB,IACjDrG,EAAM,GAAG+E,OAASE,EAAiBoB,EAAU,GAAIrG,EAAM,GAAGqB,IAAKrB,EAAM,GAAGyB,OAGvEzB,EAAMH,QAKPiC,KAAQ,QACRgE,KAAQpF,EAAGoF,KACX1E,QAAWV,EAAGU,QACdC,IAAOU,SAASP,SAASQ,KACzBhC,MAASA,EACTiC,UAAaC,UAAUC,WAThB,KAmBf,QAASmE,GAAoC5F,GAWzC,IAAK,GAFD2E,GALAkB,EAAa7F,EAAG6F,WAEhBC,EAAS,gGACTJ,EAAQG,EAAWnD,MAAM,MACzBpD,KAGKJ,EAAI,EAAG+E,EAAIyB,EAAMvG,OAAY8E,EAAJ/E,EAAOA,GAAK,EAC1C,GAAKyF,EAAQmB,EAAO/C,KAAK2C,EAAMxG,IAAM,CACjC,GAAIqG,IACAxE,MAAS4D,EAAM,GACfN,QAAWM,EAAM,GACjB3D,KAAQ2D,EAAM,IAAMA,EAAM,GAC1B1E,KAAQ0E,EAAM,GAAKA,EAAM,GAAGjC,MAAM,QAClC/B,IAAOgE,EAAM,GAMjB,KAHKY,EAAQvE,MAAQuE,EAAQxE,OACzBwE,EAAQvE,KAAOC,EAAkBsE,EAAQ5E,IAAK4E,EAAQxE,OAEtDwE,EAAQxE,KACR,IACIwE,EAAQrE,QAAUC,EAAcoE,EAAQ5E,IAAK4E,EAAQxE,MACvD,MAAOgF,IAGRR,EAAQrE,UACTqE,EAAQrE,SAAWwE,EAAMxG,EAAI,KAGjCI,EAAMN,KAAKuG,GAInB,MAAKjG,GAAMH,QAKPiC,KAAQ,aACRgE,KAAQpF,EAAGoF,KACX1E,QAAWV,EAAGU,QACdC,IAAOU,SAASP,SAASQ,KACzBhC,MAASA,EACTiC,UAAaC,UAAUC,WAThB,KAsBf,QAASuE,GAA2ChG,GAehD,GAAI0F,GAAQ1F,EAAGU,QAAQgC,MAAM,KAC7B,IAAmB,EAAfgD,EAAMvG,OACN,MAAO,KAGX,IAMIwF,GACAzF,EACA+G,EACA1D,EATA2D,EAAU,wFACVC,EAAU,iGACVC,EAAU,yCACV9G,KACAuF,EAAUxD,SAASyD,qBAAqB,UACxCuB,IAMJ,KAAKnH,IAAK2F,GACF3G,EAASG,KAAKwG,EAAS3F,KAAO2F,EAAQ3F,GAAGiG,KACzCkB,EAAmBrH,KAAK6F,EAAQ3F,GAIxC,KAAKA,EAAI,EAAG+G,EAAMP,EAAMvG,OAAY8G,EAAJ/G,EAASA,GAAK,EAAG,CAC7C,GAAIoH,GAAO,IACX,IAAK3B,EAAQuB,EAAQnD,KAAK2C,EAAMxG,IAC5BoH,GACI3F,IAAOgE,EAAM,GACb3D,KAAQ2D,EAAM,GACd5D,MAAS4D,EAAM,QAEhB,IAAKA,EAAQwB,EAAQpD,KAAK2C,EAAMxG,IAAM,CACzCoH,GACI3F,IAAOgE,EAAM,GACb3D,KAAQ2D,EAAM,GAElB,IAAI4B,IAAiB5B,EAAM,GACvBO,EAASmB,EAAmB1B,EAAM,GAAK,EAC3C,IAAIO,IACA3C,EAASF,EAAUiE,EAAK3F,MACZ,CACR4B,EAASA,EAAO2B,KAAK,KACrB,IAAIsC,GAAMjE,EAAOC,QAAQ0C,EAAOuB,UAC5BD,IAAO,IACPF,EAAKvF,KAAOwF,EAAehE,EAAO4B,UAAU,EAAGqC,GAAK9D,MAAM,MAAMvD,aAIzE,IAAKwF,EAAQyB,EAAQrD,KAAK2C,EAAMxG,IAAM,CACzC,GAAIyB,GAAM3C,EAAO8C,SAASQ,KAAKqC,QAAQ,OAAQ,IAC3C5C,EAAO4D,EAAM,GACbZ,EAASU,OAAOb,EAAwC8B,EAAMxG,EAAI,IACtEqD,GAASuB,EAAiBC,GAAKpD,IAC/B2F,GACI3F,IAAOA,EACPI,KAAQwB,EAASA,EAAOxB,KAAOA,EAC/BC,KAAQ,IAIhB,GAAIsF,EAAM,CACDA,EAAKtF,OACNsF,EAAKtF,KAAOC,EAAkBqF,EAAK3F,IAAK2F,EAAKvF,MAEjD,IAAIG,GAAUC,EAAcmF,EAAK3F,IAAK2F,EAAKvF,MACvC2F,EAAWxF,EAAUA,EAAQ+B,KAAKC,MAAMhC,EAAQ/B,OAAS,IAAM,IAE/DmH,GAAKpF,QADLA,GAAWwF,EAAQ/C,QAAQ,OAAQ,MAAQ+B,EAAMxG,EAAI,GAAGyE,QAAQ,OAAQ,IACzDzC,GAGCwE,EAAMxG,EAAI,IAE9BI,EAAMN,KAAKsH,IAGnB,MAAKhH,GAAMH,QAKPiC,KAAQ,YACRgE,KAAQpF,EAAGoF,KACX1E,QAAWgF,EAAM,GACjB/E,IAAOU,SAASP,SAASQ,KACzBhC,MAASA,EACTiC,UAAaC,UAAUC,WAThB,KA0Bf,QAASZ,GAAoC8F,EAAWhG,EAAKC,EAAQF,GACjE,GAAIkG,IACAjG,IAAOA,EACPI,KAAQH,EAGZ,IAAIgG,EAAQjG,KAAOiG,EAAQ7F,KAAM,CAC7B4F,EAAUpG,YAAa,EAElBqG,EAAQ5F,OACT4F,EAAQ5F,KAAOC,EAAkB2F,EAAQjG,IAAKiG,EAAQ7F,OAGrD6F,EAAQ1F,UACT0F,EAAQ1F,QAAUC,EAAcyF,EAAQjG,IAAKiG,EAAQ7F,MAGzD,IAAI4E,GAAY,cAAc5C,KAAKrC,EAKnC,IAJIiF,IACAiB,EAAQvC,OAASE,EAAiBoB,EAAU,GAAIiB,EAAQjG,IAAKiG,EAAQ7F,OAGrE4F,EAAUrH,MAAMH,OAAS,GACrBwH,EAAUrH,MAAM,GAAGqB,MAAQiG,EAAQjG,IAAK,CACxC,GAAIgG,EAAUrH,MAAM,GAAGyB,OAAS6F,EAAQ7F,KACpC,OAAO,CACJ,KAAK4F,EAAUrH,MAAM,GAAGyB,MAAQ4F,EAAUrH,MAAM,GAAG0B,OAAS4F,EAAQ5F,KAGvE,MAFA2F,GAAUrH,MAAM,GAAGyB,KAAO6F,EAAQ7F,KAClC4F,EAAUrH,MAAM,GAAG4B,QAAU0F,EAAQ1F,SAC9B,EAOnB,MAFAyF,GAAUrH,MAAMuH,QAAQD,GACxBD,EAAUG,SAAU,GACb,EAKX,MAHIH,GAAUpG,YAAa,GAGpB,EAYX,QAASwG,GAAsC/G,EAAIgH,GAS/C,IAAK,GAJDrC,GACA2B,EACA/D,EANA0E,EAAe,qEACf3H,KACA4H,KACAC,GAAY,EAKPC,EAAOL,EAAsCM,OAAQD,IAASD,EAAWC,EAAOA,EAAKC,OAC1F,GAAID,IAAS/G,GAAqB+G,IAASlJ,EAASU,OAApD,CAkBA,GAbA0H,GACI3F,IAAO,KACPK,KAAQ,IACRD,KAAQ,KACRsD,OAAU,MAGV+C,EAAKhC,KACLkB,EAAKtF,KAAOoG,EAAKhC,MACTT,EAAQsC,EAAalE,KAAKqE,GAAAA,MAClCd,EAAKtF,KAAO2D,EAAM,IAGjBpC,EAASmC,EAAyB0C,GAAQ,CAC3Cd,EAAK3F,IAAM4B,EAAO5B,IAClB2F,EAAKvF,KAAOwB,EAAOxB,KAED,MAAduF,EAAKtF,OACLsF,EAAKtF,KAAOC,EAAkBqF,EAAK3F,IAAK2F,EAAKvF,MAGjD,IAAI4E,GAAY,cAAc5C,KAAK/C,EAAGU,SAAWV,EAAGsH,YAChD3B,KACAW,EAAKjC,OAASE,EAAiBoB,EAAU,GAAIpD,EAAO5B,IAAK4B,EAAOxB,OAIpEmG,EAAM,GAAKE,GACXD,GAAY,EAEZD,EAAM,GAAKE,IAAQ,EAGvB9H,EAAMN,KAAKsH,GAGXU,GAGA1H,EAAMF,OAAO,EAAG4H,EAGpB,IAAIpC,IACAxD,KAAQ,UACRgE,KAAQpF,EAAGoF,KACX1E,QAAWV,EAAGU,QACdC,IAAOU,SAASP,SAASQ,KACzBhC,MAASA,EACTiC,UAAaC,UAAUC,UAG3B,OADAZ,GAAoC+D,EAAQ5E,EAAGuH,WAAavH,EAAGwH,SAAUxH,EAAGe,MAAQf,EAAGyH,WAAYzH,EAAGU,SAAWV,EAAGsH,aAC7G1C,EAQX,QAASvE,GAAkBL,EAAIgH,GAC3B,GAAI1H,GAAQ,IACZ0H,GAAkB,MAATA,EAAgB,GAAKA,CAE9B,KAKI,GADA1H,EAAQsG,EAAoC5F,GAExC,MAAOV,GAEb,MAAOwC,GACL,GAAI4F,EACA,KAAM5F,GAId,IAEI,GADAxC,EAAQgG,EAA+BtF,GAEnC,MAAOV,GAEb,MAAOwC,GACL,GAAI4F,EACA,KAAM5F,GAId,IAEI,GADAxC,EAAQ0G,EAA2ChG,GAE/C,MAAOV,GAEb,MAAOwC,GACL,GAAI4F,EACA,KAAM5F,GAId,IAEI,GADAxC,EAAQyH,EAAsC/G,EAAIgH,EAAQ,GAEtD,MAAO1H,GAEb,MAAOwC,GACL,GAAI4F,EACA,KAAM5F,GAId,OACIV,KAAQ,UAShB,QAASuG,GAA0BX,GAC/BA,GAAkB,MAATA,EAAgB,GAAKA,GAAS,CACvC,KACI,KAAUY,SACZ,MAAO5H,GACL,MAAOK,GAAkBL,EAAIgH,EAAQ,GAGzC,MAAO,MA5uBX,GAAIU,IAAQ,EACRpF,IAmvBJ,OALAjC,GAAkBQ,oCAAsCA,EACxDR,EAAkBY,kBAAoBA,EACtCZ,EAAkBc,cAAgBA,EAClCd,EAAkBwH,SAAWF,EAEtBtH,KAOV,SAAuCyH,GACpC,GAAIC,GAAU,QAASA,GAAQC,GAC3B,GAAIC,GAAaH,EAAEE,EACnBF,GAAEE,GAAU,WAER,GAAI/H,GAAOL,MAAMnB,UAAUoB,MAAMlB,KAAKmB,UAAW,GAC7CoI,EAAmBjI,EAAK,EAc5B,OAbkC,kBAAvB,KACPA,EAAK,GAAK,WACN,IACIiI,EAAiBxI,MAAMgC,KAAM5B,WAC/B,MAAOgC,GAEL,KADA5D,GAASU,OAAOkD,GACVA,KAOdmG,EAAWvI,MACJuI,EAAWvI,MAAMgC,KAAMzB,GAEvBgI,EAAWhI,EAAK,GAAIA,EAAK,KAK5C8H,GAAQ,cACRA,EAAQ,gBACV/J,GAMD,SAAgCmK,GAG7B,GAAKA,EAAL,CAIA,GAAIC,GAAeD,EAAE9C,MAAMgD,GAC3BF,GAAE9C,MAAMgD,IAAM,SAA0BC,EAAMC,EAAOzJ,EAAS0J,EAAMC,GAChE,GAAIC,EAmCJ,OAjCI5J,GAAQA,SACR4J,EAAW5J,EAAQA,QACnBA,EAAQA,QAAU,WACd,IACI,MAAO4J,GAAShJ,MAAMgC,KAAM5B,WAC9B,MAAOgC,GAEL,KADA5D,GAASU,OAAOkD,GACVA,MAId4G,EAAW5J,EACXA,EAAU,WACN,IACI,MAAO4J,GAAShJ,MAAMgC,KAAM5B,WAC9B,MAAOgC,GAEL,KADA5D,GAASU,OAAOkD,GACVA,KAWdhD,EAAQ6J,KADRD,EAASC,KACMD,EAASC,KAETD,EAASC,KAAOR,EAAEQ,OAG9BP,EAAazJ,KAAK+C,KAAM4G,EAAMC,EAAOzJ,EAAS0J,EAAMC,GAG/D,IAAIG,GAAYT,EAAEU,GAAGC,KACrBX,GAAEU,GAAGC,MAAQ,SAAoCD,GAC7C,GAAIE,GAAM,WACN,IACI,MAAOF,GAAGnJ,MAAMgC,KAAM5B,WACxB,MAAOgC,GAEL,KADA5D,GAASU,OAAOkD,GACVA,GAId,OAAO8G,GAAUjK,KAAK+C,KAAMqH,GAGhC,IAAIC,GAAWb,EAAEc,IACjBd,GAAEc,KAAO,SAA6B7I,GAClC,GAAI+H,EAAEe,WAAW9I,EAAE+I,UAAW,CAC1B,GAAIC,GAAehJ,EAAE+I,QACrB/I,GAAE+I,SAAW,WACT,IACI,MAAOC,GAAa1J,MAAMgC,KAAM5B,WAClC,MAAOgC,GAEL,KADA5D,GAASU,OAAOkD,GACVA,IAKlB,GAAIqG,EAAEe,WAAW9I,EAAEiJ,OAAQ,CACvB,GAAIC,GAAYlJ,EAAEiJ,KAClBjJ,GAAEiJ,MAAQ,WACN,IACI,MAAOC,GAAU5J,MAAMgC,KAAM5B,WAC/B,MAAOgC,GAEL,KADA5D,GAASU,OAAOkD,GACVA,IAKlB,GAAIqG,EAAEe,WAAW9I,EAAEmJ,SAAU,CACzB,GAAIC,GAAcpJ,EAAEmJ,OACpBnJ,GAAEmJ,QAAU,WACR,IACI,MAAOC,GAAY9J,MAAMgC,KAAM5B,WACjC,MAAOgC,GAEL,KADA5D,GAASU,OAAOkD,GACVA,IAKlB,IACI,MAAOkH,GAASrK,KAAK+C,KAAMtB,GAC7B,MAAO0B,GAEL,KADA5D,GAASU,OAAOkD,GACVA,MAIhB9D,EAAOyL,QAGJvL,EAAS8D,iBACZ9D,EAAS8D,gBAAiB,GAEvB9D,EAASuB,sBACZvB,EAASuB,qBAAsB,KAE5BvB,EAASiF,gBAA4C,EAA1BjF,EAASiF,kBAEvCjF,EAASiF,eAAiB,IAM5BnF,EAAOE,SAAWA,IAEhBF,QACD,SAAUA,EAAQC,GACnB,YAwNA,SAASyL,GAASC,GAKd,IAJA,GAAIhH,GAAIiH,EAAW7G,KAAK4G,GACpBE,KACA3K,EAAI,GAEDA,KAAK2K,EAAIC,EAAQ5K,IAAMyD,EAAEzD,IAAM,EAEtC,OAAO2K,GAGX,QAASE,GAAYC,GACjB,MAAcA,KAAAA,EAGlB,QAASd,GAAWc,GAChB,MAAuB,kBAATA,GAGlB,QAASC,GAAKC,EAAKC,GACf,GAAIjL,GAAG+E,CAEP,IAAI8F,EAAYG,EAAI/K,QAChB,IAAKD,IAAKgL,GACFA,EAAIxL,eAAeQ,IACnBiL,EAASxL,KAAK,KAAMO,EAAGgL,EAAIhL,QAKnC,IADA+E,EAAIiG,EAAI/K,OAEJ,IAAKD,EAAI,EAAO+E,EAAJ/E,EAAOA,IACfiL,EAASxL,KAAK,KAAMO,EAAGgL,EAAIhL,IAQ3C,QAASkL,KACL,GAAIC,EAAY,MAAOA,EAEvB,IAAIC,IACA,qBACA,0BAA4BC,EAAMC,QAOtC,OALIC,IACAH,EAAGtL,KAAK,cAAgByL,GAG5BJ,EAAa,IAAMC,EAAGpG,KAAK,KAI/B,QAASwG,GAAgB/D,EAAWgE,GAChC,GAAIC,KAEAjE,GAAUrH,OAASqH,EAAUrH,MAAMH,QACnC8K,EAAKtD,EAAUrH,MAAO,SAASJ,EAAGI,GAC9B,GAAIuL,GAAQC,EAAexL,EACvBuL,IACAD,EAAO5L,KAAK6L,KAKxBE,EACIpE,EAAUvB,KACVuB,EAAUjG,QACViG,EAAUhG,IACVgG,EAAUqE,OACVJ,EACAD,GAIR,QAASG,GAAeD,GACpB,GAAKA,EAAMlK,IAAX,CAGA,GAAIsK,IACAC,SAAYL,EAAMlK,IAClBqK,OAAYH,EAAM9J,KAClBoK,MAAYN,EAAMxG,OAClB+G,WAAYP,EAAM7J,MAAQ,KAC3BE,EAAUmK,EAAwBR,EAErC,IAAI3J,EAEA,IADA,GAAIhC,GAAI,EAAGoM,GAAQ,cAAe,eAAgB,gBAC3CpM,KAAK+L,EAAWK,EAAKpM,IAAMgC,EAAQhC,EAK9C,OAFA+L,GAAWM,QAAU,qBAAqBC,KAAKP,EAAW,aAEnDA,GAGX,QAASI,GAAwBR,GAE7B,GAAKA,EAAM3J,SAAYuK,EAAcC,aAArC,CAMA,IAJA,GAAIxK,GAAU2J,EAAM3J,QAChByK,KAAWzK,EAAQ/B,OAAS,GAC5BD,EAAIgC,EAAQ/B,OAAQyM,GAAa,EAE9B1M,KAKH,GAAIgC,EAAQhC,GAAGC,OAAS,IAAK,CACzByM,GAAa,CACb,OAIR,GAAIA,EAAY,CAEZ,GAAI7B,EAAYc,EAAMxG,QAAS,MAI/B,WAEInD,EAAQyK,GAAOE,OAAOhB,EAAMxG,OAAQ,QAK5C,OACInD,EAAQrB,MAAM,EAAG8L,GACjBzK,EAAQyK,GACRzK,EAAQrB,MAAM8L,EAAQ,KAI9B,QAASZ,GAAiBe,EAAMpL,EAASqL,EAASf,EAAQJ,EAAQD,GAC9D,GAAI9E,GAAYmG,EAAO9M,CAKvB,KADAA,EAAIuM,EAAcQ,aAAa9M,OACxBD,KACH,GAAIwB,IAAY+K,EAAcQ,aAAa/M,GACvC,MAiBR,KAbI0L,GAAUA,EAAOzL,QACjB0G,GAAc+E,OAAQA,GACtBmB,EAAUA,GAAWnB,EAAO,GAAGM,UACxBa,IACPlG,GACI+E,SACIM,SAAUa,EACVf,OAAQA,MAKpB9L,EAAIuM,EAAcS,WAAW/M,OACtBD,KACH,GAAIuM,EAAcS,WAAWhN,GAAGsM,KAAKO,GACjC,MAIRC,GAAQhB,EAAStK,EAAU,OAASsK,EAAStK,EAG7CyB,EACIgK,GACIC,+BACIN,KAAMA,EACNO,MAAO3L,GAEX4L,+BAAgCzG,EAChC0G,QAASR,EACTrL,QAASsL,GACVrB,IAIX,QAASwB,GAAWK,EAAMC,GACtB,MAAKA,IAGLxC,EAAKwC,EAAM,SAASlO,EAAK8N,GACrBG,EAAKjO,GAAO8N,IAETG,GALIA,EAQf,QAASE,KACL,GAAIC,IACAhM,IAAKU,SAASP,SAASQ,KACvBsL,SACIC,aAAcrL,UAAUC,WAQhC,OAJIJ,UAASyL,WACTH,EAAKC,QAAQG,QAAU1L,SAASyL,UAG7BH,EAGX,QAASxK,GAAKqG,GACLwE,MAELxE,EAAO2D,GACHc,QAASC,EACTC,OAAQ1B,EAAc0B,OACtBC,KAAM3B,EAAc2B,KACpBC,SAAU,aACVC,yBAA0BZ,KAC3BlE,GAEC+E,IAAY/E,EAAK,0BAA4B+E,GAE7CrE,EAAWuC,EAAc+B,gBACzBhF,EAAOiD,EAAc+B,aAAahF,IAGtCiF,EAAYjF,IAGhB,QAASiF,GAAYjF,IACjB,GAAIkF,QAAQvI,IAAMwI,EAAevD,IAAuB,gBAAkBwD,mBAAmBC,KAAKC,UAAUtF,IAGhH,QAASwE,KACL,MAAKe,GACAJ,GAME,GALC3P,EAAOgQ,SAAWA,QAAQ3E,OAC1B2E,QAAQ3E,MAAM,0CAEX,IALU,EA5bzB,GAEIsE,GACAJ,EACA9C,EACAyC,EALAe,EAASjQ,EAAOuM,MAChBwD,KAAa/P,EAAO6P,OAAQ7P,EAAO6P,KAAKC,WAKxCrC,GACI0B,OAAQ,aACRlB,gBACAC,eAGJgC,EAAKhQ,SAASE,YAGlB8P,GAAGlM,gBAAiB,CAOpB,IAkOIqI,GAlOAE,GACAC,QAAS,UAQTpM,WAAY,WAER,MADAJ,GAAOuM,MAAQ0D,EACR1D,GAUX4D,OAAQ,SAASC,EAAKzD,GAClB,GAAId,GAAMH,EAAS0E,GACfC,EAAYxE,EAAIyE,KAAKhK,YAAY,KACjCgK,EAAOzE,EAAIyE,KAAKzC,OAAO,EAAGwC,EA8B9B,OA3BI1D,IACAV,EAAKU,EAAS,SAASpM,EAAK8N,GACxBZ,EAAclN,GAAO8N,IAM7BZ,EAAcQ,aAAajN,KAAK,iBAEhCyL,EAAYZ,EAAI0E,KAChBrB,IAAkBrD,EAAIyE,KAAKzC,OAAOwC,EAAY,GAG9CV,EAAe,KAAO9D,EAAI2E,MACX3E,EAAI4E,KAAO,IAAM5E,EAAI4E,KAAO,IAC7B,IAAMH,EAAO,OAASpB,EAAgB,UAEhDrD,EAAI6E,WACJf,EAAe9D,EAAI6E,SAAW,IAAMf,GAGpClC,EAAcC,eACdwC,EAAGlM,gBAAiB,GAIjBuI,GAWXoE,QAAS,WACL,MAAK3B,MAELkB,EAAGtP,OAAOC,UAAU6L,GAEbH,GAJP,GAeJrJ,QAAS,SAASyJ,EAAS3J,EAAMf,GACzBiJ,EAAWyB,KACX1K,EAAOe,MACPA,EAAO2J,EACPA,EAAU1M,GAGdsM,EAAMqE,KAAKjE,EAAS3J,GAAMtB,MAAMgC,KAAMzB,IAU1C2O,KAAM,SAASjE,EAAS3J,GAOpB,MALIkI,GAAWyB,KACX3J,EAAO2J,EACPA,EAAU1M,GAGP,WACH,IACI+C,EAAKtB,MAAMgC,KAAM5B,WACnB,MAAMgC,GACJyI,EAAMsE,iBAAiB/M,EAAG6I,MAUtCmE,UAAW,WAGP,MAFAZ,GAAGtP,OAAOK,YAAYyL,GAEfH,GAUXsE,iBAAkB,SAAS7O,EAAI2K,GAE3B,GAAkB,gBAAP3K,GACP,MAAOuK,GAAMwE,eAAe/O,EAAI2K,EAQpC,KACIuD,EAAGtP,OAAOoB,EAAI2K,GAChB,MAAMqE,GACJ,GAAGhP,IAAOgP,EACN,KAAMA,GAId,MAAOzE,IAUXwE,eAAgB,SAASE,EAAKtE,GAQ1B,MANAxI,GACIgK,GACIzL,QAASuO,GACVtE,IAGAJ,GASX2E,QAAS,SAASX,GAGf,MAFAhB,GAAagB,EAENhE,IAIVT,EAAU,uGAAuGpH,MAAM,KACvHkH,EAAa,kMAuPjB5L,GAAOuM,MAAQA,EAGO,kBAAX4E,SAAyBA,OAAOC,KACvCD,OAAO,WAAa,MAAO5E,MAG5BvM"}
{"project":7,"logger":"javascript","platform":"javascript","sentry.interfaces.Http":{"url":"http://disqus.com/about/","headers":{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.30 (KHTML, like Gecko) Chrome/26.0.1403.0 Safari/537.30"}},"sentry.interfaces.Exception":{"type":"TypeError","value":"Object [object Array] has no method 'each'"},"sentry.interfaces.Stacktrace":{"frames":[{"filename":"http://mediacdn.disqus.com/1360620350/js/src/lib/tipped/bridge/adapters/shared.js","lineno":38,"colno":19,"function":"?","in_app":true},{"filename":"http://d3nslu0hdya83q.cloudfront.net/build/master/raven.min.js","lineno":2,"colno":8017,"function":"c.handler.c","in_app":true},{"filename":"http://mediacdn.disqus.com/1360620350/build/js/97e46ef35f64.js","lineno":55,"colno":93,"function":"c.event.handle","in_app":true},{"filename":"http://mediacdn.disqus.com/1360620350/build/js/97e46ef35f64.js","lineno":49,"colno":35,"function":"g.handle.l","in_app":true}]},"culprit":"http://disqus.com/about/","message":"Object [object Array] has no method 'each'"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment