{"version":3,"sources":["vendor/ember-cli/test-support-prefix.js","bower_components/ember/ember-testing.js","bower_components/sinon/index.js","ember-qunit.js","ember-qunit/module-for-component.js","ember-qunit/module-for-model.js","ember-qunit/module-for.js","ember-qunit/qunit-module.js","ember-qunit/test.js","ember-test-helpers.js","ember-test-helpers/isolated-container.js","ember-test-helpers/test-context.js","ember-test-helpers/test-module-for-component.js","ember-test-helpers/test-module-for-integration.js","ember-test-helpers/test-module-for-model.js","ember-test-helpers/test-module.js","ember-test-helpers/test-resolver.js","klassy.js","qunit.js","bower_components/qunit/qunit/qunit.js","bower_components/qunit-notifications/index.js","vendor/ember-cli-qunit/qunit-configuration.js","vendor/ember-cli-qunit/test-loader.js","vendor/ember-cli/test-support-suffix.js"],"sourcesContent":["/* jshint ignore:start */\n\n/* jshint ignore:end */\n","/*!\n * @overview  Ember - JavaScript Application Framework\n * @copyright Copyright 2011-2015 Tilde Inc. and contributors\n *            Portions Copyright 2006-2011 Strobe Inc.\n *            Portions Copyright 2008-2011 Apple Inc. All rights reserved.\n * @license   Licensed under MIT license\n *            See https://raw.github.com/emberjs/ember.js/master/LICENSE\n * @version   1.11.1\n */\n\n(function() {\nvar enifed, requireModule, eriuqer, requirejs, Ember;\nvar mainContext = this;\n\n(function() {\n\n  Ember = this.Ember = this.Ember || {};\n  if (typeof Ember === 'undefined') { Ember = {}; };\n  function UNDEFINED() { }\n\n  if (typeof Ember.__loader === 'undefined') {\n    var registry = {};\n    var seen = {};\n\n    enifed = function(name, deps, callback) {\n      var value = { };\n\n      if (!callback) {\n        value.deps = [];\n        value.callback = deps;\n      } else {\n        value.deps = deps;\n        value.callback = callback;\n      }\n\n        registry[name] = value;\n    };\n\n    requirejs = eriuqer = requireModule = function(name) {\n      var s = seen[name];\n\n      if (s !== undefined) { return seen[name]; }\n      if (s === UNDEFINED) { return undefined;  }\n\n      seen[name] = {};\n\n      if (!registry[name]) {\n        throw new Error('Could not find module ' + name);\n      }\n\n      var mod = registry[name];\n      var deps = mod.deps;\n      var callback = mod.callback;\n      var reified = [];\n      var exports;\n      var length = deps.length;\n\n      for (var i=0; i<length; i++) {\n        if (deps[i] === 'exports') {\n          reified.push(exports = {});\n        } else {\n          reified.push(requireModule(resolve(deps[i], name)));\n        }\n      }\n\n      var value = length === 0 ? callback.call(this) : callback.apply(this, reified);\n\n      return seen[name] = exports || (value === undefined ? UNDEFINED : value);\n    };\n\n    function resolve(child, name) {\n      if (child.charAt(0) !== '.') {\n        return child;\n      }\n      var parts = child.split('/');\n      var parentBase = name.split('/').slice(0, -1);\n\n      for (var i=0, l=parts.length; i<l; i++) {\n        var part = parts[i];\n\n        if (part === '..') {\n          parentBase.pop();\n        } else if (part === '.') {\n          continue;\n        } else {\n          parentBase.push(part);\n        }\n      }\n\n      return parentBase.join('/');\n    }\n\n    requirejs._eak_seen = registry;\n\n    Ember.__loader = {\n      define: enifed,\n      require: eriuqer,\n      registry: registry\n    };\n  } else {\n    enifed = Ember.__loader.define;\n    requirejs = eriuqer = requireModule = Ember.__loader.require;\n  }\n})();\n\nenifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/error', 'ember-metal/logger', 'ember-metal/environment'], function (exports, Ember, EmberError, Logger, environment) {\n\n  'use strict';\n\n  exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;\n\n  /*global __fail__*/\n\n  Ember['default'].assert = function(desc, test) {\n    var throwAssertion;\n\n    if (Ember['default'].typeOf(test) === 'function') {\n      throwAssertion = !test();\n    } else {\n      throwAssertion = !test;\n    }\n\n    if (throwAssertion) {\n      throw new EmberError['default'](\"Assertion Failed: \" + desc);\n    }\n  };\n\n\n  /**\n    Display a warning with the provided message. Ember build tools will\n    remove any calls to `Ember.warn()` when doing a production build.\n\n    @method warn\n    @param {String} message A warning to display.\n    @param {Boolean} test An optional boolean. If falsy, the warning\n      will be displayed.\n  */\n  Ember['default'].warn = function(message, test) {\n    if (!test) {\n      Logger['default'].warn(\"WARNING: \"+message);\n      if ('trace' in Logger['default']) {\n        Logger['default'].trace();\n      }\n    }\n  };\n\n  /**\n    Display a debug notice. Ember build tools will remove any calls to\n    `Ember.debug()` when doing a production build.\n\n    ```javascript\n    Ember.debug('I\\'m a debug notice!');\n    ```\n\n    @method debug\n    @param {String} message A debug message to display.\n  */\n  Ember['default'].debug = function(message) {\n    Logger['default'].debug(\"DEBUG: \"+message);\n  };\n\n  /**\n    Display a deprecation warning with the provided message and a stack trace\n    (Chrome and Firefox only). Ember build tools will remove any calls to\n    `Ember.deprecate()` when doing a production build.\n\n    @method deprecate\n    @param {String} message A description of the deprecation.\n    @param {Boolean} test An optional boolean. If falsy, the deprecation\n      will be displayed.\n    @param {Object} options An optional object that can be used to pass\n      in a `url` to the transition guide on the emberjs.com website.\n  */\n  Ember['default'].deprecate = function(message, test, options) {\n    var noDeprecation;\n\n    if (typeof test === 'function') {\n      noDeprecation = test();\n    } else {\n      noDeprecation = test;\n    }\n\n    if (noDeprecation) { return; }\n\n    if (Ember['default'].ENV.RAISE_ON_DEPRECATION) { throw new EmberError['default'](message); }\n\n    var error;\n\n    // When using new Error, we can't do the arguments check for Chrome. Alternatives are welcome\n    try { __fail__.fail(); } catch (e) { error = e; }\n\n    if (arguments.length === 3) {\n      Ember['default'].assert('options argument to Ember.deprecate should be an object', options && typeof options === 'object');\n      if (options.url) {\n        message += ' See ' + options.url + ' for more details.';\n      }\n    }\n\n    if (Ember['default'].LOG_STACKTRACE_ON_DEPRECATION && error.stack) {\n      var stack;\n      var stackStr = '';\n\n      if (error['arguments']) {\n        // Chrome\n        stack = error.stack.replace(/^\\s+at\\s+/gm, '').\n                            replace(/^([^\\(]+?)([\\n$])/gm, '{anonymous}($1)$2').\n                            replace(/^Object.<anonymous>\\s*\\(([^\\)]+)\\)/gm, '{anonymous}($1)').split('\\n');\n        stack.shift();\n      } else {\n        // Firefox\n        stack = error.stack.replace(/(?:\\n@:0)?\\s+$/m, '').\n                            replace(/^\\(/gm, '{anonymous}(').split('\\n');\n      }\n\n      stackStr = \"\\n    \" + stack.slice(2).join(\"\\n    \");\n      message = message + stackStr;\n    }\n\n    Logger['default'].warn(\"DEPRECATION: \"+message);\n  };\n\n\n\n  /**\n    Alias an old, deprecated method with its new counterpart.\n\n    Display a deprecation warning with the provided message and a stack trace\n    (Chrome and Firefox only) when the assigned method is called.\n\n    Ember build tools will not remove calls to `Ember.deprecateFunc()`, though\n    no warnings will be shown in production.\n\n    ```javascript\n    Ember.oldMethod = Ember.deprecateFunc('Please use the new, updated method', Ember.newMethod);\n    ```\n\n    @method deprecateFunc\n    @param {String} message A description of the deprecation.\n    @param {Function} func The new function called to replace its deprecated counterpart.\n    @return {Function} a new function that wrapped the original function with a deprecation warning\n  */\n  Ember['default'].deprecateFunc = function(message, func) {\n    return function() {\n      Ember['default'].deprecate(message);\n      return func.apply(this, arguments);\n    };\n  };\n\n\n  /**\n    Run a function meant for debugging. Ember build tools will remove any calls to\n    `Ember.runInDebug()` when doing a production build.\n\n    ```javascript\n    Ember.runInDebug(function() {\n      Ember.Handlebars.EachView.reopen({\n        didInsertElement: function() {\n          console.log('I\\'m happy');\n        }\n      });\n    });\n    ```\n\n    @method runInDebug\n    @param {Function} func The function to be executed.\n    @since 1.5.0\n  */\n  Ember['default'].runInDebug = function(func) {\n    func();\n  };\n\n  /**\n    Will call `Ember.warn()` if ENABLE_ALL_FEATURES, ENABLE_OPTIONAL_FEATURES, or\n    any specific FEATURES flag is truthy.\n\n    This method is called automatically in debug canary builds.\n\n    @private\n    @method _warnIfUsingStrippedFeatureFlags\n    @return {void}\n  */\n  function _warnIfUsingStrippedFeatureFlags(FEATURES, featuresWereStripped) {\n    if (featuresWereStripped) {\n      Ember['default'].warn('Ember.ENV.ENABLE_ALL_FEATURES is only available in canary builds.', !Ember['default'].ENV.ENABLE_ALL_FEATURES);\n      Ember['default'].warn('Ember.ENV.ENABLE_OPTIONAL_FEATURES is only available in canary builds.', !Ember['default'].ENV.ENABLE_OPTIONAL_FEATURES);\n\n      for (var key in FEATURES) {\n        if (FEATURES.hasOwnProperty(key) && key !== 'isEnabled') {\n          Ember['default'].warn('FEATURE[\"' + key + '\"] is set as enabled, but FEATURE flags are only available in canary builds.', !FEATURES[key]);\n        }\n      }\n    }\n  }\n\n  if (!Ember['default'].testing) {\n    // Complain if they're using FEATURE flags in builds other than canary\n    Ember['default'].FEATURES['features-stripped-test'] = true;\n    var featuresWereStripped = true;\n\n    \n    delete Ember['default'].FEATURES['features-stripped-test'];\n    _warnIfUsingStrippedFeatureFlags(Ember['default'].ENV.FEATURES, featuresWereStripped);\n\n    // Inform the developer about the Ember Inspector if not installed.\n    var isFirefox = typeof InstallTrigger !== 'undefined';\n    var isChrome = environment['default'].isChrome;\n\n    if (typeof window !== 'undefined' && (isFirefox || isChrome) && window.addEventListener) {\n      window.addEventListener(\"load\", function() {\n        if (document.documentElement && document.documentElement.dataset && !document.documentElement.dataset.emberExtension) {\n          var downloadURL;\n\n          if (isChrome) {\n            downloadURL = 'https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi';\n          } else if (isFirefox) {\n            downloadURL = 'https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/';\n          }\n\n          Ember['default'].debug('For more advanced debugging, install the Ember Inspector from ' + downloadURL);\n        }\n      }, false);\n    }\n  }\n\n  /*\n    We are transitioning away from `ember.js` to `ember.debug.js` to make\n    it much clearer that it is only for local development purposes.\n\n    This flag value is changed by the tooling (by a simple string replacement)\n    so that if `ember.js` (which must be output for backwards compat reasons) is\n    used a nice helpful warning message will be printed out.\n  */\n  var runningNonEmberDebugJS = false;\n  if (runningNonEmberDebugJS) {\n    Ember['default'].warn('Please use `ember.debug.js` instead of `ember.js` for development and debugging.');\n  }\n\n  exports.runningNonEmberDebugJS = runningNonEmberDebugJS;\n\n});\nenifed('ember-testing', ['ember-metal/core', 'ember-testing/initializers', 'ember-testing/support', 'ember-testing/setup_for_testing', 'ember-testing/test', 'ember-testing/adapters/adapter', 'ember-testing/adapters/qunit', 'ember-testing/helpers'], function (Ember, __dep1__, __dep2__, setupForTesting, Test, Adapter, QUnitAdapter) {\n\n  'use strict';\n\n  Ember['default'].Test = Test['default'];\n  Ember['default'].Test.Adapter = Adapter['default'];\n  Ember['default'].Test.QUnitAdapter = QUnitAdapter['default'];\n  Ember['default'].setupForTesting = setupForTesting['default'];\n\n});\nenifed('ember-testing/adapters/adapter', ['exports', 'ember-runtime/system/object'], function (exports, EmberObject) {\n\n  'use strict';\n\n  function K() { return this; }\n\n  /**\n   @module ember\n   @submodule ember-testing\n  */\n\n  /**\n    The primary purpose of this class is to create hooks that can be implemented\n    by an adapter for various test frameworks.\n\n    @class Adapter\n    @namespace Ember.Test\n  */\n  var Adapter = EmberObject['default'].extend({\n    /**\n      This callback will be called whenever an async operation is about to start.\n\n      Override this to call your framework's methods that handle async\n      operations.\n\n      @public\n      @method asyncStart\n    */\n    asyncStart: K,\n\n    /**\n      This callback will be called whenever an async operation has completed.\n\n      @public\n      @method asyncEnd\n    */\n    asyncEnd: K,\n\n    /**\n      Override this method with your testing framework's false assertion.\n      This function is called whenever an exception occurs causing the testing\n      promise to fail.\n\n      QUnit example:\n\n      ```javascript\n        exception: function(error) {\n          ok(false, error);\n        };\n      ```\n\n      @public\n      @method exception\n      @param {String} error The exception to be raised.\n    */\n    exception: function(error) {\n      throw error;\n    }\n  });\n\n  exports['default'] = Adapter;\n\n});\nenifed('ember-testing/adapters/qunit', ['exports', 'ember-testing/adapters/adapter', 'ember-metal/utils'], function (exports, Adapter, utils) {\n\n  'use strict';\n\n  exports['default'] = Adapter['default'].extend({\n    asyncStart: function() {\n      QUnit.stop();\n    },\n    asyncEnd: function() {\n      QUnit.start();\n    },\n    exception: function(error) {\n      ok(false, utils.inspect(error));\n    }\n  });\n\n});\nenifed('ember-testing/helpers', ['ember-metal/core', 'ember-metal/property_get', 'ember-metal/error', 'ember-metal/run_loop', 'ember-views/system/jquery', 'ember-testing/test', 'ember-runtime/ext/rsvp'], function (Ember, property_get, EmberError, run, jQuery, Test, RSVP) {\n\n  'use strict';\n\n  var helper = Test['default'].registerHelper;\n  var asyncHelper = Test['default'].registerAsyncHelper;\n\n  function currentRouteName(app) {\n    var appController = app.__container__.lookup('controller:application');\n\n    return property_get.get(appController, 'currentRouteName');\n  }\n\n  function currentPath(app) {\n    var appController = app.__container__.lookup('controller:application');\n\n    return property_get.get(appController, 'currentPath');\n  }\n\n  function currentURL(app) {\n    var router = app.__container__.lookup('router:main');\n\n    return property_get.get(router, 'location').getURL();\n  }\n\n  function pauseTest() {\n    Test['default'].adapter.asyncStart();\n    return new Ember['default'].RSVP.Promise(function() { }, 'TestAdapter paused promise');\n  }\n\n  function focus(el) {\n    if (el && el.is(':input, [contenteditable=true]')) {\n      var type = el.prop('type');\n      if (type !== 'checkbox' && type !== 'radio' && type !== 'hidden') {\n        run['default'](el, function() {\n          // Firefox does not trigger the `focusin` event if the window\n          // does not have focus. If the document doesn't have focus just\n          // use trigger('focusin') instead.\n          if (!document.hasFocus || document.hasFocus()) {\n            this.focus();\n          } else {\n            this.trigger('focusin');\n          }\n        });\n      }\n    }\n  }\n\n  function visit(app, url) {\n    var router = app.__container__.lookup('router:main');\n    router.location.setURL(url);\n\n    if (app._readinessDeferrals > 0) {\n      router['initialURL'] = url;\n      run['default'](app, 'advanceReadiness');\n      delete router['initialURL'];\n    } else {\n      run['default'](app.__deprecatedInstance__, 'handleURL', url);\n    }\n\n    return app.testHelpers.wait();\n  }\n\n  function click(app, selector, context) {\n    var $el = app.testHelpers.findWithAssert(selector, context);\n    run['default']($el, 'mousedown');\n\n    focus($el);\n\n    run['default']($el, 'mouseup');\n    run['default']($el, 'click');\n\n    return app.testHelpers.wait();\n  }\n\n  function check(app, selector, context) {\n    var $el = app.testHelpers.findWithAssert(selector, context);\n    var type = $el.prop('type');\n\n    Ember['default'].assert('To check \\'' + selector +\n        '\\', the input must be a checkbox', type === 'checkbox');\n\n    if (!$el.prop('checked')) {\n      app.testHelpers.click(selector, context);\n    }\n\n    return app.testHelpers.wait();\n  }\n\n  function uncheck(app, selector, context) {\n    var $el = app.testHelpers.findWithAssert(selector, context);\n    var type = $el.prop('type');\n\n    Ember['default'].assert('To uncheck \\'' + selector +\n        '\\', the input must be a checkbox', type === 'checkbox');\n\n    if ($el.prop('checked')) {\n      app.testHelpers.click(selector, context);\n    }\n\n    return app.testHelpers.wait();\n  }\n\n  function triggerEvent(app, selector, contextOrType, typeOrOptions, possibleOptions) {\n    var arity = arguments.length;\n    var context, type, options;\n\n    if (arity === 3) {\n      // context and options are optional, so this is\n      // app, selector, type\n      context = null;\n      type = contextOrType;\n      options = {};\n    } else if (arity === 4) {\n      // context and options are optional, so this is\n      if (typeof typeOrOptions === \"object\") {  // either\n        // app, selector, type, options\n        context = null;\n        type = contextOrType;\n        options = typeOrOptions;\n      } else { // or\n        // app, selector, context, type\n        context = contextOrType;\n        type = typeOrOptions;\n        options = {};\n      }\n    } else {\n      context = contextOrType;\n      type = typeOrOptions;\n      options = possibleOptions;\n    }\n\n    var $el = app.testHelpers.findWithAssert(selector, context);\n\n    var event = jQuery['default'].Event(type, options);\n\n    run['default']($el, 'trigger', event);\n\n    return app.testHelpers.wait();\n  }\n\n  function keyEvent(app, selector, contextOrType, typeOrKeyCode, keyCode) {\n    var context, type;\n\n    if (typeof keyCode === 'undefined') {\n      context = null;\n      keyCode = typeOrKeyCode;\n      type = contextOrType;\n    } else {\n      context = contextOrType;\n      type = typeOrKeyCode;\n    }\n\n    return app.testHelpers.triggerEvent(selector, context, type, { keyCode: keyCode, which: keyCode });\n  }\n\n  function fillIn(app, selector, contextOrText, text) {\n    var $el, context;\n    if (typeof text === 'undefined') {\n      text = contextOrText;\n    } else {\n      context = contextOrText;\n    }\n    $el = app.testHelpers.findWithAssert(selector, context);\n    focus($el);\n    run['default'](function() {\n      $el.val(text).change();\n    });\n    return app.testHelpers.wait();\n  }\n\n  function findWithAssert(app, selector, context) {\n    var $el = app.testHelpers.find(selector, context);\n    if ($el.length === 0) {\n      throw new EmberError['default'](\"Element \" + selector + \" not found.\");\n    }\n    return $el;\n  }\n\n  function find(app, selector, context) {\n    var $el;\n    context = context || property_get.get(app, 'rootElement');\n    $el = app.$(selector, context);\n\n    return $el;\n  }\n\n  function andThen(app, callback) {\n    return app.testHelpers.wait(callback(app));\n  }\n\n  function wait(app, value) {\n    return new RSVP['default'].Promise(function(resolve) {\n      // Every 10ms, poll for the async thing to have finished\n      var watcher = setInterval(function() {\n        var router = app.__container__.lookup('router:main');\n\n        // 1. If the router is loading, keep polling\n        var routerIsLoading = router.router && !!router.router.activeTransition;\n        if (routerIsLoading) { return; }\n\n        // 2. If there are pending Ajax requests, keep polling\n        if (Test['default'].pendingAjaxRequests) { return; }\n\n        // 3. If there are scheduled timers or we are inside of a run loop, keep polling\n        if (run['default'].hasScheduledTimers() || run['default'].currentRunLoop) { return; }\n        if (Test['default'].waiters && Test['default'].waiters.any(function(waiter) {\n          var context = waiter[0];\n          var callback = waiter[1];\n          return !callback.call(context);\n        })) {\n          return;\n        }\n        // Stop polling\n        clearInterval(watcher);\n\n        // Synchronously resolve the promise\n        run['default'](null, resolve, value);\n      }, 10);\n    });\n\n  }\n\n\n  /**\n  * Loads a route, sets up any controllers, and renders any templates associated\n  * with the route as though a real user had triggered the route change while\n  * using your app.\n  *\n  * Example:\n  *\n  * ```javascript\n  * visit('posts/index').then(function() {\n  *   // assert something\n  * });\n  * ```\n  *\n  * @method visit\n  * @param {String} url the name of the route\n  * @return {RSVP.Promise}\n  */\n  asyncHelper('visit', visit);\n\n  /**\n  * Clicks an element and triggers any actions triggered by the element's `click`\n  * event.\n  *\n  * Example:\n  *\n  * ```javascript\n  * click('.some-jQuery-selector').then(function() {\n  *   // assert something\n  * });\n  * ```\n  *\n  * @method click\n  * @param {String} selector jQuery selector for finding element on the DOM\n  * @return {RSVP.Promise}\n  */\n  asyncHelper('click', click);\n\n    /**\n  * Simulates a key event, e.g. `keypress`, `keydown`, `keyup` with the desired keyCode\n  *\n  * Example:\n  *\n  * ```javascript\n  * keyEvent('.some-jQuery-selector', 'keypress', 13).then(function() {\n  *  // assert something\n  * });\n  * ```\n  *\n  * @method keyEvent\n  * @param {String} selector jQuery selector for finding element on the DOM\n  * @param {String} type the type of key event, e.g. `keypress`, `keydown`, `keyup`\n  * @param {Number} keyCode the keyCode of the simulated key event\n  * @return {RSVP.Promise}\n  * @since 1.5.0\n  */\n  asyncHelper('keyEvent', keyEvent);\n\n  /**\n  * Fills in an input element with some text.\n  *\n  * Example:\n  *\n  * ```javascript\n  * fillIn('#email', 'you@example.com').then(function() {\n  *   // assert something\n  * });\n  * ```\n  *\n  * @method fillIn\n  * @param {String} selector jQuery selector finding an input element on the DOM\n  * to fill text with\n  * @param {String} text text to place inside the input element\n  * @return {RSVP.Promise}\n  */\n  asyncHelper('fillIn', fillIn);\n\n  /**\n  * Finds an element in the context of the app's container element. A simple alias\n  * for `app.$(selector)`.\n  *\n  * Example:\n  *\n  * ```javascript\n  * var $el = find('.my-selector');\n  * ```\n  *\n  * @method find\n  * @param {String} selector jQuery string selector for element lookup\n  * @return {Object} jQuery object representing the results of the query\n  */\n  helper('find', find);\n\n  /**\n  * Like `find`, but throws an error if the element selector returns no results.\n  *\n  * Example:\n  *\n  * ```javascript\n  * var $el = findWithAssert('.doesnt-exist'); // throws error\n  * ```\n  *\n  * @method findWithAssert\n  * @param {String} selector jQuery selector string for finding an element within\n  * the DOM\n  * @return {Object} jQuery object representing the results of the query\n  * @throws {Error} throws error if jQuery object returned has a length of 0\n  */\n  helper('findWithAssert', findWithAssert);\n\n  /**\n    Causes the run loop to process any pending events. This is used to ensure that\n    any async operations from other helpers (or your assertions) have been processed.\n\n    This is most often used as the return value for the helper functions (see 'click',\n    'fillIn','visit',etc).\n\n    Example:\n\n    ```javascript\n    Ember.Test.registerAsyncHelper('loginUser', function(app, username, password) {\n      visit('secured/path/here')\n      .fillIn('#username', username)\n      .fillIn('#password', password)\n      .click('.submit')\n\n      return app.testHelpers.wait();\n    });\n\n    @method wait\n    @param {Object} value The value to be returned.\n    @return {RSVP.Promise}\n  */\n  asyncHelper('wait', wait);\n  asyncHelper('andThen', andThen);\n\n\n  /**\n    Returns the currently active route name.\n\n  Example:\n\n  ```javascript\n  function validateRouteName() {\n    equal(currentRouteName(), 'some.path', \"correct route was transitioned into.\");\n  }\n\n  visit('/some/path').then(validateRouteName)\n  ```\n\n  @method currentRouteName\n  @return {Object} The name of the currently active route.\n  @since 1.5.0\n  */\n  helper('currentRouteName', currentRouteName);\n\n  /**\n    Returns the current path.\n\n  Example:\n\n  ```javascript\n  function validateURL() {\n    equal(currentPath(), 'some.path.index', \"correct path was transitioned into.\");\n  }\n\n  click('#some-link-id').then(validateURL);\n  ```\n\n  @method currentPath\n  @return {Object} The currently active path.\n  @since 1.5.0\n  */\n  helper('currentPath', currentPath);\n\n  /**\n    Returns the current URL.\n\n  Example:\n\n  ```javascript\n  function validateURL() {\n    equal(currentURL(), '/some/path', \"correct URL was transitioned into.\");\n  }\n\n  click('#some-link-id').then(validateURL);\n  ```\n\n  @method currentURL\n  @return {Object} The currently active URL.\n  @since 1.5.0\n  */\n  helper('currentURL', currentURL);\n\n  /**\n   Pauses the current test - this is useful for debugging while testing or for test-driving.\n   It allows you to inspect the state of your application at any point.\n\n   Example (The test will pause before clicking the button):\n\n   ```javascript\n   visit('/')\n   return pauseTest();\n\n   click('.btn');\n   ```\n\n   @since 1.9.0\n   @method pauseTest\n   @return {Object} A promise that will never resolve\n   */\n  helper('pauseTest', pauseTest);\n\n  /**\n    Triggers the given DOM event on the element identified by the provided selector.\n\n    Example:\n\n    ```javascript\n    triggerEvent('#some-elem-id', 'blur');\n    ```\n\n    This is actually used internally by the `keyEvent` helper like so:\n\n    ```javascript\n    triggerEvent('#some-elem-id', 'keypress', { keyCode: 13 });\n    ```\n\n   @method triggerEvent\n   @param {String} selector jQuery selector for finding element on the DOM\n   @param {String} [context] jQuery selector that will limit the selector\n                             argument to find only within the context's children\n   @param {String} type The event type to be triggered.\n   @param {Object} [options] The options to be passed to jQuery.Event.\n   @return {RSVP.Promise}\n   @since 1.5.0\n  */\n  asyncHelper('triggerEvent', triggerEvent);\n\n});\nenifed('ember-testing/initializers', ['ember-runtime/system/lazy_load'], function (lazy_load) {\n\n  'use strict';\n\n  var name = 'deferReadiness in `testing` mode';\n\n  lazy_load.onLoad('Ember.Application', function(Application) {\n    if (!Application.initializers[name]) {\n      Application.initializer({\n        name: name,\n\n        initialize: function(registry, application) {\n          if (application.testing) {\n            application.deferReadiness();\n          }\n        }\n      });\n    }\n  });\n\n});\nenifed('ember-testing/setup_for_testing', ['exports', 'ember-metal/core', 'ember-testing/adapters/qunit', 'ember-views/system/jquery'], function (exports, Ember, QUnitAdapter, jQuery) {\n\n  'use strict';\n\n  var Test, requests;\n\n  function incrementAjaxPendingRequests(_, xhr) {\n    requests.push(xhr);\n    Test.pendingAjaxRequests = requests.length;\n  }\n\n  function decrementAjaxPendingRequests(_, xhr) {\n    for (var i=0;i<requests.length;i++) {\n      if (xhr === requests[i]) {\n        requests.splice(i, 1);\n      }\n    }\n    Test.pendingAjaxRequests = requests.length;\n  }\n\n  /**\n    Sets Ember up for testing. This is useful to perform\n    basic setup steps in order to unit test.\n\n    Use `App.setupForTesting` to perform integration tests (full\n    application testing).\n\n    @method setupForTesting\n    @namespace Ember\n    @since 1.5.0\n  */\n  function setupForTesting() {\n    if (!Test) { Test = requireModule('ember-testing/test')['default']; }\n\n    Ember['default'].testing = true;\n\n    // if adapter is not manually set default to QUnit\n    if (!Test.adapter) {\n      Test.adapter = QUnitAdapter['default'].create();\n    }\n\n    requests = [];\n    Test.pendingAjaxRequests = requests.length;\n\n    jQuery['default'](document).off('ajaxSend', incrementAjaxPendingRequests);\n    jQuery['default'](document).off('ajaxComplete', decrementAjaxPendingRequests);\n    jQuery['default'](document).on('ajaxSend', incrementAjaxPendingRequests);\n    jQuery['default'](document).on('ajaxComplete', decrementAjaxPendingRequests);\n  }\n  exports['default'] = setupForTesting;\n\n});\nenifed('ember-testing/support', ['ember-metal/core', 'ember-views/system/jquery', 'ember-metal/environment'], function (Ember, jQuery, environment) {\n\n  'use strict';\n\n  var $ = jQuery['default'];\n\n  /**\n    This method creates a checkbox and triggers the click event to fire the\n    passed in handler. It is used to correct for a bug in older versions\n    of jQuery (e.g 1.8.3).\n\n    @private\n    @method testCheckboxClick\n  */\n  function testCheckboxClick(handler) {\n    $('<input type=\"checkbox\">')\n      .css({ position: 'absolute', left: '-1000px', top: '-1000px' })\n      .appendTo('body')\n      .on('click', handler)\n      .trigger('click')\n      .remove();\n  }\n\n  if (environment['default'].hasDOM) {\n    $(function() {\n      /*\n        Determine whether a checkbox checked using jQuery's \"click\" method will have\n        the correct value for its checked property.\n\n        If we determine that the current jQuery version exhibits this behavior,\n        patch it to work correctly as in the commit for the actual fix:\n        https://github.com/jquery/jquery/commit/1fb2f92.\n      */\n      testCheckboxClick(function() {\n        if (!this.checked && !$.event.special.click) {\n          $.event.special.click = {\n            // For checkbox, fire native event so checked state will be right\n            trigger: function() {\n              if ($.nodeName(this, \"input\") && this.type === \"checkbox\" && this.click) {\n                this.click();\n                return false;\n              }\n            }\n          };\n        }\n      });\n\n      // Try again to verify that the patch took effect or blow up.\n      testCheckboxClick(function() {\n        Ember['default'].warn(\"clicked checkboxes should be checked! the jQuery patch didn't work\", this.checked);\n      });\n    });\n  }\n\n});\nenifed('ember-testing/test', ['exports', 'ember-metal/core', 'ember-metal/run_loop', 'ember-metal/platform/create', 'ember-runtime/ext/rsvp', 'ember-testing/setup_for_testing', 'ember-application/system/application'], function (exports, Ember, emberRun, create, RSVP, setupForTesting, EmberApplication) {\n\n  'use strict';\n\n  var slice = [].slice;\n  var helpers = {};\n  var injectHelpersCallbacks = [];\n\n  /**\n    This is a container for an assortment of testing related functionality:\n\n    * Choose your default test adapter (for your framework of choice).\n    * Register/Unregister additional test helpers.\n    * Setup callbacks to be fired when the test helpers are injected into\n      your application.\n\n    @class Test\n    @namespace Ember\n  */\n  var Test = {\n    /**\n      Hash containing all known test helpers.\n\n      @property _helpers\n      @private\n      @since 1.7.0\n    */\n    _helpers: helpers,\n\n    /**\n      `registerHelper` is used to register a test helper that will be injected\n      when `App.injectTestHelpers` is called.\n\n      The helper method will always be called with the current Application as\n      the first parameter.\n\n      For example:\n\n      ```javascript\n      Ember.Test.registerHelper('boot', function(app) {\n        Ember.run(app, app.advanceReadiness);\n      });\n      ```\n\n      This helper can later be called without arguments because it will be\n      called with `app` as the first parameter.\n\n      ```javascript\n      App = Ember.Application.create();\n      App.injectTestHelpers();\n      boot();\n      ```\n\n      @public\n      @method registerHelper\n      @param {String} name The name of the helper method to add.\n      @param {Function} helperMethod\n      @param options {Object}\n    */\n    registerHelper: function(name, helperMethod) {\n      helpers[name] = {\n        method: helperMethod,\n        meta: { wait: false }\n      };\n    },\n\n    /**\n      `registerAsyncHelper` is used to register an async test helper that will be injected\n      when `App.injectTestHelpers` is called.\n\n      The helper method will always be called with the current Application as\n      the first parameter.\n\n      For example:\n\n      ```javascript\n      Ember.Test.registerAsyncHelper('boot', function(app) {\n        Ember.run(app, app.advanceReadiness);\n      });\n      ```\n\n      The advantage of an async helper is that it will not run\n      until the last async helper has completed.  All async helpers\n      after it will wait for it complete before running.\n\n\n      For example:\n\n      ```javascript\n      Ember.Test.registerAsyncHelper('deletePost', function(app, postId) {\n        click('.delete-' + postId);\n      });\n\n      // ... in your test\n      visit('/post/2');\n      deletePost(2);\n      visit('/post/3');\n      deletePost(3);\n      ```\n\n      @public\n      @method registerAsyncHelper\n      @param {String} name The name of the helper method to add.\n      @param {Function} helperMethod\n      @since 1.2.0\n    */\n    registerAsyncHelper: function(name, helperMethod) {\n      helpers[name] = {\n        method: helperMethod,\n        meta: { wait: true }\n      };\n    },\n\n    /**\n      Remove a previously added helper method.\n\n      Example:\n\n      ```javascript\n      Ember.Test.unregisterHelper('wait');\n      ```\n\n      @public\n      @method unregisterHelper\n      @param {String} name The helper to remove.\n    */\n    unregisterHelper: function(name) {\n      delete helpers[name];\n      delete Test.Promise.prototype[name];\n    },\n\n    /**\n      Used to register callbacks to be fired whenever `App.injectTestHelpers`\n      is called.\n\n      The callback will receive the current application as an argument.\n\n      Example:\n\n      ```javascript\n      Ember.Test.onInjectHelpers(function() {\n        Ember.$(document).ajaxSend(function() {\n          Test.pendingAjaxRequests++;\n        });\n\n        Ember.$(document).ajaxComplete(function() {\n          Test.pendingAjaxRequests--;\n        });\n      });\n      ```\n\n      @public\n      @method onInjectHelpers\n      @param {Function} callback The function to be called.\n    */\n    onInjectHelpers: function(callback) {\n      injectHelpersCallbacks.push(callback);\n    },\n\n    /**\n      This returns a thenable tailored for testing.  It catches failed\n      `onSuccess` callbacks and invokes the `Ember.Test.adapter.exception`\n      callback in the last chained then.\n\n      This method should be returned by async helpers such as `wait`.\n\n      @public\n      @method promise\n      @param {Function} resolver The function used to resolve the promise.\n    */\n    promise: function(resolver) {\n      return new Test.Promise(resolver);\n    },\n\n    /**\n     Used to allow ember-testing to communicate with a specific testing\n     framework.\n\n     You can manually set it before calling `App.setupForTesting()`.\n\n     Example:\n\n     ```javascript\n     Ember.Test.adapter = MyCustomAdapter.create()\n     ```\n\n     If you do not set it, ember-testing will default to `Ember.Test.QUnitAdapter`.\n\n     @public\n     @property adapter\n     @type {Class} The adapter to be used.\n     @default Ember.Test.QUnitAdapter\n    */\n    adapter: null,\n\n    /**\n      Replacement for `Ember.RSVP.resolve`\n      The only difference is this uses\n      an instance of `Ember.Test.Promise`\n\n      @public\n      @method resolve\n      @param {Mixed} The value to resolve\n      @since 1.2.0\n    */\n    resolve: function(val) {\n      return Test.promise(function(resolve) {\n        return resolve(val);\n      });\n    },\n\n    /**\n       This allows ember-testing to play nicely with other asynchronous\n       events, such as an application that is waiting for a CSS3\n       transition or an IndexDB transaction.\n\n       For example:\n\n       ```javascript\n       Ember.Test.registerWaiter(function() {\n         return myPendingTransactions() == 0;\n       });\n       ```\n       The `context` argument allows you to optionally specify the `this`\n       with which your callback will be invoked.\n\n       For example:\n\n       ```javascript\n       Ember.Test.registerWaiter(MyDB, MyDB.hasPendingTransactions);\n       ```\n\n       @public\n       @method registerWaiter\n       @param {Object} context (optional)\n       @param {Function} callback\n       @since 1.2.0\n    */\n    registerWaiter: function(context, callback) {\n      if (arguments.length === 1) {\n        callback = context;\n        context = null;\n      }\n      if (!this.waiters) {\n        this.waiters = Ember['default'].A();\n      }\n      this.waiters.push([context, callback]);\n    },\n    /**\n       `unregisterWaiter` is used to unregister a callback that was\n       registered with `registerWaiter`.\n\n       @public\n       @method unregisterWaiter\n       @param {Object} context (optional)\n       @param {Function} callback\n       @since 1.2.0\n    */\n    unregisterWaiter: function(context, callback) {\n      if (!this.waiters) { return; }\n      if (arguments.length === 1) {\n        callback = context;\n        context = null;\n      }\n      this.waiters = Ember['default'].A(this.waiters.filter(function(elt) {\n        return !(elt[0] === context && elt[1] === callback);\n      }));\n    }\n  };\n\n  function helper(app, name) {\n    var fn = helpers[name].method;\n    var meta = helpers[name].meta;\n\n    return function() {\n      var args = slice.call(arguments);\n      var lastPromise;\n\n      args.unshift(app);\n\n      // some helpers are not async and\n      // need to return a value immediately.\n      // example: `find`\n      if (!meta.wait) {\n        return fn.apply(app, args);\n      }\n\n      lastPromise = run(function() {\n        return Test.resolve(Test.lastPromise);\n      });\n\n      // wait for last helper's promise to resolve and then\n      // execute. To be safe, we need to tell the adapter we're going\n      // asynchronous here, because fn may not be invoked before we\n      // return.\n      Test.adapter.asyncStart();\n      return lastPromise.then(function() {\n        return fn.apply(app, args);\n      })[\"finally\"](function() {\n        Test.adapter.asyncEnd();\n      });\n    };\n  }\n\n  function run(fn) {\n    if (!emberRun['default'].currentRunLoop) {\n      return emberRun['default'](fn);\n    } else {\n      return fn();\n    }\n  }\n\n  EmberApplication['default'].reopen({\n    /**\n     This property contains the testing helpers for the current application. These\n     are created once you call `injectTestHelpers` on your `Ember.Application`\n     instance. The included helpers are also available on the `window` object by\n     default, but can be used from this object on the individual application also.\n\n      @property testHelpers\n      @type {Object}\n      @default {}\n    */\n    testHelpers: {},\n\n    /**\n     This property will contain the original methods that were registered\n     on the `helperContainer` before `injectTestHelpers` is called.\n\n     When `removeTestHelpers` is called, these methods are restored to the\n     `helperContainer`.\n\n      @property originalMethods\n      @type {Object}\n      @default {}\n      @private\n      @since 1.3.0\n    */\n    originalMethods: {},\n\n\n    /**\n    This property indicates whether or not this application is currently in\n    testing mode. This is set when `setupForTesting` is called on the current\n    application.\n\n    @property testing\n    @type {Boolean}\n    @default false\n    @since 1.3.0\n    */\n    testing: false,\n\n    /**\n     This hook defers the readiness of the application, so that you can start\n     the app when your tests are ready to run. It also sets the router's\n     location to 'none', so that the window's location will not be modified\n     (preventing both accidental leaking of state between tests and interference\n     with your testing framework).\n\n     Example:\n\n    ```\n    App.setupForTesting();\n    ```\n\n      @method setupForTesting\n    */\n    setupForTesting: function() {\n      setupForTesting['default']();\n\n      this.testing = true;\n\n      this.Router.reopen({\n        location: 'none'\n      });\n    },\n\n    /**\n      This will be used as the container to inject the test helpers into. By\n      default the helpers are injected into `window`.\n\n      @property helperContainer\n      @type {Object} The object to be used for test helpers.\n      @default window\n      @since 1.2.0\n    */\n    helperContainer: null,\n\n    /**\n      This injects the test helpers into the `helperContainer` object. If an object is provided\n      it will be used as the helperContainer. If `helperContainer` is not set it will default\n      to `window`. If a function of the same name has already been defined it will be cached\n      (so that it can be reset if the helper is removed with `unregisterHelper` or\n      `removeTestHelpers`).\n\n     Any callbacks registered with `onInjectHelpers` will be called once the\n     helpers have been injected.\n\n    Example:\n    ```\n    App.injectTestHelpers();\n    ```\n\n      @method injectTestHelpers\n    */\n    injectTestHelpers: function(helperContainer) {\n      if (helperContainer) {\n        this.helperContainer = helperContainer;\n      } else {\n        this.helperContainer = window;\n      }\n\n      this.testHelpers = {};\n      for (var name in helpers) {\n        this.originalMethods[name] = this.helperContainer[name];\n        this.testHelpers[name] = this.helperContainer[name] = helper(this, name);\n        protoWrap(Test.Promise.prototype, name, helper(this, name), helpers[name].meta.wait);\n      }\n\n      for (var i = 0, l = injectHelpersCallbacks.length; i < l; i++) {\n        injectHelpersCallbacks[i](this);\n      }\n    },\n\n    /**\n      This removes all helpers that have been registered, and resets and functions\n      that were overridden by the helpers.\n\n      Example:\n\n      ```javascript\n      App.removeTestHelpers();\n      ```\n\n      @public\n      @method removeTestHelpers\n    */\n    removeTestHelpers: function() {\n      if (!this.helperContainer) { return; }\n\n      for (var name in helpers) {\n        this.helperContainer[name] = this.originalMethods[name];\n        delete this.testHelpers[name];\n        delete this.originalMethods[name];\n      }\n    }\n  });\n\n  // This method is no longer needed\n  // But still here for backwards compatibility\n  // of helper chaining\n  function protoWrap(proto, name, callback, isAsync) {\n    proto[name] = function() {\n      var args = arguments;\n      if (isAsync) {\n        return callback.apply(this, args);\n      } else {\n        return this.then(function() {\n          return callback.apply(this, args);\n        });\n      }\n    };\n  }\n\n  Test.Promise = function() {\n    RSVP['default'].Promise.apply(this, arguments);\n    Test.lastPromise = this;\n  };\n\n  Test.Promise.prototype = create['default'](RSVP['default'].Promise.prototype);\n  Test.Promise.prototype.constructor = Test.Promise;\n  Test.Promise.resolve = Test.resolve;\n\n  // Patch `then` to isolate async methods\n  // specifically `Ember.Test.lastPromise`\n  var originalThen = RSVP['default'].Promise.prototype.then;\n  Test.Promise.prototype.then = function(onSuccess, onFailure) {\n    return originalThen.call(this, function(val) {\n      return isolate(onSuccess, val);\n    }, onFailure);\n  };\n\n  // This method isolates nested async methods\n  // so that they don't conflict with other last promises.\n  //\n  // 1. Set `Ember.Test.lastPromise` to null\n  // 2. Invoke method\n  // 3. Return the last promise created during method\n  function isolate(fn, val) {\n    var value, lastPromise;\n\n    // Reset lastPromise for nested helpers\n    Test.lastPromise = null;\n\n    value = fn(val);\n\n    lastPromise = Test.lastPromise;\n    Test.lastPromise = null;\n\n    // If the method returned a promise\n    // return that promise. If not,\n    // return the last async helper's promise\n    if ((value && (value instanceof Test.Promise)) || !lastPromise) {\n      return value;\n    } else {\n      return run(function() {\n        return Test.resolve(lastPromise).then(function() {\n          return value;\n        });\n      });\n    }\n  }\n\n  exports['default'] = Test;\n\n});\nenifed(\"htmlbars-test-helpers\",\n  [\"exports\"],\n  function(__exports__) {\n    \"use strict\";\n    function equalInnerHTML(fragment, html) {\n      var actualHTML = normalizeInnerHTML(fragment.innerHTML);\n      QUnit.push(actualHTML === html, actualHTML, html);\n    }\n\n    __exports__.equalInnerHTML = equalInnerHTML;function equalHTML(node, html) {\n      var fragment;\n      if (!node.nodeType && node.length) {\n        fragment = document.createDocumentFragment();\n        while (node[0]) {\n          fragment.appendChild(node[0]);\n        }\n      } else {\n        fragment = node;\n      }\n\n      var div = document.createElement(\"div\");\n      div.appendChild(fragment.cloneNode(true));\n\n      equalInnerHTML(div, html);\n    }\n\n    __exports__.equalHTML = equalHTML;// detect weird IE8 html strings\n    var ie8InnerHTMLTestElement = document.createElement('div');\n    ie8InnerHTMLTestElement.setAttribute('id', 'womp');\n    var ie8InnerHTML = (ie8InnerHTMLTestElement.outerHTML.indexOf('id=womp') > -1);\n\n    // detect side-effects of cloning svg elements in IE9-11\n    var ieSVGInnerHTML = (function () {\n      if (!document.createElementNS) {\n        return false;\n      }\n      var div = document.createElement('div');\n      var node = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n      div.appendChild(node);\n      var clone = div.cloneNode(true);\n      return clone.innerHTML === '<svg xmlns=\"http://www.w3.org/2000/svg\" />';\n    })();\n\n    function normalizeInnerHTML(actualHTML) {\n      if (ie8InnerHTML) {\n        // drop newlines in IE8\n        actualHTML = actualHTML.replace(/\\r\\n/gm, '');\n        // downcase ALLCAPS tags in IE8\n        actualHTML = actualHTML.replace(/<\\/?[A-Z\\-]+/gi, function(tag){\n          return tag.toLowerCase();\n        });\n        // quote ids in IE8\n        actualHTML = actualHTML.replace(/id=([^ >]+)/gi, function(match, id){\n          return 'id=\"'+id+'\"';\n        });\n        // IE8 adds ':' to some tags\n        // <keygen> becomes <:keygen>\n        actualHTML = actualHTML.replace(/<(\\/?):([^ >]+)/gi, function(match, slash, tag){\n          return '<'+slash+tag;\n        });\n\n        // Normalize the style attribute\n        actualHTML = actualHTML.replace(/style=\"(.+?)\"/gi, function(match, val){\n          return 'style=\"'+val.toLowerCase()+';\"';\n        });\n\n      }\n      if (ieSVGInnerHTML) {\n        // Replace `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"50%\" />` with `<svg height=\"50%\"></svg>`, etc.\n        // drop namespace attribute\n        actualHTML = actualHTML.replace(/ xmlns=\"[^\"]+\"/, '');\n        // replace self-closing elements\n        actualHTML = actualHTML.replace(/<([^ >]+) [^\\/>]*\\/>/gi, function(tag, tagName) {\n          return tag.slice(0, tag.length - 3) + '></' + tagName + '>';\n        });\n      }\n\n      return actualHTML;\n    }\n\n    __exports__.normalizeInnerHTML = normalizeInnerHTML;// detect weird IE8 checked element string\n    var checkedInput = document.createElement('input');\n    checkedInput.setAttribute('checked', 'checked');\n    var checkedInputString = checkedInput.outerHTML;\n    function isCheckedInputHTML(element) {\n      equal(element.outerHTML, checkedInputString);\n    }\n\n    __exports__.isCheckedInputHTML = isCheckedInputHTML;// check which property has the node's text content\n    var textProperty = document.createElement('div').textContent === undefined ? 'innerText' : 'textContent';\n    function getTextContent(el) {\n      // textNode\n      if (el.nodeType === 3) {\n        return el.nodeValue;\n      } else {\n        return el[textProperty];\n      }\n    }\n\n    __exports__.getTextContent = getTextContent;// IE8 does not have Object.create, so use a polyfill if needed.\n    // Polyfill based on Mozilla's (MDN)\n    function createObject(obj) {\n      if (typeof Object.create === 'function') {\n        return Object.create(obj);\n      } else {\n        var Temp = function() {};\n        Temp.prototype = obj;\n        return new Temp();\n      }\n    }\n    __exports__.createObject = createObject;\n  });\nrequireModule(\"ember-testing\");\n\n})();","/**\n * Sinon.JS 1.12.2, 2014/12/12\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS\n *\n * (The BSD License)\n * \n * Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * \n *     * Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright notice,\n *       this list of conditions and the following disclaimer in the documentation\n *       and/or other materials provided with the distribution.\n *     * Neither the name of Christian Johansen nor the names of his contributors\n *       may be used to endorse or promote products derived from this software\n *       without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    define([], function () {\n      return (root.sinon = factory());\n    });\n  } else if (typeof exports === 'object') {\n    module.exports = factory();\n  } else {\n    root.sinon = factory();\n  }\n}(this, function () {\n  var samsam, formatio;\n  (function () {\n                function define(mod, deps, fn) {\n                  if (mod == \"samsam\") {\n                    samsam = deps();\n                  } else if (typeof deps === \"function\" && mod.length === 0) {\n                    lolex = deps();\n                  } else if (typeof fn === \"function\") {\n                    formatio = fn(samsam);\n                  }\n                }\n    define.amd = {};\n((typeof define === \"function\" && define.amd && function (m) { define(\"samsam\", m); }) ||\n (typeof module === \"object\" &&\n      function (m) { module.exports = m(); }) || // Node\n function (m) { this.samsam = m(); } // Browser globals\n)(function () {\n    var o = Object.prototype;\n    var div = typeof document !== \"undefined\" && document.createElement(\"div\");\n\n    function isNaN(value) {\n        // Unlike global isNaN, this avoids type coercion\n        // typeof check avoids IE host object issues, hat tip to\n        // lodash\n        var val = value; // JsLint thinks value !== value is \"weird\"\n        return typeof value === \"number\" && value !== val;\n    }\n\n    function getClass(value) {\n        // Returns the internal [[Class]] by calling Object.prototype.toString\n        // with the provided value as this. Return value is a string, naming the\n        // internal class, e.g. \"Array\"\n        return o.toString.call(value).split(/[ \\]]/)[1];\n    }\n\n    /**\n     * @name samsam.isArguments\n     * @param Object object\n     *\n     * Returns ``true`` if ``object`` is an ``arguments`` object,\n     * ``false`` otherwise.\n     */\n    function isArguments(object) {\n        if (getClass(object) === 'Arguments') { return true; }\n        if (typeof object !== \"object\" || typeof object.length !== \"number\" ||\n                getClass(object) === \"Array\") {\n            return false;\n        }\n        if (typeof object.callee == \"function\") { return true; }\n        try {\n            object[object.length] = 6;\n            delete object[object.length];\n        } catch (e) {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * @name samsam.isElement\n     * @param Object object\n     *\n     * Returns ``true`` if ``object`` is a DOM element node. Unlike\n     * Underscore.js/lodash, this function will return ``false`` if ``object``\n     * is an *element-like* object, i.e. a regular object with a ``nodeType``\n     * property that holds the value ``1``.\n     */\n    function isElement(object) {\n        if (!object || object.nodeType !== 1 || !div) { return false; }\n        try {\n            object.appendChild(div);\n            object.removeChild(div);\n        } catch (e) {\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @name samsam.keys\n     * @param Object object\n     *\n     * Return an array of own property names.\n     */\n    function keys(object) {\n        var ks = [], prop;\n        for (prop in object) {\n            if (o.hasOwnProperty.call(object, prop)) { ks.push(prop); }\n        }\n        return ks;\n    }\n\n    /**\n     * @name samsam.isDate\n     * @param Object value\n     *\n     * Returns true if the object is a ``Date``, or *date-like*. Duck typing\n     * of date objects work by checking that the object has a ``getTime``\n     * function whose return value equals the return value from the object's\n     * ``valueOf``.\n     */\n    function isDate(value) {\n        return typeof value.getTime == \"function\" &&\n            value.getTime() == value.valueOf();\n    }\n\n    /**\n     * @name samsam.isNegZero\n     * @param Object value\n     *\n     * Returns ``true`` if ``value`` is ``-0``.\n     */\n    function isNegZero(value) {\n        return value === 0 && 1 / value === -Infinity;\n    }\n\n    /**\n     * @name samsam.equal\n     * @param Object obj1\n     * @param Object obj2\n     *\n     * Returns ``true`` if two objects are strictly equal. Compared to\n     * ``===`` there are two exceptions:\n     *\n     *   - NaN is considered equal to NaN\n     *   - -0 and +0 are not considered equal\n     */\n    function identical(obj1, obj2) {\n        if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {\n            return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);\n        }\n    }\n\n\n    /**\n     * @name samsam.deepEqual\n     * @param Object obj1\n     * @param Object obj2\n     *\n     * Deep equal comparison. Two values are \"deep equal\" if:\n     *\n     *   - They are equal, according to samsam.identical\n     *   - They are both date objects representing the same time\n     *   - They are both arrays containing elements that are all deepEqual\n     *   - They are objects with the same set of properties, and each property\n     *     in ``obj1`` is deepEqual to the corresponding property in ``obj2``\n     *\n     * Supports cyclic objects.\n     */\n    function deepEqualCyclic(obj1, obj2) {\n\n        // used for cyclic comparison\n        // contain already visited objects\n        var objects1 = [],\n            objects2 = [],\n        // contain pathes (position in the object structure)\n        // of the already visited objects\n        // indexes same as in objects arrays\n            paths1 = [],\n            paths2 = [],\n        // contains combinations of already compared objects\n        // in the manner: { \"$1['ref']$2['ref']\": true }\n            compared = {};\n\n        /**\n         * used to check, if the value of a property is an object\n         * (cyclic logic is only needed for objects)\n         * only needed for cyclic logic\n         */\n        function isObject(value) {\n\n            if (typeof value === 'object' && value !== null &&\n                    !(value instanceof Boolean) &&\n                    !(value instanceof Date)    &&\n                    !(value instanceof Number)  &&\n                    !(value instanceof RegExp)  &&\n                    !(value instanceof String)) {\n\n                return true;\n            }\n\n            return false;\n        }\n\n        /**\n         * returns the index of the given object in the\n         * given objects array, -1 if not contained\n         * only needed for cyclic logic\n         */\n        function getIndex(objects, obj) {\n\n            var i;\n            for (i = 0; i < objects.length; i++) {\n                if (objects[i] === obj) {\n                    return i;\n                }\n            }\n\n            return -1;\n        }\n\n        // does the recursion for the deep equal check\n        return (function deepEqual(obj1, obj2, path1, path2) {\n            var type1 = typeof obj1;\n            var type2 = typeof obj2;\n\n            // == null also matches undefined\n            if (obj1 === obj2 ||\n                    isNaN(obj1) || isNaN(obj2) ||\n                    obj1 == null || obj2 == null ||\n                    type1 !== \"object\" || type2 !== \"object\") {\n\n                return identical(obj1, obj2);\n            }\n\n            // Elements are only equal if identical(expected, actual)\n            if (isElement(obj1) || isElement(obj2)) { return false; }\n\n            var isDate1 = isDate(obj1), isDate2 = isDate(obj2);\n            if (isDate1 || isDate2) {\n                if (!isDate1 || !isDate2 || obj1.getTime() !== obj2.getTime()) {\n                    return false;\n                }\n            }\n\n            if (obj1 instanceof RegExp && obj2 instanceof RegExp) {\n                if (obj1.toString() !== obj2.toString()) { return false; }\n            }\n\n            var class1 = getClass(obj1);\n            var class2 = getClass(obj2);\n            var keys1 = keys(obj1);\n            var keys2 = keys(obj2);\n\n            if (isArguments(obj1) || isArguments(obj2)) {\n                if (obj1.length !== obj2.length) { return false; }\n            } else {\n                if (type1 !== type2 || class1 !== class2 ||\n                        keys1.length !== keys2.length) {\n                    return false;\n                }\n            }\n\n            var key, i, l,\n                // following vars are used for the cyclic logic\n                value1, value2,\n                isObject1, isObject2,\n                index1, index2,\n                newPath1, newPath2;\n\n            for (i = 0, l = keys1.length; i < l; i++) {\n                key = keys1[i];\n                if (!o.hasOwnProperty.call(obj2, key)) {\n                    return false;\n                }\n\n                // Start of the cyclic logic\n\n                value1 = obj1[key];\n                value2 = obj2[key];\n\n                isObject1 = isObject(value1);\n                isObject2 = isObject(value2);\n\n                // determine, if the objects were already visited\n                // (it's faster to check for isObject first, than to\n                // get -1 from getIndex for non objects)\n                index1 = isObject1 ? getIndex(objects1, value1) : -1;\n                index2 = isObject2 ? getIndex(objects2, value2) : -1;\n\n                // determine the new pathes of the objects\n                // - for non cyclic objects the current path will be extended\n                //   by current property name\n                // - for cyclic objects the stored path is taken\n                newPath1 = index1 !== -1\n                    ? paths1[index1]\n                    : path1 + '[' + JSON.stringify(key) + ']';\n                newPath2 = index2 !== -1\n                    ? paths2[index2]\n                    : path2 + '[' + JSON.stringify(key) + ']';\n\n                // stop recursion if current objects are already compared\n                if (compared[newPath1 + newPath2]) {\n                    return true;\n                }\n\n                // remember the current objects and their pathes\n                if (index1 === -1 && isObject1) {\n                    objects1.push(value1);\n                    paths1.push(newPath1);\n                }\n                if (index2 === -1 && isObject2) {\n                    objects2.push(value2);\n                    paths2.push(newPath2);\n                }\n\n                // remember that the current objects are already compared\n                if (isObject1 && isObject2) {\n                    compared[newPath1 + newPath2] = true;\n                }\n\n                // End of cyclic logic\n\n                // neither value1 nor value2 is a cycle\n                // continue with next level\n                if (!deepEqual(value1, value2, newPath1, newPath2)) {\n                    return false;\n                }\n            }\n\n            return true;\n\n        }(obj1, obj2, '$1', '$2'));\n    }\n\n    var match;\n\n    function arrayContains(array, subset) {\n        if (subset.length === 0) { return true; }\n        var i, l, j, k;\n        for (i = 0, l = array.length; i < l; ++i) {\n            if (match(array[i], subset[0])) {\n                for (j = 0, k = subset.length; j < k; ++j) {\n                    if (!match(array[i + j], subset[j])) { return false; }\n                }\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * @name samsam.match\n     * @param Object object\n     * @param Object matcher\n     *\n     * Compare arbitrary value ``object`` with matcher.\n     */\n    match = function match(object, matcher) {\n        if (matcher && typeof matcher.test === \"function\") {\n            return matcher.test(object);\n        }\n\n        if (typeof matcher === \"function\") {\n            return matcher(object) === true;\n        }\n\n        if (typeof matcher === \"string\") {\n            matcher = matcher.toLowerCase();\n            var notNull = typeof object === \"string\" || !!object;\n            return notNull &&\n                (String(object)).toLowerCase().indexOf(matcher) >= 0;\n        }\n\n        if (typeof matcher === \"number\") {\n            return matcher === object;\n        }\n\n        if (typeof matcher === \"boolean\") {\n            return matcher === object;\n        }\n\n        if (typeof(matcher) === \"undefined\") {\n            return typeof(object) === \"undefined\";\n        }\n\n        if (matcher === null) {\n            return object === null;\n        }\n\n        if (getClass(object) === \"Array\" && getClass(matcher) === \"Array\") {\n            return arrayContains(object, matcher);\n        }\n\n        if (matcher && typeof matcher === \"object\") {\n            if (matcher === object) {\n                return true;\n            }\n            var prop;\n            for (prop in matcher) {\n                var value = object[prop];\n                if (typeof value === \"undefined\" &&\n                        typeof object.getAttribute === \"function\") {\n                    value = object.getAttribute(prop);\n                }\n                if (matcher[prop] === null || typeof matcher[prop] === 'undefined') {\n                    if (value !== matcher[prop]) {\n                        return false;\n                    }\n                } else if (typeof  value === \"undefined\" || !match(value, matcher[prop])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n        throw new Error(\"Matcher was not a string, a number, a \" +\n                        \"function, a boolean or an object\");\n    };\n\n    return {\n        isArguments: isArguments,\n        isElement: isElement,\n        isDate: isDate,\n        isNegZero: isNegZero,\n        identical: identical,\n        deepEqual: deepEqualCyclic,\n        match: match,\n        keys: keys\n    };\n});\n((typeof define === \"function\" && define.amd && function (m) {\n    define(\"formatio\", [\"samsam\"], m);\n}) || (typeof module === \"object\" && function (m) {\n    module.exports = m(require(\"samsam\"));\n}) || function (m) { this.formatio = m(this.samsam); }\n)(function (samsam) {\n    \n    var formatio = {\n        excludeConstructors: [\"Object\", /^.$/],\n        quoteStrings: true,\n        limitChildrenCount: 0\n    };\n\n    var hasOwn = Object.prototype.hasOwnProperty;\n\n    var specialObjects = [];\n    if (typeof global !== \"undefined\") {\n        specialObjects.push({ object: global, value: \"[object global]\" });\n    }\n    if (typeof document !== \"undefined\") {\n        specialObjects.push({\n            object: document,\n            value: \"[object HTMLDocument]\"\n        });\n    }\n    if (typeof window !== \"undefined\") {\n        specialObjects.push({ object: window, value: \"[object Window]\" });\n    }\n\n    function functionName(func) {\n        if (!func) { return \"\"; }\n        if (func.displayName) { return func.displayName; }\n        if (func.name) { return func.name; }\n        var matches = func.toString().match(/function\\s+([^\\(]+)/m);\n        return (matches && matches[1]) || \"\";\n    }\n\n    function constructorName(f, object) {\n        var name = functionName(object && object.constructor);\n        var excludes = f.excludeConstructors ||\n                formatio.excludeConstructors || [];\n\n        var i, l;\n        for (i = 0, l = excludes.length; i < l; ++i) {\n            if (typeof excludes[i] === \"string\" && excludes[i] === name) {\n                return \"\";\n            } else if (excludes[i].test && excludes[i].test(name)) {\n                return \"\";\n            }\n        }\n\n        return name;\n    }\n\n    function isCircular(object, objects) {\n        if (typeof object !== \"object\") { return false; }\n        var i, l;\n        for (i = 0, l = objects.length; i < l; ++i) {\n            if (objects[i] === object) { return true; }\n        }\n        return false;\n    }\n\n    function ascii(f, object, processed, indent) {\n        if (typeof object === \"string\") {\n            var qs = f.quoteStrings;\n            var quote = typeof qs !== \"boolean\" || qs;\n            return processed || quote ? '\"' + object + '\"' : object;\n        }\n\n        if (typeof object === \"function\" && !(object instanceof RegExp)) {\n            return ascii.func(object);\n        }\n\n        processed = processed || [];\n\n        if (isCircular(object, processed)) { return \"[Circular]\"; }\n\n        if (Object.prototype.toString.call(object) === \"[object Array]\") {\n            return ascii.array.call(f, object, processed);\n        }\n\n        if (!object) { return String((1/object) === -Infinity ? \"-0\" : object); }\n        if (samsam.isElement(object)) { return ascii.element(object); }\n\n        if (typeof object.toString === \"function\" &&\n                object.toString !== Object.prototype.toString) {\n            return object.toString();\n        }\n\n        var i, l;\n        for (i = 0, l = specialObjects.length; i < l; i++) {\n            if (object === specialObjects[i].object) {\n                return specialObjects[i].value;\n            }\n        }\n\n        return ascii.object.call(f, object, processed, indent);\n    }\n\n    ascii.func = function (func) {\n        return \"function \" + functionName(func) + \"() {}\";\n    };\n\n    ascii.array = function (array, processed) {\n        processed = processed || [];\n        processed.push(array);\n        var pieces = [];\n        var i, l;\n        l = (this.limitChildrenCount > 0) ? \n            Math.min(this.limitChildrenCount, array.length) : array.length;\n\n        for (i = 0; i < l; ++i) {\n            pieces.push(ascii(this, array[i], processed));\n        }\n\n        if(l < array.length)\n            pieces.push(\"[... \" + (array.length - l) + \" more elements]\");\n\n        return \"[\" + pieces.join(\", \") + \"]\";\n    };\n\n    ascii.object = function (object, processed, indent) {\n        processed = processed || [];\n        processed.push(object);\n        indent = indent || 0;\n        var pieces = [], properties = samsam.keys(object).sort();\n        var length = 3;\n        var prop, str, obj, i, k, l;\n        l = (this.limitChildrenCount > 0) ? \n            Math.min(this.limitChildrenCount, properties.length) : properties.length;\n\n        for (i = 0; i < l; ++i) {\n            prop = properties[i];\n            obj = object[prop];\n\n            if (isCircular(obj, processed)) {\n                str = \"[Circular]\";\n            } else {\n                str = ascii(this, obj, processed, indent + 2);\n            }\n\n            str = (/\\s/.test(prop) ? '\"' + prop + '\"' : prop) + \": \" + str;\n            length += str.length;\n            pieces.push(str);\n        }\n\n        var cons = constructorName(this, object);\n        var prefix = cons ? \"[\" + cons + \"] \" : \"\";\n        var is = \"\";\n        for (i = 0, k = indent; i < k; ++i) { is += \" \"; }\n\n        if(l < properties.length)\n            pieces.push(\"[... \" + (properties.length - l) + \" more elements]\");\n\n        if (length + indent > 80) {\n            return prefix + \"{\\n  \" + is + pieces.join(\",\\n  \" + is) + \"\\n\" +\n                is + \"}\";\n        }\n        return prefix + \"{ \" + pieces.join(\", \") + \" }\";\n    };\n\n    ascii.element = function (element) {\n        var tagName = element.tagName.toLowerCase();\n        var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;\n\n        for (i = 0, l = attrs.length; i < l; ++i) {\n            attr = attrs.item(i);\n            attrName = attr.nodeName.toLowerCase().replace(\"html:\", \"\");\n            val = attr.nodeValue;\n            if (attrName !== \"contenteditable\" || val !== \"inherit\") {\n                if (!!val) { pairs.push(attrName + \"=\\\"\" + val + \"\\\"\"); }\n            }\n        }\n\n        var formatted = \"<\" + tagName + (pairs.length > 0 ? \" \" : \"\");\n        var content = element.innerHTML;\n\n        if (content.length > 20) {\n            content = content.substr(0, 20) + \"[...]\";\n        }\n\n        var res = formatted + pairs.join(\" \") + \">\" + content +\n                \"</\" + tagName + \">\";\n\n        return res.replace(/ contentEditable=\"inherit\"/, \"\");\n    };\n\n    function Formatio(options) {\n        for (var opt in options) {\n            this[opt] = options[opt];\n        }\n    }\n\n    Formatio.prototype = {\n        functionName: functionName,\n\n        configure: function (options) {\n            return new Formatio(options);\n        },\n\n        constructorName: function (object) {\n            return constructorName(this, object);\n        },\n\n        ascii: function (object, processed, indent) {\n            return ascii(this, object, processed, indent);\n        }\n    };\n\n    return Formatio.prototype;\n});\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.lolex=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n(function (global){\n/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/\n/*global global*/\n/**\n * @author Christian Johansen (christian@cjohansen.no) and contributors\n * @license BSD\n *\n * Copyright (c) 2010-2014 Christian Johansen\n */\n\n// node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref()\n// browsers, a number.\n// see https://github.com/cjohansen/Sinon.JS/pull/436\nvar timeoutResult = setTimeout(function() {}, 0);\nvar addTimerReturnsObject = typeof timeoutResult === \"object\";\nclearTimeout(timeoutResult);\n\nvar NativeDate = Date;\nvar id = 1;\n\n/**\n * Parse strings like \"01:10:00\" (meaning 1 hour, 10 minutes, 0 seconds) into\n * number of milliseconds. This is used to support human-readable strings passed\n * to clock.tick()\n */\nfunction parseTime(str) {\n    if (!str) {\n        return 0;\n    }\n\n    var strings = str.split(\":\");\n    var l = strings.length, i = l;\n    var ms = 0, parsed;\n\n    if (l > 3 || !/^(\\d\\d:){0,2}\\d\\d?$/.test(str)) {\n        throw new Error(\"tick only understands numbers and 'h:m:s'\");\n    }\n\n    while (i--) {\n        parsed = parseInt(strings[i], 10);\n\n        if (parsed >= 60) {\n            throw new Error(\"Invalid time \" + str);\n        }\n\n        ms += parsed * Math.pow(60, (l - i - 1));\n    }\n\n    return ms * 1000;\n}\n\n/**\n * Used to grok the `now` parameter to createClock.\n */\nfunction getEpoch(epoch) {\n    if (!epoch) { return 0; }\n    if (typeof epoch.getTime === \"function\") { return epoch.getTime(); }\n    if (typeof epoch === \"number\") { return epoch; }\n    throw new TypeError(\"now should be milliseconds since UNIX epoch\");\n}\n\nfunction inRange(from, to, timer) {\n    return timer && timer.callAt >= from && timer.callAt <= to;\n}\n\nfunction mirrorDateProperties(target, source) {\n    if (source.now) {\n        target.now = function now() {\n            return target.clock.now;\n        };\n    } else {\n        delete target.now;\n    }\n\n    if (source.toSource) {\n        target.toSource = function toSource() {\n            return source.toSource();\n        };\n    } else {\n        delete target.toSource;\n    }\n\n    target.toString = function toString() {\n        return source.toString();\n    };\n\n    target.prototype = source.prototype;\n    target.parse = source.parse;\n    target.UTC = source.UTC;\n    target.prototype.toUTCString = source.prototype.toUTCString;\n\n    for (var prop in source) {\n        if (source.hasOwnProperty(prop)) {\n            target[prop] = source[prop];\n        }\n    }\n\n    return target;\n}\n\nfunction createDate() {\n    function ClockDate(year, month, date, hour, minute, second, ms) {\n        // Defensive and verbose to avoid potential harm in passing\n        // explicit undefined when user does not pass argument\n        switch (arguments.length) {\n        case 0:\n            return new NativeDate(ClockDate.clock.now);\n        case 1:\n            return new NativeDate(year);\n        case 2:\n            return new NativeDate(year, month);\n        case 3:\n            return new NativeDate(year, month, date);\n        case 4:\n            return new NativeDate(year, month, date, hour);\n        case 5:\n            return new NativeDate(year, month, date, hour, minute);\n        case 6:\n            return new NativeDate(year, month, date, hour, minute, second);\n        default:\n            return new NativeDate(year, month, date, hour, minute, second, ms);\n        }\n    }\n\n    return mirrorDateProperties(ClockDate, NativeDate);\n}\n\nfunction addTimer(clock, timer) {\n    if (typeof timer.func === \"undefined\") {\n        throw new Error(\"Callback must be provided to timer calls\");\n    }\n\n    if (!clock.timers) {\n        clock.timers = {};\n    }\n\n    timer.id = id++;\n    timer.createdAt = clock.now;\n    timer.callAt = clock.now + (timer.delay || 0);\n\n    clock.timers[timer.id] = timer;\n\n    if (addTimerReturnsObject) {\n        return {\n            id: timer.id,\n            ref: function() {},\n            unref: function() {}\n        };\n    }\n    else {\n        return timer.id;\n    }\n}\n\nfunction firstTimerInRange(clock, from, to) {\n    var timers = clock.timers, timer = null;\n\n    for (var id in timers) {\n        if (!inRange(from, to, timers[id])) {\n            continue;\n        }\n\n        if (!timer || ~compareTimers(timer, timers[id])) {\n            timer = timers[id];\n        }\n    }\n\n    return timer;\n}\n\nfunction compareTimers(a, b) {\n    // Sort first by absolute timing\n    if (a.callAt < b.callAt) {\n        return -1;\n    }\n    if (a.callAt > b.callAt) {\n        return 1;\n    }\n\n    // Sort next by immediate, immediate timers take precedence\n    if (a.immediate && !b.immediate) {\n        return -1;\n    }\n    if (!a.immediate && b.immediate) {\n        return 1;\n    }\n\n    // Sort next by creation time, earlier-created timers take precedence\n    if (a.createdAt < b.createdAt) {\n        return -1;\n    }\n    if (a.createdAt > b.createdAt) {\n        return 1;\n    }\n\n    // Sort next by id, lower-id timers take precedence\n    if (a.id < b.id) {\n        return -1;\n    }\n    if (a.id > b.id) {\n        return 1;\n    }\n\n    // As timer ids are unique, no fallback `0` is necessary\n}\n\nfunction callTimer(clock, timer) {\n    if (typeof timer.interval == \"number\") {\n        clock.timers[timer.id].callAt += timer.interval;\n    } else {\n        delete clock.timers[timer.id];\n    }\n\n    try {\n        if (typeof timer.func == \"function\") {\n            timer.func.apply(null, timer.args);\n        } else {\n            eval(timer.func);\n        }\n    } catch (e) {\n        var exception = e;\n    }\n\n    if (!clock.timers[timer.id]) {\n        if (exception) {\n            throw exception;\n        }\n        return;\n    }\n\n    if (exception) {\n        throw exception;\n    }\n}\n\nfunction uninstall(clock, target) {\n    var method;\n\n    for (var i = 0, l = clock.methods.length; i < l; i++) {\n        method = clock.methods[i];\n\n        if (target[method].hadOwnProperty) {\n            target[method] = clock[\"_\" + method];\n        } else {\n            try {\n                delete target[method];\n            } catch (e) {}\n        }\n    }\n\n    // Prevent multiple executions which will completely remove these props\n    clock.methods = [];\n}\n\nfunction hijackMethod(target, method, clock) {\n    clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method);\n    clock[\"_\" + method] = target[method];\n\n    if (method == \"Date\") {\n        var date = mirrorDateProperties(clock[method], target[method]);\n        target[method] = date;\n    } else {\n        target[method] = function () {\n            return clock[method].apply(clock, arguments);\n        };\n\n        for (var prop in clock[method]) {\n            if (clock[method].hasOwnProperty(prop)) {\n                target[method][prop] = clock[method][prop];\n            }\n        }\n    }\n\n    target[method].clock = clock;\n}\n\nvar timers = {\n    setTimeout: setTimeout,\n    clearTimeout: clearTimeout,\n    setImmediate: (typeof setImmediate !== \"undefined\" ? setImmediate : undefined),\n    clearImmediate: (typeof clearImmediate !== \"undefined\" ? clearImmediate: undefined),\n    setInterval: setInterval,\n    clearInterval: clearInterval,\n    Date: Date\n};\n\nvar keys = Object.keys || function (obj) {\n    var ks = [];\n    for (var key in obj) {\n        ks.push(key);\n    }\n    return ks;\n};\n\nexports.timers = timers;\n\nvar createClock = exports.createClock = function (now) {\n    var clock = {\n        now: getEpoch(now),\n        timeouts: {},\n        Date: createDate()\n    };\n\n    clock.Date.clock = clock;\n\n    clock.setTimeout = function setTimeout(func, timeout) {\n        return addTimer(clock, {\n            func: func,\n            args: Array.prototype.slice.call(arguments, 2),\n            delay: timeout\n        });\n    };\n\n    clock.clearTimeout = function clearTimeout(timerId) {\n        if (!timerId) {\n            // null appears to be allowed in most browsers, and appears to be\n            // relied upon by some libraries, like Bootstrap carousel\n            return;\n        }\n        if (!clock.timers) {\n            clock.timers = [];\n        }\n        // in Node, timerId is an object with .ref()/.unref(), and\n        // its .id field is the actual timer id.\n        if (typeof timerId === \"object\") {\n            timerId = timerId.id\n        }\n        if (timerId in clock.timers) {\n            delete clock.timers[timerId];\n        }\n    };\n\n    clock.setInterval = function setInterval(func, timeout) {\n        return addTimer(clock, {\n            func: func,\n            args: Array.prototype.slice.call(arguments, 2),\n            delay: timeout,\n            interval: timeout\n        });\n    };\n\n    clock.clearInterval = function clearInterval(timerId) {\n        clock.clearTimeout(timerId);\n    };\n\n    clock.setImmediate = function setImmediate(func) {\n        return addTimer(clock, {\n            func: func,\n            args: Array.prototype.slice.call(arguments, 1),\n            immediate: true\n        });\n    };\n\n    clock.clearImmediate = function clearImmediate(timerId) {\n        clock.clearTimeout(timerId);\n    };\n\n    clock.tick = function tick(ms) {\n        ms = typeof ms == \"number\" ? ms : parseTime(ms);\n        var tickFrom = clock.now, tickTo = clock.now + ms, previous = clock.now;\n        var timer = firstTimerInRange(clock, tickFrom, tickTo);\n\n        var firstException;\n        while (timer && tickFrom <= tickTo) {\n            if (clock.timers[timer.id]) {\n                tickFrom = clock.now = timer.callAt;\n                try {\n                    callTimer(clock, timer);\n                } catch (e) {\n                    firstException = firstException || e;\n                }\n            }\n\n            timer = firstTimerInRange(clock, previous, tickTo);\n            previous = tickFrom;\n        }\n\n        clock.now = tickTo;\n\n        if (firstException) {\n            throw firstException;\n        }\n\n        return clock.now;\n    };\n\n    clock.reset = function reset() {\n        clock.timers = {};\n    };\n\n    return clock;\n};\n\nexports.install = function install(target, now, toFake) {\n    if (typeof target === \"number\") {\n        toFake = now;\n        now = target;\n        target = null;\n    }\n\n    if (!target) {\n        target = global;\n    }\n\n    var clock = createClock(now);\n\n    clock.uninstall = function () {\n        uninstall(clock, target);\n    };\n\n    clock.methods = toFake || [];\n\n    if (clock.methods.length === 0) {\n        clock.methods = keys(timers);\n    }\n\n    for (var i = 0, l = clock.methods.length; i < l; i++) {\n        hijackMethod(target, clock.methods[i], clock);\n    }\n\n    return clock;\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}]},{},[1])(1)\n});\n  })();\n  var define;\n/**\n * Sinon core utilities. For internal use only.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nvar sinon = (function () {\n\"use strict\";\n\n    var sinon;\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        sinon = module.exports = require(\"./sinon/util/core\");\n        require(\"./sinon/extend\");\n        require(\"./sinon/typeOf\");\n        require(\"./sinon/times_in_words\");\n        require(\"./sinon/spy\");\n        require(\"./sinon/call\");\n        require(\"./sinon/behavior\");\n        require(\"./sinon/stub\");\n        require(\"./sinon/mock\");\n        require(\"./sinon/collection\");\n        require(\"./sinon/assert\");\n        require(\"./sinon/sandbox\");\n        require(\"./sinon/test\");\n        require(\"./sinon/test_case\");\n        require(\"./sinon/match\");\n        require(\"./sinon/format\");\n        require(\"./sinon/log_error\");\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n        sinon = module.exports;\n    } else {\n        sinon = {};\n    }\n\n    return sinon;\n}());\n\n/**\n * @depend ../../sinon.js\n */\n/**\n * Sinon core utilities. For internal use only.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n    var div = typeof document != \"undefined\" && document.createElement(\"div\");\n    var hasOwn = Object.prototype.hasOwnProperty;\n\n    function isDOMNode(obj) {\n        var success = false;\n\n        try {\n            obj.appendChild(div);\n            success = div.parentNode == obj;\n        } catch (e) {\n            return false;\n        } finally {\n            try {\n                obj.removeChild(div);\n            } catch (e) {\n                // Remove failed, not much we can do about that\n            }\n        }\n\n        return success;\n    }\n\n    function isElement(obj) {\n        return div && obj && obj.nodeType === 1 && isDOMNode(obj);\n    }\n\n    function isFunction(obj) {\n        return typeof obj === \"function\" || !!(obj && obj.constructor && obj.call && obj.apply);\n    }\n\n    function isReallyNaN(val) {\n        return typeof val === \"number\" && isNaN(val);\n    }\n\n    function mirrorProperties(target, source) {\n        for (var prop in source) {\n            if (!hasOwn.call(target, prop)) {\n                target[prop] = source[prop];\n            }\n        }\n    }\n\n    function isRestorable(obj) {\n        return typeof obj === \"function\" && typeof obj.restore === \"function\" && obj.restore.sinon;\n    }\n\n    function makeApi(sinon) {\n        sinon.wrapMethod = function wrapMethod(object, property, method) {\n            if (!object) {\n                throw new TypeError(\"Should wrap property of object\");\n            }\n\n            if (typeof method != \"function\") {\n                throw new TypeError(\"Method wrapper should be function\");\n            }\n\n            var wrappedMethod = object[property],\n                error;\n\n            if (!isFunction(wrappedMethod)) {\n                error = new TypeError(\"Attempted to wrap \" + (typeof wrappedMethod) + \" property \" +\n                                    property + \" as function\");\n            } else if (wrappedMethod.restore && wrappedMethod.restore.sinon) {\n                error = new TypeError(\"Attempted to wrap \" + property + \" which is already wrapped\");\n            } else if (wrappedMethod.calledBefore) {\n                var verb = !!wrappedMethod.returns ? \"stubbed\" : \"spied on\";\n                error = new TypeError(\"Attempted to wrap \" + property + \" which is already \" + verb);\n            }\n\n            if (error) {\n                if (wrappedMethod && wrappedMethod.stackTrace) {\n                    error.stack += \"\\n--------------\\n\" + wrappedMethod.stackTrace;\n                }\n                throw error;\n            }\n\n            // IE 8 does not support hasOwnProperty on the window object and Firefox has a problem\n            // when using hasOwn.call on objects from other frames.\n            var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwn.call(object, property);\n            object[property] = method;\n            method.displayName = property;\n            // Set up a stack trace which can be used later to find what line of\n            // code the original method was created on.\n            method.stackTrace = (new Error(\"Stack Trace for original\")).stack;\n\n            method.restore = function () {\n                // For prototype properties try to reset by delete first.\n                // If this fails (ex: localStorage on mobile safari) then force a reset\n                // via direct assignment.\n                if (!owned) {\n                    delete object[property];\n                }\n                if (object[property] === method) {\n                    object[property] = wrappedMethod;\n                }\n            };\n\n            method.restore.sinon = true;\n            mirrorProperties(method, wrappedMethod);\n\n            return method;\n        };\n\n        sinon.create = function create(proto) {\n            var F = function () {};\n            F.prototype = proto;\n            return new F();\n        };\n\n        sinon.deepEqual = function deepEqual(a, b) {\n            if (sinon.match && sinon.match.isMatcher(a)) {\n                return a.test(b);\n            }\n\n            if (typeof a != \"object\" || typeof b != \"object\") {\n                if (isReallyNaN(a) && isReallyNaN(b)) {\n                    return true;\n                } else {\n                    return a === b;\n                }\n            }\n\n            if (isElement(a) || isElement(b)) {\n                return a === b;\n            }\n\n            if (a === b) {\n                return true;\n            }\n\n            if ((a === null && b !== null) || (a !== null && b === null)) {\n                return false;\n            }\n\n            if (a instanceof RegExp && b instanceof RegExp) {\n                return (a.source === b.source) && (a.global === b.global) &&\n                    (a.ignoreCase === b.ignoreCase) && (a.multiline === b.multiline);\n            }\n\n            var aString = Object.prototype.toString.call(a);\n            if (aString != Object.prototype.toString.call(b)) {\n                return false;\n            }\n\n            if (aString == \"[object Date]\") {\n                return a.valueOf() === b.valueOf();\n            }\n\n            var prop, aLength = 0, bLength = 0;\n\n            if (aString == \"[object Array]\" && a.length !== b.length) {\n                return false;\n            }\n\n            for (prop in a) {\n                aLength += 1;\n\n                if (!(prop in b)) {\n                    return false;\n                }\n\n                if (!deepEqual(a[prop], b[prop])) {\n                    return false;\n                }\n            }\n\n            for (prop in b) {\n                bLength += 1;\n            }\n\n            return aLength == bLength;\n        };\n\n        sinon.functionName = function functionName(func) {\n            var name = func.displayName || func.name;\n\n            // Use function decomposition as a last resort to get function\n            // name. Does not rely on function decomposition to work - if it\n            // doesn't debugging will be slightly less informative\n            // (i.e. toString will say 'spy' rather than 'myFunc').\n            if (!name) {\n                var matches = func.toString().match(/function ([^\\s\\(]+)/);\n                name = matches && matches[1];\n            }\n\n            return name;\n        };\n\n        sinon.functionToString = function toString() {\n            if (this.getCall && this.callCount) {\n                var thisValue, prop, i = this.callCount;\n\n                while (i--) {\n                    thisValue = this.getCall(i).thisValue;\n\n                    for (prop in thisValue) {\n                        if (thisValue[prop] === this) {\n                            return prop;\n                        }\n                    }\n                }\n            }\n\n            return this.displayName || \"sinon fake\";\n        };\n\n        sinon.getConfig = function (custom) {\n            var config = {};\n            custom = custom || {};\n            var defaults = sinon.defaultConfig;\n\n            for (var prop in defaults) {\n                if (defaults.hasOwnProperty(prop)) {\n                    config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];\n                }\n            }\n\n            return config;\n        };\n\n        sinon.defaultConfig = {\n            injectIntoThis: true,\n            injectInto: null,\n            properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n            useFakeTimers: true,\n            useFakeServer: true\n        };\n\n        sinon.timesInWords = function timesInWords(count) {\n            return count == 1 && \"once\" ||\n                count == 2 && \"twice\" ||\n                count == 3 && \"thrice\" ||\n                (count || 0) + \" times\";\n        };\n\n        sinon.calledInOrder = function (spies) {\n            for (var i = 1, l = spies.length; i < l; i++) {\n                if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {\n                    return false;\n                }\n            }\n\n            return true;\n        };\n\n        sinon.orderByFirstCall = function (spies) {\n            return spies.sort(function (a, b) {\n                // uuid, won't ever be equal\n                var aCall = a.getCall(0);\n                var bCall = b.getCall(0);\n                var aId = aCall && aCall.callId || -1;\n                var bId = bCall && bCall.callId || -1;\n\n                return aId < bId ? -1 : 1;\n            });\n        };\n\n        sinon.createStubInstance = function (constructor) {\n            if (typeof constructor !== \"function\") {\n                throw new TypeError(\"The constructor should be a function.\");\n            }\n            return sinon.stub(sinon.create(constructor.prototype));\n        };\n\n        sinon.restore = function (object) {\n            if (object !== null && typeof object === \"object\") {\n                for (var prop in object) {\n                    if (isRestorable(object[prop])) {\n                        object[prop].restore();\n                    }\n                }\n            } else if (isRestorable(object)) {\n                object.restore();\n            }\n        };\n\n        return sinon;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports) {\n        makeApi(exports);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n */\n\n(function (sinon) {\n    function makeApi(sinon) {\n\n        // Adapted from https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug\n        var hasDontEnumBug = (function () {\n            var obj = {\n                constructor: function () {\n                    return \"0\";\n                },\n                toString: function () {\n                    return \"1\";\n                },\n                valueOf: function () {\n                    return \"2\";\n                },\n                toLocaleString: function () {\n                    return \"3\";\n                },\n                prototype: function () {\n                    return \"4\";\n                },\n                isPrototypeOf: function () {\n                    return \"5\";\n                },\n                propertyIsEnumerable: function () {\n                    return \"6\";\n                },\n                hasOwnProperty: function () {\n                    return \"7\";\n                },\n                length: function () {\n                    return \"8\";\n                },\n                unique: function () {\n                    return \"9\"\n                }\n            };\n\n            var result = [];\n            for (var prop in obj) {\n                result.push(obj[prop]());\n            }\n            return result.join(\"\") !== \"0123456789\";\n        })();\n\n        /* Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will\n         *         override properties in previous sources.\n         *\n         * target - The Object to extend\n         * sources - Objects to copy properties from.\n         *\n         * Returns the extended target\n         */\n        function extend(target /*, sources */) {\n            var sources = Array.prototype.slice.call(arguments, 1),\n                source, i, prop;\n\n            for (i = 0; i < sources.length; i++) {\n                source = sources[i];\n\n                for (prop in source) {\n                    if (source.hasOwnProperty(prop)) {\n                        target[prop] = source[prop];\n                    }\n                }\n\n                // Make sure we copy (own) toString method even when in JScript with DontEnum bug\n                // See https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug\n                if (hasDontEnumBug && source.hasOwnProperty(\"toString\") && source.toString !== target.toString) {\n                    target.toString = source.toString;\n                }\n            }\n\n            return target;\n        };\n\n        sinon.extend = extend;\n        return sinon.extend;\n    }\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        module.exports = makeApi(sinon);\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n */\n\n(function (sinon) {\n    function makeApi(sinon) {\n\n        function timesInWords(count) {\n            switch (count) {\n                case 1:\n                    return \"once\";\n                case 2:\n                    return \"twice\";\n                case 3:\n                    return \"thrice\";\n                default:\n                    return (count || 0) + \" times\";\n            }\n        }\n\n        sinon.timesInWords = timesInWords;\n        return sinon.timesInWords;\n    }\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        module.exports = makeApi(sinon);\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n */\n/**\n * Format functions\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2014 Christian Johansen\n */\n\n(function (sinon, formatio) {\n    function makeApi(sinon) {\n        function typeOf(value) {\n            if (value === null) {\n                return \"null\";\n            } else if (value === undefined) {\n                return \"undefined\";\n            }\n            var string = Object.prototype.toString.call(value);\n            return string.substring(8, string.length - 1).toLowerCase();\n        };\n\n        sinon.typeOf = typeOf;\n        return sinon.typeOf;\n    }\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        module.exports = makeApi(sinon);\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(\n    (typeof sinon == \"object\" && sinon || null),\n    (typeof formatio == \"object\" && formatio)\n));\n\n/**\n * @depend util/core.js\n * @depend typeOf.js\n */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Match functions\n *\n * @author Maximilian Antoni (mail@maxantoni.de)\n * @license BSD\n *\n * Copyright (c) 2012 Maximilian Antoni\n */\n\n(function (sinon) {\n    function makeApi(sinon) {\n        function assertType(value, type, name) {\n            var actual = sinon.typeOf(value);\n            if (actual !== type) {\n                throw new TypeError(\"Expected type of \" + name + \" to be \" +\n                    type + \", but was \" + actual);\n            }\n        }\n\n        var matcher = {\n            toString: function () {\n                return this.message;\n            }\n        };\n\n        function isMatcher(object) {\n            return matcher.isPrototypeOf(object);\n        }\n\n        function matchObject(expectation, actual) {\n            if (actual === null || actual === undefined) {\n                return false;\n            }\n            for (var key in expectation) {\n                if (expectation.hasOwnProperty(key)) {\n                    var exp = expectation[key];\n                    var act = actual[key];\n                    if (match.isMatcher(exp)) {\n                        if (!exp.test(act)) {\n                            return false;\n                        }\n                    } else if (sinon.typeOf(exp) === \"object\") {\n                        if (!matchObject(exp, act)) {\n                            return false;\n                        }\n                    } else if (!sinon.deepEqual(exp, act)) {\n                        return false;\n                    }\n                }\n            }\n            return true;\n        }\n\n        matcher.or = function (m2) {\n            if (!arguments.length) {\n                throw new TypeError(\"Matcher expected\");\n            } else if (!isMatcher(m2)) {\n                m2 = match(m2);\n            }\n            var m1 = this;\n            var or = sinon.create(matcher);\n            or.test = function (actual) {\n                return m1.test(actual) || m2.test(actual);\n            };\n            or.message = m1.message + \".or(\" + m2.message + \")\";\n            return or;\n        };\n\n        matcher.and = function (m2) {\n            if (!arguments.length) {\n                throw new TypeError(\"Matcher expected\");\n            } else if (!isMatcher(m2)) {\n                m2 = match(m2);\n            }\n            var m1 = this;\n            var and = sinon.create(matcher);\n            and.test = function (actual) {\n                return m1.test(actual) && m2.test(actual);\n            };\n            and.message = m1.message + \".and(\" + m2.message + \")\";\n            return and;\n        };\n\n        var match = function (expectation, message) {\n            var m = sinon.create(matcher);\n            var type = sinon.typeOf(expectation);\n            switch (type) {\n            case \"object\":\n                if (typeof expectation.test === \"function\") {\n                    m.test = function (actual) {\n                        return expectation.test(actual) === true;\n                    };\n                    m.message = \"match(\" + sinon.functionName(expectation.test) + \")\";\n                    return m;\n                }\n                var str = [];\n                for (var key in expectation) {\n                    if (expectation.hasOwnProperty(key)) {\n                        str.push(key + \": \" + expectation[key]);\n                    }\n                }\n                m.test = function (actual) {\n                    return matchObject(expectation, actual);\n                };\n                m.message = \"match(\" + str.join(\", \") + \")\";\n                break;\n            case \"number\":\n                m.test = function (actual) {\n                    return expectation == actual;\n                };\n                break;\n            case \"string\":\n                m.test = function (actual) {\n                    if (typeof actual !== \"string\") {\n                        return false;\n                    }\n                    return actual.indexOf(expectation) !== -1;\n                };\n                m.message = \"match(\\\"\" + expectation + \"\\\")\";\n                break;\n            case \"regexp\":\n                m.test = function (actual) {\n                    if (typeof actual !== \"string\") {\n                        return false;\n                    }\n                    return expectation.test(actual);\n                };\n                break;\n            case \"function\":\n                m.test = expectation;\n                if (message) {\n                    m.message = message;\n                } else {\n                    m.message = \"match(\" + sinon.functionName(expectation) + \")\";\n                }\n                break;\n            default:\n                m.test = function (actual) {\n                    return sinon.deepEqual(expectation, actual);\n                };\n            }\n            if (!m.message) {\n                m.message = \"match(\" + expectation + \")\";\n            }\n            return m;\n        };\n\n        match.isMatcher = isMatcher;\n\n        match.any = match(function () {\n            return true;\n        }, \"any\");\n\n        match.defined = match(function (actual) {\n            return actual !== null && actual !== undefined;\n        }, \"defined\");\n\n        match.truthy = match(function (actual) {\n            return !!actual;\n        }, \"truthy\");\n\n        match.falsy = match(function (actual) {\n            return !actual;\n        }, \"falsy\");\n\n        match.same = function (expectation) {\n            return match(function (actual) {\n                return expectation === actual;\n            }, \"same(\" + expectation + \")\");\n        };\n\n        match.typeOf = function (type) {\n            assertType(type, \"string\", \"type\");\n            return match(function (actual) {\n                return sinon.typeOf(actual) === type;\n            }, \"typeOf(\\\"\" + type + \"\\\")\");\n        };\n\n        match.instanceOf = function (type) {\n            assertType(type, \"function\", \"type\");\n            return match(function (actual) {\n                return actual instanceof type;\n            }, \"instanceOf(\" + sinon.functionName(type) + \")\");\n        };\n\n        function createPropertyMatcher(propertyTest, messagePrefix) {\n            return function (property, value) {\n                assertType(property, \"string\", \"property\");\n                var onlyProperty = arguments.length === 1;\n                var message = messagePrefix + \"(\\\"\" + property + \"\\\"\";\n                if (!onlyProperty) {\n                    message += \", \" + value;\n                }\n                message += \")\";\n                return match(function (actual) {\n                    if (actual === undefined || actual === null ||\n                            !propertyTest(actual, property)) {\n                        return false;\n                    }\n                    return onlyProperty || sinon.deepEqual(value, actual[property]);\n                }, message);\n            };\n        }\n\n        match.has = createPropertyMatcher(function (actual, property) {\n            if (typeof actual === \"object\") {\n                return property in actual;\n            }\n            return actual[property] !== undefined;\n        }, \"has\");\n\n        match.hasOwn = createPropertyMatcher(function (actual, property) {\n            return actual.hasOwnProperty(property);\n        }, \"hasOwn\");\n\n        match.bool = match.typeOf(\"boolean\");\n        match.number = match.typeOf(\"number\");\n        match.string = match.typeOf(\"string\");\n        match.object = match.typeOf(\"object\");\n        match.func = match.typeOf(\"function\");\n        match.array = match.typeOf(\"array\");\n        match.regexp = match.typeOf(\"regexp\");\n        match.date = match.typeOf(\"date\");\n\n        sinon.match = match;\n        return match;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        module.exports = makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n */\n/**\n * Format functions\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2014 Christian Johansen\n */\n\n(function (sinon, formatio) {\n    function makeApi(sinon) {\n        function valueFormatter(value) {\n            return \"\" + value;\n        }\n\n        function getFormatioFormatter() {\n            var formatter = formatio.configure({\n                    quoteStrings: false,\n                    limitChildrenCount: 250\n                });\n\n            function format() {\n                return formatter.ascii.apply(formatter, arguments);\n            };\n\n            return format;\n        }\n\n        function getNodeFormatter(value) {\n            function format(value) {\n                return typeof value == \"object\" && value.toString === Object.prototype.toString ? util.inspect(value) : value;\n            };\n\n            try {\n                var util = require(\"util\");\n            } catch (e) {\n                /* Node, but no util module - would be very old, but better safe than sorry */\n            }\n\n            return util ? format : valueFormatter;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\",\n            formatter;\n\n        if (isNode) {\n            try {\n                formatio = require(\"formatio\");\n            } catch (e) {}\n        }\n\n        if (formatio) {\n            formatter = getFormatioFormatter()\n        } else if (isNode) {\n            formatter = getNodeFormatter();\n        } else {\n            formatter = valueFormatter;\n        }\n\n        sinon.format = formatter;\n        return sinon.format;\n    }\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        module.exports = makeApi(sinon);\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(\n    (typeof sinon == \"object\" && sinon || null),\n    (typeof formatio == \"object\" && formatio)\n));\n\n/**\n  * @depend util/core.js\n  * @depend match.js\n  * @depend format.js\n  */\n/**\n  * Spy calls\n  *\n  * @author Christian Johansen (christian@cjohansen.no)\n  * @author Maximilian Antoni (mail@maxantoni.de)\n  * @license BSD\n  *\n  * Copyright (c) 2010-2013 Christian Johansen\n  * Copyright (c) 2013 Maximilian Antoni\n  */\n\n(function (sinon) {\n    function makeApi(sinon) {\n        function throwYieldError(proxy, text, args) {\n            var msg = sinon.functionName(proxy) + text;\n            if (args.length) {\n                msg += \" Received [\" + slice.call(args).join(\", \") + \"]\";\n            }\n            throw new Error(msg);\n        }\n\n        var slice = Array.prototype.slice;\n\n        var callProto = {\n            calledOn: function calledOn(thisValue) {\n                if (sinon.match && sinon.match.isMatcher(thisValue)) {\n                    return thisValue.test(this.thisValue);\n                }\n                return this.thisValue === thisValue;\n            },\n\n            calledWith: function calledWith() {\n                for (var i = 0, l = arguments.length; i < l; i += 1) {\n                    if (!sinon.deepEqual(arguments[i], this.args[i])) {\n                        return false;\n                    }\n                }\n\n                return true;\n            },\n\n            calledWithMatch: function calledWithMatch() {\n                for (var i = 0, l = arguments.length; i < l; i += 1) {\n                    var actual = this.args[i];\n                    var expectation = arguments[i];\n                    if (!sinon.match || !sinon.match(expectation).test(actual)) {\n                        return false;\n                    }\n                }\n                return true;\n            },\n\n            calledWithExactly: function calledWithExactly() {\n                return arguments.length == this.args.length &&\n                    this.calledWith.apply(this, arguments);\n            },\n\n            notCalledWith: function notCalledWith() {\n                return !this.calledWith.apply(this, arguments);\n            },\n\n            notCalledWithMatch: function notCalledWithMatch() {\n                return !this.calledWithMatch.apply(this, arguments);\n            },\n\n            returned: function returned(value) {\n                return sinon.deepEqual(value, this.returnValue);\n            },\n\n            threw: function threw(error) {\n                if (typeof error === \"undefined\" || !this.exception) {\n                    return !!this.exception;\n                }\n\n                return this.exception === error || this.exception.name === error;\n            },\n\n            calledWithNew: function calledWithNew() {\n                return this.proxy.prototype && this.thisValue instanceof this.proxy;\n            },\n\n            calledBefore: function (other) {\n                return this.callId < other.callId;\n            },\n\n            calledAfter: function (other) {\n                return this.callId > other.callId;\n            },\n\n            callArg: function (pos) {\n                this.args[pos]();\n            },\n\n            callArgOn: function (pos, thisValue) {\n                this.args[pos].apply(thisValue);\n            },\n\n            callArgWith: function (pos) {\n                this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));\n            },\n\n            callArgOnWith: function (pos, thisValue) {\n                var args = slice.call(arguments, 2);\n                this.args[pos].apply(thisValue, args);\n            },\n\n            yield: function () {\n                this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));\n            },\n\n            yieldOn: function (thisValue) {\n                var args = this.args;\n                for (var i = 0, l = args.length; i < l; ++i) {\n                    if (typeof args[i] === \"function\") {\n                        args[i].apply(thisValue, slice.call(arguments, 1));\n                        return;\n                    }\n                }\n                throwYieldError(this.proxy, \" cannot yield since no callback was passed.\", args);\n            },\n\n            yieldTo: function (prop) {\n                this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));\n            },\n\n            yieldToOn: function (prop, thisValue) {\n                var args = this.args;\n                for (var i = 0, l = args.length; i < l; ++i) {\n                    if (args[i] && typeof args[i][prop] === \"function\") {\n                        args[i][prop].apply(thisValue, slice.call(arguments, 2));\n                        return;\n                    }\n                }\n                throwYieldError(this.proxy, \" cannot yield to '\" + prop +\n                    \"' since no callback was passed.\", args);\n            },\n\n            toString: function () {\n                var callStr = this.proxy.toString() + \"(\";\n                var args = [];\n\n                for (var i = 0, l = this.args.length; i < l; ++i) {\n                    args.push(sinon.format(this.args[i]));\n                }\n\n                callStr = callStr + args.join(\", \") + \")\";\n\n                if (typeof this.returnValue != \"undefined\") {\n                    callStr += \" => \" + sinon.format(this.returnValue);\n                }\n\n                if (this.exception) {\n                    callStr += \" !\" + this.exception.name;\n\n                    if (this.exception.message) {\n                        callStr += \"(\" + this.exception.message + \")\";\n                    }\n                }\n\n                return callStr;\n            }\n        };\n\n        callProto.invokeCallback = callProto.yield;\n\n        function createSpyCall(spy, thisValue, args, returnValue, exception, id) {\n            if (typeof id !== \"number\") {\n                throw new TypeError(\"Call id is not a number\");\n            }\n            var proxyCall = sinon.create(callProto);\n            proxyCall.proxy = spy;\n            proxyCall.thisValue = thisValue;\n            proxyCall.args = args;\n            proxyCall.returnValue = returnValue;\n            proxyCall.exception = exception;\n            proxyCall.callId = id;\n\n            return proxyCall;\n        }\n        createSpyCall.toString = callProto.toString; // used by mocks\n\n        sinon.spyCall = createSpyCall;\n        return createSpyCall;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        require(\"./match\");\n        module.exports = makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n  * @depend times_in_words.js\n  * @depend util/core.js\n  * @depend extend.js\n  * @depend call.js\n  * @depend format.js\n  */\n/**\n  * Spy functions\n  *\n  * @author Christian Johansen (christian@cjohansen.no)\n  * @license BSD\n  *\n  * Copyright (c) 2010-2013 Christian Johansen\n  */\n\n(function (sinon) {\n    function makeApi(sinon) {\n        var push = Array.prototype.push;\n        var slice = Array.prototype.slice;\n        var callId = 0;\n\n        function spy(object, property) {\n            if (!property && typeof object == \"function\") {\n                return spy.create(object);\n            }\n\n            if (!object && !property) {\n                return spy.create(function () { });\n            }\n\n            var method = object[property];\n            return sinon.wrapMethod(object, property, spy.create(method));\n        }\n\n        function matchingFake(fakes, args, strict) {\n            if (!fakes) {\n                return;\n            }\n\n            for (var i = 0, l = fakes.length; i < l; i++) {\n                if (fakes[i].matches(args, strict)) {\n                    return fakes[i];\n                }\n            }\n        }\n\n        function incrementCallCount() {\n            this.called = true;\n            this.callCount += 1;\n            this.notCalled = false;\n            this.calledOnce = this.callCount == 1;\n            this.calledTwice = this.callCount == 2;\n            this.calledThrice = this.callCount == 3;\n        }\n\n        function createCallProperties() {\n            this.firstCall = this.getCall(0);\n            this.secondCall = this.getCall(1);\n            this.thirdCall = this.getCall(2);\n            this.lastCall = this.getCall(this.callCount - 1);\n        }\n\n        var vars = \"a,b,c,d,e,f,g,h,i,j,k,l\";\n        function createProxy(func) {\n            // Retain the function length:\n            var p;\n            if (func.length) {\n                eval(\"p = (function proxy(\" + vars.substring(0, func.length * 2 - 1) +\n                    \") { return p.invoke(func, this, slice.call(arguments)); });\");\n            } else {\n                p = function proxy() {\n                    return p.invoke(func, this, slice.call(arguments));\n                };\n            }\n            return p;\n        }\n\n        var uuid = 0;\n\n        // Public API\n        var spyApi = {\n            reset: function () {\n                if (this.invoking) {\n                    var err = new Error(\"Cannot reset Sinon function while invoking it. \" +\n                                        \"Move the call to .reset outside of the callback.\");\n                    err.name = \"InvalidResetException\";\n                    throw err;\n                }\n\n                this.called = false;\n                this.notCalled = true;\n                this.calledOnce = false;\n                this.calledTwice = false;\n                this.calledThrice = false;\n                this.callCount = 0;\n                this.firstCall = null;\n                this.secondCall = null;\n                this.thirdCall = null;\n                this.lastCall = null;\n                this.args = [];\n                this.returnValues = [];\n                this.thisValues = [];\n                this.exceptions = [];\n                this.callIds = [];\n                if (this.fakes) {\n                    for (var i = 0; i < this.fakes.length; i++) {\n                        this.fakes[i].reset();\n                    }\n                }\n            },\n\n            create: function create(func) {\n                var name;\n\n                if (typeof func != \"function\") {\n                    func = function () { };\n                } else {\n                    name = sinon.functionName(func);\n                }\n\n                var proxy = createProxy(func);\n\n                sinon.extend(proxy, spy);\n                delete proxy.create;\n                sinon.extend(proxy, func);\n\n                proxy.reset();\n                proxy.prototype = func.prototype;\n                proxy.displayName = name || \"spy\";\n                proxy.toString = sinon.functionToString;\n                proxy.instantiateFake = sinon.spy.create;\n                proxy.id = \"spy#\" + uuid++;\n\n                return proxy;\n            },\n\n            invoke: function invoke(func, thisValue, args) {\n                var matching = matchingFake(this.fakes, args);\n                var exception, returnValue;\n\n                incrementCallCount.call(this);\n                push.call(this.thisValues, thisValue);\n                push.call(this.args, args);\n                push.call(this.callIds, callId++);\n\n                // Make call properties available from within the spied function:\n                createCallProperties.call(this);\n\n                try {\n                    this.invoking = true;\n\n                    if (matching) {\n                        returnValue = matching.invoke(func, thisValue, args);\n                    } else {\n                        returnValue = (this.func || func).apply(thisValue, args);\n                    }\n\n                    var thisCall = this.getCall(this.callCount - 1);\n                    if (thisCall.calledWithNew() && typeof returnValue !== \"object\") {\n                        returnValue = thisValue;\n                    }\n                } catch (e) {\n                    exception = e;\n                } finally {\n                    delete this.invoking;\n                }\n\n                push.call(this.exceptions, exception);\n                push.call(this.returnValues, returnValue);\n\n                // Make return value and exception available in the calls:\n                createCallProperties.call(this);\n\n                if (exception !== undefined) {\n                    throw exception;\n                }\n\n                return returnValue;\n            },\n\n            named: function named(name) {\n                this.displayName = name;\n                return this;\n            },\n\n            getCall: function getCall(i) {\n                if (i < 0 || i >= this.callCount) {\n                    return null;\n                }\n\n                return sinon.spyCall(this, this.thisValues[i], this.args[i],\n                                        this.returnValues[i], this.exceptions[i],\n                                        this.callIds[i]);\n            },\n\n            getCalls: function () {\n                var calls = [];\n                var i;\n\n                for (i = 0; i < this.callCount; i++) {\n                    calls.push(this.getCall(i));\n                }\n\n                return calls;\n            },\n\n            calledBefore: function calledBefore(spyFn) {\n                if (!this.called) {\n                    return false;\n                }\n\n                if (!spyFn.called) {\n                    return true;\n                }\n\n                return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];\n            },\n\n            calledAfter: function calledAfter(spyFn) {\n                if (!this.called || !spyFn.called) {\n                    return false;\n                }\n\n                return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];\n            },\n\n            withArgs: function () {\n                var args = slice.call(arguments);\n\n                if (this.fakes) {\n                    var match = matchingFake(this.fakes, args, true);\n\n                    if (match) {\n                        return match;\n                    }\n                } else {\n                    this.fakes = [];\n                }\n\n                var original = this;\n                var fake = this.instantiateFake();\n                fake.matchingAguments = args;\n                fake.parent = this;\n                push.call(this.fakes, fake);\n\n                fake.withArgs = function () {\n                    return original.withArgs.apply(original, arguments);\n                };\n\n                for (var i = 0; i < this.args.length; i++) {\n                    if (fake.matches(this.args[i])) {\n                        incrementCallCount.call(fake);\n                        push.call(fake.thisValues, this.thisValues[i]);\n                        push.call(fake.args, this.args[i]);\n                        push.call(fake.returnValues, this.returnValues[i]);\n                        push.call(fake.exceptions, this.exceptions[i]);\n                        push.call(fake.callIds, this.callIds[i]);\n                    }\n                }\n                createCallProperties.call(fake);\n\n                return fake;\n            },\n\n            matches: function (args, strict) {\n                var margs = this.matchingAguments;\n\n                if (margs.length <= args.length &&\n                    sinon.deepEqual(margs, args.slice(0, margs.length))) {\n                    return !strict || margs.length == args.length;\n                }\n            },\n\n            printf: function (format) {\n                var spy = this;\n                var args = slice.call(arguments, 1);\n                var formatter;\n\n                return (format || \"\").replace(/%(.)/g, function (match, specifyer) {\n                    formatter = spyApi.formatters[specifyer];\n\n                    if (typeof formatter == \"function\") {\n                        return formatter.call(null, spy, args);\n                    } else if (!isNaN(parseInt(specifyer, 10))) {\n                        return sinon.format(args[specifyer - 1]);\n                    }\n\n                    return \"%\" + specifyer;\n                });\n            }\n        };\n\n        function delegateToCalls(method, matchAny, actual, notCalled) {\n            spyApi[method] = function () {\n                if (!this.called) {\n                    if (notCalled) {\n                        return notCalled.apply(this, arguments);\n                    }\n                    return false;\n                }\n\n                var currentCall;\n                var matches = 0;\n\n                for (var i = 0, l = this.callCount; i < l; i += 1) {\n                    currentCall = this.getCall(i);\n\n                    if (currentCall[actual || method].apply(currentCall, arguments)) {\n                        matches += 1;\n\n                        if (matchAny) {\n                            return true;\n                        }\n                    }\n                }\n\n                return matches === this.callCount;\n            };\n        }\n\n        delegateToCalls(\"calledOn\", true);\n        delegateToCalls(\"alwaysCalledOn\", false, \"calledOn\");\n        delegateToCalls(\"calledWith\", true);\n        delegateToCalls(\"calledWithMatch\", true);\n        delegateToCalls(\"alwaysCalledWith\", false, \"calledWith\");\n        delegateToCalls(\"alwaysCalledWithMatch\", false, \"calledWithMatch\");\n        delegateToCalls(\"calledWithExactly\", true);\n        delegateToCalls(\"alwaysCalledWithExactly\", false, \"calledWithExactly\");\n        delegateToCalls(\"neverCalledWith\", false, \"notCalledWith\",\n            function () { return true; });\n        delegateToCalls(\"neverCalledWithMatch\", false, \"notCalledWithMatch\",\n            function () { return true; });\n        delegateToCalls(\"threw\", true);\n        delegateToCalls(\"alwaysThrew\", false, \"threw\");\n        delegateToCalls(\"returned\", true);\n        delegateToCalls(\"alwaysReturned\", false, \"returned\");\n        delegateToCalls(\"calledWithNew\", true);\n        delegateToCalls(\"alwaysCalledWithNew\", false, \"calledWithNew\");\n        delegateToCalls(\"callArg\", false, \"callArgWith\", function () {\n            throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n        });\n        spyApi.callArgWith = spyApi.callArg;\n        delegateToCalls(\"callArgOn\", false, \"callArgOnWith\", function () {\n            throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n        });\n        spyApi.callArgOnWith = spyApi.callArgOn;\n        delegateToCalls(\"yield\", false, \"yield\", function () {\n            throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n        });\n        // \"invokeCallback\" is an alias for \"yield\" since \"yield\" is invalid in strict mode.\n        spyApi.invokeCallback = spyApi.yield;\n        delegateToCalls(\"yieldOn\", false, \"yieldOn\", function () {\n            throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n        });\n        delegateToCalls(\"yieldTo\", false, \"yieldTo\", function (property) {\n            throw new Error(this.toString() + \" cannot yield to '\" + property +\n                \"' since it was not yet invoked.\");\n        });\n        delegateToCalls(\"yieldToOn\", false, \"yieldToOn\", function (property) {\n            throw new Error(this.toString() + \" cannot yield to '\" + property +\n                \"' since it was not yet invoked.\");\n        });\n\n        spyApi.formatters = {\n            c: function (spy) {\n                return sinon.timesInWords(spy.callCount);\n            },\n\n            n: function (spy) {\n                return spy.toString();\n            },\n\n            C: function (spy) {\n                var calls = [];\n\n                for (var i = 0, l = spy.callCount; i < l; ++i) {\n                    var stringifiedCall = \"    \" + spy.getCall(i).toString();\n                    if (/\\n/.test(calls[i - 1])) {\n                        stringifiedCall = \"\\n\" + stringifiedCall;\n                    }\n                    push.call(calls, stringifiedCall);\n                }\n\n                return calls.length > 0 ? \"\\n\" + calls.join(\"\\n\") : \"\";\n            },\n\n            t: function (spy) {\n                var objects = [];\n\n                for (var i = 0, l = spy.callCount; i < l; ++i) {\n                    push.call(objects, sinon.format(spy.thisValues[i]));\n                }\n\n                return objects.join(\", \");\n            },\n\n            \"*\": function (spy, args) {\n                var formatted = [];\n\n                for (var i = 0, l = args.length; i < l; ++i) {\n                    push.call(formatted, sinon.format(args[i]));\n                }\n\n                return formatted.join(\", \");\n            }\n        };\n\n        sinon.extend(spy, spyApi);\n\n        spy.spyCall = sinon.spyCall;\n        sinon.spy = spy;\n\n        return spy;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        require(\"./call\");\n        module.exports = makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend util/core.js\n * @depend extend.js\n */\n/**\n * Stub behavior\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @author Tim Fischbach (mail@timfischbach.de)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n    var slice = Array.prototype.slice;\n    var join = Array.prototype.join;\n\n    var nextTick = (function () {\n        if (typeof process === \"object\" && typeof process.nextTick === \"function\") {\n            return process.nextTick;\n        } else if (typeof setImmediate === \"function\") {\n            return setImmediate;\n        } else {\n            return function (callback) {\n                setTimeout(callback, 0);\n            };\n        }\n    })();\n\n    function throwsException(error, message) {\n        if (typeof error == \"string\") {\n            this.exception = new Error(message || \"\");\n            this.exception.name = error;\n        } else if (!error) {\n            this.exception = new Error(\"Error\");\n        } else {\n            this.exception = error;\n        }\n\n        return this;\n    }\n\n    function getCallback(behavior, args) {\n        var callArgAt = behavior.callArgAt;\n\n        if (callArgAt < 0) {\n            var callArgProp = behavior.callArgProp;\n\n            for (var i = 0, l = args.length; i < l; ++i) {\n                if (!callArgProp && typeof args[i] == \"function\") {\n                    return args[i];\n                }\n\n                if (callArgProp && args[i] &&\n                    typeof args[i][callArgProp] == \"function\") {\n                    return args[i][callArgProp];\n                }\n            }\n\n            return null;\n        }\n\n        return args[callArgAt];\n    }\n\n    function makeApi(sinon) {\n        function getCallbackError(behavior, func, args) {\n            if (behavior.callArgAt < 0) {\n                var msg;\n\n                if (behavior.callArgProp) {\n                    msg = sinon.functionName(behavior.stub) +\n                        \" expected to yield to '\" + behavior.callArgProp +\n                        \"', but no object with such a property was passed.\";\n                } else {\n                    msg = sinon.functionName(behavior.stub) +\n                        \" expected to yield, but no callback was passed.\";\n                }\n\n                if (args.length > 0) {\n                    msg += \" Received [\" + join.call(args, \", \") + \"]\";\n                }\n\n                return msg;\n            }\n\n            return \"argument at index \" + behavior.callArgAt + \" is not a function: \" + func;\n        }\n\n        function callCallback(behavior, args) {\n            if (typeof behavior.callArgAt == \"number\") {\n                var func = getCallback(behavior, args);\n\n                if (typeof func != \"function\") {\n                    throw new TypeError(getCallbackError(behavior, func, args));\n                }\n\n                if (behavior.callbackAsync) {\n                    nextTick(function () {\n                        func.apply(behavior.callbackContext, behavior.callbackArguments);\n                    });\n                } else {\n                    func.apply(behavior.callbackContext, behavior.callbackArguments);\n                }\n            }\n        }\n\n        var proto = {\n            create: function create(stub) {\n                var behavior = sinon.extend({}, sinon.behavior);\n                delete behavior.create;\n                behavior.stub = stub;\n\n                return behavior;\n            },\n\n            isPresent: function isPresent() {\n                return (typeof this.callArgAt == \"number\" ||\n                        this.exception ||\n                        typeof this.returnArgAt == \"number\" ||\n                        this.returnThis ||\n                        this.returnValueDefined);\n            },\n\n            invoke: function invoke(context, args) {\n                callCallback(this, args);\n\n                if (this.exception) {\n                    throw this.exception;\n                } else if (typeof this.returnArgAt == \"number\") {\n                    return args[this.returnArgAt];\n                } else if (this.returnThis) {\n                    return context;\n                }\n\n                return this.returnValue;\n            },\n\n            onCall: function onCall(index) {\n                return this.stub.onCall(index);\n            },\n\n            onFirstCall: function onFirstCall() {\n                return this.stub.onFirstCall();\n            },\n\n            onSecondCall: function onSecondCall() {\n                return this.stub.onSecondCall();\n            },\n\n            onThirdCall: function onThirdCall() {\n                return this.stub.onThirdCall();\n            },\n\n            withArgs: function withArgs(/* arguments */) {\n                throw new Error(\"Defining a stub by invoking \\\"stub.onCall(...).withArgs(...)\\\" is not supported. \" +\n                                \"Use \\\"stub.withArgs(...).onCall(...)\\\" to define sequential behavior for calls with certain arguments.\");\n            },\n\n            callsArg: function callsArg(pos) {\n                if (typeof pos != \"number\") {\n                    throw new TypeError(\"argument index is not number\");\n                }\n\n                this.callArgAt = pos;\n                this.callbackArguments = [];\n                this.callbackContext = undefined;\n                this.callArgProp = undefined;\n                this.callbackAsync = false;\n\n                return this;\n            },\n\n            callsArgOn: function callsArgOn(pos, context) {\n                if (typeof pos != \"number\") {\n                    throw new TypeError(\"argument index is not number\");\n                }\n                if (typeof context != \"object\") {\n                    throw new TypeError(\"argument context is not an object\");\n                }\n\n                this.callArgAt = pos;\n                this.callbackArguments = [];\n                this.callbackContext = context;\n                this.callArgProp = undefined;\n                this.callbackAsync = false;\n\n                return this;\n            },\n\n            callsArgWith: function callsArgWith(pos) {\n                if (typeof pos != \"number\") {\n                    throw new TypeError(\"argument index is not number\");\n                }\n\n                this.callArgAt = pos;\n                this.callbackArguments = slice.call(arguments, 1);\n                this.callbackContext = undefined;\n                this.callArgProp = undefined;\n                this.callbackAsync = false;\n\n                return this;\n            },\n\n            callsArgOnWith: function callsArgWith(pos, context) {\n                if (typeof pos != \"number\") {\n                    throw new TypeError(\"argument index is not number\");\n                }\n                if (typeof context != \"object\") {\n                    throw new TypeError(\"argument context is not an object\");\n                }\n\n                this.callArgAt = pos;\n                this.callbackArguments = slice.call(arguments, 2);\n                this.callbackContext = context;\n                this.callArgProp = undefined;\n                this.callbackAsync = false;\n\n                return this;\n            },\n\n            yields: function () {\n                this.callArgAt = -1;\n                this.callbackArguments = slice.call(arguments, 0);\n                this.callbackContext = undefined;\n                this.callArgProp = undefined;\n                this.callbackAsync = false;\n\n                return this;\n            },\n\n            yieldsOn: function (context) {\n                if (typeof context != \"object\") {\n                    throw new TypeError(\"argument context is not an object\");\n                }\n\n                this.callArgAt = -1;\n                this.callbackArguments = slice.call(arguments, 1);\n                this.callbackContext = context;\n                this.callArgProp = undefined;\n                this.callbackAsync = false;\n\n                return this;\n            },\n\n            yieldsTo: function (prop) {\n                this.callArgAt = -1;\n                this.callbackArguments = slice.call(arguments, 1);\n                this.callbackContext = undefined;\n                this.callArgProp = prop;\n                this.callbackAsync = false;\n\n                return this;\n            },\n\n            yieldsToOn: function (prop, context) {\n                if (typeof context != \"object\") {\n                    throw new TypeError(\"argument context is not an object\");\n                }\n\n                this.callArgAt = -1;\n                this.callbackArguments = slice.call(arguments, 2);\n                this.callbackContext = context;\n                this.callArgProp = prop;\n                this.callbackAsync = false;\n\n                return this;\n            },\n\n            throws: throwsException,\n            throwsException: throwsException,\n\n            returns: function returns(value) {\n                this.returnValue = value;\n                this.returnValueDefined = true;\n\n                return this;\n            },\n\n            returnsArg: function returnsArg(pos) {\n                if (typeof pos != \"number\") {\n                    throw new TypeError(\"argument index is not number\");\n                }\n\n                this.returnArgAt = pos;\n\n                return this;\n            },\n\n            returnsThis: function returnsThis() {\n                this.returnThis = true;\n\n                return this;\n            }\n        };\n\n        // create asynchronous versions of callsArg* and yields* methods\n        for (var method in proto) {\n            // need to avoid creating anotherasync versions of the newly added async methods\n            if (proto.hasOwnProperty(method) &&\n                method.match(/^(callsArg|yields)/) &&\n                !method.match(/Async/)) {\n                proto[method + \"Async\"] = (function (syncFnName) {\n                    return function () {\n                        var result = this[syncFnName].apply(this, arguments);\n                        this.callbackAsync = true;\n                        return result;\n                    };\n                })(method);\n            }\n        }\n\n        sinon.behavior = proto;\n        return proto;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        module.exports = makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend util/core.js\n * @depend extend.js\n * @depend spy.js\n * @depend behavior.js\n */\n/**\n * Stub functions\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n    function makeApi(sinon) {\n        function stub(object, property, func) {\n            if (!!func && typeof func != \"function\") {\n                throw new TypeError(\"Custom stub should be function\");\n            }\n\n            var wrapper;\n\n            if (func) {\n                wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;\n            } else {\n                wrapper = stub.create();\n            }\n\n            if (!object && typeof property === \"undefined\") {\n                return sinon.stub.create();\n            }\n\n            if (typeof property === \"undefined\" && typeof object == \"object\") {\n                for (var prop in object) {\n                    if (typeof object[prop] === \"function\") {\n                        stub(object, prop);\n                    }\n                }\n\n                return object;\n            }\n\n            return sinon.wrapMethod(object, property, wrapper);\n        }\n\n        function getDefaultBehavior(stub) {\n            return stub.defaultBehavior || getParentBehaviour(stub) || sinon.behavior.create(stub);\n        }\n\n        function getParentBehaviour(stub) {\n            return (stub.parent && getCurrentBehavior(stub.parent));\n        }\n\n        function getCurrentBehavior(stub) {\n            var behavior = stub.behaviors[stub.callCount - 1];\n            return behavior && behavior.isPresent() ? behavior : getDefaultBehavior(stub);\n        }\n\n        var uuid = 0;\n\n        var proto = {\n            create: function create() {\n                var functionStub = function () {\n                    return getCurrentBehavior(functionStub).invoke(this, arguments);\n                };\n\n                functionStub.id = \"stub#\" + uuid++;\n                var orig = functionStub;\n                functionStub = sinon.spy.create(functionStub);\n                functionStub.func = orig;\n\n                sinon.extend(functionStub, stub);\n                functionStub.instantiateFake = sinon.stub.create;\n                functionStub.displayName = \"stub\";\n                functionStub.toString = sinon.functionToString;\n\n                functionStub.defaultBehavior = null;\n                functionStub.behaviors = [];\n\n                return functionStub;\n            },\n\n            resetBehavior: function () {\n                var i;\n\n                this.defaultBehavior = null;\n                this.behaviors = [];\n\n                delete this.returnValue;\n                delete this.returnArgAt;\n                this.returnThis = false;\n\n                if (this.fakes) {\n                    for (i = 0; i < this.fakes.length; i++) {\n                        this.fakes[i].resetBehavior();\n                    }\n                }\n            },\n\n            onCall: function onCall(index) {\n                if (!this.behaviors[index]) {\n                    this.behaviors[index] = sinon.behavior.create(this);\n                }\n\n                return this.behaviors[index];\n            },\n\n            onFirstCall: function onFirstCall() {\n                return this.onCall(0);\n            },\n\n            onSecondCall: function onSecondCall() {\n                return this.onCall(1);\n            },\n\n            onThirdCall: function onThirdCall() {\n                return this.onCall(2);\n            }\n        };\n\n        for (var method in sinon.behavior) {\n            if (sinon.behavior.hasOwnProperty(method) &&\n                !proto.hasOwnProperty(method) &&\n                method != \"create\" &&\n                method != \"withArgs\" &&\n                method != \"invoke\") {\n                proto[method] = (function (behaviorMethod) {\n                    return function () {\n                        this.defaultBehavior = this.defaultBehavior || sinon.behavior.create(this);\n                        this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);\n                        return this;\n                    };\n                }(method));\n            }\n        }\n\n        sinon.extend(stub, proto);\n        sinon.stub = stub;\n\n        return stub;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        require(\"./behavior\");\n        require(\"./spy\");\n        module.exports = makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend times_in_words.js\n * @depend util/core.js\n * @depend extend.js\n * @depend stub.js\n * @depend format.js\n */\n/**\n * Mock functions.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n    function makeApi(sinon) {\n        var push = [].push;\n        var match = sinon.match;\n\n        function mock(object) {\n            if (!object) {\n                return sinon.expectation.create(\"Anonymous mock\");\n            }\n\n            return mock.create(object);\n        }\n\n        function each(collection, callback) {\n            if (!collection) {\n                return;\n            }\n\n            for (var i = 0, l = collection.length; i < l; i += 1) {\n                callback(collection[i]);\n            }\n        }\n\n        sinon.extend(mock, {\n            create: function create(object) {\n                if (!object) {\n                    throw new TypeError(\"object is null\");\n                }\n\n                var mockObject = sinon.extend({}, mock);\n                mockObject.object = object;\n                delete mockObject.create;\n\n                return mockObject;\n            },\n\n            expects: function expects(method) {\n                if (!method) {\n                    throw new TypeError(\"method is falsy\");\n                }\n\n                if (!this.expectations) {\n                    this.expectations = {};\n                    this.proxies = [];\n                }\n\n                if (!this.expectations[method]) {\n                    this.expectations[method] = [];\n                    var mockObject = this;\n\n                    sinon.wrapMethod(this.object, method, function () {\n                        return mockObject.invokeMethod(method, this, arguments);\n                    });\n\n                    push.call(this.proxies, method);\n                }\n\n                var expectation = sinon.expectation.create(method);\n                push.call(this.expectations[method], expectation);\n\n                return expectation;\n            },\n\n            restore: function restore() {\n                var object = this.object;\n\n                each(this.proxies, function (proxy) {\n                    if (typeof object[proxy].restore == \"function\") {\n                        object[proxy].restore();\n                    }\n                });\n            },\n\n            verify: function verify() {\n                var expectations = this.expectations || {};\n                var messages = [], met = [];\n\n                each(this.proxies, function (proxy) {\n                    each(expectations[proxy], function (expectation) {\n                        if (!expectation.met()) {\n                            push.call(messages, expectation.toString());\n                        } else {\n                            push.call(met, expectation.toString());\n                        }\n                    });\n                });\n\n                this.restore();\n\n                if (messages.length > 0) {\n                    sinon.expectation.fail(messages.concat(met).join(\"\\n\"));\n                } else if (met.length > 0) {\n                    sinon.expectation.pass(messages.concat(met).join(\"\\n\"));\n                }\n\n                return true;\n            },\n\n            invokeMethod: function invokeMethod(method, thisValue, args) {\n                var expectations = this.expectations && this.expectations[method];\n                var length = expectations && expectations.length || 0, i;\n\n                for (i = 0; i < length; i += 1) {\n                    if (!expectations[i].met() &&\n                        expectations[i].allowsCall(thisValue, args)) {\n                        return expectations[i].apply(thisValue, args);\n                    }\n                }\n\n                var messages = [], available, exhausted = 0;\n\n                for (i = 0; i < length; i += 1) {\n                    if (expectations[i].allowsCall(thisValue, args)) {\n                        available = available || expectations[i];\n                    } else {\n                        exhausted += 1;\n                    }\n                    push.call(messages, \"    \" + expectations[i].toString());\n                }\n\n                if (exhausted === 0) {\n                    return available.apply(thisValue, args);\n                }\n\n                messages.unshift(\"Unexpected call: \" + sinon.spyCall.toString.call({\n                    proxy: method,\n                    args: args\n                }));\n\n                sinon.expectation.fail(messages.join(\"\\n\"));\n            }\n        });\n\n        var times = sinon.timesInWords;\n        var slice = Array.prototype.slice;\n\n        function callCountInWords(callCount) {\n            if (callCount == 0) {\n                return \"never called\";\n            } else {\n                return \"called \" + times(callCount);\n            }\n        }\n\n        function expectedCallCountInWords(expectation) {\n            var min = expectation.minCalls;\n            var max = expectation.maxCalls;\n\n            if (typeof min == \"number\" && typeof max == \"number\") {\n                var str = times(min);\n\n                if (min != max) {\n                    str = \"at least \" + str + \" and at most \" + times(max);\n                }\n\n                return str;\n            }\n\n            if (typeof min == \"number\") {\n                return \"at least \" + times(min);\n            }\n\n            return \"at most \" + times(max);\n        }\n\n        function receivedMinCalls(expectation) {\n            var hasMinLimit = typeof expectation.minCalls == \"number\";\n            return !hasMinLimit || expectation.callCount >= expectation.minCalls;\n        }\n\n        function receivedMaxCalls(expectation) {\n            if (typeof expectation.maxCalls != \"number\") {\n                return false;\n            }\n\n            return expectation.callCount == expectation.maxCalls;\n        }\n\n        function verifyMatcher(possibleMatcher, arg) {\n            if (match && match.isMatcher(possibleMatcher)) {\n                return possibleMatcher.test(arg);\n            } else {\n                return true;\n            }\n        }\n\n        sinon.expectation = {\n            minCalls: 1,\n            maxCalls: 1,\n\n            create: function create(methodName) {\n                var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);\n                delete expectation.create;\n                expectation.method = methodName;\n\n                return expectation;\n            },\n\n            invoke: function invoke(func, thisValue, args) {\n                this.verifyCallAllowed(thisValue, args);\n\n                return sinon.spy.invoke.apply(this, arguments);\n            },\n\n            atLeast: function atLeast(num) {\n                if (typeof num != \"number\") {\n                    throw new TypeError(\"'\" + num + \"' is not number\");\n                }\n\n                if (!this.limitsSet) {\n                    this.maxCalls = null;\n                    this.limitsSet = true;\n                }\n\n                this.minCalls = num;\n\n                return this;\n            },\n\n            atMost: function atMost(num) {\n                if (typeof num != \"number\") {\n                    throw new TypeError(\"'\" + num + \"' is not number\");\n                }\n\n                if (!this.limitsSet) {\n                    this.minCalls = null;\n                    this.limitsSet = true;\n                }\n\n                this.maxCalls = num;\n\n                return this;\n            },\n\n            never: function never() {\n                return this.exactly(0);\n            },\n\n            once: function once() {\n                return this.exactly(1);\n            },\n\n            twice: function twice() {\n                return this.exactly(2);\n            },\n\n            thrice: function thrice() {\n                return this.exactly(3);\n            },\n\n            exactly: function exactly(num) {\n                if (typeof num != \"number\") {\n                    throw new TypeError(\"'\" + num + \"' is not a number\");\n                }\n\n                this.atLeast(num);\n                return this.atMost(num);\n            },\n\n            met: function met() {\n                return !this.failed && receivedMinCalls(this);\n            },\n\n            verifyCallAllowed: function verifyCallAllowed(thisValue, args) {\n                if (receivedMaxCalls(this)) {\n                    this.failed = true;\n                    sinon.expectation.fail(this.method + \" already called \" + times(this.maxCalls));\n                }\n\n                if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n                    sinon.expectation.fail(this.method + \" called with \" + thisValue + \" as thisValue, expected \" +\n                        this.expectedThis);\n                }\n\n                if (!(\"expectedArguments\" in this)) {\n                    return;\n                }\n\n                if (!args) {\n                    sinon.expectation.fail(this.method + \" received no arguments, expected \" +\n                        sinon.format(this.expectedArguments));\n                }\n\n                if (args.length < this.expectedArguments.length) {\n                    sinon.expectation.fail(this.method + \" received too few arguments (\" + sinon.format(args) +\n                        \"), expected \" + sinon.format(this.expectedArguments));\n                }\n\n                if (this.expectsExactArgCount &&\n                    args.length != this.expectedArguments.length) {\n                    sinon.expectation.fail(this.method + \" received too many arguments (\" + sinon.format(args) +\n                        \"), expected \" + sinon.format(this.expectedArguments));\n                }\n\n                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n\n                    if (!verifyMatcher(this.expectedArguments[i], args[i])) {\n                        sinon.expectation.fail(this.method + \" received wrong arguments \" + sinon.format(args) +\n                            \", didn't match \" + this.expectedArguments.toString());\n                    }\n\n                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n                        sinon.expectation.fail(this.method + \" received wrong arguments \" + sinon.format(args) +\n                            \", expected \" + sinon.format(this.expectedArguments));\n                    }\n                }\n            },\n\n            allowsCall: function allowsCall(thisValue, args) {\n                if (this.met() && receivedMaxCalls(this)) {\n                    return false;\n                }\n\n                if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n                    return false;\n                }\n\n                if (!(\"expectedArguments\" in this)) {\n                    return true;\n                }\n\n                args = args || [];\n\n                if (args.length < this.expectedArguments.length) {\n                    return false;\n                }\n\n                if (this.expectsExactArgCount &&\n                    args.length != this.expectedArguments.length) {\n                    return false;\n                }\n\n                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n                    if (!verifyMatcher(this.expectedArguments[i], args[i])) {\n                        return false;\n                    }\n\n                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n                        return false;\n                    }\n                }\n\n                return true;\n            },\n\n            withArgs: function withArgs() {\n                this.expectedArguments = slice.call(arguments);\n                return this;\n            },\n\n            withExactArgs: function withExactArgs() {\n                this.withArgs.apply(this, arguments);\n                this.expectsExactArgCount = true;\n                return this;\n            },\n\n            on: function on(thisValue) {\n                this.expectedThis = thisValue;\n                return this;\n            },\n\n            toString: function () {\n                var args = (this.expectedArguments || []).slice();\n\n                if (!this.expectsExactArgCount) {\n                    push.call(args, \"[...]\");\n                }\n\n                var callStr = sinon.spyCall.toString.call({\n                    proxy: this.method || \"anonymous mock expectation\",\n                    args: args\n                });\n\n                var message = callStr.replace(\", [...\", \"[, ...\") + \" \" +\n                    expectedCallCountInWords(this);\n\n                if (this.met()) {\n                    return \"Expectation met: \" + message;\n                }\n\n                return \"Expected \" + message + \" (\" +\n                    callCountInWords(this.callCount) + \")\";\n            },\n\n            verify: function verify() {\n                if (!this.met()) {\n                    sinon.expectation.fail(this.toString());\n                } else {\n                    sinon.expectation.pass(this.toString());\n                }\n\n                return true;\n            },\n\n            pass: function pass(message) {\n                sinon.assert.pass(message);\n            },\n\n            fail: function fail(message) {\n                var exception = new Error(message);\n                exception.name = \"ExpectationError\";\n\n                throw exception;\n            }\n        };\n\n        sinon.mock = mock;\n        return mock;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        require(\"./call\");\n        require(\"./match\");\n        require(\"./spy\");\n        module.exports = makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend util/core.js\n * @depend stub.js\n * @depend mock.js\n */\n/**\n * Collections of stubs, spies and mocks.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n    var push = [].push;\n    var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n    function getFakes(fakeCollection) {\n        if (!fakeCollection.fakes) {\n            fakeCollection.fakes = [];\n        }\n\n        return fakeCollection.fakes;\n    }\n\n    function each(fakeCollection, method) {\n        var fakes = getFakes(fakeCollection);\n\n        for (var i = 0, l = fakes.length; i < l; i += 1) {\n            if (typeof fakes[i][method] == \"function\") {\n                fakes[i][method]();\n            }\n        }\n    }\n\n    function compact(fakeCollection) {\n        var fakes = getFakes(fakeCollection);\n        var i = 0;\n        while (i < fakes.length) {\n            fakes.splice(i, 1);\n        }\n    }\n\n    function makeApi(sinon) {\n        var collection = {\n            verify: function resolve() {\n                each(this, \"verify\");\n            },\n\n            restore: function restore() {\n                each(this, \"restore\");\n                compact(this);\n            },\n\n            reset: function restore() {\n                each(this, \"reset\");\n            },\n\n            verifyAndRestore: function verifyAndRestore() {\n                var exception;\n\n                try {\n                    this.verify();\n                } catch (e) {\n                    exception = e;\n                }\n\n                this.restore();\n\n                if (exception) {\n                    throw exception;\n                }\n            },\n\n            add: function add(fake) {\n                push.call(getFakes(this), fake);\n                return fake;\n            },\n\n            spy: function spy() {\n                return this.add(sinon.spy.apply(sinon, arguments));\n            },\n\n            stub: function stub(object, property, value) {\n                if (property) {\n                    var original = object[property];\n\n                    if (typeof original != \"function\") {\n                        if (!hasOwnProperty.call(object, property)) {\n                            throw new TypeError(\"Cannot stub non-existent own property \" + property);\n                        }\n\n                        object[property] = value;\n\n                        return this.add({\n                            restore: function () {\n                                object[property] = original;\n                            }\n                        });\n                    }\n                }\n                if (!property && !!object && typeof object == \"object\") {\n                    var stubbedObj = sinon.stub.apply(sinon, arguments);\n\n                    for (var prop in stubbedObj) {\n                        if (typeof stubbedObj[prop] === \"function\") {\n                            this.add(stubbedObj[prop]);\n                        }\n                    }\n\n                    return stubbedObj;\n                }\n\n                return this.add(sinon.stub.apply(sinon, arguments));\n            },\n\n            mock: function mock() {\n                return this.add(sinon.mock.apply(sinon, arguments));\n            },\n\n            inject: function inject(obj) {\n                var col = this;\n\n                obj.spy = function () {\n                    return col.spy.apply(col, arguments);\n                };\n\n                obj.stub = function () {\n                    return col.stub.apply(col, arguments);\n                };\n\n                obj.mock = function () {\n                    return col.mock.apply(col, arguments);\n                };\n\n                return obj;\n            }\n        };\n\n        sinon.collection = collection;\n        return collection;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        require(\"./mock\");\n        require(\"./spy\");\n        require(\"./stub\");\n        module.exports = makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/*global lolex */\n\n/**\n * Fake timer API\n * setTimeout\n * setInterval\n * clearTimeout\n * clearInterval\n * tick\n * reset\n * Date\n *\n * Inspired by jsUnitMockTimeOut from JsUnit\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n    var sinon = {};\n}\n\n(function (global) {\n    function makeApi(sinon, lol) {\n        var llx = typeof lolex !== \"undefined\" ? lolex : lol;\n\n        sinon.useFakeTimers = function () {\n            var now, methods = Array.prototype.slice.call(arguments);\n\n            if (typeof methods[0] === \"string\") {\n                now = 0;\n            } else {\n                now = methods.shift();\n            }\n\n            var clock = llx.install(now || 0, methods);\n            clock.restore = clock.uninstall;\n            return clock;\n        };\n\n        sinon.clock = {\n            create: function (now) {\n                return llx.createClock(now);\n            }\n        };\n\n        sinon.timers = {\n            setTimeout: setTimeout,\n            clearTimeout: clearTimeout,\n            setImmediate: (typeof setImmediate !== \"undefined\" ? setImmediate : undefined),\n            clearImmediate: (typeof clearImmediate !== \"undefined\" ? clearImmediate : undefined),\n            setInterval: setInterval,\n            clearInterval: clearInterval,\n            Date: Date\n        };\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, epxorts, module) {\n        var sinon = require(\"./core\");\n        makeApi(sinon, require(\"lolex\"));\n        module.exports = sinon;\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else {\n        makeApi(sinon);\n    }\n}(typeof global != \"undefined\" && typeof global !== \"function\" ? global : this));\n\n/**\n * Minimal Event interface implementation\n *\n * Original implementation by Sven Fuchs: https://gist.github.com/995028\n * Modifications and tests by Christian Johansen.\n *\n * @author Sven Fuchs (svenfuchs@artweb-design.de)\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2011 Sven Fuchs, Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n    this.sinon = {};\n}\n\n(function () {\n    var push = [].push;\n\n    function makeApi(sinon) {\n        sinon.Event = function Event(type, bubbles, cancelable, target) {\n            this.initEvent(type, bubbles, cancelable, target);\n        };\n\n        sinon.Event.prototype = {\n            initEvent: function (type, bubbles, cancelable, target) {\n                this.type = type;\n                this.bubbles = bubbles;\n                this.cancelable = cancelable;\n                this.target = target;\n            },\n\n            stopPropagation: function () {},\n\n            preventDefault: function () {\n                this.defaultPrevented = true;\n            }\n        };\n\n        sinon.ProgressEvent = function ProgressEvent(type, progressEventRaw, target) {\n            this.initEvent(type, false, false, target);\n            this.loaded = progressEventRaw.loaded || null;\n            this.total = progressEventRaw.total || null;\n        };\n\n        sinon.ProgressEvent.prototype = new sinon.Event();\n\n        sinon.ProgressEvent.prototype.constructor =  sinon.ProgressEvent;\n\n        sinon.CustomEvent = function CustomEvent(type, customData, target) {\n            this.initEvent(type, false, false, target);\n            this.detail = customData.detail || null;\n        };\n\n        sinon.CustomEvent.prototype = new sinon.Event();\n\n        sinon.CustomEvent.prototype.constructor =  sinon.CustomEvent;\n\n        sinon.EventTarget = {\n            addEventListener: function addEventListener(event, listener) {\n                this.eventListeners = this.eventListeners || {};\n                this.eventListeners[event] = this.eventListeners[event] || [];\n                push.call(this.eventListeners[event], listener);\n            },\n\n            removeEventListener: function removeEventListener(event, listener) {\n                var listeners = this.eventListeners && this.eventListeners[event] || [];\n\n                for (var i = 0, l = listeners.length; i < l; ++i) {\n                    if (listeners[i] == listener) {\n                        return listeners.splice(i, 1);\n                    }\n                }\n            },\n\n            dispatchEvent: function dispatchEvent(event) {\n                var type = event.type;\n                var listeners = this.eventListeners && this.eventListeners[type] || [];\n\n                for (var i = 0; i < listeners.length; i++) {\n                    if (typeof listeners[i] == \"function\") {\n                        listeners[i].call(this, event);\n                    } else {\n                        listeners[i].handleEvent(event);\n                    }\n                }\n\n                return !!event.defaultPrevented;\n            }\n        };\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require) {\n        var sinon = require(\"./core\");\n        makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require);\n    } else {\n        makeApi(sinon);\n    }\n}());\n\n/**\n * @depend ../sinon.js\n */\n/**\n * Logs errors\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2014 Christian Johansen\n */\n\n(function (sinon) {\n    // cache a reference to setTimeout, so that our reference won't be stubbed out\n    // when using fake timers and errors will still get logged\n    // https://github.com/cjohansen/Sinon.JS/issues/381\n    var realSetTimeout = setTimeout;\n\n    function makeApi(sinon) {\n\n        function log() {}\n\n        function logError(label, err) {\n            var msg = label + \" threw exception: \";\n\n            sinon.log(msg + \"[\" + err.name + \"] \" + err.message);\n\n            if (err.stack) {\n                sinon.log(err.stack);\n            }\n\n            logError.setTimeout(function () {\n                err.message = msg + err.message;\n                throw err;\n            }, 0);\n        };\n\n        // wrap realSetTimeout with something we can stub in tests\n        logError.setTimeout = function (func, timeout) {\n            realSetTimeout(func, timeout);\n        }\n\n        var exports = {};\n        exports.log = sinon.log = log;\n        exports.logError = sinon.logError = logError;\n\n        return exports;\n    }\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        module.exports = makeApi(sinon);\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend core.js\n * @depend ../extend.js\n * @depend event.js\n * @depend ../log_error.js\n */\n/**\n * Fake XMLHttpRequest object\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (global) {\n\n    var supportsProgress = typeof ProgressEvent !== \"undefined\";\n    var supportsCustomEvent = typeof CustomEvent !== \"undefined\";\n    var sinonXhr = { XMLHttpRequest: global.XMLHttpRequest };\n    sinonXhr.GlobalXMLHttpRequest = global.XMLHttpRequest;\n    sinonXhr.GlobalActiveXObject = global.ActiveXObject;\n    sinonXhr.supportsActiveX = typeof sinonXhr.GlobalActiveXObject != \"undefined\";\n    sinonXhr.supportsXHR = typeof sinonXhr.GlobalXMLHttpRequest != \"undefined\";\n    sinonXhr.workingXHR = sinonXhr.supportsXHR ? sinonXhr.GlobalXMLHttpRequest : sinonXhr.supportsActiveX\n                                     ? function () { return new sinonXhr.GlobalActiveXObject(\"MSXML2.XMLHTTP.3.0\") } : false;\n    sinonXhr.supportsCORS = sinonXhr.supportsXHR && \"withCredentials\" in (new sinonXhr.GlobalXMLHttpRequest());\n\n    /*jsl:ignore*/\n    var unsafeHeaders = {\n        \"Accept-Charset\": true,\n        \"Accept-Encoding\": true,\n        Connection: true,\n        \"Content-Length\": true,\n        Cookie: true,\n        Cookie2: true,\n        \"Content-Transfer-Encoding\": true,\n        Date: true,\n        Expect: true,\n        Host: true,\n        \"Keep-Alive\": true,\n        Referer: true,\n        TE: true,\n        Trailer: true,\n        \"Transfer-Encoding\": true,\n        Upgrade: true,\n        \"User-Agent\": true,\n        Via: true\n    };\n    /*jsl:end*/\n\n    function FakeXMLHttpRequest() {\n        this.readyState = FakeXMLHttpRequest.UNSENT;\n        this.requestHeaders = {};\n        this.requestBody = null;\n        this.status = 0;\n        this.statusText = \"\";\n        this.upload = new UploadProgress();\n        if (sinonXhr.supportsCORS) {\n            this.withCredentials = false;\n        }\n\n        var xhr = this;\n        var events = [\"loadstart\", \"load\", \"abort\", \"loadend\"];\n\n        function addEventListener(eventName) {\n            xhr.addEventListener(eventName, function (event) {\n                var listener = xhr[\"on\" + eventName];\n\n                if (listener && typeof listener == \"function\") {\n                    listener.call(this, event);\n                }\n            });\n        }\n\n        for (var i = events.length - 1; i >= 0; i--) {\n            addEventListener(events[i]);\n        }\n\n        if (typeof FakeXMLHttpRequest.onCreate == \"function\") {\n            FakeXMLHttpRequest.onCreate(this);\n        }\n    }\n\n    // An upload object is created for each\n    // FakeXMLHttpRequest and allows upload\n    // events to be simulated using uploadProgress\n    // and uploadError.\n    function UploadProgress() {\n        this.eventListeners = {\n            progress: [],\n            load: [],\n            abort: [],\n            error: []\n        }\n    }\n\n    UploadProgress.prototype.addEventListener = function addEventListener(event, listener) {\n        this.eventListeners[event].push(listener);\n    };\n\n    UploadProgress.prototype.removeEventListener = function removeEventListener(event, listener) {\n        var listeners = this.eventListeners[event] || [];\n\n        for (var i = 0, l = listeners.length; i < l; ++i) {\n            if (listeners[i] == listener) {\n                return listeners.splice(i, 1);\n            }\n        }\n    };\n\n    UploadProgress.prototype.dispatchEvent = function dispatchEvent(event) {\n        var listeners = this.eventListeners[event.type] || [];\n\n        for (var i = 0, listener; (listener = listeners[i]) != null; i++) {\n            listener(event);\n        }\n    };\n\n    function verifyState(xhr) {\n        if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n            throw new Error(\"INVALID_STATE_ERR\");\n        }\n\n        if (xhr.sendFlag) {\n            throw new Error(\"INVALID_STATE_ERR\");\n        }\n    }\n\n    function getHeader(headers, header) {\n        header = header.toLowerCase();\n\n        for (var h in headers) {\n            if (h.toLowerCase() == header) {\n                return h;\n            }\n        }\n\n        return null;\n    }\n\n    // filtering to enable a white-list version of Sinon FakeXhr,\n    // where whitelisted requests are passed through to real XHR\n    function each(collection, callback) {\n        if (!collection) {\n            return;\n        }\n\n        for (var i = 0, l = collection.length; i < l; i += 1) {\n            callback(collection[i]);\n        }\n    }\n    function some(collection, callback) {\n        for (var index = 0; index < collection.length; index++) {\n            if (callback(collection[index]) === true) {\n                return true;\n            }\n        }\n        return false;\n    }\n    // largest arity in XHR is 5 - XHR#open\n    var apply = function (obj, method, args) {\n        switch (args.length) {\n        case 0: return obj[method]();\n        case 1: return obj[method](args[0]);\n        case 2: return obj[method](args[0], args[1]);\n        case 3: return obj[method](args[0], args[1], args[2]);\n        case 4: return obj[method](args[0], args[1], args[2], args[3]);\n        case 5: return obj[method](args[0], args[1], args[2], args[3], args[4]);\n        }\n    };\n\n    FakeXMLHttpRequest.filters = [];\n    FakeXMLHttpRequest.addFilter = function addFilter(fn) {\n        this.filters.push(fn)\n    };\n    var IE6Re = /MSIE 6/;\n    FakeXMLHttpRequest.defake = function defake(fakeXhr, xhrArgs) {\n        var xhr = new sinonXhr.workingXHR();\n        each([\n            \"open\",\n            \"setRequestHeader\",\n            \"send\",\n            \"abort\",\n            \"getResponseHeader\",\n            \"getAllResponseHeaders\",\n            \"addEventListener\",\n            \"overrideMimeType\",\n            \"removeEventListener\"\n        ], function (method) {\n            fakeXhr[method] = function () {\n                return apply(xhr, method, arguments);\n            };\n        });\n\n        var copyAttrs = function (args) {\n            each(args, function (attr) {\n                try {\n                    fakeXhr[attr] = xhr[attr]\n                } catch (e) {\n                    if (!IE6Re.test(navigator.userAgent)) {\n                        throw e;\n                    }\n                }\n            });\n        };\n\n        var stateChange = function stateChange() {\n            fakeXhr.readyState = xhr.readyState;\n            if (xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {\n                copyAttrs([\"status\", \"statusText\"]);\n            }\n            if (xhr.readyState >= FakeXMLHttpRequest.LOADING) {\n                copyAttrs([\"responseText\", \"response\"]);\n            }\n            if (xhr.readyState === FakeXMLHttpRequest.DONE) {\n                copyAttrs([\"responseXML\"]);\n            }\n            if (fakeXhr.onreadystatechange) {\n                fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr });\n            }\n        };\n\n        if (xhr.addEventListener) {\n            for (var event in fakeXhr.eventListeners) {\n                if (fakeXhr.eventListeners.hasOwnProperty(event)) {\n                    each(fakeXhr.eventListeners[event], function (handler) {\n                        xhr.addEventListener(event, handler);\n                    });\n                }\n            }\n            xhr.addEventListener(\"readystatechange\", stateChange);\n        } else {\n            xhr.onreadystatechange = stateChange;\n        }\n        apply(xhr, \"open\", xhrArgs);\n    };\n    FakeXMLHttpRequest.useFilters = false;\n\n    function verifyRequestOpened(xhr) {\n        if (xhr.readyState != FakeXMLHttpRequest.OPENED) {\n            throw new Error(\"INVALID_STATE_ERR - \" + xhr.readyState);\n        }\n    }\n\n    function verifyRequestSent(xhr) {\n        if (xhr.readyState == FakeXMLHttpRequest.DONE) {\n            throw new Error(\"Request done\");\n        }\n    }\n\n    function verifyHeadersReceived(xhr) {\n        if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {\n            throw new Error(\"No headers received\");\n        }\n    }\n\n    function verifyResponseBodyType(body) {\n        if (typeof body != \"string\") {\n            var error = new Error(\"Attempted to respond to fake XMLHttpRequest with \" +\n                                 body + \", which is not a string.\");\n            error.name = \"InvalidBodyException\";\n            throw error;\n        }\n    }\n\n    FakeXMLHttpRequest.parseXML = function parseXML(text) {\n        var xmlDoc;\n\n        if (typeof DOMParser != \"undefined\") {\n            var parser = new DOMParser();\n            xmlDoc = parser.parseFromString(text, \"text/xml\");\n        } else {\n            xmlDoc = new ActiveXObject(\"Microsoft.XMLDOM\");\n            xmlDoc.async = \"false\";\n            xmlDoc.loadXML(text);\n        }\n\n        return xmlDoc;\n    };\n\n    FakeXMLHttpRequest.statusCodes = {\n        100: \"Continue\",\n        101: \"Switching Protocols\",\n        200: \"OK\",\n        201: \"Created\",\n        202: \"Accepted\",\n        203: \"Non-Authoritative Information\",\n        204: \"No Content\",\n        205: \"Reset Content\",\n        206: \"Partial Content\",\n        207: \"Multi-Status\",\n        300: \"Multiple Choice\",\n        301: \"Moved Permanently\",\n        302: \"Found\",\n        303: \"See Other\",\n        304: \"Not Modified\",\n        305: \"Use Proxy\",\n        307: \"Temporary Redirect\",\n        400: \"Bad Request\",\n        401: \"Unauthorized\",\n        402: \"Payment Required\",\n        403: \"Forbidden\",\n        404: \"Not Found\",\n        405: \"Method Not Allowed\",\n        406: \"Not Acceptable\",\n        407: \"Proxy Authentication Required\",\n        408: \"Request Timeout\",\n        409: \"Conflict\",\n        410: \"Gone\",\n        411: \"Length Required\",\n        412: \"Precondition Failed\",\n        413: \"Request Entity Too Large\",\n        414: \"Request-URI Too Long\",\n        415: \"Unsupported Media Type\",\n        416: \"Requested Range Not Satisfiable\",\n        417: \"Expectation Failed\",\n        422: \"Unprocessable Entity\",\n        500: \"Internal Server Error\",\n        501: \"Not Implemented\",\n        502: \"Bad Gateway\",\n        503: \"Service Unavailable\",\n        504: \"Gateway Timeout\",\n        505: \"HTTP Version Not Supported\"\n    };\n\n    function makeApi(sinon) {\n        sinon.xhr = sinonXhr;\n\n        sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {\n            async: true,\n\n            open: function open(method, url, async, username, password) {\n                this.method = method;\n                this.url = url;\n                this.async = typeof async == \"boolean\" ? async : true;\n                this.username = username;\n                this.password = password;\n                this.responseText = null;\n                this.responseXML = null;\n                this.requestHeaders = {};\n                this.sendFlag = false;\n\n                if (FakeXMLHttpRequest.useFilters === true) {\n                    var xhrArgs = arguments;\n                    var defake = some(FakeXMLHttpRequest.filters, function (filter) {\n                        return filter.apply(this, xhrArgs)\n                    });\n                    if (defake) {\n                        return FakeXMLHttpRequest.defake(this, arguments);\n                    }\n                }\n                this.readyStateChange(FakeXMLHttpRequest.OPENED);\n            },\n\n            readyStateChange: function readyStateChange(state) {\n                this.readyState = state;\n\n                if (typeof this.onreadystatechange == \"function\") {\n                    try {\n                        this.onreadystatechange();\n                    } catch (e) {\n                        sinon.logError(\"Fake XHR onreadystatechange handler\", e);\n                    }\n                }\n\n                this.dispatchEvent(new sinon.Event(\"readystatechange\"));\n\n                switch (this.readyState) {\n                    case FakeXMLHttpRequest.DONE:\n                        this.dispatchEvent(new sinon.Event(\"load\", false, false, this));\n                        this.dispatchEvent(new sinon.Event(\"loadend\", false, false, this));\n                        this.upload.dispatchEvent(new sinon.Event(\"load\", false, false, this));\n                        if (supportsProgress) {\n                            this.upload.dispatchEvent(new sinon.ProgressEvent(\"progress\", {loaded: 100, total: 100}));\n                        }\n                        break;\n                }\n            },\n\n            setRequestHeader: function setRequestHeader(header, value) {\n                verifyState(this);\n\n                if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {\n                    throw new Error(\"Refused to set unsafe header \\\"\" + header + \"\\\"\");\n                }\n\n                if (this.requestHeaders[header]) {\n                    this.requestHeaders[header] += \",\" + value;\n                } else {\n                    this.requestHeaders[header] = value;\n                }\n            },\n\n            // Helps testing\n            setResponseHeaders: function setResponseHeaders(headers) {\n                verifyRequestOpened(this);\n                this.responseHeaders = {};\n\n                for (var header in headers) {\n                    if (headers.hasOwnProperty(header)) {\n                        this.responseHeaders[header] = headers[header];\n                    }\n                }\n\n                if (this.async) {\n                    this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);\n                } else {\n                    this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;\n                }\n            },\n\n            // Currently treats ALL data as a DOMString (i.e. no Document)\n            send: function send(data) {\n                verifyState(this);\n\n                if (!/^(get|head)$/i.test(this.method)) {\n                    var contentType = getHeader(this.requestHeaders, \"Content-Type\");\n                    if (this.requestHeaders[contentType]) {\n                        var value = this.requestHeaders[contentType].split(\";\");\n                        this.requestHeaders[contentType] = value[0] + \";charset=utf-8\";\n                    } else {\n                        this.requestHeaders[\"Content-Type\"] = \"text/plain;charset=utf-8\";\n                    }\n\n                    this.requestBody = data;\n                }\n\n                this.errorFlag = false;\n                this.sendFlag = this.async;\n                this.readyStateChange(FakeXMLHttpRequest.OPENED);\n\n                if (typeof this.onSend == \"function\") {\n                    this.onSend(this);\n                }\n\n                this.dispatchEvent(new sinon.Event(\"loadstart\", false, false, this));\n            },\n\n            abort: function abort() {\n                this.aborted = true;\n                this.responseText = null;\n                this.errorFlag = true;\n                this.requestHeaders = {};\n\n                if (this.readyState > FakeXMLHttpRequest.UNSENT && this.sendFlag) {\n                    this.readyStateChange(FakeXMLHttpRequest.DONE);\n                    this.sendFlag = false;\n                }\n\n                this.readyState = FakeXMLHttpRequest.UNSENT;\n\n                this.dispatchEvent(new sinon.Event(\"abort\", false, false, this));\n\n                this.upload.dispatchEvent(new sinon.Event(\"abort\", false, false, this));\n\n                if (typeof this.onerror === \"function\") {\n                    this.onerror();\n                }\n            },\n\n            getResponseHeader: function getResponseHeader(header) {\n                if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n                    return null;\n                }\n\n                if (/^Set-Cookie2?$/i.test(header)) {\n                    return null;\n                }\n\n                header = getHeader(this.responseHeaders, header);\n\n                return this.responseHeaders[header] || null;\n            },\n\n            getAllResponseHeaders: function getAllResponseHeaders() {\n                if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n                    return \"\";\n                }\n\n                var headers = \"\";\n\n                for (var header in this.responseHeaders) {\n                    if (this.responseHeaders.hasOwnProperty(header) &&\n                        !/^Set-Cookie2?$/i.test(header)) {\n                        headers += header + \": \" + this.responseHeaders[header] + \"\\r\\n\";\n                    }\n                }\n\n                return headers;\n            },\n\n            setResponseBody: function setResponseBody(body) {\n                verifyRequestSent(this);\n                verifyHeadersReceived(this);\n                verifyResponseBodyType(body);\n\n                var chunkSize = this.chunkSize || 10;\n                var index = 0;\n                this.responseText = \"\";\n\n                do {\n                    if (this.async) {\n                        this.readyStateChange(FakeXMLHttpRequest.LOADING);\n                    }\n\n                    this.responseText += body.substring(index, index + chunkSize);\n                    index += chunkSize;\n                } while (index < body.length);\n\n                var type = this.getResponseHeader(\"Content-Type\");\n\n                if (this.responseText &&\n                    (!type || /(text\\/xml)|(application\\/xml)|(\\+xml)/.test(type))) {\n                    try {\n                        this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);\n                    } catch (e) {\n                        // Unable to parse XML - no biggie\n                    }\n                }\n\n                this.readyStateChange(FakeXMLHttpRequest.DONE);\n            },\n\n            respond: function respond(status, headers, body) {\n                this.status = typeof status == \"number\" ? status : 200;\n                this.statusText = FakeXMLHttpRequest.statusCodes[this.status];\n                this.setResponseHeaders(headers || {});\n                this.setResponseBody(body || \"\");\n            },\n\n            uploadProgress: function uploadProgress(progressEventRaw) {\n                if (supportsProgress) {\n                    this.upload.dispatchEvent(new sinon.ProgressEvent(\"progress\", progressEventRaw));\n                }\n            },\n\n            uploadError: function uploadError(error) {\n                if (supportsCustomEvent) {\n                    this.upload.dispatchEvent(new sinon.CustomEvent(\"error\", {detail: error}));\n                }\n            }\n        });\n\n        sinon.extend(FakeXMLHttpRequest, {\n            UNSENT: 0,\n            OPENED: 1,\n            HEADERS_RECEIVED: 2,\n            LOADING: 3,\n            DONE: 4\n        });\n\n        sinon.useFakeXMLHttpRequest = function () {\n            FakeXMLHttpRequest.restore = function restore(keepOnCreate) {\n                if (sinonXhr.supportsXHR) {\n                    global.XMLHttpRequest = sinonXhr.GlobalXMLHttpRequest;\n                }\n\n                if (sinonXhr.supportsActiveX) {\n                    global.ActiveXObject = sinonXhr.GlobalActiveXObject;\n                }\n\n                delete FakeXMLHttpRequest.restore;\n\n                if (keepOnCreate !== true) {\n                    delete FakeXMLHttpRequest.onCreate;\n                }\n            };\n            if (sinonXhr.supportsXHR) {\n                global.XMLHttpRequest = FakeXMLHttpRequest;\n            }\n\n            if (sinonXhr.supportsActiveX) {\n                global.ActiveXObject = function ActiveXObject(objId) {\n                    if (objId == \"Microsoft.XMLHTTP\" || /^Msxml2\\.XMLHTTP/i.test(objId)) {\n\n                        return new FakeXMLHttpRequest();\n                    }\n\n                    return new sinonXhr.GlobalActiveXObject(objId);\n                };\n            }\n\n            return FakeXMLHttpRequest;\n        };\n\n        sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./core\");\n        require(\"./event\");\n        makeApi(sinon);\n        module.exports = sinon;\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (typeof sinon === \"undefined\") {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n\n})(typeof self !== \"undefined\" ? self : this);\n\n/**\n * @depend fake_xml_http_request.js\n * @depend ../format.js\n * @depend ../log_error.js\n */\n/**\n * The Sinon \"server\" mimics a web server that receives requests from\n * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,\n * both synchronously and asynchronously. To respond synchronuously, canned\n * answers have to be provided upfront.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n    var sinon = {};\n}\n\n(function () {\n    var push = [].push;\n    function F() {}\n\n    function create(proto) {\n        F.prototype = proto;\n        return new F();\n    }\n\n    function responseArray(handler) {\n        var response = handler;\n\n        if (Object.prototype.toString.call(handler) != \"[object Array]\") {\n            response = [200, {}, handler];\n        }\n\n        if (typeof response[2] != \"string\") {\n            throw new TypeError(\"Fake server response body should be string, but was \" +\n                                typeof response[2]);\n        }\n\n        return response;\n    }\n\n    var wloc = typeof window !== \"undefined\" ? window.location : {};\n    var rCurrLoc = new RegExp(\"^\" + wloc.protocol + \"//\" + wloc.host);\n\n    function matchOne(response, reqMethod, reqUrl) {\n        var rmeth = response.method;\n        var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase();\n        var url = response.url;\n        var matchUrl = !url || url == reqUrl || (typeof url.test == \"function\" && url.test(reqUrl));\n\n        return matchMethod && matchUrl;\n    }\n\n    function match(response, request) {\n        var requestUrl = request.url;\n\n        if (!/^https?:\\/\\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {\n            requestUrl = requestUrl.replace(rCurrLoc, \"\");\n        }\n\n        if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {\n            if (typeof response.response == \"function\") {\n                var ru = response.url;\n                var args = [request].concat(ru && typeof ru.exec == \"function\" ? ru.exec(requestUrl).slice(1) : []);\n                return response.response.apply(response, args);\n            }\n\n            return true;\n        }\n\n        return false;\n    }\n\n    function makeApi(sinon) {\n        sinon.fakeServer = {\n            create: function () {\n                var server = create(this);\n                this.xhr = sinon.useFakeXMLHttpRequest();\n                server.requests = [];\n\n                this.xhr.onCreate = function (xhrObj) {\n                    server.addRequest(xhrObj);\n                };\n\n                return server;\n            },\n\n            addRequest: function addRequest(xhrObj) {\n                var server = this;\n                push.call(this.requests, xhrObj);\n\n                xhrObj.onSend = function () {\n                    server.handleRequest(this);\n\n                    if (server.autoRespond && !server.responding) {\n                        setTimeout(function () {\n                            server.responding = false;\n                            server.respond();\n                        }, server.autoRespondAfter || 10);\n\n                        server.responding = true;\n                    }\n                };\n            },\n\n            getHTTPMethod: function getHTTPMethod(request) {\n                if (this.fakeHTTPMethods && /post/i.test(request.method)) {\n                    var matches = (request.requestBody || \"\").match(/_method=([^\\b;]+)/);\n                    return !!matches ? matches[1] : request.method;\n                }\n\n                return request.method;\n            },\n\n            handleRequest: function handleRequest(xhr) {\n                if (xhr.async) {\n                    if (!this.queue) {\n                        this.queue = [];\n                    }\n\n                    push.call(this.queue, xhr);\n                } else {\n                    this.processRequest(xhr);\n                }\n            },\n\n            log: function log(response, request) {\n                var str;\n\n                str =  \"Request:\\n\"  + sinon.format(request)  + \"\\n\\n\";\n                str += \"Response:\\n\" + sinon.format(response) + \"\\n\\n\";\n\n                sinon.log(str);\n            },\n\n            respondWith: function respondWith(method, url, body) {\n                if (arguments.length == 1 && typeof method != \"function\") {\n                    this.response = responseArray(method);\n                    return;\n                }\n\n                if (!this.responses) { this.responses = []; }\n\n                if (arguments.length == 1) {\n                    body = method;\n                    url = method = null;\n                }\n\n                if (arguments.length == 2) {\n                    body = url;\n                    url = method;\n                    method = null;\n                }\n\n                push.call(this.responses, {\n                    method: method,\n                    url: url,\n                    response: typeof body == \"function\" ? body : responseArray(body)\n                });\n            },\n\n            respond: function respond() {\n                if (arguments.length > 0) {\n                    this.respondWith.apply(this, arguments);\n                }\n\n                var queue = this.queue || [];\n                var requests = queue.splice(0, queue.length);\n                var request;\n\n                while (request = requests.shift()) {\n                    this.processRequest(request);\n                }\n            },\n\n            processRequest: function processRequest(request) {\n                try {\n                    if (request.aborted) {\n                        return;\n                    }\n\n                    var response = this.response || [404, {}, \"\"];\n\n                    if (this.responses) {\n                        for (var l = this.responses.length, i = l - 1; i >= 0; i--) {\n                            if (match.call(this, this.responses[i], request)) {\n                                response = this.responses[i].response;\n                                break;\n                            }\n                        }\n                    }\n\n                    if (request.readyState != 4) {\n                        this.log(response, request);\n\n                        request.respond(response[0], response[1], response[2]);\n                    }\n                } catch (e) {\n                    sinon.logError(\"Fake server request processing\", e);\n                }\n            },\n\n            restore: function restore() {\n                return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);\n            }\n        };\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./core\");\n        require(\"./fake_xml_http_request\");\n        makeApi(sinon);\n        module.exports = sinon;\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else {\n        makeApi(sinon);\n    }\n}());\n\n/**\n * @depend fake_server.js\n * @depend fake_timers.js\n */\n/**\n * Add-on for sinon.fakeServer that automatically handles a fake timer along with\n * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery\n * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,\n * it polls the object for completion with setInterval. Dispite the direct\n * motivation, there is nothing jQuery-specific in this file, so it can be used\n * in any environment where the ajax implementation depends on setInterval or\n * setTimeout.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function () {\n    function makeApi(sinon) {\n        function Server() {}\n        Server.prototype = sinon.fakeServer;\n\n        sinon.fakeServerWithClock = new Server();\n\n        sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {\n            if (xhr.async) {\n                if (typeof setTimeout.clock == \"object\") {\n                    this.clock = setTimeout.clock;\n                } else {\n                    this.clock = sinon.useFakeTimers();\n                    this.resetClock = true;\n                }\n\n                if (!this.longestTimeout) {\n                    var clockSetTimeout = this.clock.setTimeout;\n                    var clockSetInterval = this.clock.setInterval;\n                    var server = this;\n\n                    this.clock.setTimeout = function (fn, timeout) {\n                        server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n                        return clockSetTimeout.apply(this, arguments);\n                    };\n\n                    this.clock.setInterval = function (fn, timeout) {\n                        server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n                        return clockSetInterval.apply(this, arguments);\n                    };\n                }\n            }\n\n            return sinon.fakeServer.addRequest.call(this, xhr);\n        };\n\n        sinon.fakeServerWithClock.respond = function respond() {\n            var returnVal = sinon.fakeServer.respond.apply(this, arguments);\n\n            if (this.clock) {\n                this.clock.tick(this.longestTimeout || 0);\n                this.longestTimeout = 0;\n\n                if (this.resetClock) {\n                    this.clock.restore();\n                    this.resetClock = false;\n                }\n            }\n\n            return returnVal;\n        };\n\n        sinon.fakeServerWithClock.restore = function restore() {\n            if (this.clock) {\n                this.clock.restore();\n            }\n\n            return sinon.fakeServer.restore.apply(this, arguments);\n        };\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require) {\n        var sinon = require(\"./core\");\n        require(\"./fake_server\");\n        require(\"./fake_timers\");\n        makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require);\n    } else {\n        makeApi(sinon);\n    }\n}());\n\n/**\n * @depend util/core.js\n * @depend extend.js\n * @depend collection.js\n * @depend util/fake_timers.js\n * @depend util/fake_server_with_clock.js\n */\n/**\n * Manages fake collections as well as fake utilities such as Sinon's\n * timers and fake XHR implementation in one convenient object.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function () {\n    function makeApi(sinon) {\n        var push = [].push;\n\n        function exposeValue(sandbox, config, key, value) {\n            if (!value) {\n                return;\n            }\n\n            if (config.injectInto && !(key in config.injectInto)) {\n                config.injectInto[key] = value;\n                sandbox.injectedKeys.push(key);\n            } else {\n                push.call(sandbox.args, value);\n            }\n        }\n\n        function prepareSandboxFromConfig(config) {\n            var sandbox = sinon.create(sinon.sandbox);\n\n            if (config.useFakeServer) {\n                if (typeof config.useFakeServer == \"object\") {\n                    sandbox.serverPrototype = config.useFakeServer;\n                }\n\n                sandbox.useFakeServer();\n            }\n\n            if (config.useFakeTimers) {\n                if (typeof config.useFakeTimers == \"object\") {\n                    sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);\n                } else {\n                    sandbox.useFakeTimers();\n                }\n            }\n\n            return sandbox;\n        }\n\n        sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {\n            useFakeTimers: function useFakeTimers() {\n                this.clock = sinon.useFakeTimers.apply(sinon, arguments);\n\n                return this.add(this.clock);\n            },\n\n            serverPrototype: sinon.fakeServer,\n\n            useFakeServer: function useFakeServer() {\n                var proto = this.serverPrototype || sinon.fakeServer;\n\n                if (!proto || !proto.create) {\n                    return null;\n                }\n\n                this.server = proto.create();\n                return this.add(this.server);\n            },\n\n            inject: function (obj) {\n                sinon.collection.inject.call(this, obj);\n\n                if (this.clock) {\n                    obj.clock = this.clock;\n                }\n\n                if (this.server) {\n                    obj.server = this.server;\n                    obj.requests = this.server.requests;\n                }\n\n                obj.match = sinon.match;\n\n                return obj;\n            },\n\n            restore: function () {\n                sinon.collection.restore.apply(this, arguments);\n                this.restoreContext();\n            },\n\n            restoreContext: function () {\n                if (this.injectedKeys) {\n                    for (var i = 0, j = this.injectedKeys.length; i < j; i++) {\n                        delete this.injectInto[this.injectedKeys[i]];\n                    }\n                    this.injectedKeys = [];\n                }\n            },\n\n            create: function (config) {\n                if (!config) {\n                    return sinon.create(sinon.sandbox);\n                }\n\n                var sandbox = prepareSandboxFromConfig(config);\n                sandbox.args = sandbox.args || [];\n                sandbox.injectedKeys = [];\n                sandbox.injectInto = config.injectInto;\n                var prop, value, exposed = sandbox.inject({});\n\n                if (config.properties) {\n                    for (var i = 0, l = config.properties.length; i < l; i++) {\n                        prop = config.properties[i];\n                        value = exposed[prop] || prop == \"sandbox\" && sandbox;\n                        exposeValue(sandbox, config, prop, value);\n                    }\n                } else {\n                    exposeValue(sandbox, config, \"sandbox\", value);\n                }\n\n                return sandbox;\n            },\n\n            match: sinon.match\n        });\n\n        sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;\n\n        return sinon.sandbox;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        require(\"./util/fake_server\");\n        require(\"./util/fake_timers\");\n        require(\"./collection\");\n        module.exports = makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}());\n\n/**\n * @depend util/core.js\n * @depend stub.js\n * @depend mock.js\n * @depend sandbox.js\n */\n/**\n * Test function, sandboxes fakes\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n    function makeApi(sinon) {\n        function test(callback) {\n            var type = typeof callback;\n\n            if (type != \"function\") {\n                throw new TypeError(\"sinon.test needs to wrap a test function, got \" + type);\n            }\n\n            function sinonSandboxedTest() {\n                var config = sinon.getConfig(sinon.config);\n                config.injectInto = config.injectIntoThis && this || config.injectInto;\n                var sandbox = sinon.sandbox.create(config);\n                var exception, result;\n                var doneIsWrapped = false;\n                var argumentsCopy = Array.prototype.slice.call(arguments);\n                if (argumentsCopy.length > 0 && typeof argumentsCopy[arguments.length - 1] == \"function\") {\n                    var oldDone = argumentsCopy[arguments.length - 1];\n                    argumentsCopy[arguments.length - 1] = function done(result) {\n                        if (result) {\n                            sandbox.restore();\n                            throw exception;\n                        } else {\n                            sandbox.verifyAndRestore();\n                        }\n                        oldDone(result);\n                    }\n                    doneIsWrapped = true;\n                }\n\n                var args = argumentsCopy.concat(sandbox.args);\n\n                try {\n                    result = callback.apply(this, args);\n                } catch (e) {\n                    exception = e;\n                }\n\n                if (!doneIsWrapped) {\n                    if (typeof exception !== \"undefined\") {\n                        sandbox.restore();\n                        throw exception;\n                    } else {\n                        sandbox.verifyAndRestore();\n                    }\n                }\n\n                return result;\n            };\n\n            if (callback.length) {\n                return function sinonAsyncSandboxedTest(callback) {\n                    return sinonSandboxedTest.apply(this, arguments);\n                };\n            }\n\n            return sinonSandboxedTest;\n        }\n\n        test.config = {\n            injectIntoThis: true,\n            injectInto: null,\n            properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n            useFakeTimers: true,\n            useFakeServer: true\n        };\n\n        sinon.test = test;\n        return test;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        require(\"./sandbox\");\n        module.exports = makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend util/core.js\n * @depend test.js\n */\n/**\n * Test case, sandboxes all test functions\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n    function createTest(property, setUp, tearDown) {\n        return function () {\n            if (setUp) {\n                setUp.apply(this, arguments);\n            }\n\n            var exception, result;\n\n            try {\n                result = property.apply(this, arguments);\n            } catch (e) {\n                exception = e;\n            }\n\n            if (tearDown) {\n                tearDown.apply(this, arguments);\n            }\n\n            if (exception) {\n                throw exception;\n            }\n\n            return result;\n        };\n    }\n\n    function makeApi(sinon) {\n        function testCase(tests, prefix) {\n            /*jsl:ignore*/\n            if (!tests || typeof tests != \"object\") {\n                throw new TypeError(\"sinon.testCase needs an object with test functions\");\n            }\n            /*jsl:end*/\n\n            prefix = prefix || \"test\";\n            var rPrefix = new RegExp(\"^\" + prefix);\n            var methods = {}, testName, property, method;\n            var setUp = tests.setUp;\n            var tearDown = tests.tearDown;\n\n            for (testName in tests) {\n                if (tests.hasOwnProperty(testName)) {\n                    property = tests[testName];\n\n                    if (/^(setUp|tearDown)$/.test(testName)) {\n                        continue;\n                    }\n\n                    if (typeof property == \"function\" && rPrefix.test(testName)) {\n                        method = property;\n\n                        if (setUp || tearDown) {\n                            method = createTest(property, setUp, tearDown);\n                        }\n\n                        methods[testName] = sinon.test(method);\n                    } else {\n                        methods[testName] = tests[testName];\n                    }\n                }\n            }\n\n            return methods;\n        }\n\n        sinon.testCase = testCase;\n        return testCase;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        require(\"./test\");\n        module.exports = makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend times_in_words.js\n * @depend util/core.js\n * @depend stub.js\n * @depend format.js\n */\n/**\n * Assertions matching the test spy retrieval interface.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon, global) {\n    var slice = Array.prototype.slice;\n\n    function makeApi(sinon) {\n        var assert;\n\n        function verifyIsStub() {\n            var method;\n\n            for (var i = 0, l = arguments.length; i < l; ++i) {\n                method = arguments[i];\n\n                if (!method) {\n                    assert.fail(\"fake is not a spy\");\n                }\n\n                if (typeof method != \"function\") {\n                    assert.fail(method + \" is not a function\");\n                }\n\n                if (typeof method.getCall != \"function\") {\n                    assert.fail(method + \" is not stubbed\");\n                }\n            }\n        }\n\n        function failAssertion(object, msg) {\n            object = object || global;\n            var failMethod = object.fail || assert.fail;\n            failMethod.call(object, msg);\n        }\n\n        function mirrorPropAsAssertion(name, method, message) {\n            if (arguments.length == 2) {\n                message = method;\n                method = name;\n            }\n\n            assert[name] = function (fake) {\n                verifyIsStub(fake);\n\n                var args = slice.call(arguments, 1);\n                var failed = false;\n\n                if (typeof method == \"function\") {\n                    failed = !method(fake);\n                } else {\n                    failed = typeof fake[method] == \"function\" ?\n                        !fake[method].apply(fake, args) : !fake[method];\n                }\n\n                if (failed) {\n                    failAssertion(this, fake.printf.apply(fake, [message].concat(args)));\n                } else {\n                    assert.pass(name);\n                }\n            };\n        }\n\n        function exposedName(prefix, prop) {\n            return !prefix || /^fail/.test(prop) ? prop :\n                prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);\n        }\n\n        assert = {\n            failException: \"AssertError\",\n\n            fail: function fail(message) {\n                var error = new Error(message);\n                error.name = this.failException || assert.failException;\n\n                throw error;\n            },\n\n            pass: function pass(assertion) {},\n\n            callOrder: function assertCallOrder() {\n                verifyIsStub.apply(null, arguments);\n                var expected = \"\", actual = \"\";\n\n                if (!sinon.calledInOrder(arguments)) {\n                    try {\n                        expected = [].join.call(arguments, \", \");\n                        var calls = slice.call(arguments);\n                        var i = calls.length;\n                        while (i) {\n                            if (!calls[--i].called) {\n                                calls.splice(i, 1);\n                            }\n                        }\n                        actual = sinon.orderByFirstCall(calls).join(\", \");\n                    } catch (e) {\n                        // If this fails, we'll just fall back to the blank string\n                    }\n\n                    failAssertion(this, \"expected \" + expected + \" to be \" +\n                                \"called in order but were called as \" + actual);\n                } else {\n                    assert.pass(\"callOrder\");\n                }\n            },\n\n            callCount: function assertCallCount(method, count) {\n                verifyIsStub(method);\n\n                if (method.callCount != count) {\n                    var msg = \"expected %n to be called \" + sinon.timesInWords(count) +\n                        \" but was called %c%C\";\n                    failAssertion(this, method.printf(msg));\n                } else {\n                    assert.pass(\"callCount\");\n                }\n            },\n\n            expose: function expose(target, options) {\n                if (!target) {\n                    throw new TypeError(\"target is null or undefined\");\n                }\n\n                var o = options || {};\n                var prefix = typeof o.prefix == \"undefined\" && \"assert\" || o.prefix;\n                var includeFail = typeof o.includeFail == \"undefined\" || !!o.includeFail;\n\n                for (var method in this) {\n                    if (method != \"expose\" && (includeFail || !/^(fail)/.test(method))) {\n                        target[exposedName(prefix, method)] = this[method];\n                    }\n                }\n\n                return target;\n            },\n\n            match: function match(actual, expectation) {\n                var matcher = sinon.match(expectation);\n                if (matcher.test(actual)) {\n                    assert.pass(\"match\");\n                } else {\n                    var formatted = [\n                        \"expected value to match\",\n                        \"    expected = \" + sinon.format(expectation),\n                        \"    actual = \" + sinon.format(actual)\n                    ]\n                    failAssertion(this, formatted.join(\"\\n\"));\n                }\n            }\n        };\n\n        mirrorPropAsAssertion(\"called\", \"expected %n to have been called at least once but was never called\");\n        mirrorPropAsAssertion(\"notCalled\", function (spy) { return !spy.called; },\n                            \"expected %n to not have been called but was called %c%C\");\n        mirrorPropAsAssertion(\"calledOnce\", \"expected %n to be called once but was called %c%C\");\n        mirrorPropAsAssertion(\"calledTwice\", \"expected %n to be called twice but was called %c%C\");\n        mirrorPropAsAssertion(\"calledThrice\", \"expected %n to be called thrice but was called %c%C\");\n        mirrorPropAsAssertion(\"calledOn\", \"expected %n to be called with %1 as this but was called with %t\");\n        mirrorPropAsAssertion(\"alwaysCalledOn\", \"expected %n to always be called with %1 as this but was called with %t\");\n        mirrorPropAsAssertion(\"calledWithNew\", \"expected %n to be called with new\");\n        mirrorPropAsAssertion(\"alwaysCalledWithNew\", \"expected %n to always be called with new\");\n        mirrorPropAsAssertion(\"calledWith\", \"expected %n to be called with arguments %*%C\");\n        mirrorPropAsAssertion(\"calledWithMatch\", \"expected %n to be called with match %*%C\");\n        mirrorPropAsAssertion(\"alwaysCalledWith\", \"expected %n to always be called with arguments %*%C\");\n        mirrorPropAsAssertion(\"alwaysCalledWithMatch\", \"expected %n to always be called with match %*%C\");\n        mirrorPropAsAssertion(\"calledWithExactly\", \"expected %n to be called with exact arguments %*%C\");\n        mirrorPropAsAssertion(\"alwaysCalledWithExactly\", \"expected %n to always be called with exact arguments %*%C\");\n        mirrorPropAsAssertion(\"neverCalledWith\", \"expected %n to never be called with arguments %*%C\");\n        mirrorPropAsAssertion(\"neverCalledWithMatch\", \"expected %n to never be called with match %*%C\");\n        mirrorPropAsAssertion(\"threw\", \"%n did not throw exception%C\");\n        mirrorPropAsAssertion(\"alwaysThrew\", \"%n did not always throw exception%C\");\n\n        sinon.assert = assert;\n        return assert;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./util/core\");\n        require(\"./match\");\n        module.exports = makeApi(sinon);\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else if (!sinon) {\n        return;\n    } else {\n        makeApi(sinon);\n    }\n\n}(typeof sinon == \"object\" && sinon || null, typeof window != \"undefined\" ? window : (typeof self != \"undefined\") ? self : global));\n\n/**\n * @depend core.js\n * @depend ../extend.js\n * @depend event.js\n * @depend ../log_error.js\n */\n/**\n * Fake XDomainRequest object\n */\n\nif (typeof sinon == \"undefined\") {\n    this.sinon = {};\n}\n\n// wrapper for global\n(function (global) {\n    var xdr = { XDomainRequest: global.XDomainRequest };\n    xdr.GlobalXDomainRequest = global.XDomainRequest;\n    xdr.supportsXDR = typeof xdr.GlobalXDomainRequest != \"undefined\";\n    xdr.workingXDR = xdr.supportsXDR ? xdr.GlobalXDomainRequest :  false;\n\n    function makeApi(sinon) {\n        sinon.xdr = xdr;\n\n        function FakeXDomainRequest() {\n            this.readyState = FakeXDomainRequest.UNSENT;\n            this.requestBody = null;\n            this.requestHeaders = {};\n            this.status = 0;\n            this.timeout = null;\n\n            if (typeof FakeXDomainRequest.onCreate == \"function\") {\n                FakeXDomainRequest.onCreate(this);\n            }\n        }\n\n        function verifyState(xdr) {\n            if (xdr.readyState !== FakeXDomainRequest.OPENED) {\n                throw new Error(\"INVALID_STATE_ERR\");\n            }\n\n            if (xdr.sendFlag) {\n                throw new Error(\"INVALID_STATE_ERR\");\n            }\n        }\n\n        function verifyRequestSent(xdr) {\n            if (xdr.readyState == FakeXDomainRequest.UNSENT) {\n                throw new Error(\"Request not sent\");\n            }\n            if (xdr.readyState == FakeXDomainRequest.DONE) {\n                throw new Error(\"Request done\");\n            }\n        }\n\n        function verifyResponseBodyType(body) {\n            if (typeof body != \"string\") {\n                var error = new Error(\"Attempted to respond to fake XDomainRequest with \" +\n                                    body + \", which is not a string.\");\n                error.name = \"InvalidBodyException\";\n                throw error;\n            }\n        }\n\n        sinon.extend(FakeXDomainRequest.prototype, sinon.EventTarget, {\n            open: function open(method, url) {\n                this.method = method;\n                this.url = url;\n\n                this.responseText = null;\n                this.sendFlag = false;\n\n                this.readyStateChange(FakeXDomainRequest.OPENED);\n            },\n\n            readyStateChange: function readyStateChange(state) {\n                this.readyState = state;\n                var eventName = \"\";\n                switch (this.readyState) {\n                case FakeXDomainRequest.UNSENT:\n                    break;\n                case FakeXDomainRequest.OPENED:\n                    break;\n                case FakeXDomainRequest.LOADING:\n                    if (this.sendFlag) {\n                        //raise the progress event\n                        eventName = \"onprogress\";\n                    }\n                    break;\n                case FakeXDomainRequest.DONE:\n                    if (this.isTimeout) {\n                        eventName = \"ontimeout\"\n                    } else if (this.errorFlag || (this.status < 200 || this.status > 299)) {\n                        eventName = \"onerror\";\n                    } else {\n                        eventName = \"onload\"\n                    }\n                    break;\n                }\n\n                // raising event (if defined)\n                if (eventName) {\n                    if (typeof this[eventName] == \"function\") {\n                        try {\n                            this[eventName]();\n                        } catch (e) {\n                            sinon.logError(\"Fake XHR \" + eventName + \" handler\", e);\n                        }\n                    }\n                }\n            },\n\n            send: function send(data) {\n                verifyState(this);\n\n                if (!/^(get|head)$/i.test(this.method)) {\n                    this.requestBody = data;\n                }\n                this.requestHeaders[\"Content-Type\"] = \"text/plain;charset=utf-8\";\n\n                this.errorFlag = false;\n                this.sendFlag = true;\n                this.readyStateChange(FakeXDomainRequest.OPENED);\n\n                if (typeof this.onSend == \"function\") {\n                    this.onSend(this);\n                }\n            },\n\n            abort: function abort() {\n                this.aborted = true;\n                this.responseText = null;\n                this.errorFlag = true;\n\n                if (this.readyState > sinon.FakeXDomainRequest.UNSENT && this.sendFlag) {\n                    this.readyStateChange(sinon.FakeXDomainRequest.DONE);\n                    this.sendFlag = false;\n                }\n            },\n\n            setResponseBody: function setResponseBody(body) {\n                verifyRequestSent(this);\n                verifyResponseBodyType(body);\n\n                var chunkSize = this.chunkSize || 10;\n                var index = 0;\n                this.responseText = \"\";\n\n                do {\n                    this.readyStateChange(FakeXDomainRequest.LOADING);\n                    this.responseText += body.substring(index, index + chunkSize);\n                    index += chunkSize;\n                } while (index < body.length);\n\n                this.readyStateChange(FakeXDomainRequest.DONE);\n            },\n\n            respond: function respond(status, contentType, body) {\n                // content-type ignored, since XDomainRequest does not carry this\n                // we keep the same syntax for respond(...) as for FakeXMLHttpRequest to ease\n                // test integration across browsers\n                this.status = typeof status == \"number\" ? status : 200;\n                this.setResponseBody(body || \"\");\n            },\n\n            simulatetimeout: function simulatetimeout() {\n                this.status = 0;\n                this.isTimeout = true;\n                // Access to this should actually throw an error\n                this.responseText = undefined;\n                this.readyStateChange(FakeXDomainRequest.DONE);\n            }\n        });\n\n        sinon.extend(FakeXDomainRequest, {\n            UNSENT: 0,\n            OPENED: 1,\n            LOADING: 3,\n            DONE: 4\n        });\n\n        sinon.useFakeXDomainRequest = function useFakeXDomainRequest() {\n            sinon.FakeXDomainRequest.restore = function restore(keepOnCreate) {\n                if (xdr.supportsXDR) {\n                    global.XDomainRequest = xdr.GlobalXDomainRequest;\n                }\n\n                delete sinon.FakeXDomainRequest.restore;\n\n                if (keepOnCreate !== true) {\n                    delete sinon.FakeXDomainRequest.onCreate;\n                }\n            };\n            if (xdr.supportsXDR) {\n                global.XDomainRequest = sinon.FakeXDomainRequest;\n            }\n            return sinon.FakeXDomainRequest;\n        };\n\n        sinon.FakeXDomainRequest = FakeXDomainRequest;\n    }\n\n    var isNode = typeof module !== \"undefined\" && module.exports && typeof require == \"function\";\n    var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n    function loadDependencies(require, exports, module) {\n        var sinon = require(\"./core\");\n        require(\"./event\");\n        makeApi(sinon);\n        module.exports = sinon;\n    }\n\n    if (isAMD) {\n        define(loadDependencies);\n    } else if (isNode) {\n        loadDependencies(require, module.exports, module);\n    } else {\n        makeApi(sinon);\n    }\n})(this);\n\n  return sinon;\n}));\n","define('ember-qunit', ['exports', 'ember-qunit/module-for', 'ember-qunit/module-for-component', 'ember-qunit/module-for-model', 'ember-qunit/test', 'ember-test-helpers'], function (exports, moduleFor, moduleForComponent, moduleForModel, test, ember_test_helpers) {\n\n  'use strict';\n\n\n\n  exports.moduleFor = moduleFor['default'];\n  exports.moduleForComponent = moduleForComponent['default'];\n  exports.moduleForModel = moduleForModel['default'];\n  exports.test = test['default'];\n  exports.setResolver = ember_test_helpers.setResolver;\n\n});","define('ember-qunit/module-for-component', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, qunit_module, ember_test_helpers) {\n\n  'use strict';\n\n  function moduleForComponent(name, description, callbacks) {\n    qunit_module.createModule(ember_test_helpers.TestModuleForComponent, name, description, callbacks);\n  }\n  exports['default'] = moduleForComponent;\n\n});","define('ember-qunit/module-for-model', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, qunit_module, ember_test_helpers) {\n\n  'use strict';\n\n  function moduleForModel(name, description, callbacks) {\n    qunit_module.createModule(ember_test_helpers.TestModuleForModel, name, description, callbacks);\n  }\n  exports['default'] = moduleForModel;\n\n});","define('ember-qunit/module-for', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, qunit_module, ember_test_helpers) {\n\n  'use strict';\n\n  function moduleFor(name, description, callbacks) {\n    qunit_module.createModule(ember_test_helpers.TestModule, name, description, callbacks);\n  }\n  exports['default'] = moduleFor;\n\n});","define('ember-qunit/qunit-module', ['exports', 'qunit'], function (exports, qunit) {\n\n  'use strict';\n\n  exports.createModule = createModule;\n\n  function beforeEachCallback(callbacks) {\n    if (typeof callbacks !== 'object') { return; }\n    if (!callbacks) { return; }\n\n    var beforeEach;\n    \n    if (callbacks.setup) {\n      beforeEach = callbacks.setup;\n      delete callbacks.setup;\n    }\n\n    if (callbacks.beforeEach) {\n      beforeEach = callbacks.beforeEach;\n      delete callbacks.beforeEach;\n    }\n\n    return beforeEach;\n  }\n\n  function afterEachCallback(callbacks) {\n    if (typeof callbacks !== 'object') { return; }\n    if (!callbacks) { return; }\n\n    var afterEach;\n\n    if (callbacks.teardown) {\n      afterEach = callbacks.teardown;\n      delete callbacks.teardown;\n    }\n\n    if (callbacks.afterEach) {\n      afterEach = callbacks.afterEach;\n      delete callbacks.afterEach;\n    }\n\n    return afterEach;\n  }\n\n  function createModule(Constructor, name, description, callbacks) {\n    var beforeEach = beforeEachCallback(callbacks || description);\n    var afterEach  = afterEachCallback(callbacks || description);\n\n    var module = new Constructor(name, description, callbacks);\n\n    qunit.module(module.name, {\n      setup: function(assert) {\n        var done = assert.async();\n        module.setup().then(function() {\n          if (beforeEach) {\n            beforeEach.call(module.context, assert);\n          }\n        })['finally'](done);\n      },\n\n      teardown: function(assert) {\n        if (afterEach) {\n          afterEach.call(module.context, assert);\n        }\n        var done = assert.async();\n        module.teardown()['finally'](done);\n      }\n    });\n  }\n\n});","define('ember-qunit/test', ['exports', 'ember', 'ember-test-helpers', 'qunit'], function (exports, Ember, ember_test_helpers, qunit) {\n\n  'use strict';\n\n  function resetViews() {\n    Ember['default'].View.views = {};\n  }\n\n  function test(testName, callback) {\n    function wrapper(assert) {\n      var context = ember_test_helpers.getContext();\n\n      resetViews();\n      var result = callback.call(context, assert);\n\n      function failTestOnPromiseRejection(reason) {\n        var message;\n        if (reason instanceof Error) {\n          message = reason.stack;\n        } else {\n          message = Ember['default'].inspect(reason);\n        }\n        ok(false, message);\n      }\n\n      Ember['default'].run(function(){\n        QUnit.stop();\n        Ember['default'].RSVP.Promise.resolve(result)['catch'](failTestOnPromiseRejection)['finally'](QUnit.start);\n      });\n    }\n\n    qunit.test(testName, wrapper);\n  }\n  exports['default'] = test;\n\n});","define('ember-test-helpers', ['exports', 'ember', 'ember-test-helpers/isolated-container', 'ember-test-helpers/test-module', 'ember-test-helpers/test-module-for-component', 'ember-test-helpers/test-module-for-model', 'ember-test-helpers/test-module-for-integration', 'ember-test-helpers/test-context', 'ember-test-helpers/test-resolver'], function (exports, Ember, isolatedContainer, TestModule, TestModuleForComponent, TestModuleForModel, TestModuleForIntegration, test_context, test_resolver) {\n\n  'use strict';\n\n  Ember['default'].testing = true;\n\n  exports.isolatedContainer = isolatedContainer['default'];\n  exports.TestModule = TestModule['default'];\n  exports.TestModuleForComponent = TestModuleForComponent['default'];\n  exports.TestModuleForModel = TestModuleForModel['default'];\n  exports.TestModuleForIntegration = TestModuleForIntegration['default'];\n  exports.getContext = test_context.getContext;\n  exports.setContext = test_context.setContext;\n  exports.setResolver = test_resolver.setResolver;\n\n});","define('ember-test-helpers/isolated-container', ['exports', 'ember-test-helpers/test-resolver', 'ember'], function (exports, test_resolver, Ember) {\n\n  'use strict';\n\n  function exposeRegistryMethodsWithoutDeprecations(container) {\n    var methods = [\n      'register',\n      'unregister',\n      'resolve',\n      'normalize',\n      'typeInjection',\n      'injection',\n      'factoryInjection',\n      'factoryTypeInjection',\n      'has',\n      'options',\n      'optionsForType'\n    ];\n\n    function exposeRegistryMethod(container, method) {\n      container[method] = function() {\n        return container._registry[method].apply(container._registry, arguments);\n      };\n    }\n\n    for (var i = 0, l = methods.length; i < l; i++) {\n      exposeRegistryMethod(container, methods[i]);\n    }\n  }\n\n  function isolatedContainer(fullNames) {\n    var resolver = test_resolver.getResolver();\n    var container;\n\n    var normalize = function(fullName) {\n      return resolver.normalize(fullName);\n    };\n\n    if (Ember['default'].Registry) {\n      var registry = new Ember['default'].Registry();\n      registry.normalizeFullName = normalize;\n\n      container = registry.container();\n      exposeRegistryMethodsWithoutDeprecations(container);\n\n    } else {\n      container = new Ember['default'].Container();\n\n      //normalizeFullName only exists since Ember 1.9\n      if (Ember['default'].typeOf(container.normalizeFullName) === 'function') {\n        container.normalizeFullName = normalize;\n      } else {\n        container.normalize = normalize;\n      }\n    }\n\n    container.optionsForType('component', { singleton: false });\n    container.optionsForType('view', { singleton: false });\n    container.optionsForType('template', { instantiate: false });\n    container.optionsForType('helper', { instantiate: false });\n    container.register('component-lookup:main', Ember['default'].ComponentLookup);\n    container.register('controller:basic', Ember['default'].Controller, { instantiate: false });\n    container.register('controller:object', Ember['default'].ObjectController, { instantiate: false });\n    container.register('controller:array', Ember['default'].ArrayController, { instantiate: false });\n    container.register('view:default', Ember['default']._MetamorphView);\n    container.register('view:toplevel', Ember['default'].View.extend());\n    container.register('view:select', Ember['default'].Select);\n    container.register('route:basic', Ember['default'].Route, { instantiate: false });\n\n    var globalContext = typeof global === 'object' && global || self;\n    if (globalContext.DS) {\n      var DS = globalContext.DS;\n      container.register('transform:boolean', DS.BooleanTransform);\n      container.register('transform:date', DS.DateTransform);\n      container.register('transform:number', DS.NumberTransform);\n      container.register('transform:string', DS.StringTransform);\n      container.register('serializer:-default', DS.JSONSerializer);\n      container.register('serializer:-rest', DS.RESTSerializer);\n      container.register('adapter:-rest', DS.RESTAdapter);\n    }\n\n    for (var i = fullNames.length; i > 0; i--) {\n      var fullName = fullNames[i - 1];\n      var normalizedFullName = resolver.normalize(fullName);\n      container.register(fullName, resolver.resolve(normalizedFullName));\n    }\n    return container;\n  }\n  exports['default'] = isolatedContainer;\n\n});","define('ember-test-helpers/test-context', ['exports'], function (exports) {\n\n  'use strict';\n\n  exports.setContext = setContext;\n  exports.getContext = getContext;\n\n  var __test_context__;\n\n  function setContext(context) {\n    __test_context__ = context;\n  }\n\n  function getContext() {\n    return __test_context__;\n  }\n\n});","define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-helpers/test-module', 'ember', 'ember-test-helpers/test-resolver'], function (exports, TestModule, Ember, test_resolver) {\n\n  'use strict';\n\n  exports['default'] = TestModule['default'].extend({\n    init: function(componentName, description, callbacks) {\n      this.componentName = componentName;\n\n      this._super.call(this, 'component:' + componentName, description, callbacks);\n\n      this.setupSteps.push(this.setupComponent);\n    },\n\n    setupComponent: function() {\n      var _this = this;\n      var resolver = test_resolver.getResolver();\n      var container = this.container;\n      var context = this.context;\n\n      var layoutName = 'template:components/' + this.componentName;\n\n      var layout = resolver.resolve(layoutName);\n\n      if (layout) {\n        container.register(layoutName, layout);\n        container.injection(this.subjectName, 'layout', layoutName);\n      }\n\n      context.dispatcher = Ember['default'].EventDispatcher.create();\n      context.dispatcher.setup({}, '#ember-testing');\n\n      this.callbacks.render = function() {\n        var containerView = Ember['default'].ContainerView.create({container: container});\n        Ember['default'].run(function(){\n          var subject = context.subject();\n          containerView.pushObject(subject);\n          containerView.appendTo('#ember-testing');\n        });\n\n        _this.teardownSteps.unshift(function() {\n          Ember['default'].run(function() {\n            Ember['default'].tryInvoke(containerView, 'destroy');\n          });\n        });\n      };\n\n      this.callbacks.append = function() {\n        Ember['default'].deprecate('this.append() is deprecated. Please use this.render() or this.$() instead.');\n        return context.$();\n      };\n\n      context.$ = function() {\n        this.render();\n        var subject = this.subject();\n\n        return subject.$.apply(subject, arguments);\n      };\n    }\n  });\n\n});","define('ember-test-helpers/test-module-for-integration', ['exports', 'ember', 'ember-test-helpers/test-module', 'ember-test-helpers/test-resolver', 'ember-test-helpers/test-context'], function (exports, Ember, TestModule, test_resolver, test_context) {\n\n  'use strict';\n\n  exports['default'] = TestModule['default'].extend({\n\n    isIntegration: true,\n\n    init: function(name, description, callbacks) {\n      this._super.call(this, name, description, callbacks);\n      this.setupSteps.push(this.setupIntegrationHelpers);\n      this.teardownSteps.push(this.teardownView);\n    },\n\n    setupIntegrationHelpers: function() {\n      var self = this;\n      var context = this.context;\n      context.dispatcher = Ember['default'].EventDispatcher.create();\n      context.dispatcher.setup({}, '#ember-testing');\n      this.actionHooks = {};\n\n      context.render = function(template) {\n        if (Ember['default'].isArray(template)) {\n          template = template.join('');\n        }\n        if (typeof template === 'string') {\n          template = Ember['default'].Handlebars.compile(template);\n        }\n        self.view = Ember['default'].View.create({\n          context: context,\n          controller: self,\n          template: template,\n          container: self.container\n        });\n        Ember['default'].run(function() {\n          self.view.appendTo('#ember-testing');\n        });\n      };\n\n      context.$ = function() {\n        return self.view.$.apply(self.view, arguments);\n      };\n\n      context.set = function(key, value) {\n        Ember['default'].run(function() {\n          Ember['default'].set(context, key, value);\n        });\n      };\n\n      context.get = function(key) {\n        return Ember['default'].get(context, key);\n      };\n\n      context.on = function(actionName, handler) {\n        self.actionHooks[actionName] = handler;\n      };\n\n    },\n\n    setupContext: function() {\n\n      test_context.setContext({\n        container:  this.container,\n        factory: function() {},\n        dispatcher: null\n      });\n\n      this.context = test_context.getContext();\n    },\n\n    send: function(actionName) {\n      var hook = this.actionHooks[actionName];\n      if (!hook) {\n        throw new Error(\"integration testing template received unexpected action \" + actionName);\n      }\n      hook.apply(this, Array.prototype.slice.call(arguments, 1));\n    },\n\n    teardownView: function() {\n      var view = this.view;\n      if (view) {\n        Ember['default'].run(function() {\n          view.destroy();\n        });\n      }\n    }\n\n  });\n\n});","define('ember-test-helpers/test-module-for-model', ['exports', 'ember-test-helpers/test-module', 'ember'], function (exports, TestModule, Ember) {\n\n  'use strict';\n\n  exports['default'] = TestModule['default'].extend({\n    init: function(modelName, description, callbacks) {\n      this.modelName = modelName;\n\n      this._super.call(this, 'model:' + modelName, description, callbacks);\n\n      this.setupSteps.push(this.setupModel);\n    },\n\n    setupModel: function() {\n      var container = this.container;\n      var defaultSubject = this.defaultSubject;\n      var callbacks = this.callbacks;\n      var modelName = this.modelName;\n\n      if (DS._setupContainer) {\n        DS._setupContainer(container);\n      } else {\n        container.register('store:main', DS.Store);\n      }\n\n      var adapterFactory = container.lookupFactory('adapter:application');\n      if (!adapterFactory) {\n        container.register('adapter:application', DS.FixtureAdapter);\n      }\n\n      callbacks.store = function(){\n        var container = this.container;\n\n        return container.lookup('store:main');\n      };\n\n      if (callbacks.subject === defaultSubject) {\n        callbacks.subject = function(options) {\n          var container = this.container;\n\n          return Ember['default'].run(function() {\n            return container.lookup('store:main').createRecord(modelName, options);\n          });\n        };\n      }\n    }\n  });\n\n});","define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helpers/isolated-container', 'ember-test-helpers/test-context', 'klassy', 'ember-test-helpers/test-resolver'], function (exports, Ember, isolatedContainer, test_context, klassy, test_resolver) {\n\n  'use strict';\n\n  exports['default'] = klassy.Klass.extend({\n    init: function(subjectName, description, callbacks) {\n      // Allow `description` to be omitted, in which case it should\n      // default to `subjectName`\n      if (!callbacks && typeof description === 'object') {\n        callbacks = description;\n        description = subjectName;\n      }\n\n      this.subjectName = subjectName;\n      this.description = description || subjectName;\n      this.name = description || subjectName;\n      this.callbacks = callbacks || {};\n\n      if (this.callbacks.integration) {\n        this.isIntegration = callbacks.integration;      \n        delete callbacks.integration;\n      }\n\n      this.initSubject();\n      this.initNeeds();\n      this.initSetupSteps();\n      this.initTeardownSteps();\n    },\n\n    initSubject: function() {\n      this.callbacks.subject = this.callbacks.subject || this.defaultSubject;\n    },\n\n    initNeeds: function() {\n      this.needs = [this.subjectName];\n      if (this.callbacks.needs) {\n        this.needs = this.needs.concat(this.callbacks.needs)\n        delete this.callbacks.needs;\n      }\n    },\n\n    initSetupSteps: function() {\n      this.setupSteps = [];\n      this.contextualizedSetupSteps = [];\n\n      if (this.callbacks.beforeSetup) {\n        this.setupSteps.push( this.callbacks.beforeSetup );\n        delete this.callbacks.beforeSetup;\n      }\n\n      this.setupSteps.push(this.setupContainer);\n      this.setupSteps.push(this.setupContext);\n      this.setupSteps.push(this.setupTestElements);\n\n      if (this.callbacks.setup) {\n        this.contextualizedSetupSteps.push( this.callbacks.setup );\n        delete this.callbacks.setup;\n      }\n    },\n\n    initTeardownSteps: function() {\n      this.teardownSteps = [];\n      this.contextualizedTeardownSteps = [];\n\n      if (this.callbacks.teardown) {\n        this.contextualizedTeardownSteps.push( this.callbacks.teardown );\n        delete this.callbacks.teardown;\n      }\n\n      this.teardownSteps.push(this.teardownSubject);\n      this.teardownSteps.push(this.teardownContainer);\n      this.teardownSteps.push(this.teardownContext);\n      this.teardownSteps.push(this.teardownTestElements);\n\n      if (this.callbacks.afterTeardown) {\n        this.teardownSteps.push( this.callbacks.afterTeardown );\n        delete this.callbacks.afterTeardown;\n      }\n    },\n\n    setup: function() {\n      var self = this;\n      return self.invokeSteps(self.setupSteps).then(function() {\n        self.contextualizeCallbacks();\n        return self.invokeSteps(self.contextualizedSetupSteps, self.context);\n      });\n    },\n\n    teardown: function() {\n      var self = this;\n      return self.invokeSteps(self.contextualizedTeardownSteps, self.context).then(function() {\n        return self.invokeSteps(self.teardownSteps);\n      }).then(function() {\n        self.cache = null;\n        self.cachedCalls = null;\n      });\n    },\n\n    invokeSteps: function(steps, _context) {\n      var context = _context;\n      if (!context) {\n        context = this;\n      }\n      steps = steps.slice();\n      function nextStep() {\n        var step = steps.shift();\n        if (step) {\n          return Ember['default'].RSVP.resolve(step.call(context)).then(nextStep);\n        } else {\n          return Ember['default'].RSVP.resolve();\n        }\n      }\n      return nextStep();\n    },\n\n    setupContainer: function() {\n      if (this.isIntegration) {\n        this._setupIntegratedContainer();\n      } else {\n        this._setupIsolatedContainer();\n      }\n    },\n\n    setupContext: function() {\n      var subjectName = this.subjectName;\n      var container = this.container;\n\n      var factory = function() {\n        return container.lookupFactory(subjectName);\n      };\n\n      test_context.setContext({\n        container:  this.container,\n        factory:    factory,\n        dispatcher: null\n      });\n\n      this.context = test_context.getContext();\n    },\n\n    setupTestElements: function() {\n      if (Ember['default'].$('#ember-testing').length === 0) {\n        Ember['default'].$('<div id=\"ember-testing\"/>').appendTo(document.body);\n      }\n    },\n\n    teardownSubject: function() {\n      var subject = this.cache.subject;\n\n      if (subject) {\n        Ember['default'].run(function() {\n          Ember['default'].tryInvoke(subject, 'destroy');\n        });\n      }\n    },\n\n    teardownContainer: function() {\n      var container = this.container;\n      Ember['default'].run(function() {\n        container.destroy();\n      });\n    },\n\n    teardownContext: function() {\n      var context = this.context;\n      if (context.dispatcher) {\n        Ember['default'].run(function() {\n          context.dispatcher.destroy();\n        });\n      }\n    },\n\n    teardownTestElements: function() {\n      Ember['default'].$('#ember-testing').empty();\n      Ember['default'].View.views = {};\n    },\n\n    defaultSubject: function(options, factory) {\n      return factory.create(options);\n    },\n\n    // allow arbitrary named factories, like rspec let\n    contextualizeCallbacks: function() {\n      var _this     = this;\n      var callbacks = this.callbacks;\n      var context   = this.context;\n      var factory   = context.factory;\n\n      this.cache = this.cache || {};\n      this.cachedCalls = this.cachedCalls || {};\n\n      var keys = Ember['default'].keys(callbacks);\n\n      for (var i = 0, l = keys.length; i < l; i++) {\n        (function(key) {\n\n          context[key] = function(options) {\n            if (_this.cachedCalls[key]) { return _this.cache[key]; }\n\n            var result = callbacks[key].call(_this, options, factory());\n\n            _this.cache[key] = result;\n            _this.cachedCalls[key] = true;\n\n            return result;\n          };\n\n        })(keys[i]);\n      }\n    },\n\n\n    _setupIsolatedContainer: function() {\n      this.container = isolatedContainer['default'](this.needs);\n    },\n\n    _setupIntegratedContainer: function() {\n      var resolver = test_resolver.getResolver();\n      var namespace = Ember['default'].Object.create({\n        Resolver: { create: function() { return resolver; } }\n      });\n\n      if (Ember['default'].Application.buildRegistry) {\n        var registry;\n        registry = Ember['default'].Application.buildRegistry(namespace);\n        registry.register('component-lookup:main', Ember['default'].ComponentLookup);\n        this.registry = registry;\n        this.container = registry.container();\n      } else {\n        this.container = Ember['default'].Application.buildContainer(namespace);\n        this.container.register('component-lookup:main', Ember['default'].ComponentLookup);\n      }\n    }\n\n  });\n\n});","define('ember-test-helpers/test-resolver', ['exports'], function (exports) {\n\n  'use strict';\n\n  exports.setResolver = setResolver;\n  exports.getResolver = getResolver;\n\n  var __resolver__;\n\n  function setResolver(resolver) {\n    __resolver__ = resolver;\n  }\n\n  function getResolver() {\n    if (__resolver__ == null) throw new Error('you must set a resolver with `testResolver.set(resolver)`');\n    return __resolver__;\n  }\n\n});","define('klassy', ['exports'], function (exports) {\n\n  'use strict';\n\n  /**\n   Extend a class with the properties and methods of one or more other classes.\n\n   When a method is replaced with another method, it will be wrapped in a\n   function that makes the replaced method accessible via `this._super`.\n\n   @method extendClass\n   @param {Object} destination The class to merge into\n   @param {Object} source One or more source classes\n   */\n  var extendClass = function(destination) {\n    var sources = Array.prototype.slice.call(arguments, 1);\n    var source;\n\n    for (var i = 0, l = sources.length; i < l; i++) {\n      source = sources[i];\n\n      for (var p in source) {\n        if (source.hasOwnProperty(p) &&\n          destination[p] &&\n          typeof destination[p] === 'function' &&\n          typeof source[p] === 'function') {\n\n          /* jshint loopfunc:true */\n          destination[p] =\n            (function(destinationFn, sourceFn) {\n              var wrapper = function() {\n                var prevSuper = this._super;\n                this._super = destinationFn;\n\n                var ret = sourceFn.apply(this, arguments);\n\n                this._super = prevSuper;\n\n                return ret;\n              };\n              wrapper.wrappedFunction = sourceFn;\n              return wrapper;\n            })(destination[p], source[p]);\n\n        } else {\n          destination[p] = source[p];\n        }\n      }\n    }\n  };\n\n  // `subclassing` is a state flag used by `defineClass` to track when a class is\n  // being subclassed. It allows constructors to avoid calling `init`, which can\n  // be expensive and cause undesirable side effects.\n  var subclassing = false;\n\n  /**\n   Define a new class with the properties and methods of one or more other classes.\n\n   The new class can be based on a `SuperClass`, which will be inserted into its\n   prototype chain.\n\n   Furthermore, one or more mixins (object that contain properties and/or methods)\n   may be specified, which will be applied in order. When a method is replaced\n   with another method, it will be wrapped in a function that makes the previous\n   method accessible via `this._super`.\n\n   @method defineClass\n   @param {Object} SuperClass A base class to extend. If `mixins` are to be included\n   without a `SuperClass`, pass `null` for SuperClass.\n   @param {Object} mixins One or more objects that contain properties and methods\n   to apply to the new class.\n   */\n  var defineClass = function(SuperClass) {\n    var Klass = function() {\n      if (!subclassing && this.init) {\n        this.init.apply(this, arguments);\n      }\n    };\n\n    if (SuperClass) {\n      subclassing = true;\n      Klass.prototype = new SuperClass();\n      subclassing = false;\n    }\n\n    if (arguments.length > 1) {\n      var extendArgs = Array.prototype.slice.call(arguments, 1);\n      extendArgs.unshift(Klass.prototype);\n      extendClass.apply(Klass.prototype, extendArgs);\n    }\n\n    Klass.constructor = Klass;\n\n    Klass.extend = function() {\n      var args = Array.prototype.slice.call(arguments, 0);\n      args.unshift(Klass);\n      return defineClass.apply(Klass, args);\n    };\n\n    return Klass;\n  };\n\n  /**\n   A base class that can be extended.\n\n   @example\n\n   ```javascript\n   var CelestialObject = Klass.extend({\n     init: function(name) {\n       this._super();\n       this.name = name;\n       this.isCelestialObject = true;\n     },\n     greeting: function() {\n       return 'Hello from ' + this.name;\n     }\n   });\n\n   var Planet = CelestialObject.extend({\n     init: function(name) {\n       this._super.apply(this, arguments);\n       this.isPlanet = true;\n     },\n     greeting: function() {\n       return this._super() + '!';\n     },\n   });\n\n   var earth = new Planet('Earth');\n\n   console.log(earth instanceof Klass);           // true\n   console.log(earth instanceof CelestialObject); // true\n   console.log(earth instanceof Planet);          // true\n\n   console.log(earth.isCelestialObject);          // true\n   console.log(earth.isPlanet);                   // true\n\n   console.log(earth.greeting());                 // 'Hello from Earth!'\n   ```\n\n   @class Klass\n   */\n  var Klass = defineClass(null, {\n    init: function() {}\n  });\n\n  exports.Klass = Klass;\n  exports.defineClass = defineClass;\n  exports.extendClass = extendClass;\n\n});","define('qunit', ['exports'], function (exports) {\n\n\t'use strict';\n\n\t/* globals test:true */\n\n\tvar module = QUnit.module;\n\tvar test = QUnit.test;\n\tvar skip = QUnit.skip;\n\n\texports['default'] = QUnit;\n\n\texports.module = module;\n\texports.test = test;\n\texports.skip = skip;\n\n});","/*!\n * QUnit 1.17.1\n * http://qunitjs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2015-01-20T19:39Z\n */\n\n(function( window ) {\n\nvar QUnit,\n\tconfig,\n\tonErrorFnPrev,\n\tloggingCallbacks = {},\n\tfileName = ( sourceFromStacktrace( 0 ) || \"\" ).replace( /(:\\d+)+\\)?/, \"\" ).replace( /.+\\//, \"\" ),\n\ttoString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty,\n\t// Keep a local reference to Date (GH-283)\n\tDate = window.Date,\n\tnow = Date.now || function() {\n\t\treturn new Date().getTime();\n\t},\n\tglobalStartCalled = false,\n\trunStarted = false,\n\tsetTimeout = window.setTimeout,\n\tclearTimeout = window.clearTimeout,\n\tdefined = {\n\t\tdocument: window.document !== undefined,\n\t\tsetTimeout: window.setTimeout !== undefined,\n\t\tsessionStorage: (function() {\n\t\t\tvar x = \"qunit-test-string\";\n\t\t\ttry {\n\t\t\t\tsessionStorage.setItem( x, x );\n\t\t\t\tsessionStorage.removeItem( x );\n\t\t\t\treturn true;\n\t\t\t} catch ( e ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}())\n\t},\n\t/**\n\t * Provides a normalized error string, correcting an issue\n\t * with IE 7 (and prior) where Error.prototype.toString is\n\t * not properly implemented\n\t *\n\t * Based on http://es5.github.com/#x15.11.4.4\n\t *\n\t * @param {String|Error} error\n\t * @return {String} error message\n\t */\n\terrorString = function( error ) {\n\t\tvar name, message,\n\t\t\terrorString = error.toString();\n\t\tif ( errorString.substring( 0, 7 ) === \"[object\" ) {\n\t\t\tname = error.name ? error.name.toString() : \"Error\";\n\t\t\tmessage = error.message ? error.message.toString() : \"\";\n\t\t\tif ( name && message ) {\n\t\t\t\treturn name + \": \" + message;\n\t\t\t} else if ( name ) {\n\t\t\t\treturn name;\n\t\t\t} else if ( message ) {\n\t\t\t\treturn message;\n\t\t\t} else {\n\t\t\t\treturn \"Error\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn errorString;\n\t\t}\n\t},\n\t/**\n\t * Makes a clone of an object using only Array or Object as base,\n\t * and copies over the own enumerable properties.\n\t *\n\t * @param {Object} obj\n\t * @return {Object} New object with only the own properties (recursively).\n\t */\n\tobjectValues = function( obj ) {\n\t\tvar key, val,\n\t\t\tvals = QUnit.is( \"array\", obj ) ? [] : {};\n\t\tfor ( key in obj ) {\n\t\t\tif ( hasOwn.call( obj, key ) ) {\n\t\t\t\tval = obj[ key ];\n\t\t\t\tvals[ key ] = val === Object( val ) ? objectValues( val ) : val;\n\t\t\t}\n\t\t}\n\t\treturn vals;\n\t};\n\nQUnit = {};\n\n/**\n * Config object: Maintain internal state\n * Later exposed as QUnit.config\n * `config` initialized at top of scope\n */\nconfig = {\n\t// The queue of tests to run\n\tqueue: [],\n\n\t// block until document ready\n\tblocking: true,\n\n\t// by default, run previously failed tests first\n\t// very useful in combination with \"Hide passed tests\" checked\n\treorder: true,\n\n\t// by default, modify document.title when suite is done\n\taltertitle: true,\n\n\t// by default, scroll to top of the page when suite is done\n\tscrolltop: true,\n\n\t// when enabled, all tests must call expect()\n\trequireExpects: false,\n\n\t// add checkboxes that are persisted in the query-string\n\t// when enabled, the id is set to `true` as a `QUnit.config` property\n\turlConfig: [\n\t\t{\n\t\t\tid: \"hidepassed\",\n\t\t\tlabel: \"Hide passed tests\",\n\t\t\ttooltip: \"Only show tests and assertions that fail. Stored as query-strings.\"\n\t\t},\n\t\t{\n\t\t\tid: \"noglobals\",\n\t\t\tlabel: \"Check for Globals\",\n\t\t\ttooltip: \"Enabling this will test if any test introduces new properties on the \" +\n\t\t\t\t\"`window` object. Stored as query-strings.\"\n\t\t},\n\t\t{\n\t\t\tid: \"notrycatch\",\n\t\t\tlabel: \"No try-catch\",\n\t\t\ttooltip: \"Enabling this will run tests outside of a try-catch block. Makes debugging \" +\n\t\t\t\t\"exceptions in IE reasonable. Stored as query-strings.\"\n\t\t}\n\t],\n\n\t// Set of all modules.\n\tmodules: [],\n\n\t// The first unnamed module\n\tcurrentModule: {\n\t\tname: \"\",\n\t\ttests: []\n\t},\n\n\tcallbacks: {}\n};\n\n// Push a loose unnamed module to the modules collection\nconfig.modules.push( config.currentModule );\n\n// Initialize more QUnit.config and QUnit.urlParams\n(function() {\n\tvar i, current,\n\t\tlocation = window.location || { search: \"\", protocol: \"file:\" },\n\t\tparams = location.search.slice( 1 ).split( \"&\" ),\n\t\tlength = params.length,\n\t\turlParams = {};\n\n\tif ( params[ 0 ] ) {\n\t\tfor ( i = 0; i < length; i++ ) {\n\t\t\tcurrent = params[ i ].split( \"=\" );\n\t\t\tcurrent[ 0 ] = decodeURIComponent( current[ 0 ] );\n\n\t\t\t// allow just a key to turn on a flag, e.g., test.html?noglobals\n\t\t\tcurrent[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;\n\t\t\tif ( urlParams[ current[ 0 ] ] ) {\n\t\t\t\turlParams[ current[ 0 ] ] = [].concat( urlParams[ current[ 0 ] ], current[ 1 ] );\n\t\t\t} else {\n\t\t\t\turlParams[ current[ 0 ] ] = current[ 1 ];\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( urlParams.filter === true ) {\n\t\tdelete urlParams.filter;\n\t}\n\n\tQUnit.urlParams = urlParams;\n\n\t// String search anywhere in moduleName+testName\n\tconfig.filter = urlParams.filter;\n\n\tconfig.testId = [];\n\tif ( urlParams.testId ) {\n\n\t\t// Ensure that urlParams.testId is an array\n\t\turlParams.testId = [].concat( urlParams.testId );\n\t\tfor ( i = 0; i < urlParams.testId.length; i++ ) {\n\t\t\tconfig.testId.push( urlParams.testId[ i ] );\n\t\t}\n\t}\n\n\t// Figure out if we're running the tests from a server or not\n\tQUnit.isLocal = location.protocol === \"file:\";\n}());\n\n// Root QUnit object.\n// `QUnit` initialized at top of scope\nextend( QUnit, {\n\n\t// call on start of module test to prepend name to all tests\n\tmodule: function( name, testEnvironment ) {\n\t\tvar currentModule = {\n\t\t\tname: name,\n\t\t\ttestEnvironment: testEnvironment,\n\t\t\ttests: []\n\t\t};\n\n\t\t// DEPRECATED: handles setup/teardown functions,\n\t\t// beforeEach and afterEach should be used instead\n\t\tif ( testEnvironment && testEnvironment.setup ) {\n\t\t\ttestEnvironment.beforeEach = testEnvironment.setup;\n\t\t\tdelete testEnvironment.setup;\n\t\t}\n\t\tif ( testEnvironment && testEnvironment.teardown ) {\n\t\t\ttestEnvironment.afterEach = testEnvironment.teardown;\n\t\t\tdelete testEnvironment.teardown;\n\t\t}\n\n\t\tconfig.modules.push( currentModule );\n\t\tconfig.currentModule = currentModule;\n\t},\n\n\t// DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0.\n\tasyncTest: function( testName, expected, callback ) {\n\t\tif ( arguments.length === 2 ) {\n\t\t\tcallback = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tQUnit.test( testName, expected, callback, true );\n\t},\n\n\ttest: function( testName, expected, callback, async ) {\n\t\tvar test;\n\n\t\tif ( arguments.length === 2 ) {\n\t\t\tcallback = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\ttest = new Test({\n\t\t\ttestName: testName,\n\t\t\texpected: expected,\n\t\t\tasync: async,\n\t\t\tcallback: callback\n\t\t});\n\n\t\ttest.queue();\n\t},\n\n\tskip: function( testName ) {\n\t\tvar test = new Test({\n\t\t\ttestName: testName,\n\t\t\tskip: true\n\t\t});\n\n\t\ttest.queue();\n\t},\n\n\t// DEPRECATED: The functionality of QUnit.start() will be altered in QUnit 2.0.\n\t// In QUnit 2.0, invoking it will ONLY affect the `QUnit.config.autostart` blocking behavior.\n\tstart: function( count ) {\n\t\tvar globalStartAlreadyCalled = globalStartCalled;\n\n\t\tif ( !config.current ) {\n\t\t\tglobalStartCalled = true;\n\n\t\t\tif ( runStarted ) {\n\t\t\t\tthrow new Error( \"Called start() outside of a test context while already started\" );\n\t\t\t} else if ( globalStartAlreadyCalled || count > 1 ) {\n\t\t\t\tthrow new Error( \"Called start() outside of a test context too many times\" );\n\t\t\t} else if ( config.autostart ) {\n\t\t\t\tthrow new Error( \"Called start() outside of a test context when \" +\n\t\t\t\t\t\"QUnit.config.autostart was true\" );\n\t\t\t} else if ( !config.pageLoaded ) {\n\n\t\t\t\t// The page isn't completely loaded yet, so bail out and let `QUnit.load` handle it\n\t\t\t\tconfig.autostart = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// If a test is running, adjust its semaphore\n\t\t\tconfig.current.semaphore -= count || 1;\n\n\t\t\t// Don't start until equal number of stop-calls\n\t\t\tif ( config.current.semaphore > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// throw an Error if start is called more often than stop\n\t\t\tif ( config.current.semaphore < 0 ) {\n\t\t\t\tconfig.current.semaphore = 0;\n\n\t\t\t\tQUnit.pushFailure(\n\t\t\t\t\t\"Called start() while already started (test's semaphore was 0 already)\",\n\t\t\t\t\tsourceFromStacktrace( 2 )\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tresumeProcessing();\n\t},\n\n\t// DEPRECATED: QUnit.stop() will be removed in QUnit 2.0.\n\tstop: function( count ) {\n\n\t\t// If there isn't a test running, don't allow QUnit.stop() to be called\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"Called stop() outside of a test context\" );\n\t\t}\n\n\t\t// If a test is running, adjust its semaphore\n\t\tconfig.current.semaphore += count || 1;\n\n\t\tpauseProcessing();\n\t},\n\n\tconfig: config,\n\n\t// Safe object type checking\n\tis: function( type, obj ) {\n\t\treturn QUnit.objectType( obj ) === type;\n\t},\n\n\tobjectType: function( obj ) {\n\t\tif ( typeof obj === \"undefined\" ) {\n\t\t\treturn \"undefined\";\n\t\t}\n\n\t\t// Consider: typeof null === object\n\t\tif ( obj === null ) {\n\t\t\treturn \"null\";\n\t\t}\n\n\t\tvar match = toString.call( obj ).match( /^\\[object\\s(.*)\\]$/ ),\n\t\t\ttype = match && match[ 1 ] || \"\";\n\n\t\tswitch ( type ) {\n\t\t\tcase \"Number\":\n\t\t\t\tif ( isNaN( obj ) ) {\n\t\t\t\t\treturn \"nan\";\n\t\t\t\t}\n\t\t\t\treturn \"number\";\n\t\t\tcase \"String\":\n\t\t\tcase \"Boolean\":\n\t\t\tcase \"Array\":\n\t\t\tcase \"Date\":\n\t\t\tcase \"RegExp\":\n\t\t\tcase \"Function\":\n\t\t\t\treturn type.toLowerCase();\n\t\t}\n\t\tif ( typeof obj === \"object\" ) {\n\t\t\treturn \"object\";\n\t\t}\n\t\treturn undefined;\n\t},\n\n\textend: extend,\n\n\tload: function() {\n\t\tconfig.pageLoaded = true;\n\n\t\t// Initialize the configuration options\n\t\textend( config, {\n\t\t\tstats: { all: 0, bad: 0 },\n\t\t\tmoduleStats: { all: 0, bad: 0 },\n\t\t\tstarted: 0,\n\t\t\tupdateRate: 1000,\n\t\t\tautostart: true,\n\t\t\tfilter: \"\"\n\t\t}, true );\n\n\t\tconfig.blocking = false;\n\n\t\tif ( config.autostart ) {\n\t\t\tresumeProcessing();\n\t\t}\n\t}\n});\n\n// Register logging callbacks\n(function() {\n\tvar i, l, key,\n\t\tcallbacks = [ \"begin\", \"done\", \"log\", \"testStart\", \"testDone\",\n\t\t\t\"moduleStart\", \"moduleDone\" ];\n\n\tfunction registerLoggingCallback( key ) {\n\t\tvar loggingCallback = function( callback ) {\n\t\t\tif ( QUnit.objectType( callback ) !== \"function\" ) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"QUnit logging methods require a callback function as their first parameters.\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconfig.callbacks[ key ].push( callback );\n\t\t};\n\n\t\t// DEPRECATED: This will be removed on QUnit 2.0.0+\n\t\t// Stores the registered functions allowing restoring\n\t\t// at verifyLoggingCallbacks() if modified\n\t\tloggingCallbacks[ key ] = loggingCallback;\n\n\t\treturn loggingCallback;\n\t}\n\n\tfor ( i = 0, l = callbacks.length; i < l; i++ ) {\n\t\tkey = callbacks[ i ];\n\n\t\t// Initialize key collection of logging callback\n\t\tif ( QUnit.objectType( config.callbacks[ key ] ) === \"undefined\" ) {\n\t\t\tconfig.callbacks[ key ] = [];\n\t\t}\n\n\t\tQUnit[ key ] = registerLoggingCallback( key );\n\t}\n})();\n\n// `onErrorFnPrev` initialized at top of scope\n// Preserve other handlers\nonErrorFnPrev = window.onerror;\n\n// Cover uncaught exceptions\n// Returning true will suppress the default browser handler,\n// returning false will let it run.\nwindow.onerror = function( error, filePath, linerNr ) {\n\tvar ret = false;\n\tif ( onErrorFnPrev ) {\n\t\tret = onErrorFnPrev( error, filePath, linerNr );\n\t}\n\n\t// Treat return value as window.onerror itself does,\n\t// Only do our handling if not suppressed.\n\tif ( ret !== true ) {\n\t\tif ( QUnit.config.current ) {\n\t\t\tif ( QUnit.config.current.ignoreGlobalErrors ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t} else {\n\t\t\tQUnit.test( \"global failure\", extend(function() {\n\t\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t\t}, { validTest: true } ) );\n\t\t}\n\t\treturn false;\n\t}\n\n\treturn ret;\n};\n\nfunction done() {\n\tvar runtime, passed;\n\n\tconfig.autorun = true;\n\n\t// Log the last module results\n\tif ( config.previousModule ) {\n\t\trunLoggingCallbacks( \"moduleDone\", {\n\t\t\tname: config.previousModule.name,\n\t\t\ttests: config.previousModule.tests,\n\t\t\tfailed: config.moduleStats.bad,\n\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\ttotal: config.moduleStats.all,\n\t\t\truntime: now() - config.moduleStats.started\n\t\t});\n\t}\n\tdelete config.previousModule;\n\n\truntime = now() - config.started;\n\tpassed = config.stats.all - config.stats.bad;\n\n\trunLoggingCallbacks( \"done\", {\n\t\tfailed: config.stats.bad,\n\t\tpassed: passed,\n\t\ttotal: config.stats.all,\n\t\truntime: runtime\n\t});\n}\n\n// Doesn't support IE6 to IE9\n// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\nfunction extractStacktrace( e, offset ) {\n\toffset = offset === undefined ? 4 : offset;\n\n\tvar stack, include, i;\n\n\tif ( e.stacktrace ) {\n\n\t\t// Opera 12.x\n\t\treturn e.stacktrace.split( \"\\n\" )[ offset + 3 ];\n\t} else if ( e.stack ) {\n\n\t\t// Firefox, Chrome, Safari 6+, IE10+, PhantomJS and Node\n\t\tstack = e.stack.split( \"\\n\" );\n\t\tif ( /^error$/i.test( stack[ 0 ] ) ) {\n\t\t\tstack.shift();\n\t\t}\n\t\tif ( fileName ) {\n\t\t\tinclude = [];\n\t\t\tfor ( i = offset; i < stack.length; i++ ) {\n\t\t\t\tif ( stack[ i ].indexOf( fileName ) !== -1 ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tinclude.push( stack[ i ] );\n\t\t\t}\n\t\t\tif ( include.length ) {\n\t\t\t\treturn include.join( \"\\n\" );\n\t\t\t}\n\t\t}\n\t\treturn stack[ offset ];\n\t} else if ( e.sourceURL ) {\n\n\t\t// Safari < 6\n\t\t// exclude useless self-reference for generated Error objects\n\t\tif ( /qunit.js$/.test( e.sourceURL ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// for actual exceptions, this is useful\n\t\treturn e.sourceURL + \":\" + e.line;\n\t}\n}\n\nfunction sourceFromStacktrace( offset ) {\n\tvar e = new Error();\n\tif ( !e.stack ) {\n\t\ttry {\n\t\t\tthrow e;\n\t\t} catch ( err ) {\n\t\t\t// This should already be true in most browsers\n\t\t\te = err;\n\t\t}\n\t}\n\treturn extractStacktrace( e, offset );\n}\n\nfunction synchronize( callback, last ) {\n\tif ( QUnit.objectType( callback ) === \"array\" ) {\n\t\twhile ( callback.length ) {\n\t\t\tsynchronize( callback.shift() );\n\t\t}\n\t\treturn;\n\t}\n\tconfig.queue.push( callback );\n\n\tif ( config.autorun && !config.blocking ) {\n\t\tprocess( last );\n\t}\n}\n\nfunction process( last ) {\n\tfunction next() {\n\t\tprocess( last );\n\t}\n\tvar start = now();\n\tconfig.depth = ( config.depth || 0 ) + 1;\n\n\twhile ( config.queue.length && !config.blocking ) {\n\t\tif ( !defined.setTimeout || config.updateRate <= 0 ||\n\t\t\t\t( ( now() - start ) < config.updateRate ) ) {\n\t\t\tif ( config.current ) {\n\n\t\t\t\t// Reset async tracking for each phase of the Test lifecycle\n\t\t\t\tconfig.current.usedAsync = false;\n\t\t\t}\n\t\t\tconfig.queue.shift()();\n\t\t} else {\n\t\t\tsetTimeout( next, 13 );\n\t\t\tbreak;\n\t\t}\n\t}\n\tconfig.depth--;\n\tif ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {\n\t\tdone();\n\t}\n}\n\nfunction begin() {\n\tvar i, l,\n\t\tmodulesLog = [];\n\n\t// If the test run hasn't officially begun yet\n\tif ( !config.started ) {\n\n\t\t// Record the time of the test run's beginning\n\t\tconfig.started = now();\n\n\t\tverifyLoggingCallbacks();\n\n\t\t// Delete the loose unnamed module if unused.\n\t\tif ( config.modules[ 0 ].name === \"\" && config.modules[ 0 ].tests.length === 0 ) {\n\t\t\tconfig.modules.shift();\n\t\t}\n\n\t\t// Avoid unnecessary information by not logging modules' test environments\n\t\tfor ( i = 0, l = config.modules.length; i < l; i++ ) {\n\t\t\tmodulesLog.push({\n\t\t\t\tname: config.modules[ i ].name,\n\t\t\t\ttests: config.modules[ i ].tests\n\t\t\t});\n\t\t}\n\n\t\t// The test run is officially beginning now\n\t\trunLoggingCallbacks( \"begin\", {\n\t\t\ttotalTests: Test.count,\n\t\t\tmodules: modulesLog\n\t\t});\n\t}\n\n\tconfig.blocking = false;\n\tprocess( true );\n}\n\nfunction resumeProcessing() {\n\trunStarted = true;\n\n\t// A slight delay to allow this iteration of the event loop to finish (more assertions, etc.)\n\tif ( defined.setTimeout ) {\n\t\tsetTimeout(function() {\n\t\t\tif ( config.current && config.current.semaphore > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( config.timeout ) {\n\t\t\t\tclearTimeout( config.timeout );\n\t\t\t}\n\n\t\t\tbegin();\n\t\t}, 13 );\n\t} else {\n\t\tbegin();\n\t}\n}\n\nfunction pauseProcessing() {\n\tconfig.blocking = true;\n\n\tif ( config.testTimeout && defined.setTimeout ) {\n\t\tclearTimeout( config.timeout );\n\t\tconfig.timeout = setTimeout(function() {\n\t\t\tif ( config.current ) {\n\t\t\t\tconfig.current.semaphore = 0;\n\t\t\t\tQUnit.pushFailure( \"Test timed out\", sourceFromStacktrace( 2 ) );\n\t\t\t} else {\n\t\t\t\tthrow new Error( \"Test timed out\" );\n\t\t\t}\n\t\t\tresumeProcessing();\n\t\t}, config.testTimeout );\n\t}\n}\n\nfunction saveGlobal() {\n\tconfig.pollution = [];\n\n\tif ( config.noglobals ) {\n\t\tfor ( var key in window ) {\n\t\t\tif ( hasOwn.call( window, key ) ) {\n\t\t\t\t// in Opera sometimes DOM element ids show up here, ignore them\n\t\t\t\tif ( /^qunit-test-output/.test( key ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconfig.pollution.push( key );\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction checkPollution() {\n\tvar newGlobals,\n\t\tdeletedGlobals,\n\t\told = config.pollution;\n\n\tsaveGlobal();\n\n\tnewGlobals = diff( config.pollution, old );\n\tif ( newGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Introduced global variable(s): \" + newGlobals.join( \", \" ) );\n\t}\n\n\tdeletedGlobals = diff( old, config.pollution );\n\tif ( deletedGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Deleted global variable(s): \" + deletedGlobals.join( \", \" ) );\n\t}\n}\n\n// returns a new Array with the elements that are in a but not in b\nfunction diff( a, b ) {\n\tvar i, j,\n\t\tresult = a.slice();\n\n\tfor ( i = 0; i < result.length; i++ ) {\n\t\tfor ( j = 0; j < b.length; j++ ) {\n\t\t\tif ( result[ i ] === b[ j ] ) {\n\t\t\t\tresult.splice( i, 1 );\n\t\t\t\ti--;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction extend( a, b, undefOnly ) {\n\tfor ( var prop in b ) {\n\t\tif ( hasOwn.call( b, prop ) ) {\n\n\t\t\t// Avoid \"Member not found\" error in IE8 caused by messing with window.constructor\n\t\t\tif ( !( prop === \"constructor\" && a === window ) ) {\n\t\t\t\tif ( b[ prop ] === undefined ) {\n\t\t\t\t\tdelete a[ prop ];\n\t\t\t\t} else if ( !( undefOnly && typeof a[ prop ] !== \"undefined\" ) ) {\n\t\t\t\t\ta[ prop ] = b[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a;\n}\n\nfunction runLoggingCallbacks( key, args ) {\n\tvar i, l, callbacks;\n\n\tcallbacks = config.callbacks[ key ];\n\tfor ( i = 0, l = callbacks.length; i < l; i++ ) {\n\t\tcallbacks[ i ]( args );\n\t}\n}\n\n// DEPRECATED: This will be removed on 2.0.0+\n// This function verifies if the loggingCallbacks were modified by the user\n// If so, it will restore it, assign the given callback and print a console warning\nfunction verifyLoggingCallbacks() {\n\tvar loggingCallback, userCallback;\n\n\tfor ( loggingCallback in loggingCallbacks ) {\n\t\tif ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) {\n\n\t\t\tuserCallback = QUnit[ loggingCallback ];\n\n\t\t\t// Restore the callback function\n\t\t\tQUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ];\n\n\t\t\t// Assign the deprecated given callback\n\t\t\tQUnit[ loggingCallback ]( userCallback );\n\n\t\t\tif ( window.console && window.console.warn ) {\n\t\t\t\twindow.console.warn(\n\t\t\t\t\t\"QUnit.\" + loggingCallback + \" was replaced with a new value.\\n\" +\n\t\t\t\t\t\"Please, check out the documentation on how to apply logging callbacks.\\n\" +\n\t\t\t\t\t\"Reference: http://api.qunitjs.com/category/callbacks/\"\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\n// from jquery.js\nfunction inArray( elem, array ) {\n\tif ( array.indexOf ) {\n\t\treturn array.indexOf( elem );\n\t}\n\n\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n\t\tif ( array[ i ] === elem ) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\nfunction Test( settings ) {\n\tvar i, l;\n\n\t++Test.count;\n\n\textend( this, settings );\n\tthis.assertions = [];\n\tthis.semaphore = 0;\n\tthis.usedAsync = false;\n\tthis.module = config.currentModule;\n\tthis.stack = sourceFromStacktrace( 3 );\n\n\t// Register unique strings\n\tfor ( i = 0, l = this.module.tests; i < l.length; i++ ) {\n\t\tif ( this.module.tests[ i ].name === this.testName ) {\n\t\t\tthis.testName += \" \";\n\t\t}\n\t}\n\n\tthis.testId = generateHash( this.module.name, this.testName );\n\n\tthis.module.tests.push({\n\t\tname: this.testName,\n\t\ttestId: this.testId\n\t});\n\n\tif ( settings.skip ) {\n\n\t\t// Skipped tests will fully ignore any sent callback\n\t\tthis.callback = function() {};\n\t\tthis.async = false;\n\t\tthis.expected = 0;\n\t} else {\n\t\tthis.assert = new Assert( this );\n\t}\n}\n\nTest.count = 0;\n\nTest.prototype = {\n\tbefore: function() {\n\t\tif (\n\n\t\t\t// Emit moduleStart when we're switching from one module to another\n\t\t\tthis.module !== config.previousModule ||\n\n\t\t\t\t// They could be equal (both undefined) but if the previousModule property doesn't\n\t\t\t\t// yet exist it means this is the first test in a suite that isn't wrapped in a\n\t\t\t\t// module, in which case we'll just emit a moduleStart event for 'undefined'.\n\t\t\t\t// Without this, reporters can get testStart before moduleStart  which is a problem.\n\t\t\t\t!hasOwn.call( config, \"previousModule\" )\n\t\t) {\n\t\t\tif ( hasOwn.call( config, \"previousModule\" ) ) {\n\t\t\t\trunLoggingCallbacks( \"moduleDone\", {\n\t\t\t\t\tname: config.previousModule.name,\n\t\t\t\t\ttests: config.previousModule.tests,\n\t\t\t\t\tfailed: config.moduleStats.bad,\n\t\t\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\t\t\ttotal: config.moduleStats.all,\n\t\t\t\t\truntime: now() - config.moduleStats.started\n\t\t\t\t});\n\t\t\t}\n\t\t\tconfig.previousModule = this.module;\n\t\t\tconfig.moduleStats = { all: 0, bad: 0, started: now() };\n\t\t\trunLoggingCallbacks( \"moduleStart\", {\n\t\t\t\tname: this.module.name,\n\t\t\t\ttests: this.module.tests\n\t\t\t});\n\t\t}\n\n\t\tconfig.current = this;\n\n\t\tthis.testEnvironment = extend( {}, this.module.testEnvironment );\n\t\tdelete this.testEnvironment.beforeEach;\n\t\tdelete this.testEnvironment.afterEach;\n\n\t\tthis.started = now();\n\t\trunLoggingCallbacks( \"testStart\", {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module.name,\n\t\t\ttestId: this.testId\n\t\t});\n\n\t\tif ( !config.pollution ) {\n\t\t\tsaveGlobal();\n\t\t}\n\t},\n\n\trun: function() {\n\t\tvar promise;\n\n\t\tconfig.current = this;\n\n\t\tif ( this.async ) {\n\t\t\tQUnit.stop();\n\t\t}\n\n\t\tthis.callbackStarted = now();\n\n\t\tif ( config.notrycatch ) {\n\t\t\tpromise = this.callback.call( this.testEnvironment, this.assert );\n\t\t\tthis.resolvePromise( promise );\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpromise = this.callback.call( this.testEnvironment, this.assert );\n\t\t\tthis.resolvePromise( promise );\n\t\t} catch ( e ) {\n\t\t\tthis.pushFailure( \"Died on test #\" + ( this.assertions.length + 1 ) + \" \" +\n\t\t\t\tthis.stack + \": \" + ( e.message || e ), extractStacktrace( e, 0 ) );\n\n\t\t\t// else next test will carry the responsibility\n\t\t\tsaveGlobal();\n\n\t\t\t// Restart the tests if they're blocking\n\t\t\tif ( config.blocking ) {\n\t\t\t\tQUnit.start();\n\t\t\t}\n\t\t}\n\t},\n\n\tafter: function() {\n\t\tcheckPollution();\n\t},\n\n\tqueueHook: function( hook, hookName ) {\n\t\tvar promise,\n\t\t\ttest = this;\n\t\treturn function runHook() {\n\t\t\tconfig.current = test;\n\t\t\tif ( config.notrycatch ) {\n\t\t\t\tpromise = hook.call( test.testEnvironment, test.assert );\n\t\t\t\ttest.resolvePromise( promise, hookName );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tpromise = hook.call( test.testEnvironment, test.assert );\n\t\t\t\ttest.resolvePromise( promise, hookName );\n\t\t\t} catch ( error ) {\n\t\t\t\ttest.pushFailure( hookName + \" failed on \" + test.testName + \": \" +\n\t\t\t\t\t( error.message || error ), extractStacktrace( error, 0 ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t// Currently only used for module level hooks, can be used to add global level ones\n\thooks: function( handler ) {\n\t\tvar hooks = [];\n\n\t\t// Hooks are ignored on skipped tests\n\t\tif ( this.skip ) {\n\t\t\treturn hooks;\n\t\t}\n\n\t\tif ( this.module.testEnvironment &&\n\t\t\t\tQUnit.objectType( this.module.testEnvironment[ handler ] ) === \"function\" ) {\n\t\t\thooks.push( this.queueHook( this.module.testEnvironment[ handler ], handler ) );\n\t\t}\n\n\t\treturn hooks;\n\t},\n\n\tfinish: function() {\n\t\tconfig.current = this;\n\t\tif ( config.requireExpects && this.expected === null ) {\n\t\t\tthis.pushFailure( \"Expected number of assertions to be defined, but expect() was \" +\n\t\t\t\t\"not called.\", this.stack );\n\t\t} else if ( this.expected !== null && this.expected !== this.assertions.length ) {\n\t\t\tthis.pushFailure( \"Expected \" + this.expected + \" assertions, but \" +\n\t\t\t\tthis.assertions.length + \" were run\", this.stack );\n\t\t} else if ( this.expected === null && !this.assertions.length ) {\n\t\t\tthis.pushFailure( \"Expected at least one assertion, but none were run - call \" +\n\t\t\t\t\"expect(0) to accept zero assertions.\", this.stack );\n\t\t}\n\n\t\tvar i,\n\t\t\tbad = 0;\n\n\t\tthis.runtime = now() - this.started;\n\t\tconfig.stats.all += this.assertions.length;\n\t\tconfig.moduleStats.all += this.assertions.length;\n\n\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n\t\t\tif ( !this.assertions[ i ].result ) {\n\t\t\t\tbad++;\n\t\t\t\tconfig.stats.bad++;\n\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t}\n\t\t}\n\n\t\trunLoggingCallbacks( \"testDone\", {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module.name,\n\t\t\tskipped: !!this.skip,\n\t\t\tfailed: bad,\n\t\t\tpassed: this.assertions.length - bad,\n\t\t\ttotal: this.assertions.length,\n\t\t\truntime: this.runtime,\n\n\t\t\t// HTML Reporter use\n\t\t\tassertions: this.assertions,\n\t\t\ttestId: this.testId,\n\n\t\t\t// DEPRECATED: this property will be removed in 2.0.0, use runtime instead\n\t\t\tduration: this.runtime\n\t\t});\n\n\t\t// QUnit.reset() is deprecated and will be replaced for a new\n\t\t// fixture reset function on QUnit 2.0/2.1.\n\t\t// It's still called here for backwards compatibility handling\n\t\tQUnit.reset();\n\n\t\tconfig.current = undefined;\n\t},\n\n\tqueue: function() {\n\t\tvar bad,\n\t\t\ttest = this;\n\n\t\tif ( !this.valid() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfunction run() {\n\n\t\t\t// each of these can by async\n\t\t\tsynchronize([\n\t\t\t\tfunction() {\n\t\t\t\t\ttest.before();\n\t\t\t\t},\n\n\t\t\t\ttest.hooks( \"beforeEach\" ),\n\n\t\t\t\tfunction() {\n\t\t\t\t\ttest.run();\n\t\t\t\t},\n\n\t\t\t\ttest.hooks( \"afterEach\" ).reverse(),\n\n\t\t\t\tfunction() {\n\t\t\t\t\ttest.after();\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\ttest.finish();\n\t\t\t\t}\n\t\t\t]);\n\t\t}\n\n\t\t// `bad` initialized at top of scope\n\t\t// defer when previous test run passed, if storage is available\n\t\tbad = QUnit.config.reorder && defined.sessionStorage &&\n\t\t\t\t+sessionStorage.getItem( \"qunit-test-\" + this.module.name + \"-\" + this.testName );\n\n\t\tif ( bad ) {\n\t\t\trun();\n\t\t} else {\n\t\t\tsynchronize( run, true );\n\t\t}\n\t},\n\n\tpush: function( result, actual, expected, message ) {\n\t\tvar source,\n\t\t\tdetails = {\n\t\t\t\tmodule: this.module.name,\n\t\t\t\tname: this.testName,\n\t\t\t\tresult: result,\n\t\t\t\tmessage: message,\n\t\t\t\tactual: actual,\n\t\t\t\texpected: expected,\n\t\t\t\ttestId: this.testId,\n\t\t\t\truntime: now() - this.started\n\t\t\t};\n\n\t\tif ( !result ) {\n\t\t\tsource = sourceFromStacktrace();\n\n\t\t\tif ( source ) {\n\t\t\t\tdetails.source = source;\n\t\t\t}\n\t\t}\n\n\t\trunLoggingCallbacks( \"log\", details );\n\n\t\tthis.assertions.push({\n\t\t\tresult: !!result,\n\t\t\tmessage: message\n\t\t});\n\t},\n\n\tpushFailure: function( message, source, actual ) {\n\t\tif ( !this instanceof Test ) {\n\t\t\tthrow new Error( \"pushFailure() assertion outside test context, was \" +\n\t\t\t\tsourceFromStacktrace( 2 ) );\n\t\t}\n\n\t\tvar details = {\n\t\t\t\tmodule: this.module.name,\n\t\t\t\tname: this.testName,\n\t\t\t\tresult: false,\n\t\t\t\tmessage: message || \"error\",\n\t\t\t\tactual: actual || null,\n\t\t\t\ttestId: this.testId,\n\t\t\t\truntime: now() - this.started\n\t\t\t};\n\n\t\tif ( source ) {\n\t\t\tdetails.source = source;\n\t\t}\n\n\t\trunLoggingCallbacks( \"log\", details );\n\n\t\tthis.assertions.push({\n\t\t\tresult: false,\n\t\t\tmessage: message\n\t\t});\n\t},\n\n\tresolvePromise: function( promise, phase ) {\n\t\tvar then, message,\n\t\t\ttest = this;\n\t\tif ( promise != null ) {\n\t\t\tthen = promise.then;\n\t\t\tif ( QUnit.objectType( then ) === \"function\" ) {\n\t\t\t\tQUnit.stop();\n\t\t\t\tthen.call(\n\t\t\t\t\tpromise,\n\t\t\t\t\tQUnit.start,\n\t\t\t\t\tfunction( error ) {\n\t\t\t\t\t\tmessage = \"Promise rejected \" +\n\t\t\t\t\t\t\t( !phase ? \"during\" : phase.replace( /Each$/, \"\" ) ) +\n\t\t\t\t\t\t\t\" \" + test.testName + \": \" + ( error.message || error );\n\t\t\t\t\t\ttest.pushFailure( message, extractStacktrace( error, 0 ) );\n\n\t\t\t\t\t\t// else next test will carry the responsibility\n\t\t\t\t\t\tsaveGlobal();\n\n\t\t\t\t\t\t// Unblock\n\t\t\t\t\t\tQUnit.start();\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\n\tvalid: function() {\n\t\tvar include,\n\t\t\tfilter = config.filter,\n\t\t\tmodule = QUnit.urlParams.module && QUnit.urlParams.module.toLowerCase(),\n\t\t\tfullName = ( this.module.name + \": \" + this.testName ).toLowerCase();\n\n\t\t// Internally-generated tests are always valid\n\t\tif ( this.callback && this.callback.validTest ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( config.testId.length > 0 && inArray( this.testId, config.testId ) < 0 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( module && ( !this.module.name || this.module.name.toLowerCase() !== module ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !filter ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tinclude = filter.charAt( 0 ) !== \"!\";\n\t\tif ( !include ) {\n\t\t\tfilter = filter.toLowerCase().slice( 1 );\n\t\t}\n\n\t\t// If the filter matches, we need to honour include\n\t\tif ( fullName.indexOf( filter ) !== -1 ) {\n\t\t\treturn include;\n\t\t}\n\n\t\t// Otherwise, do the opposite\n\t\treturn !include;\n\t}\n\n};\n\n// Resets the test setup. Useful for tests that modify the DOM.\n/*\nDEPRECATED: Use multiple tests instead of resetting inside a test.\nUse testStart or testDone for custom cleanup.\nThis method will throw an error in 2.0, and will be removed in 2.1\n*/\nQUnit.reset = function() {\n\n\t// Return on non-browser environments\n\t// This is necessary to not break on node tests\n\tif ( typeof window === \"undefined\" ) {\n\t\treturn;\n\t}\n\n\tvar fixture = defined.document && document.getElementById &&\n\t\t\tdocument.getElementById( \"qunit-fixture\" );\n\n\tif ( fixture ) {\n\t\tfixture.innerHTML = config.fixture;\n\t}\n};\n\nQUnit.pushFailure = function() {\n\tif ( !QUnit.config.current ) {\n\t\tthrow new Error( \"pushFailure() assertion outside test context, in \" +\n\t\t\tsourceFromStacktrace( 2 ) );\n\t}\n\n\t// Gets current test obj\n\tvar currentTest = QUnit.config.current;\n\n\treturn currentTest.pushFailure.apply( currentTest, arguments );\n};\n\n// Based on Java's String.hashCode, a simple but not\n// rigorously collision resistant hashing function\nfunction generateHash( module, testName ) {\n\tvar hex,\n\t\ti = 0,\n\t\thash = 0,\n\t\tstr = module + \"\\x1C\" + testName,\n\t\tlen = str.length;\n\n\tfor ( ; i < len; i++ ) {\n\t\thash  = ( ( hash << 5 ) - hash ) + str.charCodeAt( i );\n\t\thash |= 0;\n\t}\n\n\t// Convert the possibly negative integer hash code into an 8 character hex string, which isn't\n\t// strictly necessary but increases user understanding that the id is a SHA-like hash\n\thex = ( 0x100000000 + hash ).toString( 16 );\n\tif ( hex.length < 8 ) {\n\t\thex = \"0000000\" + hex;\n\t}\n\n\treturn hex.slice( -8 );\n}\n\nfunction Assert( testContext ) {\n\tthis.test = testContext;\n}\n\n// Assert helpers\nQUnit.assert = Assert.prototype = {\n\n\t// Specify the number of expected assertions to guarantee that failed test\n\t// (no assertions are run at all) don't slip through.\n\texpect: function( asserts ) {\n\t\tif ( arguments.length === 1 ) {\n\t\t\tthis.test.expected = asserts;\n\t\t} else {\n\t\t\treturn this.test.expected;\n\t\t}\n\t},\n\n\t// Increment this Test's semaphore counter, then return a single-use function that\n\t// decrements that counter a maximum of once.\n\tasync: function() {\n\t\tvar test = this.test,\n\t\t\tpopped = false;\n\n\t\ttest.semaphore += 1;\n\t\ttest.usedAsync = true;\n\t\tpauseProcessing();\n\n\t\treturn function done() {\n\t\t\tif ( !popped ) {\n\t\t\t\ttest.semaphore -= 1;\n\t\t\t\tpopped = true;\n\t\t\t\tresumeProcessing();\n\t\t\t} else {\n\t\t\t\ttest.pushFailure( \"Called the callback returned from `assert.async` more than once\",\n\t\t\t\t\tsourceFromStacktrace( 2 ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t// Exports test.push() to the user API\n\tpush: function( /* result, actual, expected, message */ ) {\n\t\tvar assert = this,\n\t\t\tcurrentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current;\n\n\t\t// Backwards compatibility fix.\n\t\t// Allows the direct use of global exported assertions and QUnit.assert.*\n\t\t// Although, it's use is not recommended as it can leak assertions\n\t\t// to other tests from async tests, because we only get a reference to the current test,\n\t\t// not exactly the test where assertion were intended to be called.\n\t\tif ( !currentTest ) {\n\t\t\tthrow new Error( \"assertion outside test context, in \" + sourceFromStacktrace( 2 ) );\n\t\t}\n\n\t\tif ( currentTest.usedAsync === true && currentTest.semaphore === 0 ) {\n\t\t\tcurrentTest.pushFailure( \"Assertion after the final `assert.async` was resolved\",\n\t\t\t\tsourceFromStacktrace( 2 ) );\n\n\t\t\t// Allow this assertion to continue running anyway...\n\t\t}\n\n\t\tif ( !( assert instanceof Assert ) ) {\n\t\t\tassert = currentTest.assert;\n\t\t}\n\t\treturn assert.test.push.apply( assert.test, arguments );\n\t},\n\n\t/**\n\t * Asserts rough true-ish result.\n\t * @name ok\n\t * @function\n\t * @example ok( \"asdfasdf\".length > 5, \"There must be at least 5 chars\" );\n\t */\n\tok: function( result, message ) {\n\t\tmessage = message || ( result ? \"okay\" : \"failed, expected argument to be truthy, was: \" +\n\t\t\tQUnit.dump.parse( result ) );\n\t\tthis.push( !!result, result, true, message );\n\t},\n\n\t/**\n\t * Assert that the first two arguments are equal, with an optional message.\n\t * Prints out both actual and expected values.\n\t * @name equal\n\t * @function\n\t * @example equal( format( \"{0} bytes.\", 2), \"2 bytes.\", \"replaces {0} with next argument\" );\n\t */\n\tequal: function( actual, expected, message ) {\n\t\t/*jshint eqeqeq:false */\n\t\tthis.push( expected == actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name notEqual\n\t * @function\n\t */\n\tnotEqual: function( actual, expected, message ) {\n\t\t/*jshint eqeqeq:false */\n\t\tthis.push( expected != actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name propEqual\n\t * @function\n\t */\n\tpropEqual: function( actual, expected, message ) {\n\t\tactual = objectValues( actual );\n\t\texpected = objectValues( expected );\n\t\tthis.push( QUnit.equiv( actual, expected ), actual, expected, message );\n\t},\n\n\t/**\n\t * @name notPropEqual\n\t * @function\n\t */\n\tnotPropEqual: function( actual, expected, message ) {\n\t\tactual = objectValues( actual );\n\t\texpected = objectValues( expected );\n\t\tthis.push( !QUnit.equiv( actual, expected ), actual, expected, message );\n\t},\n\n\t/**\n\t * @name deepEqual\n\t * @function\n\t */\n\tdeepEqual: function( actual, expected, message ) {\n\t\tthis.push( QUnit.equiv( actual, expected ), actual, expected, message );\n\t},\n\n\t/**\n\t * @name notDeepEqual\n\t * @function\n\t */\n\tnotDeepEqual: function( actual, expected, message ) {\n\t\tthis.push( !QUnit.equiv( actual, expected ), actual, expected, message );\n\t},\n\n\t/**\n\t * @name strictEqual\n\t * @function\n\t */\n\tstrictEqual: function( actual, expected, message ) {\n\t\tthis.push( expected === actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name notStrictEqual\n\t * @function\n\t */\n\tnotStrictEqual: function( actual, expected, message ) {\n\t\tthis.push( expected !== actual, actual, expected, message );\n\t},\n\n\t\"throws\": function( block, expected, message ) {\n\t\tvar actual, expectedType,\n\t\t\texpectedOutput = expected,\n\t\t\tok = false;\n\n\t\t// 'expected' is optional unless doing string comparison\n\t\tif ( message == null && typeof expected === \"string\" ) {\n\t\t\tmessage = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tthis.test.ignoreGlobalErrors = true;\n\t\ttry {\n\t\t\tblock.call( this.test.testEnvironment );\n\t\t} catch (e) {\n\t\t\tactual = e;\n\t\t}\n\t\tthis.test.ignoreGlobalErrors = false;\n\n\t\tif ( actual ) {\n\t\t\texpectedType = QUnit.objectType( expected );\n\n\t\t\t// we don't want to validate thrown error\n\t\t\tif ( !expected ) {\n\t\t\t\tok = true;\n\t\t\t\texpectedOutput = null;\n\n\t\t\t// expected is a regexp\n\t\t\t} else if ( expectedType === \"regexp\" ) {\n\t\t\t\tok = expected.test( errorString( actual ) );\n\n\t\t\t// expected is a string\n\t\t\t} else if ( expectedType === \"string\" ) {\n\t\t\t\tok = expected === errorString( actual );\n\n\t\t\t// expected is a constructor, maybe an Error constructor\n\t\t\t} else if ( expectedType === \"function\" && actual instanceof expected ) {\n\t\t\t\tok = true;\n\n\t\t\t// expected is an Error object\n\t\t\t} else if ( expectedType === \"object\" ) {\n\t\t\t\tok = actual instanceof expected.constructor &&\n\t\t\t\t\tactual.name === expected.name &&\n\t\t\t\t\tactual.message === expected.message;\n\n\t\t\t// expected is a validation function which returns true if validation passed\n\t\t\t} else if ( expectedType === \"function\" && expected.call( {}, actual ) === true ) {\n\t\t\t\texpectedOutput = null;\n\t\t\t\tok = true;\n\t\t\t}\n\n\t\t\tthis.push( ok, actual, expectedOutput, message );\n\t\t} else {\n\t\t\tthis.test.pushFailure( message, null, \"No exception was thrown.\" );\n\t\t}\n\t}\n};\n\n// Provide an alternative to assert.throws(), for enviroments that consider throws a reserved word\n// Known to us are: Closure Compiler, Narwhal\n(function() {\n\t/*jshint sub:true */\n\tAssert.prototype.raises = Assert.prototype[ \"throws\" ];\n}());\n\n// Test for equality any JavaScript type.\n// Author: Philippe Rathé <prathe@gmail.com>\nQUnit.equiv = (function() {\n\n\t// Call the o related callback with the given arguments.\n\tfunction bindCallbacks( o, callbacks, args ) {\n\t\tvar prop = QUnit.objectType( o );\n\t\tif ( prop ) {\n\t\t\tif ( QUnit.objectType( callbacks[ prop ] ) === \"function\" ) {\n\t\t\t\treturn callbacks[ prop ].apply( callbacks, args );\n\t\t\t} else {\n\t\t\t\treturn callbacks[ prop ]; // or undefined\n\t\t\t}\n\t\t}\n\t}\n\n\t// the real equiv function\n\tvar innerEquiv,\n\n\t\t// stack to decide between skip/abort functions\n\t\tcallers = [],\n\n\t\t// stack to avoiding loops from circular referencing\n\t\tparents = [],\n\t\tparentsB = [],\n\n\t\tgetProto = Object.getPrototypeOf || function( obj ) {\n\t\t\t/* jshint camelcase: false, proto: true */\n\t\t\treturn obj.__proto__;\n\t\t},\n\t\tcallbacks = (function() {\n\n\t\t\t// for string, boolean, number and null\n\t\t\tfunction useStrictEquality( b, a ) {\n\n\t\t\t\t/*jshint eqeqeq:false */\n\t\t\t\tif ( b instanceof a.constructor || a instanceof b.constructor ) {\n\n\t\t\t\t\t// to catch short annotation VS 'new' annotation of a\n\t\t\t\t\t// declaration\n\t\t\t\t\t// e.g. var i = 1;\n\t\t\t\t\t// var j = new Number(1);\n\t\t\t\t\treturn a == b;\n\t\t\t\t} else {\n\t\t\t\t\treturn a === b;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t\"string\": useStrictEquality,\n\t\t\t\t\"boolean\": useStrictEquality,\n\t\t\t\t\"number\": useStrictEquality,\n\t\t\t\t\"null\": useStrictEquality,\n\t\t\t\t\"undefined\": useStrictEquality,\n\n\t\t\t\t\"nan\": function( b ) {\n\t\t\t\t\treturn isNaN( b );\n\t\t\t\t},\n\n\t\t\t\t\"date\": function( b, a ) {\n\t\t\t\t\treturn QUnit.objectType( b ) === \"date\" && a.valueOf() === b.valueOf();\n\t\t\t\t},\n\n\t\t\t\t\"regexp\": function( b, a ) {\n\t\t\t\t\treturn QUnit.objectType( b ) === \"regexp\" &&\n\n\t\t\t\t\t\t// the regex itself\n\t\t\t\t\t\ta.source === b.source &&\n\n\t\t\t\t\t\t// and its modifiers\n\t\t\t\t\t\ta.global === b.global &&\n\n\t\t\t\t\t\t// (gmi) ...\n\t\t\t\t\t\ta.ignoreCase === b.ignoreCase &&\n\t\t\t\t\t\ta.multiline === b.multiline &&\n\t\t\t\t\t\ta.sticky === b.sticky;\n\t\t\t\t},\n\n\t\t\t\t// - skip when the property is a method of an instance (OOP)\n\t\t\t\t// - abort otherwise,\n\t\t\t\t// initial === would have catch identical references anyway\n\t\t\t\t\"function\": function() {\n\t\t\t\t\tvar caller = callers[ callers.length - 1 ];\n\t\t\t\t\treturn caller !== Object && typeof caller !== \"undefined\";\n\t\t\t\t},\n\n\t\t\t\t\"array\": function( b, a ) {\n\t\t\t\t\tvar i, j, len, loop, aCircular, bCircular;\n\n\t\t\t\t\t// b could be an object literal here\n\t\t\t\t\tif ( QUnit.objectType( b ) !== \"array\" ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tlen = a.length;\n\t\t\t\t\tif ( len !== b.length ) {\n\t\t\t\t\t\t// safe and faster\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// track reference to avoid circular references\n\t\t\t\t\tparents.push( a );\n\t\t\t\t\tparentsB.push( b );\n\t\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\t\tloop = false;\n\t\t\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\t\t\taCircular = parents[ j ] === a[ i ];\n\t\t\t\t\t\t\tbCircular = parentsB[ j ] === b[ i ];\n\t\t\t\t\t\t\tif ( aCircular || bCircular ) {\n\t\t\t\t\t\t\t\tif ( a[ i ] === b[ i ] || aCircular && bCircular ) {\n\t\t\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tparents.pop();\n\t\t\t\t\t\t\t\t\tparentsB.pop();\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {\n\t\t\t\t\t\t\tparents.pop();\n\t\t\t\t\t\t\tparentsB.pop();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tparents.pop();\n\t\t\t\t\tparentsB.pop();\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\n\t\t\t\t\"object\": function( b, a ) {\n\n\t\t\t\t\t/*jshint forin:false */\n\t\t\t\t\tvar i, j, loop, aCircular, bCircular,\n\t\t\t\t\t\t// Default to true\n\t\t\t\t\t\teq = true,\n\t\t\t\t\t\taProperties = [],\n\t\t\t\t\t\tbProperties = [];\n\n\t\t\t\t\t// comparing constructors is more strict than using\n\t\t\t\t\t// instanceof\n\t\t\t\t\tif ( a.constructor !== b.constructor ) {\n\n\t\t\t\t\t\t// Allow objects with no prototype to be equivalent to\n\t\t\t\t\t\t// objects with Object as their constructor.\n\t\t\t\t\t\tif ( !( ( getProto( a ) === null && getProto( b ) === Object.prototype ) ||\n\t\t\t\t\t\t\t( getProto( b ) === null && getProto( a ) === Object.prototype ) ) ) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// stack constructor before traversing properties\n\t\t\t\t\tcallers.push( a.constructor );\n\n\t\t\t\t\t// track reference to avoid circular references\n\t\t\t\t\tparents.push( a );\n\t\t\t\t\tparentsB.push( b );\n\n\t\t\t\t\t// be strict: don't ensure hasOwnProperty and go deep\n\t\t\t\t\tfor ( i in a ) {\n\t\t\t\t\t\tloop = false;\n\t\t\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\t\t\taCircular = parents[ j ] === a[ i ];\n\t\t\t\t\t\t\tbCircular = parentsB[ j ] === b[ i ];\n\t\t\t\t\t\t\tif ( aCircular || bCircular ) {\n\t\t\t\t\t\t\t\tif ( a[ i ] === b[ i ] || aCircular && bCircular ) {\n\t\t\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\teq = false;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\taProperties.push( i );\n\t\t\t\t\t\tif ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {\n\t\t\t\t\t\t\teq = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tparents.pop();\n\t\t\t\t\tparentsB.pop();\n\t\t\t\t\tcallers.pop(); // unstack, we are done\n\n\t\t\t\t\tfor ( i in b ) {\n\t\t\t\t\t\tbProperties.push( i ); // collect b's properties\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ensures identical properties name\n\t\t\t\t\treturn eq && innerEquiv( aProperties.sort(), bProperties.sort() );\n\t\t\t\t}\n\t\t\t};\n\t\t}());\n\n\tinnerEquiv = function() { // can take multiple arguments\n\t\tvar args = [].slice.apply( arguments );\n\t\tif ( args.length < 2 ) {\n\t\t\treturn true; // end transition\n\t\t}\n\n\t\treturn ( (function( a, b ) {\n\t\t\tif ( a === b ) {\n\t\t\t\treturn true; // catch the most you can\n\t\t\t} else if ( a === null || b === null || typeof a === \"undefined\" ||\n\t\t\t\t\ttypeof b === \"undefined\" ||\n\t\t\t\t\tQUnit.objectType( a ) !== QUnit.objectType( b ) ) {\n\n\t\t\t\t// don't lose time with error prone cases\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\treturn bindCallbacks( a, callbacks, [ b, a ] );\n\t\t\t}\n\n\t\t\t// apply transition with (1..n) arguments\n\t\t}( args[ 0 ], args[ 1 ] ) ) &&\n\t\t\tinnerEquiv.apply( this, args.splice( 1, args.length - 1 ) ) );\n\t};\n\n\treturn innerEquiv;\n}());\n\n// Based on jsDump by Ariel Flesler\n// http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html\nQUnit.dump = (function() {\n\tfunction quote( str ) {\n\t\treturn \"\\\"\" + str.toString().replace( /\"/g, \"\\\\\\\"\" ) + \"\\\"\";\n\t}\n\tfunction literal( o ) {\n\t\treturn o + \"\";\n\t}\n\tfunction join( pre, arr, post ) {\n\t\tvar s = dump.separator(),\n\t\t\tbase = dump.indent(),\n\t\t\tinner = dump.indent( 1 );\n\t\tif ( arr.join ) {\n\t\t\tarr = arr.join( \",\" + s + inner );\n\t\t}\n\t\tif ( !arr ) {\n\t\t\treturn pre + post;\n\t\t}\n\t\treturn [ pre, inner + arr, base + post ].join( s );\n\t}\n\tfunction array( arr, stack ) {\n\t\tvar i = arr.length,\n\t\t\tret = new Array( i );\n\n\t\tif ( dump.maxDepth && dump.depth > dump.maxDepth ) {\n\t\t\treturn \"[object Array]\";\n\t\t}\n\n\t\tthis.up();\n\t\twhile ( i-- ) {\n\t\t\tret[ i ] = this.parse( arr[ i ], undefined, stack );\n\t\t}\n\t\tthis.down();\n\t\treturn join( \"[\", ret, \"]\" );\n\t}\n\n\tvar reName = /^function (\\w+)/,\n\t\tdump = {\n\n\t\t\t// objType is used mostly internally, you can fix a (custom) type in advance\n\t\t\tparse: function( obj, objType, stack ) {\n\t\t\t\tstack = stack || [];\n\t\t\t\tvar res, parser, parserType,\n\t\t\t\t\tinStack = inArray( obj, stack );\n\n\t\t\t\tif ( inStack !== -1 ) {\n\t\t\t\t\treturn \"recursion(\" + ( inStack - stack.length ) + \")\";\n\t\t\t\t}\n\n\t\t\t\tobjType = objType || this.typeOf( obj  );\n\t\t\t\tparser = this.parsers[ objType ];\n\t\t\t\tparserType = typeof parser;\n\n\t\t\t\tif ( parserType === \"function\" ) {\n\t\t\t\t\tstack.push( obj );\n\t\t\t\t\tres = parser.call( this, obj, stack );\n\t\t\t\t\tstack.pop();\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t\treturn ( parserType === \"string\" ) ? parser : this.parsers.error;\n\t\t\t},\n\t\t\ttypeOf: function( obj ) {\n\t\t\t\tvar type;\n\t\t\t\tif ( obj === null ) {\n\t\t\t\t\ttype = \"null\";\n\t\t\t\t} else if ( typeof obj === \"undefined\" ) {\n\t\t\t\t\ttype = \"undefined\";\n\t\t\t\t} else if ( QUnit.is( \"regexp\", obj ) ) {\n\t\t\t\t\ttype = \"regexp\";\n\t\t\t\t} else if ( QUnit.is( \"date\", obj ) ) {\n\t\t\t\t\ttype = \"date\";\n\t\t\t\t} else if ( QUnit.is( \"function\", obj ) ) {\n\t\t\t\t\ttype = \"function\";\n\t\t\t\t} else if ( obj.setInterval !== undefined &&\n\t\t\t\t\t\tobj.document !== undefined &&\n\t\t\t\t\t\tobj.nodeType === undefined ) {\n\t\t\t\t\ttype = \"window\";\n\t\t\t\t} else if ( obj.nodeType === 9 ) {\n\t\t\t\t\ttype = \"document\";\n\t\t\t\t} else if ( obj.nodeType ) {\n\t\t\t\t\ttype = \"node\";\n\t\t\t\t} else if (\n\n\t\t\t\t\t// native arrays\n\t\t\t\t\ttoString.call( obj ) === \"[object Array]\" ||\n\n\t\t\t\t\t// NodeList objects\n\t\t\t\t\t( typeof obj.length === \"number\" && obj.item !== undefined &&\n\t\t\t\t\t( obj.length ? obj.item( 0 ) === obj[ 0 ] : ( obj.item( 0 ) === null &&\n\t\t\t\t\tobj[ 0 ] === undefined ) ) )\n\t\t\t\t) {\n\t\t\t\t\ttype = \"array\";\n\t\t\t\t} else if ( obj.constructor === Error.prototype.constructor ) {\n\t\t\t\t\ttype = \"error\";\n\t\t\t\t} else {\n\t\t\t\t\ttype = typeof obj;\n\t\t\t\t}\n\t\t\t\treturn type;\n\t\t\t},\n\t\t\tseparator: function() {\n\t\t\t\treturn this.multiline ? this.HTML ? \"<br />\" : \"\\n\" : this.HTML ? \"&#160;\" : \" \";\n\t\t\t},\n\t\t\t// extra can be a number, shortcut for increasing-calling-decreasing\n\t\t\tindent: function( extra ) {\n\t\t\t\tif ( !this.multiline ) {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t\tvar chr = this.indentChar;\n\t\t\t\tif ( this.HTML ) {\n\t\t\t\t\tchr = chr.replace( /\\t/g, \"   \" ).replace( / /g, \"&#160;\" );\n\t\t\t\t}\n\t\t\t\treturn new Array( this.depth + ( extra || 0 ) ).join( chr );\n\t\t\t},\n\t\t\tup: function( a ) {\n\t\t\t\tthis.depth += a || 1;\n\t\t\t},\n\t\t\tdown: function( a ) {\n\t\t\t\tthis.depth -= a || 1;\n\t\t\t},\n\t\t\tsetParser: function( name, parser ) {\n\t\t\t\tthis.parsers[ name ] = parser;\n\t\t\t},\n\t\t\t// The next 3 are exposed so you can use them\n\t\t\tquote: quote,\n\t\t\tliteral: literal,\n\t\t\tjoin: join,\n\t\t\t//\n\t\t\tdepth: 1,\n\t\t\tmaxDepth: 5,\n\n\t\t\t// This is the list of parsers, to modify them, use dump.setParser\n\t\t\tparsers: {\n\t\t\t\twindow: \"[Window]\",\n\t\t\t\tdocument: \"[Document]\",\n\t\t\t\terror: function( error ) {\n\t\t\t\t\treturn \"Error(\\\"\" + error.message + \"\\\")\";\n\t\t\t\t},\n\t\t\t\tunknown: \"[Unknown]\",\n\t\t\t\t\"null\": \"null\",\n\t\t\t\t\"undefined\": \"undefined\",\n\t\t\t\t\"function\": function( fn ) {\n\t\t\t\t\tvar ret = \"function\",\n\n\t\t\t\t\t\t// functions never have name in IE\n\t\t\t\t\t\tname = \"name\" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ];\n\n\t\t\t\t\tif ( name ) {\n\t\t\t\t\t\tret += \" \" + name;\n\t\t\t\t\t}\n\t\t\t\t\tret += \"( \";\n\n\t\t\t\t\tret = [ ret, dump.parse( fn, \"functionArgs\" ), \"){\" ].join( \"\" );\n\t\t\t\t\treturn join( ret, dump.parse( fn, \"functionCode\" ), \"}\" );\n\t\t\t\t},\n\t\t\t\tarray: array,\n\t\t\t\tnodelist: array,\n\t\t\t\t\"arguments\": array,\n\t\t\t\tobject: function( map, stack ) {\n\t\t\t\t\tvar keys, key, val, i, nonEnumerableProperties,\n\t\t\t\t\t\tret = [];\n\n\t\t\t\t\tif ( dump.maxDepth && dump.depth > dump.maxDepth ) {\n\t\t\t\t\t\treturn \"[object Object]\";\n\t\t\t\t\t}\n\n\t\t\t\t\tdump.up();\n\t\t\t\t\tkeys = [];\n\t\t\t\t\tfor ( key in map ) {\n\t\t\t\t\t\tkeys.push( key );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Some properties are not always enumerable on Error objects.\n\t\t\t\t\tnonEnumerableProperties = [ \"message\", \"name\" ];\n\t\t\t\t\tfor ( i in nonEnumerableProperties ) {\n\t\t\t\t\t\tkey = nonEnumerableProperties[ i ];\n\t\t\t\t\t\tif ( key in map && !( key in keys ) ) {\n\t\t\t\t\t\t\tkeys.push( key );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tkeys.sort();\n\t\t\t\t\tfor ( i = 0; i < keys.length; i++ ) {\n\t\t\t\t\t\tkey = keys[ i ];\n\t\t\t\t\t\tval = map[ key ];\n\t\t\t\t\t\tret.push( dump.parse( key, \"key\" ) + \": \" +\n\t\t\t\t\t\t\tdump.parse( val, undefined, stack ) );\n\t\t\t\t\t}\n\t\t\t\t\tdump.down();\n\t\t\t\t\treturn join( \"{\", ret, \"}\" );\n\t\t\t\t},\n\t\t\t\tnode: function( node ) {\n\t\t\t\t\tvar len, i, val,\n\t\t\t\t\t\topen = dump.HTML ? \"&lt;\" : \"<\",\n\t\t\t\t\t\tclose = dump.HTML ? \"&gt;\" : \">\",\n\t\t\t\t\t\ttag = node.nodeName.toLowerCase(),\n\t\t\t\t\t\tret = open + tag,\n\t\t\t\t\t\tattrs = node.attributes;\n\n\t\t\t\t\tif ( attrs ) {\n\t\t\t\t\t\tfor ( i = 0, len = attrs.length; i < len; i++ ) {\n\t\t\t\t\t\t\tval = attrs[ i ].nodeValue;\n\n\t\t\t\t\t\t\t// IE6 includes all attributes in .attributes, even ones not explicitly\n\t\t\t\t\t\t\t// set. Those have values like undefined, null, 0, false, \"\" or\n\t\t\t\t\t\t\t// \"inherit\".\n\t\t\t\t\t\t\tif ( val && val !== \"inherit\" ) {\n\t\t\t\t\t\t\t\tret += \" \" + attrs[ i ].nodeName + \"=\" +\n\t\t\t\t\t\t\t\t\tdump.parse( val, \"attribute\" );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tret += close;\n\n\t\t\t\t\t// Show content of TextNode or CDATASection\n\t\t\t\t\tif ( node.nodeType === 3 || node.nodeType === 4 ) {\n\t\t\t\t\t\tret += node.nodeValue;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ret + open + \"/\" + tag + close;\n\t\t\t\t},\n\n\t\t\t\t// function calls it internally, it's the arguments part of the function\n\t\t\t\tfunctionArgs: function( fn ) {\n\t\t\t\t\tvar args,\n\t\t\t\t\t\tl = fn.length;\n\n\t\t\t\t\tif ( !l ) {\n\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\targs = new Array( l );\n\t\t\t\t\twhile ( l-- ) {\n\n\t\t\t\t\t\t// 97 is 'a'\n\t\t\t\t\t\targs[ l ] = String.fromCharCode( 97 + l );\n\t\t\t\t\t}\n\t\t\t\t\treturn \" \" + args.join( \", \" ) + \" \";\n\t\t\t\t},\n\t\t\t\t// object calls it internally, the key part of an item in a map\n\t\t\t\tkey: quote,\n\t\t\t\t// function calls it internally, it's the content of the function\n\t\t\t\tfunctionCode: \"[code]\",\n\t\t\t\t// node calls it internally, it's an html attribute value\n\t\t\t\tattribute: quote,\n\t\t\t\tstring: quote,\n\t\t\t\tdate: quote,\n\t\t\t\tregexp: literal,\n\t\t\t\tnumber: literal,\n\t\t\t\t\"boolean\": literal\n\t\t\t},\n\t\t\t// if true, entities are escaped ( <, >, \\t, space and \\n )\n\t\t\tHTML: false,\n\t\t\t// indentation unit\n\t\t\tindentChar: \"  \",\n\t\t\t// if true, items in a collection, are separated by a \\n, else just a space.\n\t\t\tmultiline: true\n\t\t};\n\n\treturn dump;\n}());\n\n// back compat\nQUnit.jsDump = QUnit.dump;\n\n// For browser, export only select globals\nif ( typeof window !== \"undefined\" ) {\n\n\t// Deprecated\n\t// Extend assert methods to QUnit and Global scope through Backwards compatibility\n\t(function() {\n\t\tvar i,\n\t\t\tassertions = Assert.prototype;\n\n\t\tfunction applyCurrent( current ) {\n\t\t\treturn function() {\n\t\t\t\tvar assert = new Assert( QUnit.config.current );\n\t\t\t\tcurrent.apply( assert, arguments );\n\t\t\t};\n\t\t}\n\n\t\tfor ( i in assertions ) {\n\t\t\tQUnit[ i ] = applyCurrent( assertions[ i ] );\n\t\t}\n\t})();\n\n\t(function() {\n\t\tvar i, l,\n\t\t\tkeys = [\n\t\t\t\t\"test\",\n\t\t\t\t\"module\",\n\t\t\t\t\"expect\",\n\t\t\t\t\"asyncTest\",\n\t\t\t\t\"start\",\n\t\t\t\t\"stop\",\n\t\t\t\t\"ok\",\n\t\t\t\t\"equal\",\n\t\t\t\t\"notEqual\",\n\t\t\t\t\"propEqual\",\n\t\t\t\t\"notPropEqual\",\n\t\t\t\t\"deepEqual\",\n\t\t\t\t\"notDeepEqual\",\n\t\t\t\t\"strictEqual\",\n\t\t\t\t\"notStrictEqual\",\n\t\t\t\t\"throws\"\n\t\t\t];\n\n\t\tfor ( i = 0, l = keys.length; i < l; i++ ) {\n\t\t\twindow[ keys[ i ] ] = QUnit[ keys[ i ] ];\n\t\t}\n\t})();\n\n\twindow.QUnit = QUnit;\n}\n\n// For nodejs\nif ( typeof module !== \"undefined\" && module && module.exports ) {\n\tmodule.exports = QUnit;\n\n\t// For consistency with CommonJS environments' exports\n\tmodule.exports.QUnit = QUnit;\n}\n\n// For CommonJS with exports, but without module.exports, like Rhino\nif ( typeof exports !== \"undefined\" && exports ) {\n\texports.QUnit = QUnit;\n}\n\n// Get a reference to the global object, like window in browsers\n}( (function() {\n\treturn this;\n})() ));\n\n/*istanbul ignore next */\n// jscs:disable maximumLineLength\n/*\n * Javascript Diff Algorithm\n *  By John Resig (http://ejohn.org/)\n *  Modified by Chu Alan \"sprite\"\n *\n * Released under the MIT license.\n *\n * More Info:\n *  http://ejohn.org/projects/javascript-diff-algorithm/\n *\n * Usage: QUnit.diff(expected, actual)\n *\n * QUnit.diff( \"the quick brown fox jumped over\", \"the quick fox jumps over\" ) == \"the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over\"\n */\nQUnit.diff = (function() {\n\tvar hasOwn = Object.prototype.hasOwnProperty;\n\n\t/*jshint eqeqeq:false, eqnull:true */\n\tfunction diff( o, n ) {\n\t\tvar i,\n\t\t\tns = {},\n\t\t\tos = {};\n\n\t\tfor ( i = 0; i < n.length; i++ ) {\n\t\t\tif ( !hasOwn.call( ns, n[ i ] ) ) {\n\t\t\t\tns[ n[ i ] ] = {\n\t\t\t\t\trows: [],\n\t\t\t\t\to: null\n\t\t\t\t};\n\t\t\t}\n\t\t\tns[ n[ i ] ].rows.push( i );\n\t\t}\n\n\t\tfor ( i = 0; i < o.length; i++ ) {\n\t\t\tif ( !hasOwn.call( os, o[ i ] ) ) {\n\t\t\t\tos[ o[ i ] ] = {\n\t\t\t\t\trows: [],\n\t\t\t\t\tn: null\n\t\t\t\t};\n\t\t\t}\n\t\t\tos[ o[ i ] ].rows.push( i );\n\t\t}\n\n\t\tfor ( i in ns ) {\n\t\t\tif ( hasOwn.call( ns, i ) ) {\n\t\t\t\tif ( ns[ i ].rows.length === 1 && hasOwn.call( os, i ) && os[ i ].rows.length === 1 ) {\n\t\t\t\t\tn[ ns[ i ].rows[ 0 ] ] = {\n\t\t\t\t\t\ttext: n[ ns[ i ].rows[ 0 ] ],\n\t\t\t\t\t\trow: os[ i ].rows[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t\to[ os[ i ].rows[ 0 ] ] = {\n\t\t\t\t\t\ttext: o[ os[ i ].rows[ 0 ] ],\n\t\t\t\t\t\trow: ns[ i ].rows[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = 0; i < n.length - 1; i++ ) {\n\t\t\tif ( n[ i ].text != null && n[ i + 1 ].text == null && n[ i ].row + 1 < o.length && o[ n[ i ].row + 1 ].text == null &&\n\t\t\t\tn[ i + 1 ] == o[ n[ i ].row + 1 ] ) {\n\n\t\t\t\tn[ i + 1 ] = {\n\t\t\t\t\ttext: n[ i + 1 ],\n\t\t\t\t\trow: n[ i ].row + 1\n\t\t\t\t};\n\t\t\t\to[ n[ i ].row + 1 ] = {\n\t\t\t\t\ttext: o[ n[ i ].row + 1 ],\n\t\t\t\t\trow: i + 1\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = n.length - 1; i > 0; i-- ) {\n\t\t\tif ( n[ i ].text != null && n[ i - 1 ].text == null && n[ i ].row > 0 && o[ n[ i ].row - 1 ].text == null &&\n\t\t\t\tn[ i - 1 ] == o[ n[ i ].row - 1 ] ) {\n\n\t\t\t\tn[ i - 1 ] = {\n\t\t\t\t\ttext: n[ i - 1 ],\n\t\t\t\t\trow: n[ i ].row - 1\n\t\t\t\t};\n\t\t\t\to[ n[ i ].row - 1 ] = {\n\t\t\t\t\ttext: o[ n[ i ].row - 1 ],\n\t\t\t\t\trow: i - 1\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\to: o,\n\t\t\tn: n\n\t\t};\n\t}\n\n\treturn function( o, n ) {\n\t\to = o.replace( /\\s+$/, \"\" );\n\t\tn = n.replace( /\\s+$/, \"\" );\n\n\t\tvar i, pre,\n\t\t\tstr = \"\",\n\t\t\tout = diff( o === \"\" ? [] : o.split( /\\s+/ ), n === \"\" ? [] : n.split( /\\s+/ ) ),\n\t\t\toSpace = o.match( /\\s+/g ),\n\t\t\tnSpace = n.match( /\\s+/g );\n\n\t\tif ( oSpace == null ) {\n\t\t\toSpace = [ \" \" ];\n\t\t} else {\n\t\t\toSpace.push( \" \" );\n\t\t}\n\n\t\tif ( nSpace == null ) {\n\t\t\tnSpace = [ \" \" ];\n\t\t} else {\n\t\t\tnSpace.push( \" \" );\n\t\t}\n\n\t\tif ( out.n.length === 0 ) {\n\t\t\tfor ( i = 0; i < out.o.length; i++ ) {\n\t\t\t\tstr += \"<del>\" + out.o[ i ] + oSpace[ i ] + \"</del>\";\n\t\t\t}\n\t\t} else {\n\t\t\tif ( out.n[ 0 ].text == null ) {\n\t\t\t\tfor ( n = 0; n < out.o.length && out.o[ n ].text == null; n++ ) {\n\t\t\t\t\tstr += \"<del>\" + out.o[ n ] + oSpace[ n ] + \"</del>\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( i = 0; i < out.n.length; i++ ) {\n\t\t\t\tif ( out.n[ i ].text == null ) {\n\t\t\t\t\tstr += \"<ins>\" + out.n[ i ] + nSpace[ i ] + \"</ins>\";\n\t\t\t\t} else {\n\n\t\t\t\t\t// `pre` initialized at top of scope\n\t\t\t\t\tpre = \"\";\n\n\t\t\t\t\tfor ( n = out.n[ i ].row + 1; n < out.o.length && out.o[ n ].text == null; n++ ) {\n\t\t\t\t\t\tpre += \"<del>\" + out.o[ n ] + oSpace[ n ] + \"</del>\";\n\t\t\t\t\t}\n\t\t\t\t\tstr += \" \" + out.n[ i ].text + nSpace[ i ] + pre;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn str;\n\t};\n}());\n// jscs:enable\n\n(function() {\n\n// Deprecated QUnit.init - Ref #530\n// Re-initialize the configuration options\nQUnit.init = function() {\n\tvar tests, banner, result, qunit,\n\t\tconfig = QUnit.config;\n\n\tconfig.stats = { all: 0, bad: 0 };\n\tconfig.moduleStats = { all: 0, bad: 0 };\n\tconfig.started = 0;\n\tconfig.updateRate = 1000;\n\tconfig.blocking = false;\n\tconfig.autostart = true;\n\tconfig.autorun = false;\n\tconfig.filter = \"\";\n\tconfig.queue = [];\n\n\t// Return on non-browser environments\n\t// This is necessary to not break on node tests\n\tif ( typeof window === \"undefined\" ) {\n\t\treturn;\n\t}\n\n\tqunit = id( \"qunit\" );\n\tif ( qunit ) {\n\t\tqunit.innerHTML =\n\t\t\t\"<h1 id='qunit-header'>\" + escapeText( document.title ) + \"</h1>\" +\n\t\t\t\"<h2 id='qunit-banner'></h2>\" +\n\t\t\t\"<div id='qunit-testrunner-toolbar'></div>\" +\n\t\t\t\"<h2 id='qunit-userAgent'></h2>\" +\n\t\t\t\"<ol id='qunit-tests'></ol>\";\n\t}\n\n\ttests = id( \"qunit-tests\" );\n\tbanner = id( \"qunit-banner\" );\n\tresult = id( \"qunit-testresult\" );\n\n\tif ( tests ) {\n\t\ttests.innerHTML = \"\";\n\t}\n\n\tif ( banner ) {\n\t\tbanner.className = \"\";\n\t}\n\n\tif ( result ) {\n\t\tresult.parentNode.removeChild( result );\n\t}\n\n\tif ( tests ) {\n\t\tresult = document.createElement( \"p\" );\n\t\tresult.id = \"qunit-testresult\";\n\t\tresult.className = \"result\";\n\t\ttests.parentNode.insertBefore( result, tests );\n\t\tresult.innerHTML = \"Running...<br />&#160;\";\n\t}\n};\n\n// Don't load the HTML Reporter on non-Browser environments\nif ( typeof window === \"undefined\" ) {\n\treturn;\n}\n\nvar config = QUnit.config,\n\thasOwn = Object.prototype.hasOwnProperty,\n\tdefined = {\n\t\tdocument: window.document !== undefined,\n\t\tsessionStorage: (function() {\n\t\t\tvar x = \"qunit-test-string\";\n\t\t\ttry {\n\t\t\t\tsessionStorage.setItem( x, x );\n\t\t\t\tsessionStorage.removeItem( x );\n\t\t\t\treturn true;\n\t\t\t} catch ( e ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}())\n\t},\n\tmodulesList = [];\n\n/**\n* Escape text for attribute or text content.\n*/\nfunction escapeText( s ) {\n\tif ( !s ) {\n\t\treturn \"\";\n\t}\n\ts = s + \"\";\n\n\t// Both single quotes and double quotes (for attributes)\n\treturn s.replace( /['\"<>&]/g, function( s ) {\n\t\tswitch ( s ) {\n\t\tcase \"'\":\n\t\t\treturn \"&#039;\";\n\t\tcase \"\\\"\":\n\t\t\treturn \"&quot;\";\n\t\tcase \"<\":\n\t\t\treturn \"&lt;\";\n\t\tcase \">\":\n\t\t\treturn \"&gt;\";\n\t\tcase \"&\":\n\t\t\treturn \"&amp;\";\n\t\t}\n\t});\n}\n\n/**\n * @param {HTMLElement} elem\n * @param {string} type\n * @param {Function} fn\n */\nfunction addEvent( elem, type, fn ) {\n\tif ( elem.addEventListener ) {\n\n\t\t// Standards-based browsers\n\t\telem.addEventListener( type, fn, false );\n\t} else if ( elem.attachEvent ) {\n\n\t\t// support: IE <9\n\t\telem.attachEvent( \"on\" + type, fn );\n\t}\n}\n\n/**\n * @param {Array|NodeList} elems\n * @param {string} type\n * @param {Function} fn\n */\nfunction addEvents( elems, type, fn ) {\n\tvar i = elems.length;\n\twhile ( i-- ) {\n\t\taddEvent( elems[ i ], type, fn );\n\t}\n}\n\nfunction hasClass( elem, name ) {\n\treturn ( \" \" + elem.className + \" \" ).indexOf( \" \" + name + \" \" ) >= 0;\n}\n\nfunction addClass( elem, name ) {\n\tif ( !hasClass( elem, name ) ) {\n\t\telem.className += ( elem.className ? \" \" : \"\" ) + name;\n\t}\n}\n\nfunction toggleClass( elem, name ) {\n\tif ( hasClass( elem, name ) ) {\n\t\tremoveClass( elem, name );\n\t} else {\n\t\taddClass( elem, name );\n\t}\n}\n\nfunction removeClass( elem, name ) {\n\tvar set = \" \" + elem.className + \" \";\n\n\t// Class name may appear multiple times\n\twhile ( set.indexOf( \" \" + name + \" \" ) >= 0 ) {\n\t\tset = set.replace( \" \" + name + \" \", \" \" );\n\t}\n\n\t// trim for prettiness\n\telem.className = typeof set.trim === \"function\" ? set.trim() : set.replace( /^\\s+|\\s+$/g, \"\" );\n}\n\nfunction id( name ) {\n\treturn defined.document && document.getElementById && document.getElementById( name );\n}\n\nfunction getUrlConfigHtml() {\n\tvar i, j, val,\n\t\tescaped, escapedTooltip,\n\t\tselection = false,\n\t\tlen = config.urlConfig.length,\n\t\turlConfigHtml = \"\";\n\n\tfor ( i = 0; i < len; i++ ) {\n\t\tval = config.urlConfig[ i ];\n\t\tif ( typeof val === \"string\" ) {\n\t\t\tval = {\n\t\t\t\tid: val,\n\t\t\t\tlabel: val\n\t\t\t};\n\t\t}\n\n\t\tescaped = escapeText( val.id );\n\t\tescapedTooltip = escapeText( val.tooltip );\n\n\t\tif ( config[ val.id ] === undefined ) {\n\t\t\tconfig[ val.id ] = QUnit.urlParams[ val.id ];\n\t\t}\n\n\t\tif ( !val.value || typeof val.value === \"string\" ) {\n\t\t\turlConfigHtml += \"<input id='qunit-urlconfig-\" + escaped +\n\t\t\t\t\"' name='\" + escaped + \"' type='checkbox'\" +\n\t\t\t\t( val.value ? \" value='\" + escapeText( val.value ) + \"'\" : \"\" ) +\n\t\t\t\t( config[ val.id ] ? \" checked='checked'\" : \"\" ) +\n\t\t\t\t\" title='\" + escapedTooltip + \"' /><label for='qunit-urlconfig-\" + escaped +\n\t\t\t\t\"' title='\" + escapedTooltip + \"'>\" + val.label + \"</label>\";\n\t\t} else {\n\t\t\turlConfigHtml += \"<label for='qunit-urlconfig-\" + escaped +\n\t\t\t\t\"' title='\" + escapedTooltip + \"'>\" + val.label +\n\t\t\t\t\": </label><select id='qunit-urlconfig-\" + escaped +\n\t\t\t\t\"' name='\" + escaped + \"' title='\" + escapedTooltip + \"'><option></option>\";\n\n\t\t\tif ( QUnit.is( \"array\", val.value ) ) {\n\t\t\t\tfor ( j = 0; j < val.value.length; j++ ) {\n\t\t\t\t\tescaped = escapeText( val.value[ j ] );\n\t\t\t\t\turlConfigHtml += \"<option value='\" + escaped + \"'\" +\n\t\t\t\t\t\t( config[ val.id ] === val.value[ j ] ?\n\t\t\t\t\t\t\t( selection = true ) && \" selected='selected'\" : \"\" ) +\n\t\t\t\t\t\t\">\" + escaped + \"</option>\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( j in val.value ) {\n\t\t\t\t\tif ( hasOwn.call( val.value, j ) ) {\n\t\t\t\t\t\turlConfigHtml += \"<option value='\" + escapeText( j ) + \"'\" +\n\t\t\t\t\t\t\t( config[ val.id ] === j ?\n\t\t\t\t\t\t\t\t( selection = true ) && \" selected='selected'\" : \"\" ) +\n\t\t\t\t\t\t\t\">\" + escapeText( val.value[ j ] ) + \"</option>\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( config[ val.id ] && !selection ) {\n\t\t\t\tescaped = escapeText( config[ val.id ] );\n\t\t\t\turlConfigHtml += \"<option value='\" + escaped +\n\t\t\t\t\t\"' selected='selected' disabled='disabled'>\" + escaped + \"</option>\";\n\t\t\t}\n\t\t\turlConfigHtml += \"</select>\";\n\t\t}\n\t}\n\n\treturn urlConfigHtml;\n}\n\n// Handle \"click\" events on toolbar checkboxes and \"change\" for select menus.\n// Updates the URL with the new state of `config.urlConfig` values.\nfunction toolbarChanged() {\n\tvar updatedUrl, value,\n\t\tfield = this,\n\t\tparams = {};\n\n\t// Detect if field is a select menu or a checkbox\n\tif ( \"selectedIndex\" in field ) {\n\t\tvalue = field.options[ field.selectedIndex ].value || undefined;\n\t} else {\n\t\tvalue = field.checked ? ( field.defaultValue || true ) : undefined;\n\t}\n\n\tparams[ field.name ] = value;\n\tupdatedUrl = setUrl( params );\n\n\tif ( \"hidepassed\" === field.name && \"replaceState\" in window.history ) {\n\t\tconfig[ field.name ] = value || false;\n\t\tif ( value ) {\n\t\t\taddClass( id( \"qunit-tests\" ), \"hidepass\" );\n\t\t} else {\n\t\t\tremoveClass( id( \"qunit-tests\" ), \"hidepass\" );\n\t\t}\n\n\t\t// It is not necessary to refresh the whole page\n\t\twindow.history.replaceState( null, \"\", updatedUrl );\n\t} else {\n\t\twindow.location = updatedUrl;\n\t}\n}\n\nfunction setUrl( params ) {\n\tvar key,\n\t\tquerystring = \"?\";\n\n\tparams = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );\n\n\tfor ( key in params ) {\n\t\tif ( hasOwn.call( params, key ) ) {\n\t\t\tif ( params[ key ] === undefined ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tquerystring += encodeURIComponent( key );\n\t\t\tif ( params[ key ] !== true ) {\n\t\t\t\tquerystring += \"=\" + encodeURIComponent( params[ key ] );\n\t\t\t}\n\t\t\tquerystring += \"&\";\n\t\t}\n\t}\n\treturn location.protocol + \"//\" + location.host +\n\t\tlocation.pathname + querystring.slice( 0, -1 );\n}\n\nfunction applyUrlParams() {\n\tvar selectBox = id( \"qunit-modulefilter\" ),\n\t\tselection = decodeURIComponent( selectBox.options[ selectBox.selectedIndex ].value ),\n\t\tfilter = id( \"qunit-filter-input\" ).value;\n\n\twindow.location = setUrl({\n\t\tmodule: ( selection === \"\" ) ? undefined : selection,\n\t\tfilter: ( filter === \"\" ) ? undefined : filter,\n\n\t\t// Remove testId filter\n\t\ttestId: undefined\n\t});\n}\n\nfunction toolbarUrlConfigContainer() {\n\tvar urlConfigContainer = document.createElement( \"span\" );\n\n\turlConfigContainer.innerHTML = getUrlConfigHtml();\n\taddClass( urlConfigContainer, \"qunit-url-config\" );\n\n\t// For oldIE support:\n\t// * Add handlers to the individual elements instead of the container\n\t// * Use \"click\" instead of \"change\" for checkboxes\n\taddEvents( urlConfigContainer.getElementsByTagName( \"input\" ), \"click\", toolbarChanged );\n\taddEvents( urlConfigContainer.getElementsByTagName( \"select\" ), \"change\", toolbarChanged );\n\n\treturn urlConfigContainer;\n}\n\nfunction toolbarLooseFilter() {\n\tvar filter = document.createElement( \"form\" ),\n\t\tlabel = document.createElement( \"label\" ),\n\t\tinput = document.createElement( \"input\" ),\n\t\tbutton = document.createElement( \"button\" );\n\n\taddClass( filter, \"qunit-filter\" );\n\n\tlabel.innerHTML = \"Filter: \";\n\n\tinput.type = \"text\";\n\tinput.value = config.filter || \"\";\n\tinput.name = \"filter\";\n\tinput.id = \"qunit-filter-input\";\n\n\tbutton.innerHTML = \"Go\";\n\n\tlabel.appendChild( input );\n\n\tfilter.appendChild( label );\n\tfilter.appendChild( button );\n\taddEvent( filter, \"submit\", function( ev ) {\n\t\tapplyUrlParams();\n\n\t\tif ( ev && ev.preventDefault ) {\n\t\t\tev.preventDefault();\n\t\t}\n\n\t\treturn false;\n\t});\n\n\treturn filter;\n}\n\nfunction toolbarModuleFilterHtml() {\n\tvar i,\n\t\tmoduleFilterHtml = \"\";\n\n\tif ( !modulesList.length ) {\n\t\treturn false;\n\t}\n\n\tmodulesList.sort(function( a, b ) {\n\t\treturn a.localeCompare( b );\n\t});\n\n\tmoduleFilterHtml += \"<label for='qunit-modulefilter'>Module: </label>\" +\n\t\t\"<select id='qunit-modulefilter' name='modulefilter'><option value='' \" +\n\t\t( QUnit.urlParams.module === undefined ? \"selected='selected'\" : \"\" ) +\n\t\t\">< All Modules ></option>\";\n\n\tfor ( i = 0; i < modulesList.length; i++ ) {\n\t\tmoduleFilterHtml += \"<option value='\" +\n\t\t\tescapeText( encodeURIComponent( modulesList[ i ] ) ) + \"' \" +\n\t\t\t( QUnit.urlParams.module === modulesList[ i ] ? \"selected='selected'\" : \"\" ) +\n\t\t\t\">\" + escapeText( modulesList[ i ] ) + \"</option>\";\n\t}\n\tmoduleFilterHtml += \"</select>\";\n\n\treturn moduleFilterHtml;\n}\n\nfunction toolbarModuleFilter() {\n\tvar toolbar = id( \"qunit-testrunner-toolbar\" ),\n\t\tmoduleFilter = document.createElement( \"span\" ),\n\t\tmoduleFilterHtml = toolbarModuleFilterHtml();\n\n\tif ( !toolbar || !moduleFilterHtml ) {\n\t\treturn false;\n\t}\n\n\tmoduleFilter.setAttribute( \"id\", \"qunit-modulefilter-container\" );\n\tmoduleFilter.innerHTML = moduleFilterHtml;\n\n\taddEvent( moduleFilter.lastChild, \"change\", applyUrlParams );\n\n\ttoolbar.appendChild( moduleFilter );\n}\n\nfunction appendToolbar() {\n\tvar toolbar = id( \"qunit-testrunner-toolbar\" );\n\n\tif ( toolbar ) {\n\t\ttoolbar.appendChild( toolbarUrlConfigContainer() );\n\t\ttoolbar.appendChild( toolbarLooseFilter() );\n\t}\n}\n\nfunction appendHeader() {\n\tvar header = id( \"qunit-header\" );\n\n\tif ( header ) {\n\t\theader.innerHTML = \"<a href='\" +\n\t\t\tsetUrl({ filter: undefined, module: undefined, testId: undefined }) +\n\t\t\t\"'>\" + header.innerHTML + \"</a> \";\n\t}\n}\n\nfunction appendBanner() {\n\tvar banner = id( \"qunit-banner\" );\n\n\tif ( banner ) {\n\t\tbanner.className = \"\";\n\t}\n}\n\nfunction appendTestResults() {\n\tvar tests = id( \"qunit-tests\" ),\n\t\tresult = id( \"qunit-testresult\" );\n\n\tif ( result ) {\n\t\tresult.parentNode.removeChild( result );\n\t}\n\n\tif ( tests ) {\n\t\ttests.innerHTML = \"\";\n\t\tresult = document.createElement( \"p\" );\n\t\tresult.id = \"qunit-testresult\";\n\t\tresult.className = \"result\";\n\t\ttests.parentNode.insertBefore( result, tests );\n\t\tresult.innerHTML = \"Running...<br />&#160;\";\n\t}\n}\n\nfunction storeFixture() {\n\tvar fixture = id( \"qunit-fixture\" );\n\tif ( fixture ) {\n\t\tconfig.fixture = fixture.innerHTML;\n\t}\n}\n\nfunction appendUserAgent() {\n\tvar userAgent = id( \"qunit-userAgent\" );\n\tif ( userAgent ) {\n\t\tuserAgent.innerHTML = \"\";\n\t\tuserAgent.appendChild( document.createTextNode( navigator.userAgent ) );\n\t}\n}\n\nfunction appendTestsList( modules ) {\n\tvar i, l, x, z, test, moduleObj;\n\n\tfor ( i = 0, l = modules.length; i < l; i++ ) {\n\t\tmoduleObj = modules[ i ];\n\n\t\tif ( moduleObj.name ) {\n\t\t\tmodulesList.push( moduleObj.name );\n\t\t}\n\n\t\tfor ( x = 0, z = moduleObj.tests.length; x < z; x++ ) {\n\t\t\ttest = moduleObj.tests[ x ];\n\n\t\t\tappendTest( test.name, test.testId, moduleObj.name );\n\t\t}\n\t}\n}\n\nfunction appendTest( name, testId, moduleName ) {\n\tvar title, rerunTrigger, testBlock, assertList,\n\t\ttests = id( \"qunit-tests\" );\n\n\tif ( !tests ) {\n\t\treturn;\n\t}\n\n\ttitle = document.createElement( \"strong\" );\n\ttitle.innerHTML = getNameHtml( name, moduleName );\n\n\trerunTrigger = document.createElement( \"a\" );\n\trerunTrigger.innerHTML = \"Rerun\";\n\trerunTrigger.href = setUrl({ testId: testId });\n\n\ttestBlock = document.createElement( \"li\" );\n\ttestBlock.appendChild( title );\n\ttestBlock.appendChild( rerunTrigger );\n\ttestBlock.id = \"qunit-test-output-\" + testId;\n\n\tassertList = document.createElement( \"ol\" );\n\tassertList.className = \"qunit-assert-list\";\n\n\ttestBlock.appendChild( assertList );\n\n\ttests.appendChild( testBlock );\n}\n\n// HTML Reporter initialization and load\nQUnit.begin(function( details ) {\n\tvar qunit = id( \"qunit\" );\n\n\t// Fixture is the only one necessary to run without the #qunit element\n\tstoreFixture();\n\n\tif ( qunit ) {\n\t\tqunit.innerHTML =\n\t\t\t\"<h1 id='qunit-header'>\" + escapeText( document.title ) + \"</h1>\" +\n\t\t\t\"<h2 id='qunit-banner'></h2>\" +\n\t\t\t\"<div id='qunit-testrunner-toolbar'></div>\" +\n\t\t\t\"<h2 id='qunit-userAgent'></h2>\" +\n\t\t\t\"<ol id='qunit-tests'></ol>\";\n\t}\n\n\tappendHeader();\n\tappendBanner();\n\tappendTestResults();\n\tappendUserAgent();\n\tappendToolbar();\n\tappendTestsList( details.modules );\n\ttoolbarModuleFilter();\n\n\tif ( qunit && config.hidepassed ) {\n\t\taddClass( qunit.lastChild, \"hidepass\" );\n\t}\n});\n\nQUnit.done(function( details ) {\n\tvar i, key,\n\t\tbanner = id( \"qunit-banner\" ),\n\t\ttests = id( \"qunit-tests\" ),\n\t\thtml = [\n\t\t\t\"Tests completed in \",\n\t\t\tdetails.runtime,\n\t\t\t\" milliseconds.<br />\",\n\t\t\t\"<span class='passed'>\",\n\t\t\tdetails.passed,\n\t\t\t\"</span> assertions of <span class='total'>\",\n\t\t\tdetails.total,\n\t\t\t\"</span> passed, <span class='failed'>\",\n\t\t\tdetails.failed,\n\t\t\t\"</span> failed.\"\n\t\t].join( \"\" );\n\n\tif ( banner ) {\n\t\tbanner.className = details.failed ? \"qunit-fail\" : \"qunit-pass\";\n\t}\n\n\tif ( tests ) {\n\t\tid( \"qunit-testresult\" ).innerHTML = html;\n\t}\n\n\tif ( config.altertitle && defined.document && document.title ) {\n\n\t\t// show ✖ for good, ✔ for bad suite result in title\n\t\t// use escape sequences in case file gets loaded with non-utf-8-charset\n\t\tdocument.title = [\n\t\t\t( details.failed ? \"\\u2716\" : \"\\u2714\" ),\n\t\t\tdocument.title.replace( /^[\\u2714\\u2716] /i, \"\" )\n\t\t].join( \" \" );\n\t}\n\n\t// clear own sessionStorage items if all tests passed\n\tif ( config.reorder && defined.sessionStorage && details.failed === 0 ) {\n\t\tfor ( i = 0; i < sessionStorage.length; i++ ) {\n\t\t\tkey = sessionStorage.key( i++ );\n\t\t\tif ( key.indexOf( \"qunit-test-\" ) === 0 ) {\n\t\t\t\tsessionStorage.removeItem( key );\n\t\t\t}\n\t\t}\n\t}\n\n\t// scroll back to top to show results\n\tif ( config.scrolltop && window.scrollTo ) {\n\t\twindow.scrollTo( 0, 0 );\n\t}\n});\n\nfunction getNameHtml( name, module ) {\n\tvar nameHtml = \"\";\n\n\tif ( module ) {\n\t\tnameHtml = \"<span class='module-name'>\" + escapeText( module ) + \"</span>: \";\n\t}\n\n\tnameHtml += \"<span class='test-name'>\" + escapeText( name ) + \"</span>\";\n\n\treturn nameHtml;\n}\n\nQUnit.testStart(function( details ) {\n\tvar running, testBlock;\n\n\ttestBlock = id( \"qunit-test-output-\" + details.testId );\n\tif ( testBlock ) {\n\t\ttestBlock.className = \"running\";\n\t} else {\n\n\t\t// Report later registered tests\n\t\tappendTest( details.name, details.testId, details.module );\n\t}\n\n\trunning = id( \"qunit-testresult\" );\n\tif ( running ) {\n\t\trunning.innerHTML = \"Running: <br />\" + getNameHtml( details.name, details.module );\n\t}\n\n});\n\nQUnit.log(function( details ) {\n\tvar assertList, assertLi,\n\t\tmessage, expected, actual,\n\t\ttestItem = id( \"qunit-test-output-\" + details.testId );\n\n\tif ( !testItem ) {\n\t\treturn;\n\t}\n\n\tmessage = escapeText( details.message ) || ( details.result ? \"okay\" : \"failed\" );\n\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n\tmessage += \"<span class='runtime'>@ \" + details.runtime + \" ms</span>\";\n\n\t// pushFailure doesn't provide details.expected\n\t// when it calls, it's implicit to also not show expected and diff stuff\n\t// Also, we need to check details.expected existence, as it can exist and be undefined\n\tif ( !details.result && hasOwn.call( details, \"expected\" ) ) {\n\t\texpected = escapeText( QUnit.dump.parse( details.expected ) );\n\t\tactual = escapeText( QUnit.dump.parse( details.actual ) );\n\t\tmessage += \"<table><tr class='test-expected'><th>Expected: </th><td><pre>\" +\n\t\t\texpected +\n\t\t\t\"</pre></td></tr>\";\n\n\t\tif ( actual !== expected ) {\n\t\t\tmessage += \"<tr class='test-actual'><th>Result: </th><td><pre>\" +\n\t\t\t\tactual + \"</pre></td></tr>\" +\n\t\t\t\t\"<tr class='test-diff'><th>Diff: </th><td><pre>\" +\n\t\t\t\tQUnit.diff( expected, actual ) + \"</pre></td></tr>\";\n\t\t}\n\n\t\tif ( details.source ) {\n\t\t\tmessage += \"<tr class='test-source'><th>Source: </th><td><pre>\" +\n\t\t\t\tescapeText( details.source ) + \"</pre></td></tr>\";\n\t\t}\n\n\t\tmessage += \"</table>\";\n\n\t// this occours when pushFailure is set and we have an extracted stack trace\n\t} else if ( !details.result && details.source ) {\n\t\tmessage += \"<table>\" +\n\t\t\t\"<tr class='test-source'><th>Source: </th><td><pre>\" +\n\t\t\tescapeText( details.source ) + \"</pre></td></tr>\" +\n\t\t\t\"</table>\";\n\t}\n\n\tassertList = testItem.getElementsByTagName( \"ol\" )[ 0 ];\n\n\tassertLi = document.createElement( \"li\" );\n\tassertLi.className = details.result ? \"pass\" : \"fail\";\n\tassertLi.innerHTML = message;\n\tassertList.appendChild( assertLi );\n});\n\nQUnit.testDone(function( details ) {\n\tvar testTitle, time, testItem, assertList,\n\t\tgood, bad, testCounts, skipped,\n\t\ttests = id( \"qunit-tests\" );\n\n\tif ( !tests ) {\n\t\treturn;\n\t}\n\n\ttestItem = id( \"qunit-test-output-\" + details.testId );\n\n\tassertList = testItem.getElementsByTagName( \"ol\" )[ 0 ];\n\n\tgood = details.passed;\n\tbad = details.failed;\n\n\t// store result when possible\n\tif ( config.reorder && defined.sessionStorage ) {\n\t\tif ( bad ) {\n\t\t\tsessionStorage.setItem( \"qunit-test-\" + details.module + \"-\" + details.name, bad );\n\t\t} else {\n\t\t\tsessionStorage.removeItem( \"qunit-test-\" + details.module + \"-\" + details.name );\n\t\t}\n\t}\n\n\tif ( bad === 0 ) {\n\t\taddClass( assertList, \"qunit-collapsed\" );\n\t}\n\n\t// testItem.firstChild is the test name\n\ttestTitle = testItem.firstChild;\n\n\ttestCounts = bad ?\n\t\t\"<b class='failed'>\" + bad + \"</b>, \" + \"<b class='passed'>\" + good + \"</b>, \" :\n\t\t\"\";\n\n\ttestTitle.innerHTML += \" <b class='counts'>(\" + testCounts +\n\t\tdetails.assertions.length + \")</b>\";\n\n\tif ( details.skipped ) {\n\t\ttestItem.className = \"skipped\";\n\t\tskipped = document.createElement( \"em\" );\n\t\tskipped.className = \"qunit-skipped-label\";\n\t\tskipped.innerHTML = \"skipped\";\n\t\ttestItem.insertBefore( skipped, testTitle );\n\t} else {\n\t\taddEvent( testTitle, \"click\", function() {\n\t\t\ttoggleClass( assertList, \"qunit-collapsed\" );\n\t\t});\n\n\t\ttestItem.className = bad ? \"fail\" : \"pass\";\n\n\t\ttime = document.createElement( \"span\" );\n\t\ttime.className = \"runtime\";\n\t\ttime.innerHTML = details.runtime + \" ms\";\n\t\ttestItem.insertBefore( time, assertList );\n\t}\n});\n\nif ( !defined.document || document.readyState === \"complete\" ) {\n\tconfig.pageLoaded = true;\n\tconfig.autorun = true;\n}\n\nif ( defined.document ) {\n\taddEvent( window, \"load\", QUnit.load );\n}\n\n})();\n","QUnit.notifications = function(options) {\n  \"use strict\";\n\n  options         = options         || {};\n  options.icons   = options.icons   || {};\n  options.timeout = options.timeout || 4000;\n  options.titles  = options.titles  || { passed: \"Passed!\", failed: \"Failed!\" };\n  options.bodies  = options.bodies  || {\n    passed: \"{{passed}} of {{total}} passed\",\n    failed: \"{{passed}} passed. {{failed}} failed.\"\n  };\n\n  var renderBody = function(body, details) {\n    [ \"passed\", \"failed\", \"total\", \"runtime\" ].forEach(function(type) {\n      body = body.replace(\"{{\" + type + \"}}\", details[ type ]);\n    });\n\n    return body;\n  };\n\n  function generateQueryString(params) {\n    var key,\n      querystring = \"?\";\n\n    params = QUnit.extend(QUnit.extend({}, QUnit.urlParams), params);\n\n    for (key in params) {\n      if (params.hasOwnProperty(key)) {\n        if (params[ key ] === undefined) {\n          continue;\n        }\n        querystring += encodeURIComponent(key);\n        if (params[ key ] !== true) {\n          querystring += \"=\" + encodeURIComponent(params[ key ]);\n        }\n        querystring += \"&\";\n      }\n    }\n    return location.protocol + \"//\" + location.host +\n      location.pathname + querystring.slice(0, -1);\n  }\n\n  if (window.Notification) {\n    QUnit.done(function(details) {\n      var title,\n          _options = {},\n          notification;\n\n      if (window.Notification && QUnit.urlParams.notifications) {\n        if (details.failed === 0) {\n          title = options.titles.passed;\n          _options.body = renderBody(options.bodies.passed, details);\n\n          if (options.icons.passed) {\n            _options.icon = options.icons.passed;\n          }\n        } else {\n          title = options.titles.failed;\n          _options.body = renderBody(options.bodies.failed, details);\n\n          if (options.icons.failed) {\n            _options.icon = options.icons.failed;\n          }\n        }\n\n        notification = new window.Notification(title, _options);\n\n        setTimeout(function() {\n          notification.close();\n        }, options.timeout);\n      }\n    });\n\n    QUnit.begin(function() {\n      var toolbar      = document.getElementById( \"qunit-testrunner-toolbar\" ),\n          notification = document.createElement( \"input\" ),\n          label        = document.createElement(\"label\");\n\n      notification.type = \"checkbox\";\n      notification.id   = \"qunit-notifications\";\n\n      if (QUnit.urlParams.notifications) {\n        notification.checked = true;\n      }\n\n      notification.addEventListener(\"click\", function(event) {\n        if (event.target.checked) {\n          window.Notification.requestPermission(function() {\n            window.location = generateQueryString({ notifications: true });\n          });\n        } else {\n          window.location = generateQueryString({ notifications: undefined });\n        }\n      }, false);\n      toolbar.appendChild(notification);\n\n      label.innerHTML = \"Notifications\";\n      label.setAttribute( \"for\", \"qunit-notifications\" );\n      label.setAttribute( \"title\", \"Show notifications.\" );\n      toolbar.appendChild(label);\n    });\n  }\n};\n","/* globals jQuery,QUnit */\n\nQUnit.config.urlConfig.push({ id: 'nocontainer', label: 'Hide container'});\nQUnit.config.urlConfig.push({ id: 'nojshint', label: 'Disable JSHint'});\nQUnit.config.urlConfig.push({ id: 'dockcontainer', label: 'Dock container'});\nQUnit.config.testTimeout = 60000; //Default Test Timeout 60 Seconds\n\nif (QUnit.notifications) {\n  QUnit.notifications({\n    icons: {\n      passed: '/assets/passed.png',\n      failed: '/assets/failed.png'\n    }\n  });\n}\n\njQuery(document).ready(function() {\n  var containerVisibility = QUnit.urlParams.nocontainer ? 'hidden' : 'visible';\n  var containerPosition = QUnit.urlParams.dockcontainer ? 'absolute' : 'relative';\n  document.getElementById('ember-testing-container').style.visibility = containerVisibility;\n  document.getElementById('ember-testing-container').style.position = containerPosition;\n});\n","/* globals jQuery,QUnit */\n\njQuery(document).ready(function() {\n  var TestLoader = require('ember-cli/test-loader')['default'];\n  TestLoader.prototype.shouldLoadModule = function(moduleName) {\n    return moduleName.match(/\\/.*[-_]test$/) || (!QUnit.urlParams.nojshint && moduleName.match(/\\.jshint$/));\n  };\n\n  TestLoader.prototype.moduleLoadFailure = function(moduleName, error) {\n    QUnit.module('TestLoader Failures');\n    QUnit.test(moduleName + ': could not be loaded', function() {\n      throw error;\n    });\n  };\n\n  var autostart = QUnit.config.autostart !== false;\n  QUnit.config.autostart = false;\n\n  setTimeout(function() {\n    TestLoader.load();\n\n    if (autostart) {\n      QUnit.start();\n    }\n  }, 250);\n});\n","/* jshint ignore:start */\n\nrunningTests = true;\n\n\n\n/* jshint ignore:end */\n"],"names":[],"mappings":"AAAA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxnLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1zFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;","file":"test-support.js"}