{"version":3,"sources":["vendor/ember-cli/test-support-prefix.js","license.js","loader.js","ember-babel.js","ember-debug/deprecate.js","ember-debug/error.js","ember-debug/features.js","ember-debug/handlers.js","ember-debug/index.js","ember-debug/testing.js","ember-debug/warn.js","ember-testing/adapters/adapter.js","ember-testing/adapters/qunit.js","ember-testing/events.js","ember-testing/ext/application.js","ember-testing/ext/rsvp.js","ember-testing/helpers.js","ember-testing/helpers/and_then.js","ember-testing/helpers/click.js","ember-testing/helpers/current_path.js","ember-testing/helpers/current_route_name.js","ember-testing/helpers/current_url.js","ember-testing/helpers/fill_in.js","ember-testing/helpers/find.js","ember-testing/helpers/find_with_assert.js","ember-testing/helpers/key_event.js","ember-testing/helpers/pause_test.js","ember-testing/helpers/trigger_event.js","ember-testing/helpers/visit.js","ember-testing/helpers/wait.js","ember-testing/index.js","ember-testing/initializers.js","ember-testing/setup_for_testing.js","ember-testing/support.js","ember-testing/test.js","ember-testing/test/adapter.js","ember-testing/test/helpers.js","ember-testing/test/on_inject_helpers.js","ember-testing/test/pending_requests.js","ember-testing/test/promise.js","ember-testing/test/run.js","ember-testing/test/waiters.js","node-module.js","vendor/monkey-patches.js","vendor/qunit/qunit.js","vendor/ember-qunit/qunit-configuration.js","addon-test-support/@ember/test-helpers/-utils.js","addon-test-support/@ember/test-helpers/application.js","addon-test-support/@ember/test-helpers/build-owner.js","addon-test-support/@ember/test-helpers/dom/-get-element.js","addon-test-support/@ember/test-helpers/dom/-is-focusable.js","addon-test-support/@ember/test-helpers/dom/-is-form-control.js","addon-test-support/@ember/test-helpers/dom/blur.js","addon-test-support/@ember/test-helpers/dom/click.js","addon-test-support/@ember/test-helpers/dom/fill-in.js","addon-test-support/@ember/test-helpers/dom/fire-event.js","addon-test-support/@ember/test-helpers/dom/focus.js","addon-test-support/@ember/test-helpers/dom/get-root-element.js","addon-test-support/@ember/test-helpers/dom/tap.js","addon-test-support/@ember/test-helpers/dom/trigger-event.js","addon-test-support/@ember/test-helpers/dom/trigger-key-event.js","addon-test-support/@ember/test-helpers/dom/wait-for.js","addon-test-support/@ember/test-helpers/global.js","addon-test-support/@ember/test-helpers/has-ember-version.js","addon-test-support/@ember/test-helpers/index.js","addon-test-support/@ember/test-helpers/resolver.js","addon-test-support/@ember/test-helpers/settled.js","addon-test-support/@ember/test-helpers/setup-application-context.js","addon-test-support/@ember/test-helpers/setup-context.js","addon-test-support/@ember/test-helpers/setup-rendering-context.js","addon-test-support/@ember/test-helpers/teardown-application-context.js","addon-test-support/@ember/test-helpers/teardown-context.js","addon-test-support/@ember/test-helpers/teardown-rendering-context.js","addon-test-support/@ember/test-helpers/validate-error-handler.js","addon-test-support/@ember/test-helpers/wait-until.js","addon-test-support/ember-cli-qunit.js","addon-test-support/ember-cli-test-loader/test-support/index.js","addon-test-support/ember-qunit/adapter.js","addon-test-support/ember-qunit/index.js","addon-test-support/ember-qunit/legacy-2-x/module-for-component.js","addon-test-support/ember-qunit/legacy-2-x/module-for-model.js","addon-test-support/ember-qunit/legacy-2-x/module-for.js","addon-test-support/ember-qunit/legacy-2-x/qunit-module.js","addon-test-support/ember-qunit/test-loader.js","addon-test-support/ember-test-helpers/has-ember-version.js","addon-test-support/ember-test-helpers/index.js","addon-test-support/ember-test-helpers/legacy-0-6-x/-legacy-overrides.js","addon-test-support/ember-test-helpers/legacy-0-6-x/abstract-test-module.js","addon-test-support/ember-test-helpers/legacy-0-6-x/build-registry.js","addon-test-support/ember-test-helpers/legacy-0-6-x/ext/rsvp.js","addon-test-support/ember-test-helpers/legacy-0-6-x/test-module-for-acceptance.js","addon-test-support/ember-test-helpers/legacy-0-6-x/test-module-for-component.js","addon-test-support/ember-test-helpers/legacy-0-6-x/test-module-for-model.js","addon-test-support/ember-test-helpers/legacy-0-6-x/test-module.js","addon-test-support/ember-test-helpers/wait.js","addon-test-support/qunit/index.js","vendor/ember-cli/test-support-suffix.js"],"sourcesContent":["\n","/*!\n * @overview Ember - JavaScript Application Framework\n * @copyright Copyright 2011-2017 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 2.18.0\n */\n","/*global process */\nvar enifed, requireModule, Ember;\nvar mainContext = this; // Used in ember-environment/lib/global.js\n\n(function() {\n function missingModule(name, referrerName) {\n if (referrerName) {\n throw new Error('Could not find module ' + name + ' required by: ' + referrerName);\n } else {\n throw new Error('Could not find module ' + name);\n }\n }\n\n function internalRequire(_name, referrerName) {\n var name = _name;\n var mod = registry[name];\n\n if (!mod) {\n name = name + '/index';\n mod = registry[name];\n }\n\n var exports = seen[name];\n\n if (exports !== undefined) {\n return exports;\n }\n\n exports = seen[name] = {};\n\n if (!mod) {\n missingModule(_name, referrerName);\n }\n\n var deps = mod.deps;\n var callback = mod.callback;\n var reified = new Array(deps.length);\n\n for (var i = 0; i < deps.length; i++) {\n if (deps[i] === 'exports') {\n reified[i] = exports;\n } else if (deps[i] === 'require') {\n reified[i] = requireModule;\n } else {\n reified[i] = internalRequire(deps[i], name);\n }\n }\n\n callback.apply(this, reified);\n\n return exports;\n }\n\n var isNode = typeof window === 'undefined' &&\n typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n if (!isNode) {\n Ember = this.Ember = this.Ember || {};\n }\n\n if (typeof Ember === 'undefined') { Ember = {}; }\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 requireModule = function(name) {\n return internalRequire(name, null);\n };\n\n // setup `require` module\n requireModule['default'] = requireModule;\n\n requireModule.has = function registryHas(moduleName) {\n return !!registry[moduleName] || !!registry[moduleName + '/index'];\n };\n\n requireModule._eak_seen = registry;\n\n Ember.__loader = {\n define: enifed,\n require: requireModule,\n registry: registry\n };\n } else {\n enifed = Ember.__loader.define;\n requireModule = Ember.__loader.require;\n }\n})();\n","enifed('ember-babel', ['exports'], function (exports) {\n 'use strict';\n\n exports.classCallCheck = classCallCheck;\n exports.inherits = inherits;\n exports.taggedTemplateLiteralLoose = taggedTemplateLiteralLoose;\n exports.createClass = createClass;\n exports.defaults = defaults;\n function classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError('Cannot call a class as a function');\n }\n }\n\n function inherits(subClass, superClass) {\n if (typeof superClass !== 'function' && superClass !== null) {\n throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : defaults(subClass, superClass);\n }\n\n function taggedTemplateLiteralLoose(strings, raw) {\n strings.raw = raw;\n return strings;\n }\n\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ('value' in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function createClass(Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function defaults(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = Object.getOwnPropertyDescriptor(defaults, key);\n if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }\n return obj;\n }\n\n var possibleConstructorReturn = exports.possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError('this hasn\\'t been initialized - super() hasn\\'t been called');\n }\n return call && (typeof call === 'object' || typeof call === 'function') ? call : self;\n };\n\n var slice = exports.slice = Array.prototype.slice;\n});","enifed('ember-debug/deprecate', ['exports', 'ember-debug/error', 'ember-console', 'ember-environment', 'ember-debug/handlers'], function (exports, _error, _emberConsole, _emberEnvironment, _handlers) {\n 'use strict';\n\n exports.missingOptionsUntilDeprecation = exports.missingOptionsIdDeprecation = exports.missingOptionsDeprecation = exports.registerHandler = undefined;\n\n /**\n @module @ember/debug\n @public\n */\n /**\n Allows for runtime registration of handler functions that override the default deprecation behavior.\n Deprecations are invoked by calls to [Ember.deprecate](https://emberjs.com/api/classes/Ember.html#method_deprecate).\n The following example demonstrates its usage by registering a handler that throws an error if the\n message contains the word \"should\", otherwise defers to the default handler.\n \n ```javascript\n Ember.Debug.registerDeprecationHandler((message, options, next) => {\n if (message.indexOf('should') !== -1) {\n throw new Error(`Deprecation message with should: ${message}`);\n } else {\n // defer to whatever handler was registered before this one\n next(message, options);\n }\n });\n ```\n \n The handler function takes the following arguments:\n \n
\n
message - The message received from the deprecation call.
\n
options - An object passed in with the deprecation call containing additional information including:
\n
\n
id - An id of the deprecation in the form of package-name.specific-deprecation.
\n
until - The Ember version number the feature and deprecation will be removed in.
\n
\n
next - A function that calls into the previously registered handler.
\n
\n \n @public\n @static\n @method registerDeprecationHandler\n @for @ember/debug\n @param handler {Function} A function to handle deprecation calls.\n @since 2.1.0\n */\n var registerHandler = function () {}; /*global __fail__*/\n\n var missingOptionsDeprecation = void 0,\n missingOptionsIdDeprecation = void 0,\n missingOptionsUntilDeprecation = void 0,\n deprecate = void 0;\n\n if (true) {\n exports.registerHandler = registerHandler = function registerHandler(handler) {\n (0, _handlers.registerHandler)('deprecate', handler);\n };\n\n var formatMessage = function formatMessage(_message, options) {\n var message = _message;\n\n if (options && options.id) {\n message = message + (' [deprecation id: ' + options.id + ']');\n }\n\n if (options && options.url) {\n message += ' See ' + options.url + ' for more details.';\n }\n\n return message;\n };\n\n registerHandler(function logDeprecationToConsole(message, options) {\n var updatedMessage = formatMessage(message, options);\n\n _emberConsole.default.warn('DEPRECATION: ' + updatedMessage);\n });\n\n var captureErrorForStack = void 0;\n\n if (new Error().stack) {\n captureErrorForStack = function () {\n return new Error();\n };\n } else {\n captureErrorForStack = function () {\n try {\n __fail__.fail();\n } catch (e) {\n return e;\n }\n };\n }\n\n registerHandler(function logDeprecationStackTrace(message, options, next) {\n if (_emberEnvironment.ENV.LOG_STACKTRACE_ON_DEPRECATION) {\n var stackStr = '';\n var error = captureErrorForStack();\n var stack = void 0;\n\n if (error.stack) {\n if (error['arguments']) {\n // Chrome\n stack = error.stack.replace(/^\\s+at\\s+/gm, '').replace(/^([^\\(]+?)([\\n$])/gm, '{anonymous}($1)$2').replace(/^Object.\\s*\\(([^\\)]+)\\)/gm, '{anonymous}($1)').split('\\n');\n stack.shift();\n } else {\n // Firefox\n stack = error.stack.replace(/(?:\\n@:0)?\\s+$/m, '').replace(/^\\(/gm, '{anonymous}(').split('\\n');\n }\n\n stackStr = '\\n ' + stack.slice(2).join('\\n ');\n }\n\n var updatedMessage = formatMessage(message, options);\n\n _emberConsole.default.warn('DEPRECATION: ' + updatedMessage + stackStr);\n } else {\n next.apply(undefined, arguments);\n }\n });\n\n registerHandler(function raiseOnDeprecation(message, options, next) {\n if (_emberEnvironment.ENV.RAISE_ON_DEPRECATION) {\n var updatedMessage = formatMessage(message);\n\n throw new _error.default(updatedMessage);\n } else {\n next.apply(undefined, arguments);\n }\n });\n\n exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `Ember.deprecate` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include `id` and `until` properties.';\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `Ember.deprecate` you must provide `id` in options.';\n exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation = 'When calling `Ember.deprecate` you must provide `until` in options.';\n /**\n @module @ember/application\n @public\n */\n /**\n Display a deprecation warning with the provided message and a stack trace\n (Chrome and Firefox only).\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n @method deprecate\n @for @ember/application/deprecations\n @param {String} message A description of the deprecation.\n @param {Boolean} test A boolean. If falsy, the deprecation will be displayed.\n @param {Object} options\n @param {String} options.id A unique id for this deprecation. The id can be\n used by Ember debugging tools to change the behavior (raise, log or silence)\n for that specific deprecation. The id should be namespaced by dots, e.g.\n \"view.helper.select\".\n @param {string} options.until The version of Ember when this deprecation\n warning will be removed.\n @param {String} [options.url] An optional url to the transition guide on the\n emberjs.com website.\n @static\n @public\n @since 1.0.0\n */\n deprecate = function deprecate(message, test, options) {\n if (!options || !options.id && !options.until) {\n deprecate(missingOptionsDeprecation, false, {\n id: 'ember-debug.deprecate-options-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n if (options && !options.id) {\n deprecate(missingOptionsIdDeprecation, false, {\n id: 'ember-debug.deprecate-id-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n if (options && !options.until) {\n deprecate(missingOptionsUntilDeprecation, options && options.until, {\n id: 'ember-debug.deprecate-until-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n _handlers.invoke.apply(undefined, ['deprecate'].concat(Array.prototype.slice.call(arguments)));\n };\n }\n\n exports.default = deprecate;\n exports.registerHandler = registerHandler;\n exports.missingOptionsDeprecation = missingOptionsDeprecation;\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;\n exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation;\n});","enifed(\"ember-debug/error\", [\"exports\", \"ember-babel\"], function (exports, _emberBabel) {\n \"use strict\";\n\n /**\n @module @ember/error\n */\n function ExtendBuiltin(klass) {\n function ExtendableBuiltin() {\n klass.apply(this, arguments);\n }\n\n ExtendableBuiltin.prototype = Object.create(klass.prototype);\n ExtendableBuiltin.prototype.constructor = ExtendableBuiltin;\n return ExtendableBuiltin;\n }\n\n /**\n A subclass of the JavaScript Error object for use in Ember.\n \n @class EmberError\n @extends Error\n @constructor\n @public\n */\n\n var EmberError = function (_ExtendBuiltin) {\n (0, _emberBabel.inherits)(EmberError, _ExtendBuiltin);\n\n function EmberError(message) {\n (0, _emberBabel.classCallCheck)(this, EmberError);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _ExtendBuiltin.call(this));\n\n if (!(_this instanceof EmberError)) {\n var _ret;\n\n return _ret = new EmberError(message), (0, _emberBabel.possibleConstructorReturn)(_this, _ret);\n }\n\n var error = Error.call(_this, message);\n _this.stack = error.stack;\n _this.description = error.description;\n _this.fileName = error.fileName;\n _this.lineNumber = error.lineNumber;\n _this.message = error.message;\n _this.name = error.name;\n _this.number = error.number;\n _this.code = error.code;\n return _this;\n }\n\n return EmberError;\n }(ExtendBuiltin(Error));\n\n exports.default = EmberError;\n});","enifed('ember-debug/features', ['exports', 'ember-environment', 'ember/features'], function (exports, _emberEnvironment, _features) {\n 'use strict';\n\n exports.default = isEnabled;\n var FEATURES = _features.FEATURES;\n\n\n /**\n @module ember\n */\n\n /**\n The hash of enabled Canary features. Add to this, any canary features\n before creating your application.\n \n Alternatively (and recommended), you can also define `EmberENV.FEATURES`\n if you need to enable features flagged at runtime.\n \n @class FEATURES\n @namespace Ember\n @static\n @since 1.1.0\n @public\n */\n\n // Auto-generated\n\n /**\n Determine whether the specified `feature` is enabled. Used by Ember's\n build tools to exclude experimental features from beta/stable builds.\n \n You can define the following configuration options:\n \n * `EmberENV.ENABLE_OPTIONAL_FEATURES` - enable any features that have not been explicitly\n enabled/disabled.\n \n @method isEnabled\n @param {String} feature The feature to check\n @return {Boolean}\n @for Ember.FEATURES\n @since 1.1.0\n @public\n */\n function isEnabled(feature) {\n var featureValue = FEATURES[feature];\n\n if (featureValue === true || featureValue === false || featureValue === undefined) {\n return featureValue;\n } else if (_emberEnvironment.ENV.ENABLE_OPTIONAL_FEATURES) {\n return true;\n } else {\n return false;\n }\n }\n});","enifed('ember-debug/handlers', ['exports'], function (exports) {\n 'use strict';\n\n var HANDLERS = exports.HANDLERS = {};\n\n var registerHandler = function () {};\n var invoke = function () {};\n\n if (true) {\n exports.registerHandler = registerHandler = function registerHandler(type, callback) {\n var nextHandler = HANDLERS[type] || function () {};\n\n HANDLERS[type] = function (message, options) {\n callback(message, options, nextHandler);\n };\n };\n\n exports.invoke = invoke = function invoke(type, message, test, options) {\n if (test) {\n return;\n }\n\n var handlerForType = HANDLERS[type];\n\n if (handlerForType) {\n handlerForType(message, options);\n }\n };\n }\n\n exports.registerHandler = registerHandler;\n exports.invoke = invoke;\n});","enifed('ember-debug/index', ['exports', 'ember-debug/warn', 'ember-debug/deprecate', 'ember-debug/features', 'ember-debug/error', 'ember-debug/testing', 'ember-environment', 'ember-console', 'ember/features'], function (exports, _warn2, _deprecate2, _features, _error, _testing, _emberEnvironment, _emberConsole, _features2) {\n 'use strict';\n\n exports._warnIfUsingStrippedFeatureFlags = exports.getDebugFunction = exports.setDebugFunction = exports.deprecateFunc = exports.runInDebug = exports.debugFreeze = exports.debugSeal = exports.deprecate = exports.debug = exports.warn = exports.info = exports.assert = exports.setTesting = exports.isTesting = exports.Error = exports.isFeatureEnabled = exports.registerDeprecationHandler = exports.registerWarnHandler = undefined;\n Object.defineProperty(exports, 'registerWarnHandler', {\n enumerable: true,\n get: function () {\n return _warn2.registerHandler;\n }\n });\n Object.defineProperty(exports, 'registerDeprecationHandler', {\n enumerable: true,\n get: function () {\n return _deprecate2.registerHandler;\n }\n });\n Object.defineProperty(exports, 'isFeatureEnabled', {\n enumerable: true,\n get: function () {\n return _features.default;\n }\n });\n Object.defineProperty(exports, 'Error', {\n enumerable: true,\n get: function () {\n return _error.default;\n }\n });\n Object.defineProperty(exports, 'isTesting', {\n enumerable: true,\n get: function () {\n return _testing.isTesting;\n }\n });\n Object.defineProperty(exports, 'setTesting', {\n enumerable: true,\n get: function () {\n return _testing.setTesting;\n }\n });\n var DEFAULT_FEATURES = _features2.DEFAULT_FEATURES,\n FEATURES = _features2.FEATURES;\n\n\n // These are the default production build versions:\n var noop = function () {};\n\n var assert = noop;\n var info = noop;\n var warn = noop;\n var debug = noop;\n var deprecate = noop;\n var debugSeal = noop;\n var debugFreeze = noop;\n var runInDebug = noop;\n var setDebugFunction = noop;\n var getDebugFunction = noop;\n\n var deprecateFunc = function () {\n return arguments[arguments.length - 1];\n };\n\n if (true) {\n exports.setDebugFunction = setDebugFunction = function (type, callback) {\n switch (type) {\n case 'assert':\n return exports.assert = assert = callback;\n case 'info':\n return exports.info = info = callback;\n case 'warn':\n return exports.warn = warn = callback;\n case 'debug':\n return exports.debug = debug = callback;\n case 'deprecate':\n return exports.deprecate = deprecate = callback;\n case 'debugSeal':\n return exports.debugSeal = debugSeal = callback;\n case 'debugFreeze':\n return exports.debugFreeze = debugFreeze = callback;\n case 'runInDebug':\n return exports.runInDebug = runInDebug = callback;\n case 'deprecateFunc':\n return exports.deprecateFunc = deprecateFunc = callback;\n }\n };\n\n exports.getDebugFunction = getDebugFunction = function (type) {\n switch (type) {\n case 'assert':\n return assert;\n case 'info':\n return info;\n case 'warn':\n return warn;\n case 'debug':\n return debug;\n case 'deprecate':\n return deprecate;\n case 'debugSeal':\n return debugSeal;\n case 'debugFreeze':\n return debugFreeze;\n case 'runInDebug':\n return runInDebug;\n case 'deprecateFunc':\n return deprecateFunc;\n }\n };\n }\n\n /**\n @module @ember/debug\n */\n\n if (true) {\n /**\n Define an assertion that will throw an exception if the condition is not met.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n ```javascript\n import { assert } from '@ember/debug';\n // Test for truthiness\n assert('Must pass a valid object', obj);\n // Fail unconditionally\n assert('This code path should never be run');\n ```\n @method assert\n @static\n @for @ember/debug\n @param {String} desc A description of the assertion. This will become\n the text of the Error thrown if the assertion fails.\n @param {Boolean} test Must be truthy for the assertion to pass. If\n falsy, an exception will be thrown.\n @public\n @since 1.0.0\n */\n setDebugFunction('assert', function assert(desc, test) {\n if (!test) {\n throw new _error.default('Assertion Failed: ' + desc);\n }\n });\n\n /**\n Display a debug notice.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n ```javascript\n import { debug } from '@ember/debug';\n debug('I\\'m a debug notice!');\n ```\n @method debug\n @for @ember/debug\n @static\n @param {String} message A debug message to display.\n @public\n */\n setDebugFunction('debug', function debug(message) {\n _emberConsole.default.debug('DEBUG: ' + message);\n });\n\n /**\n Display an info notice.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n @method info\n @private\n */\n setDebugFunction('info', function info() {\n _emberConsole.default.info.apply(undefined, arguments);\n });\n\n /**\n @module @ember/application\n @public\n */\n\n /**\n Alias an old, deprecated method with its new counterpart.\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 * In a production build, this method is defined as an empty function (NOP).\n ```javascript\n Ember.oldMethod = Ember.deprecateFunc('Please use the new, updated method', Ember.newMethod);\n ```\n @method deprecateFunc\n @static\n @for @ember/application/deprecations\n @param {String} message A description of the deprecation.\n @param {Object} [options] The options object for Ember.deprecate.\n @param {Function} func The new function called to replace its deprecated counterpart.\n @return {Function} A new function that wraps the original function with a deprecation warning\n @private\n */\n setDebugFunction('deprecateFunc', function deprecateFunc() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (args.length === 3) {\n var message = args[0],\n options = args[1],\n func = args[2];\n\n return function () {\n deprecate(message, false, options);\n return func.apply(this, arguments);\n };\n } else {\n var _message = args[0],\n _func = args[1];\n\n return function () {\n deprecate(_message);\n return _func.apply(this, arguments);\n };\n }\n });\n\n /**\n @module @ember/debug\n @public\n */\n /**\n Run a function meant for debugging.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n ```javascript\n import Component from '@ember/component';\n import { runInDebug } from '@ember/debug';\n runInDebug(() => {\n Component.reopen({\n didInsertElement() {\n console.log(\"I'm happy\");\n }\n });\n });\n ```\n @method runInDebug\n @for @ember/debug\n @static\n @param {Function} func The function to be executed.\n @since 1.5.0\n @public\n */\n setDebugFunction('runInDebug', function runInDebug(func) {\n func();\n });\n\n setDebugFunction('debugSeal', function debugSeal(obj) {\n Object.seal(obj);\n });\n\n setDebugFunction('debugFreeze', function debugFreeze(obj) {\n Object.freeze(obj);\n });\n\n setDebugFunction('deprecate', _deprecate2.default);\n\n setDebugFunction('warn', _warn2.default);\n }\n\n var _warnIfUsingStrippedFeatureFlags = void 0;\n\n if (true && !(0, _testing.isTesting)()) {\n /**\n Will call `warn()` if ENABLE_OPTIONAL_FEATURES or\n any specific FEATURES flag is truthy.\n This method is called automatically in debug canary builds.\n @private\n @method _warnIfUsingStrippedFeatureFlags\n @return {void}\n */\n exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags = function _warnIfUsingStrippedFeatureFlags(FEATURES, knownFeatures, featuresWereStripped) {\n if (featuresWereStripped) {\n warn('Ember.ENV.ENABLE_OPTIONAL_FEATURES is only available in canary builds.', !_emberEnvironment.ENV.ENABLE_OPTIONAL_FEATURES, { id: 'ember-debug.feature-flag-with-features-stripped' });\n\n var keys = Object.keys(FEATURES || {});\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (key === 'isEnabled' || !(key in knownFeatures)) {\n continue;\n }\n\n warn('FEATURE[\"' + key + '\"] is set as enabled, but FEATURE flags are only available in canary builds.', !FEATURES[key], { id: 'ember-debug.feature-flag-with-features-stripped' });\n }\n }\n };\n\n // Complain if they're using FEATURE flags in builds other than canary\n FEATURES['features-stripped-test'] = true;\n var featuresWereStripped = true;\n\n if ((0, _features.default)('features-stripped-test')) {\n featuresWereStripped = false;\n }\n\n delete FEATURES['features-stripped-test'];\n _warnIfUsingStrippedFeatureFlags(_emberEnvironment.ENV.FEATURES, DEFAULT_FEATURES, featuresWereStripped);\n\n // Inform the developer about the Ember Inspector if not installed.\n var isFirefox = _emberEnvironment.environment.isFirefox;\n var isChrome = _emberEnvironment.environment.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 = void 0;\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 debug('For more advanced debugging, install the Ember Inspector from ' + downloadURL);\n }\n }, false);\n }\n }\n\n exports.assert = assert;\n exports.info = info;\n exports.warn = warn;\n exports.debug = debug;\n exports.deprecate = deprecate;\n exports.debugSeal = debugSeal;\n exports.debugFreeze = debugFreeze;\n exports.runInDebug = runInDebug;\n exports.deprecateFunc = deprecateFunc;\n exports.setDebugFunction = setDebugFunction;\n exports.getDebugFunction = getDebugFunction;\n exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;\n});","enifed(\"ember-debug/testing\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.isTesting = isTesting;\n exports.setTesting = setTesting;\n var testing = false;\n\n function isTesting() {\n return testing;\n }\n\n function setTesting(value) {\n testing = !!value;\n }\n});","enifed('ember-debug/warn', ['exports', 'ember-console', 'ember-debug/deprecate', 'ember-debug/handlers'], function (exports, _emberConsole, _deprecate, _handlers) {\n 'use strict';\n\n exports.missingOptionsDeprecation = exports.missingOptionsIdDeprecation = exports.registerHandler = undefined;\n\n\n var registerHandler = function () {};\n var warn = function () {};\n var missingOptionsDeprecation = void 0,\n missingOptionsIdDeprecation = void 0;\n\n /**\n @module @ember/debug\n */\n\n if (true) {\n /**\n Allows for runtime registration of handler functions that override the default warning behavior.\n Warnings are invoked by calls made to [warn](https://emberjs.com/api/classes/Ember.html#method_warn).\n The following example demonstrates its usage by registering a handler that does nothing overriding Ember's\n default warning behavior.\n ```javascript\n import { registerWarnHandler } from '@ember/debug';\n // next is not called, so no warnings get the default behavior\n registerWarnHandler(() => {});\n ```\n The handler function takes the following arguments:\n
\n
message - The message received from the warn call.
\n
options - An object passed in with the warn call containing additional information including:
\n
\n
id - An id of the warning in the form of package-name.specific-warning.
\n
\n
next - A function that calls into the previously registered handler.
\";\n\n \t\t\t// This occurs when pushFailure is set and we have an extracted stack trace\n \t\t} else if (!details.result && details.source) {\n \t\t\tmessage += \"
\" + \"
Source:
\" + escapeText(details.source) + \"
\" + \"
\";\n \t\t}\n\n \t\tassertList = testItem.getElementsByTagName(\"ol\")[0];\n\n \t\tassertLi = document$$1.createElement(\"li\");\n \t\tassertLi.className = details.result ? \"pass\" : \"fail\";\n \t\tassertLi.innerHTML = message;\n \t\tassertList.appendChild(assertLi);\n \t});\n\n \tQUnit.testDone(function (details) {\n \t\tvar testTitle,\n \t\t time,\n \t\t testItem,\n \t\t assertList,\n \t\t good,\n \t\t bad,\n \t\t testCounts,\n \t\t skipped,\n \t\t sourceName,\n \t\t tests = id(\"qunit-tests\");\n\n \t\tif (!tests) {\n \t\t\treturn;\n \t\t}\n\n \t\ttestItem = id(\"qunit-test-output-\" + details.testId);\n\n \t\tassertList = testItem.getElementsByTagName(\"ol\")[0];\n\n \t\tgood = details.passed;\n \t\tbad = details.failed;\n\n \t\t// This test passed if it has no unexpected failed assertions\n \t\tvar testPassed = details.failed > 0 ? details.todo : !details.todo;\n\n \t\tif (testPassed) {\n\n \t\t\t// Collapse the passing tests\n \t\t\taddClass(assertList, \"qunit-collapsed\");\n \t\t} else if (config.collapse) {\n \t\t\tif (!collapseNext) {\n\n \t\t\t\t// Skip collapsing the first failing test\n \t\t\t\tcollapseNext = true;\n \t\t\t} else {\n\n \t\t\t\t// Collapse remaining tests\n \t\t\t\taddClass(assertList, \"qunit-collapsed\");\n \t\t\t}\n \t\t}\n\n \t\t// The testItem.firstChild is the test name\n \t\ttestTitle = testItem.firstChild;\n\n \t\ttestCounts = bad ? \"\" + bad + \", \" + \"\" + good + \", \" : \"\";\n\n \t\ttestTitle.innerHTML += \" (\" + testCounts + details.assertions.length + \")\";\n\n \t\tif (details.skipped) {\n \t\t\tstats.skippedTests++;\n\n \t\t\ttestItem.className = \"skipped\";\n \t\t\tskipped = document$$1.createElement(\"em\");\n \t\t\tskipped.className = \"qunit-skipped-label\";\n \t\t\tskipped.innerHTML = \"skipped\";\n \t\t\ttestItem.insertBefore(skipped, testTitle);\n \t\t} else {\n \t\t\taddEvent(testTitle, \"click\", function () {\n \t\t\t\ttoggleClass(assertList, \"qunit-collapsed\");\n \t\t\t});\n\n \t\t\ttestItem.className = testPassed ? \"pass\" : \"fail\";\n\n \t\t\tif (details.todo) {\n \t\t\t\tvar todoLabel = document$$1.createElement(\"em\");\n \t\t\t\ttodoLabel.className = \"qunit-todo-label\";\n \t\t\t\ttodoLabel.innerHTML = \"todo\";\n \t\t\t\ttestItem.className += \" todo\";\n \t\t\t\ttestItem.insertBefore(todoLabel, testTitle);\n \t\t\t}\n\n \t\t\ttime = document$$1.createElement(\"span\");\n \t\t\ttime.className = \"runtime\";\n \t\t\ttime.innerHTML = details.runtime + \" ms\";\n \t\t\ttestItem.insertBefore(time, assertList);\n\n \t\t\tif (!testPassed) {\n \t\t\t\tstats.failedTests++;\n \t\t\t} else if (details.todo) {\n \t\t\t\tstats.todoTests++;\n \t\t\t} else {\n \t\t\t\tstats.passedTests++;\n \t\t\t}\n \t\t}\n\n \t\t// Show the source of the test when showing assertions\n \t\tif (details.source) {\n \t\t\tsourceName = document$$1.createElement(\"p\");\n \t\t\tsourceName.innerHTML = \"Source: \" + details.source;\n \t\t\taddClass(sourceName, \"qunit-source\");\n \t\t\tif (testPassed) {\n \t\t\t\taddClass(sourceName, \"qunit-collapsed\");\n \t\t\t}\n \t\t\taddEvent(testTitle, \"click\", function () {\n \t\t\t\ttoggleClass(sourceName, \"qunit-collapsed\");\n \t\t\t});\n \t\t\ttestItem.appendChild(sourceName);\n \t\t}\n \t});\n\n \t// Avoid readyState issue with phantomjs\n \t// Ref: #818\n \tvar notPhantom = function (p) {\n \t\treturn !(p && p.version && p.version.major > 0);\n \t}(window.phantom);\n\n \tif (notPhantom && document$$1.readyState === \"complete\") {\n \t\tQUnit.load();\n \t} else {\n \t\taddEvent(window, \"load\", QUnit.load);\n \t}\n\n \t// Wrap window.onerror. We will call the original window.onerror to see if\n \t// the existing handler fully handles the error; if not, we will call the\n \t// QUnit.onError function.\n \tvar originalWindowOnError = window.onerror;\n\n \t// Cover uncaught exceptions\n \t// Returning true will suppress the default browser handler,\n \t// returning false will let it run.\n \twindow.onerror = function (message, fileName, lineNumber) {\n \t\tvar ret = false;\n \t\tif (originalWindowOnError) {\n \t\t\tfor (var _len = arguments.length, args = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {\n \t\t\t\targs[_key - 3] = arguments[_key];\n \t\t\t}\n\n \t\t\tret = originalWindowOnError.call.apply(originalWindowOnError, [this, message, fileName, lineNumber].concat(args));\n \t\t}\n\n \t\t// Treat return value as window.onerror itself does,\n \t\t// Only do our handling if not suppressed.\n \t\tif (ret !== true) {\n \t\t\tvar error = {\n \t\t\t\tmessage: message,\n \t\t\t\tfileName: fileName,\n \t\t\t\tlineNumber: lineNumber\n \t\t\t};\n\n \t\t\tret = QUnit.onError(error);\n \t\t}\n\n \t\treturn ret;\n \t};\n\n \t// Listen for unhandled rejections, and call QUnit.onUnhandledRejection\n \twindow.addEventListener(\"unhandledrejection\", function (event) {\n \t\tQUnit.onUnhandledRejection(event.reason);\n \t});\n })();\n\n /*\n * This file is a modified version of google-diff-match-patch's JavaScript implementation\n * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),\n * modifications are licensed as more fully set forth in LICENSE.txt.\n *\n * The original source of google-diff-match-patch is attributable and licensed as follows:\n *\n * Copyright 2006 Google Inc.\n * https://code.google.com/p/google-diff-match-patch/\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * More Info:\n * https://code.google.com/p/google-diff-match-patch/\n *\n * Usage: QUnit.diff(expected, actual)\n *\n */\n QUnit.diff = function () {\n \tfunction DiffMatchPatch() {}\n\n \t// DIFF FUNCTIONS\n\n \t/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\n \tvar DIFF_DELETE = -1,\n \t DIFF_INSERT = 1,\n \t DIFF_EQUAL = 0;\n\n \t/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} optChecklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @return {!Array.} Array of diff tuples.\n */\n \tDiffMatchPatch.prototype.DiffMain = function (text1, text2, optChecklines) {\n \t\tvar deadline, checklines, commonlength, commonprefix, commonsuffix, diffs;\n\n \t\t// The diff must be complete in up to 1 second.\n \t\tdeadline = new Date().getTime() + 1000;\n\n \t\t// Check for null inputs.\n \t\tif (text1 === null || text2 === null) {\n \t\t\tthrow new Error(\"Null input. (DiffMain)\");\n \t\t}\n\n \t\t// Check for equality (speedup).\n \t\tif (text1 === text2) {\n \t\t\tif (text1) {\n \t\t\t\treturn [[DIFF_EQUAL, text1]];\n \t\t\t}\n \t\t\treturn [];\n \t\t}\n\n \t\tif (typeof optChecklines === \"undefined\") {\n \t\t\toptChecklines = true;\n \t\t}\n\n \t\tchecklines = optChecklines;\n\n \t\t// Trim off common prefix (speedup).\n \t\tcommonlength = this.diffCommonPrefix(text1, text2);\n \t\tcommonprefix = text1.substring(0, commonlength);\n \t\ttext1 = text1.substring(commonlength);\n \t\ttext2 = text2.substring(commonlength);\n\n \t\t// Trim off common suffix (speedup).\n \t\tcommonlength = this.diffCommonSuffix(text1, text2);\n \t\tcommonsuffix = text1.substring(text1.length - commonlength);\n \t\ttext1 = text1.substring(0, text1.length - commonlength);\n \t\ttext2 = text2.substring(0, text2.length - commonlength);\n\n \t\t// Compute the diff on the middle block.\n \t\tdiffs = this.diffCompute(text1, text2, checklines, deadline);\n\n \t\t// Restore the prefix and suffix.\n \t\tif (commonprefix) {\n \t\t\tdiffs.unshift([DIFF_EQUAL, commonprefix]);\n \t\t}\n \t\tif (commonsuffix) {\n \t\t\tdiffs.push([DIFF_EQUAL, commonsuffix]);\n \t\t}\n \t\tthis.diffCleanupMerge(diffs);\n \t\treturn diffs;\n \t};\n\n \t/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.} diffs Array of diff tuples.\n */\n \tDiffMatchPatch.prototype.diffCleanupEfficiency = function (diffs) {\n \t\tvar changes, equalities, equalitiesLength, lastequality, pointer, preIns, preDel, postIns, postDel;\n \t\tchanges = false;\n \t\tequalities = []; // Stack of indices where equalities are found.\n \t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n \t\t/** @type {?string} */\n \t\tlastequality = null;\n\n \t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n \t\tpointer = 0; // Index of current position.\n\n \t\t// Is there an insertion operation before the last equality.\n \t\tpreIns = false;\n\n \t\t// Is there a deletion operation before the last equality.\n \t\tpreDel = false;\n\n \t\t// Is there an insertion operation after the last equality.\n \t\tpostIns = false;\n\n \t\t// Is there a deletion operation after the last equality.\n \t\tpostDel = false;\n \t\twhile (pointer < diffs.length) {\n\n \t\t\t// Equality found.\n \t\t\tif (diffs[pointer][0] === DIFF_EQUAL) {\n \t\t\t\tif (diffs[pointer][1].length < 4 && (postIns || postDel)) {\n\n \t\t\t\t\t// Candidate found.\n \t\t\t\t\tequalities[equalitiesLength++] = pointer;\n \t\t\t\t\tpreIns = postIns;\n \t\t\t\t\tpreDel = postDel;\n \t\t\t\t\tlastequality = diffs[pointer][1];\n \t\t\t\t} else {\n\n \t\t\t\t\t// Not a candidate, and can never become one.\n \t\t\t\t\tequalitiesLength = 0;\n \t\t\t\t\tlastequality = null;\n \t\t\t\t}\n \t\t\t\tpostIns = postDel = false;\n\n \t\t\t\t// An insertion or deletion.\n \t\t\t} else {\n\n \t\t\t\tif (diffs[pointer][0] === DIFF_DELETE) {\n \t\t\t\t\tpostDel = true;\n \t\t\t\t} else {\n \t\t\t\t\tpostIns = true;\n \t\t\t\t}\n\n \t\t\t\t/*\n * Five types to be split:\n * ABXYCD\n * AXCD\n * ABXC\n * AXCD\n * ABXC\n */\n \t\t\t\tif (lastequality && (preIns && preDel && postIns && postDel || lastequality.length < 2 && preIns + preDel + postIns + postDel === 3)) {\n\n \t\t\t\t\t// Duplicate record.\n \t\t\t\t\tdiffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);\n\n \t\t\t\t\t// Change second copy to insert.\n \t\t\t\t\tdiffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n \t\t\t\t\tequalitiesLength--; // Throw away the equality we just deleted;\n \t\t\t\t\tlastequality = null;\n \t\t\t\t\tif (preIns && preDel) {\n\n \t\t\t\t\t\t// No changes made which could affect previous entry, keep going.\n \t\t\t\t\t\tpostIns = postDel = true;\n \t\t\t\t\t\tequalitiesLength = 0;\n \t\t\t\t\t} else {\n \t\t\t\t\t\tequalitiesLength--; // Throw away the previous equality.\n \t\t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n \t\t\t\t\t\tpostIns = postDel = false;\n \t\t\t\t\t}\n \t\t\t\t\tchanges = true;\n \t\t\t\t}\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n\n \t\tif (changes) {\n \t\t\tthis.diffCleanupMerge(diffs);\n \t\t}\n \t};\n\n \t/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.} diffs Array of diff tuples.\n * @param {integer} string to be beautified.\n * @return {string} HTML representation.\n */\n \tDiffMatchPatch.prototype.diffPrettyHtml = function (diffs) {\n \t\tvar op,\n \t\t data,\n \t\t x,\n \t\t html = [];\n \t\tfor (x = 0; x < diffs.length; x++) {\n \t\t\top = diffs[x][0]; // Operation (insert, delete, equal)\n \t\t\tdata = diffs[x][1]; // Text of change.\n \t\t\tswitch (op) {\n \t\t\t\tcase DIFF_INSERT:\n \t\t\t\t\thtml[x] = \"\" + escapeText(data) + \"\";\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_DELETE:\n \t\t\t\t\thtml[x] = \"\" + escapeText(data) + \"\";\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_EQUAL:\n \t\t\t\t\thtml[x] = \"\" + escapeText(data) + \"\";\n \t\t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t\treturn html.join(\"\");\n \t};\n\n \t/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\n \tDiffMatchPatch.prototype.diffCommonPrefix = function (text1, text2) {\n \t\tvar pointermid, pointermax, pointermin, pointerstart;\n\n \t\t// Quick check for common null cases.\n \t\tif (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) {\n \t\t\treturn 0;\n \t\t}\n\n \t\t// Binary search.\n \t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n \t\tpointermin = 0;\n \t\tpointermax = Math.min(text1.length, text2.length);\n \t\tpointermid = pointermax;\n \t\tpointerstart = 0;\n \t\twhile (pointermin < pointermid) {\n \t\t\tif (text1.substring(pointerstart, pointermid) === text2.substring(pointerstart, pointermid)) {\n \t\t\t\tpointermin = pointermid;\n \t\t\t\tpointerstart = pointermin;\n \t\t\t} else {\n \t\t\t\tpointermax = pointermid;\n \t\t\t}\n \t\t\tpointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n \t\t}\n \t\treturn pointermid;\n \t};\n\n \t/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\n \tDiffMatchPatch.prototype.diffCommonSuffix = function (text1, text2) {\n \t\tvar pointermid, pointermax, pointermin, pointerend;\n\n \t\t// Quick check for common null cases.\n \t\tif (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) {\n \t\t\treturn 0;\n \t\t}\n\n \t\t// Binary search.\n \t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n \t\tpointermin = 0;\n \t\tpointermax = Math.min(text1.length, text2.length);\n \t\tpointermid = pointermax;\n \t\tpointerend = 0;\n \t\twhile (pointermin < pointermid) {\n \t\t\tif (text1.substring(text1.length - pointermid, text1.length - pointerend) === text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n \t\t\t\tpointermin = pointermid;\n \t\t\t\tpointerend = pointermin;\n \t\t\t} else {\n \t\t\t\tpointermax = pointermid;\n \t\t\t}\n \t\t\tpointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n \t\t}\n \t\treturn pointermid;\n \t};\n\n \t/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\n \tDiffMatchPatch.prototype.diffCompute = function (text1, text2, checklines, deadline) {\n \t\tvar diffs, longtext, shorttext, i, hm, text1A, text2A, text1B, text2B, midCommon, diffsA, diffsB;\n\n \t\tif (!text1) {\n\n \t\t\t// Just add some text (speedup).\n \t\t\treturn [[DIFF_INSERT, text2]];\n \t\t}\n\n \t\tif (!text2) {\n\n \t\t\t// Just delete some text (speedup).\n \t\t\treturn [[DIFF_DELETE, text1]];\n \t\t}\n\n \t\tlongtext = text1.length > text2.length ? text1 : text2;\n \t\tshorttext = text1.length > text2.length ? text2 : text1;\n \t\ti = longtext.indexOf(shorttext);\n \t\tif (i !== -1) {\n\n \t\t\t// Shorter text is inside the longer text (speedup).\n \t\t\tdiffs = [[DIFF_INSERT, longtext.substring(0, i)], [DIFF_EQUAL, shorttext], [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n\n \t\t\t// Swap insertions for deletions if diff is reversed.\n \t\t\tif (text1.length > text2.length) {\n \t\t\t\tdiffs[0][0] = diffs[2][0] = DIFF_DELETE;\n \t\t\t}\n \t\t\treturn diffs;\n \t\t}\n\n \t\tif (shorttext.length === 1) {\n\n \t\t\t// Single character string.\n \t\t\t// After the previous speedup, the character can't be an equality.\n \t\t\treturn [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n \t\t}\n\n \t\t// Check to see if the problem can be split in two.\n \t\thm = this.diffHalfMatch(text1, text2);\n \t\tif (hm) {\n\n \t\t\t// A half-match was found, sort out the return data.\n \t\t\ttext1A = hm[0];\n \t\t\ttext1B = hm[1];\n \t\t\ttext2A = hm[2];\n \t\t\ttext2B = hm[3];\n \t\t\tmidCommon = hm[4];\n\n \t\t\t// Send both pairs off for separate processing.\n \t\t\tdiffsA = this.DiffMain(text1A, text2A, checklines, deadline);\n \t\t\tdiffsB = this.DiffMain(text1B, text2B, checklines, deadline);\n\n \t\t\t// Merge the results.\n \t\t\treturn diffsA.concat([[DIFF_EQUAL, midCommon]], diffsB);\n \t\t}\n\n \t\tif (checklines && text1.length > 100 && text2.length > 100) {\n \t\t\treturn this.diffLineMode(text1, text2, deadline);\n \t\t}\n\n \t\treturn this.diffBisect(text1, text2, deadline);\n \t};\n\n \t/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\n \tDiffMatchPatch.prototype.diffHalfMatch = function (text1, text2) {\n \t\tvar longtext, shorttext, dmp, text1A, text2B, text2A, text1B, midCommon, hm1, hm2, hm;\n\n \t\tlongtext = text1.length > text2.length ? text1 : text2;\n \t\tshorttext = text1.length > text2.length ? text2 : text1;\n \t\tif (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n \t\t\treturn null; // Pointless.\n \t\t}\n \t\tdmp = this; // 'this' becomes 'window' in a closure.\n\n \t\t/**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n \t\tfunction diffHalfMatchI(longtext, shorttext, i) {\n \t\t\tvar seed, j, bestCommon, prefixLength, suffixLength, bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;\n\n \t\t\t// Start with a 1/4 length substring at position i as a seed.\n \t\t\tseed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n \t\t\tj = -1;\n \t\t\tbestCommon = \"\";\n \t\t\twhile ((j = shorttext.indexOf(seed, j + 1)) !== -1) {\n \t\t\t\tprefixLength = dmp.diffCommonPrefix(longtext.substring(i), shorttext.substring(j));\n \t\t\t\tsuffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), shorttext.substring(0, j));\n \t\t\t\tif (bestCommon.length < suffixLength + prefixLength) {\n \t\t\t\t\tbestCommon = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength);\n \t\t\t\t\tbestLongtextA = longtext.substring(0, i - suffixLength);\n \t\t\t\t\tbestLongtextB = longtext.substring(i + prefixLength);\n \t\t\t\t\tbestShorttextA = shorttext.substring(0, j - suffixLength);\n \t\t\t\t\tbestShorttextB = shorttext.substring(j + prefixLength);\n \t\t\t\t}\n \t\t\t}\n \t\t\tif (bestCommon.length * 2 >= longtext.length) {\n \t\t\t\treturn [bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB, bestCommon];\n \t\t\t} else {\n \t\t\t\treturn null;\n \t\t\t}\n \t\t}\n\n \t\t// First check if the second quarter is the seed for a half-match.\n \t\thm1 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 4));\n\n \t\t// Check again based on the third quarter.\n \t\thm2 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 2));\n \t\tif (!hm1 && !hm2) {\n \t\t\treturn null;\n \t\t} else if (!hm2) {\n \t\t\thm = hm1;\n \t\t} else if (!hm1) {\n \t\t\thm = hm2;\n \t\t} else {\n\n \t\t\t// Both matched. Select the longest.\n \t\t\thm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n \t\t}\n\n \t\t// A half-match was found, sort out the return data.\n \t\tif (text1.length > text2.length) {\n \t\t\ttext1A = hm[0];\n \t\t\ttext1B = hm[1];\n \t\t\ttext2A = hm[2];\n \t\t\ttext2B = hm[3];\n \t\t} else {\n \t\t\ttext2A = hm[0];\n \t\t\ttext2B = hm[1];\n \t\t\ttext1A = hm[2];\n \t\t\ttext1B = hm[3];\n \t\t}\n \t\tmidCommon = hm[4];\n \t\treturn [text1A, text1B, text2A, text2B, midCommon];\n \t};\n\n \t/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\n \tDiffMatchPatch.prototype.diffLineMode = function (text1, text2, deadline) {\n \t\tvar a, diffs, linearray, pointer, countInsert, countDelete, textInsert, textDelete, j;\n\n \t\t// Scan the text on a line-by-line basis first.\n \t\ta = this.diffLinesToChars(text1, text2);\n \t\ttext1 = a.chars1;\n \t\ttext2 = a.chars2;\n \t\tlinearray = a.lineArray;\n\n \t\tdiffs = this.DiffMain(text1, text2, false, deadline);\n\n \t\t// Convert the diff back to original text.\n \t\tthis.diffCharsToLines(diffs, linearray);\n\n \t\t// Eliminate freak matches (e.g. blank lines)\n \t\tthis.diffCleanupSemantic(diffs);\n\n \t\t// Rediff any replacement blocks, this time character-by-character.\n \t\t// Add a dummy entry at the end.\n \t\tdiffs.push([DIFF_EQUAL, \"\"]);\n \t\tpointer = 0;\n \t\tcountDelete = 0;\n \t\tcountInsert = 0;\n \t\ttextDelete = \"\";\n \t\ttextInsert = \"\";\n \t\twhile (pointer < diffs.length) {\n \t\t\tswitch (diffs[pointer][0]) {\n \t\t\t\tcase DIFF_INSERT:\n \t\t\t\t\tcountInsert++;\n \t\t\t\t\ttextInsert += diffs[pointer][1];\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_DELETE:\n \t\t\t\t\tcountDelete++;\n \t\t\t\t\ttextDelete += diffs[pointer][1];\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_EQUAL:\n\n \t\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n \t\t\t\t\tif (countDelete >= 1 && countInsert >= 1) {\n\n \t\t\t\t\t\t// Delete the offending records and add the merged ones.\n \t\t\t\t\t\tdiffs.splice(pointer - countDelete - countInsert, countDelete + countInsert);\n \t\t\t\t\t\tpointer = pointer - countDelete - countInsert;\n \t\t\t\t\t\ta = this.DiffMain(textDelete, textInsert, false, deadline);\n \t\t\t\t\t\tfor (j = a.length - 1; j >= 0; j--) {\n \t\t\t\t\t\t\tdiffs.splice(pointer, 0, a[j]);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tpointer = pointer + a.length;\n \t\t\t\t\t}\n \t\t\t\t\tcountInsert = 0;\n \t\t\t\t\tcountDelete = 0;\n \t\t\t\t\ttextDelete = \"\";\n \t\t\t\t\ttextInsert = \"\";\n \t\t\t\t\tbreak;\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n \t\tdiffs.pop(); // Remove the dummy entry at the end.\n\n \t\treturn diffs;\n \t};\n\n \t/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\n \tDiffMatchPatch.prototype.diffBisect = function (text1, text2, deadline) {\n \t\tvar text1Length, text2Length, maxD, vOffset, vLength, v1, v2, x, delta, front, k1start, k1end, k2start, k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;\n\n \t\t// Cache the text lengths to prevent multiple calls.\n \t\ttext1Length = text1.length;\n \t\ttext2Length = text2.length;\n \t\tmaxD = Math.ceil((text1Length + text2Length) / 2);\n \t\tvOffset = maxD;\n \t\tvLength = 2 * maxD;\n \t\tv1 = new Array(vLength);\n \t\tv2 = new Array(vLength);\n\n \t\t// Setting all elements to -1 is faster in Chrome & Firefox than mixing\n \t\t// integers and undefined.\n \t\tfor (x = 0; x < vLength; x++) {\n \t\t\tv1[x] = -1;\n \t\t\tv2[x] = -1;\n \t\t}\n \t\tv1[vOffset + 1] = 0;\n \t\tv2[vOffset + 1] = 0;\n \t\tdelta = text1Length - text2Length;\n\n \t\t// If the total number of characters is odd, then the front path will collide\n \t\t// with the reverse path.\n \t\tfront = delta % 2 !== 0;\n\n \t\t// Offsets for start and end of k loop.\n \t\t// Prevents mapping of space beyond the grid.\n \t\tk1start = 0;\n \t\tk1end = 0;\n \t\tk2start = 0;\n \t\tk2end = 0;\n \t\tfor (d = 0; d < maxD; d++) {\n\n \t\t\t// Bail out if deadline is reached.\n \t\t\tif (new Date().getTime() > deadline) {\n \t\t\t\tbreak;\n \t\t\t}\n\n \t\t\t// Walk the front path one step.\n \t\t\tfor (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n \t\t\t\tk1Offset = vOffset + k1;\n \t\t\t\tif (k1 === -d || k1 !== d && v1[k1Offset - 1] < v1[k1Offset + 1]) {\n \t\t\t\t\tx1 = v1[k1Offset + 1];\n \t\t\t\t} else {\n \t\t\t\t\tx1 = v1[k1Offset - 1] + 1;\n \t\t\t\t}\n \t\t\t\ty1 = x1 - k1;\n \t\t\t\twhile (x1 < text1Length && y1 < text2Length && text1.charAt(x1) === text2.charAt(y1)) {\n \t\t\t\t\tx1++;\n \t\t\t\t\ty1++;\n \t\t\t\t}\n \t\t\t\tv1[k1Offset] = x1;\n \t\t\t\tif (x1 > text1Length) {\n\n \t\t\t\t\t// Ran off the right of the graph.\n \t\t\t\t\tk1end += 2;\n \t\t\t\t} else if (y1 > text2Length) {\n\n \t\t\t\t\t// Ran off the bottom of the graph.\n \t\t\t\t\tk1start += 2;\n \t\t\t\t} else if (front) {\n \t\t\t\t\tk2Offset = vOffset + delta - k1;\n \t\t\t\t\tif (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) {\n\n \t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n \t\t\t\t\t\tx2 = text1Length - v2[k2Offset];\n \t\t\t\t\t\tif (x1 >= x2) {\n\n \t\t\t\t\t\t\t// Overlap detected.\n \t\t\t\t\t\t\treturn this.diffBisectSplit(text1, text2, x1, y1, deadline);\n \t\t\t\t\t\t}\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t}\n\n \t\t\t// Walk the reverse path one step.\n \t\t\tfor (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n \t\t\t\tk2Offset = vOffset + k2;\n \t\t\t\tif (k2 === -d || k2 !== d && v2[k2Offset - 1] < v2[k2Offset + 1]) {\n \t\t\t\t\tx2 = v2[k2Offset + 1];\n \t\t\t\t} else {\n \t\t\t\t\tx2 = v2[k2Offset - 1] + 1;\n \t\t\t\t}\n \t\t\t\ty2 = x2 - k2;\n \t\t\t\twhile (x2 < text1Length && y2 < text2Length && text1.charAt(text1Length - x2 - 1) === text2.charAt(text2Length - y2 - 1)) {\n \t\t\t\t\tx2++;\n \t\t\t\t\ty2++;\n \t\t\t\t}\n \t\t\t\tv2[k2Offset] = x2;\n \t\t\t\tif (x2 > text1Length) {\n\n \t\t\t\t\t// Ran off the left of the graph.\n \t\t\t\t\tk2end += 2;\n \t\t\t\t} else if (y2 > text2Length) {\n\n \t\t\t\t\t// Ran off the top of the graph.\n \t\t\t\t\tk2start += 2;\n \t\t\t\t} else if (!front) {\n \t\t\t\t\tk1Offset = vOffset + delta - k2;\n \t\t\t\t\tif (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) {\n \t\t\t\t\t\tx1 = v1[k1Offset];\n \t\t\t\t\t\ty1 = vOffset + x1 - k1Offset;\n\n \t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n \t\t\t\t\t\tx2 = text1Length - x2;\n \t\t\t\t\t\tif (x1 >= x2) {\n\n \t\t\t\t\t\t\t// Overlap detected.\n \t\t\t\t\t\t\treturn this.diffBisectSplit(text1, text2, x1, y1, deadline);\n \t\t\t\t\t\t}\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t}\n \t\t}\n\n \t\t// Diff took too long and hit the deadline or\n \t\t// number of diffs equals number of characters, no commonality at all.\n \t\treturn [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n \t};\n\n \t/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.} Array of diff tuples.\n * @private\n */\n \tDiffMatchPatch.prototype.diffBisectSplit = function (text1, text2, x, y, deadline) {\n \t\tvar text1a, text1b, text2a, text2b, diffs, diffsb;\n \t\ttext1a = text1.substring(0, x);\n \t\ttext2a = text2.substring(0, y);\n \t\ttext1b = text1.substring(x);\n \t\ttext2b = text2.substring(y);\n\n \t\t// Compute both diffs serially.\n \t\tdiffs = this.DiffMain(text1a, text2a, false, deadline);\n \t\tdiffsb = this.DiffMain(text1b, text2b, false, deadline);\n\n \t\treturn diffs.concat(diffsb);\n \t};\n\n \t/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.} diffs Array of diff tuples.\n */\n \tDiffMatchPatch.prototype.diffCleanupSemantic = function (diffs) {\n \t\tvar changes, equalities, equalitiesLength, lastequality, pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1, lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;\n \t\tchanges = false;\n \t\tequalities = []; // Stack of indices where equalities are found.\n \t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n \t\t/** @type {?string} */\n \t\tlastequality = null;\n\n \t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n \t\tpointer = 0; // Index of current position.\n\n \t\t// Number of characters that changed prior to the equality.\n \t\tlengthInsertions1 = 0;\n \t\tlengthDeletions1 = 0;\n\n \t\t// Number of characters that changed after the equality.\n \t\tlengthInsertions2 = 0;\n \t\tlengthDeletions2 = 0;\n \t\twhile (pointer < diffs.length) {\n \t\t\tif (diffs[pointer][0] === DIFF_EQUAL) {\n \t\t\t\t// Equality found.\n \t\t\t\tequalities[equalitiesLength++] = pointer;\n \t\t\t\tlengthInsertions1 = lengthInsertions2;\n \t\t\t\tlengthDeletions1 = lengthDeletions2;\n \t\t\t\tlengthInsertions2 = 0;\n \t\t\t\tlengthDeletions2 = 0;\n \t\t\t\tlastequality = diffs[pointer][1];\n \t\t\t} else {\n \t\t\t\t// An insertion or deletion.\n \t\t\t\tif (diffs[pointer][0] === DIFF_INSERT) {\n \t\t\t\t\tlengthInsertions2 += diffs[pointer][1].length;\n \t\t\t\t} else {\n \t\t\t\t\tlengthDeletions2 += diffs[pointer][1].length;\n \t\t\t\t}\n\n \t\t\t\t// Eliminate an equality that is smaller or equal to the edits on both\n \t\t\t\t// sides of it.\n \t\t\t\tif (lastequality && lastequality.length <= Math.max(lengthInsertions1, lengthDeletions1) && lastequality.length <= Math.max(lengthInsertions2, lengthDeletions2)) {\n\n \t\t\t\t\t// Duplicate record.\n \t\t\t\t\tdiffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);\n\n \t\t\t\t\t// Change second copy to insert.\n \t\t\t\t\tdiffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n\n \t\t\t\t\t// Throw away the equality we just deleted.\n \t\t\t\t\tequalitiesLength--;\n\n \t\t\t\t\t// Throw away the previous equality (it needs to be reevaluated).\n \t\t\t\t\tequalitiesLength--;\n \t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n\n \t\t\t\t\t// Reset the counters.\n \t\t\t\t\tlengthInsertions1 = 0;\n \t\t\t\t\tlengthDeletions1 = 0;\n \t\t\t\t\tlengthInsertions2 = 0;\n \t\t\t\t\tlengthDeletions2 = 0;\n \t\t\t\t\tlastequality = null;\n \t\t\t\t\tchanges = true;\n \t\t\t\t}\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n\n \t\t// Normalize the diff.\n \t\tif (changes) {\n \t\t\tthis.diffCleanupMerge(diffs);\n \t\t}\n\n \t\t// Find any overlaps between deletions and insertions.\n \t\t// e.g: abcxxxxxxdef\n \t\t// -> abcxxxdef\n \t\t// e.g: xxxabcdefxxx\n \t\t// -> defxxxabc\n \t\t// Only extract an overlap if it is as big as the edit ahead or behind it.\n \t\tpointer = 1;\n \t\twhile (pointer < diffs.length) {\n \t\t\tif (diffs[pointer - 1][0] === DIFF_DELETE && diffs[pointer][0] === DIFF_INSERT) {\n \t\t\t\tdeletion = diffs[pointer - 1][1];\n \t\t\t\tinsertion = diffs[pointer][1];\n \t\t\t\toverlapLength1 = this.diffCommonOverlap(deletion, insertion);\n \t\t\t\toverlapLength2 = this.diffCommonOverlap(insertion, deletion);\n \t\t\t\tif (overlapLength1 >= overlapLength2) {\n \t\t\t\t\tif (overlapLength1 >= deletion.length / 2 || overlapLength1 >= insertion.length / 2) {\n\n \t\t\t\t\t\t// Overlap found. Insert an equality and trim the surrounding edits.\n \t\t\t\t\t\tdiffs.splice(pointer, 0, [DIFF_EQUAL, insertion.substring(0, overlapLength1)]);\n \t\t\t\t\t\tdiffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlapLength1);\n \t\t\t\t\t\tdiffs[pointer + 1][1] = insertion.substring(overlapLength1);\n \t\t\t\t\t\tpointer++;\n \t\t\t\t\t}\n \t\t\t\t} else {\n \t\t\t\t\tif (overlapLength2 >= deletion.length / 2 || overlapLength2 >= insertion.length / 2) {\n\n \t\t\t\t\t\t// Reverse overlap found.\n \t\t\t\t\t\t// Insert an equality and swap and trim the surrounding edits.\n \t\t\t\t\t\tdiffs.splice(pointer, 0, [DIFF_EQUAL, deletion.substring(0, overlapLength2)]);\n\n \t\t\t\t\t\tdiffs[pointer - 1][0] = DIFF_INSERT;\n \t\t\t\t\t\tdiffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlapLength2);\n \t\t\t\t\t\tdiffs[pointer + 1][0] = DIFF_DELETE;\n \t\t\t\t\t\tdiffs[pointer + 1][1] = deletion.substring(overlapLength2);\n \t\t\t\t\t\tpointer++;\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t\tpointer++;\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n \t};\n\n \t/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\n \tDiffMatchPatch.prototype.diffCommonOverlap = function (text1, text2) {\n \t\tvar text1Length, text2Length, textLength, best, length, pattern, found;\n\n \t\t// Cache the text lengths to prevent multiple calls.\n \t\ttext1Length = text1.length;\n \t\ttext2Length = text2.length;\n\n \t\t// Eliminate the null case.\n \t\tif (text1Length === 0 || text2Length === 0) {\n \t\t\treturn 0;\n \t\t}\n\n \t\t// Truncate the longer string.\n \t\tif (text1Length > text2Length) {\n \t\t\ttext1 = text1.substring(text1Length - text2Length);\n \t\t} else if (text1Length < text2Length) {\n \t\t\ttext2 = text2.substring(0, text1Length);\n \t\t}\n \t\ttextLength = Math.min(text1Length, text2Length);\n\n \t\t// Quick check for the worst case.\n \t\tif (text1 === text2) {\n \t\t\treturn textLength;\n \t\t}\n\n \t\t// Start by looking for a single character match\n \t\t// and increase length until no match is found.\n \t\t// Performance analysis: https://neil.fraser.name/news/2010/11/04/\n \t\tbest = 0;\n \t\tlength = 1;\n \t\twhile (true) {\n \t\t\tpattern = text1.substring(textLength - length);\n \t\t\tfound = text2.indexOf(pattern);\n \t\t\tif (found === -1) {\n \t\t\t\treturn best;\n \t\t\t}\n \t\t\tlength += found;\n \t\t\tif (found === 0 || text1.substring(textLength - length) === text2.substring(0, length)) {\n \t\t\t\tbest = length;\n \t\t\t\tlength++;\n \t\t\t}\n \t\t}\n \t};\n\n \t/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\n \tDiffMatchPatch.prototype.diffLinesToChars = function (text1, text2) {\n \t\tvar lineArray, lineHash, chars1, chars2;\n \t\tlineArray = []; // E.g. lineArray[4] === 'Hello\\n'\n \t\tlineHash = {}; // E.g. lineHash['Hello\\n'] === 4\n\n \t\t// '\\x00' is a valid character, but various debuggers don't like it.\n \t\t// So we'll insert a junk entry to avoid generating a null character.\n \t\tlineArray[0] = \"\";\n\n \t\t/**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n \t\tfunction diffLinesToCharsMunge(text) {\n \t\t\tvar chars, lineStart, lineEnd, lineArrayLength, line;\n \t\t\tchars = \"\";\n\n \t\t\t// Walk the text, pulling out a substring for each line.\n \t\t\t// text.split('\\n') would would temporarily double our memory footprint.\n \t\t\t// Modifying text would create many large strings to garbage collect.\n \t\t\tlineStart = 0;\n \t\t\tlineEnd = -1;\n\n \t\t\t// Keeping our own length variable is faster than looking it up.\n \t\t\tlineArrayLength = lineArray.length;\n \t\t\twhile (lineEnd < text.length - 1) {\n \t\t\t\tlineEnd = text.indexOf(\"\\n\", lineStart);\n \t\t\t\tif (lineEnd === -1) {\n \t\t\t\t\tlineEnd = text.length - 1;\n \t\t\t\t}\n \t\t\t\tline = text.substring(lineStart, lineEnd + 1);\n \t\t\t\tlineStart = lineEnd + 1;\n\n \t\t\t\tvar lineHashExists = lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined;\n\n \t\t\t\tif (lineHashExists) {\n \t\t\t\t\tchars += String.fromCharCode(lineHash[line]);\n \t\t\t\t} else {\n \t\t\t\t\tchars += String.fromCharCode(lineArrayLength);\n \t\t\t\t\tlineHash[line] = lineArrayLength;\n \t\t\t\t\tlineArray[lineArrayLength++] = line;\n \t\t\t\t}\n \t\t\t}\n \t\t\treturn chars;\n \t\t}\n\n \t\tchars1 = diffLinesToCharsMunge(text1);\n \t\tchars2 = diffLinesToCharsMunge(text2);\n \t\treturn {\n \t\t\tchars1: chars1,\n \t\t\tchars2: chars2,\n \t\t\tlineArray: lineArray\n \t\t};\n \t};\n\n \t/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.} diffs Array of diff tuples.\n * @param {!Array.} lineArray Array of unique strings.\n * @private\n */\n \tDiffMatchPatch.prototype.diffCharsToLines = function (diffs, lineArray) {\n \t\tvar x, chars, text, y;\n \t\tfor (x = 0; x < diffs.length; x++) {\n \t\t\tchars = diffs[x][1];\n \t\t\ttext = [];\n \t\t\tfor (y = 0; y < chars.length; y++) {\n \t\t\t\ttext[y] = lineArray[chars.charCodeAt(y)];\n \t\t\t}\n \t\t\tdiffs[x][1] = text.join(\"\");\n \t\t}\n \t};\n\n \t/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.} diffs Array of diff tuples.\n */\n \tDiffMatchPatch.prototype.diffCleanupMerge = function (diffs) {\n \t\tvar pointer, countDelete, countInsert, textInsert, textDelete, commonlength, changes, diffPointer, position;\n \t\tdiffs.push([DIFF_EQUAL, \"\"]); // Add a dummy entry at the end.\n \t\tpointer = 0;\n \t\tcountDelete = 0;\n \t\tcountInsert = 0;\n \t\ttextDelete = \"\";\n \t\ttextInsert = \"\";\n\n \t\twhile (pointer < diffs.length) {\n \t\t\tswitch (diffs[pointer][0]) {\n \t\t\t\tcase DIFF_INSERT:\n \t\t\t\t\tcountInsert++;\n \t\t\t\t\ttextInsert += diffs[pointer][1];\n \t\t\t\t\tpointer++;\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_DELETE:\n \t\t\t\t\tcountDelete++;\n \t\t\t\t\ttextDelete += diffs[pointer][1];\n \t\t\t\t\tpointer++;\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_EQUAL:\n\n \t\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n \t\t\t\t\tif (countDelete + countInsert > 1) {\n \t\t\t\t\t\tif (countDelete !== 0 && countInsert !== 0) {\n\n \t\t\t\t\t\t\t// Factor out any common prefixes.\n \t\t\t\t\t\t\tcommonlength = this.diffCommonPrefix(textInsert, textDelete);\n \t\t\t\t\t\t\tif (commonlength !== 0) {\n \t\t\t\t\t\t\t\tif (pointer - countDelete - countInsert > 0 && diffs[pointer - countDelete - countInsert - 1][0] === DIFF_EQUAL) {\n \t\t\t\t\t\t\t\t\tdiffs[pointer - countDelete - countInsert - 1][1] += textInsert.substring(0, commonlength);\n \t\t\t\t\t\t\t\t} else {\n \t\t\t\t\t\t\t\t\tdiffs.splice(0, 0, [DIFF_EQUAL, textInsert.substring(0, commonlength)]);\n \t\t\t\t\t\t\t\t\tpointer++;\n \t\t\t\t\t\t\t\t}\n \t\t\t\t\t\t\t\ttextInsert = textInsert.substring(commonlength);\n \t\t\t\t\t\t\t\ttextDelete = textDelete.substring(commonlength);\n \t\t\t\t\t\t\t}\n\n \t\t\t\t\t\t\t// Factor out any common suffixies.\n \t\t\t\t\t\t\tcommonlength = this.diffCommonSuffix(textInsert, textDelete);\n \t\t\t\t\t\t\tif (commonlength !== 0) {\n \t\t\t\t\t\t\t\tdiffs[pointer][1] = textInsert.substring(textInsert.length - commonlength) + diffs[pointer][1];\n \t\t\t\t\t\t\t\ttextInsert = textInsert.substring(0, textInsert.length - commonlength);\n \t\t\t\t\t\t\t\ttextDelete = textDelete.substring(0, textDelete.length - commonlength);\n \t\t\t\t\t\t\t}\n \t\t\t\t\t\t}\n\n \t\t\t\t\t\t// Delete the offending records and add the merged ones.\n \t\t\t\t\t\tif (countDelete === 0) {\n \t\t\t\t\t\t\tdiffs.splice(pointer - countInsert, countDelete + countInsert, [DIFF_INSERT, textInsert]);\n \t\t\t\t\t\t} else if (countInsert === 0) {\n \t\t\t\t\t\t\tdiffs.splice(pointer - countDelete, countDelete + countInsert, [DIFF_DELETE, textDelete]);\n \t\t\t\t\t\t} else {\n \t\t\t\t\t\t\tdiffs.splice(pointer - countDelete - countInsert, countDelete + countInsert, [DIFF_DELETE, textDelete], [DIFF_INSERT, textInsert]);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tpointer = pointer - countDelete - countInsert + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1;\n \t\t\t\t\t} else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {\n\n \t\t\t\t\t\t// Merge this equality with the previous one.\n \t\t\t\t\t\tdiffs[pointer - 1][1] += diffs[pointer][1];\n \t\t\t\t\t\tdiffs.splice(pointer, 1);\n \t\t\t\t\t} else {\n \t\t\t\t\t\tpointer++;\n \t\t\t\t\t}\n \t\t\t\t\tcountInsert = 0;\n \t\t\t\t\tcountDelete = 0;\n \t\t\t\t\ttextDelete = \"\";\n \t\t\t\t\ttextInsert = \"\";\n \t\t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t\tif (diffs[diffs.length - 1][1] === \"\") {\n \t\t\tdiffs.pop(); // Remove the dummy entry at the end.\n \t\t}\n\n \t\t// Second pass: look for single edits surrounded on both sides by equalities\n \t\t// which can be shifted sideways to eliminate an equality.\n \t\t// e.g: ABAC -> ABAC\n \t\tchanges = false;\n \t\tpointer = 1;\n\n \t\t// Intentionally ignore the first and last element (don't need checking).\n \t\twhile (pointer < diffs.length - 1) {\n \t\t\tif (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) {\n\n \t\t\t\tdiffPointer = diffs[pointer][1];\n \t\t\t\tposition = diffPointer.substring(diffPointer.length - diffs[pointer - 1][1].length);\n\n \t\t\t\t// This is a single edit surrounded by equalities.\n \t\t\t\tif (position === diffs[pointer - 1][1]) {\n\n \t\t\t\t\t// Shift the edit over the previous equality.\n \t\t\t\t\tdiffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length);\n \t\t\t\t\tdiffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n \t\t\t\t\tdiffs.splice(pointer - 1, 1);\n \t\t\t\t\tchanges = true;\n \t\t\t\t} else if (diffPointer.substring(0, diffs[pointer + 1][1].length) === diffs[pointer + 1][1]) {\n\n \t\t\t\t\t// Shift the edit over the next equality.\n \t\t\t\t\tdiffs[pointer - 1][1] += diffs[pointer + 1][1];\n \t\t\t\t\tdiffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1];\n \t\t\t\t\tdiffs.splice(pointer + 1, 1);\n \t\t\t\t\tchanges = true;\n \t\t\t\t}\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n\n \t\t// If shifts were made, the diff needs reordering and another shift sweep.\n \t\tif (changes) {\n \t\t\tthis.diffCleanupMerge(diffs);\n \t\t}\n \t};\n\n \treturn function (o, n) {\n \t\tvar diff, output, text;\n \t\tdiff = new DiffMatchPatch();\n \t\toutput = diff.DiffMain(o, n);\n \t\tdiff.diffCleanupEfficiency(output);\n \t\ttext = diff.diffPrettyHtml(output);\n\n \t\treturn text;\n \t};\n }();\n\n}((function() { return this; }())));\n","/* globals QUnit */\n\n(function() {\n QUnit.config.autostart = false;\n QUnit.config.urlConfig.push({ id: 'nocontainer', label: 'Hide container' });\n QUnit.config.urlConfig.push({ id: 'nolint', label: 'Disable Linting' });\n QUnit.config.urlConfig.push({ id: 'dockcontainer', label: 'Dock container' });\n QUnit.config.urlConfig.push({ id: 'devmode', label: 'Development mode' });\n\n QUnit.config.testTimeout = QUnit.urlParams.devmode ? null : 60000; //Default Test Timeout 60 Seconds\n})();\n","define('@ember/test-helpers/-utils', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.nextTickPromise = nextTickPromise;\n exports.runDestroyablesFor = runDestroyablesFor;\n var nextTick = exports.nextTick = setTimeout;\n var futureTick = exports.futureTick = setTimeout;\n\n /**\n @private\n @returns {Promise} promise which resolves on the next turn of the event loop\n */\n function nextTickPromise() {\n return new Ember.RSVP.Promise(function (resolve) {\n nextTick(resolve);\n });\n }\n\n /**\n Retrieves an array of destroyables from the specified property on the object\n provided, iterates that array invoking each function, then deleting the\n property (clearing the array).\n \n @private\n @param {Object} object an object to search for the destroyable array within\n @param {string} property the property on the object that contains the destroyable array\n */\n function runDestroyablesFor(object, property) {\n var destroyables = object[property];\n\n if (!destroyables) {\n return;\n }\n\n for (var i = 0; i < destroyables.length; i++) {\n destroyables[i]();\n }\n\n delete object[property];\n }\n});","define('@ember/test-helpers/application', ['exports', '@ember/test-helpers/resolver'], function (exports, _resolver) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.setApplication = setApplication;\n exports.getApplication = getApplication;\n\n\n var __application__;\n\n /**\n Stores the provided application instance so that tests being ran will be aware of the application under test.\n \n - Required by `setupApplicationContext` method.\n - Used by `setupContext` and `setupRenderingContext` when present.\n \n @public\n @param {Ember.Application} application the application that will be tested\n */\n function setApplication(application) {\n __application__ = application;\n\n if (!(0, _resolver.getResolver)()) {\n var Resolver = application.Resolver;\n var resolver = Resolver.create({ namespace: application });\n\n (0, _resolver.setResolver)(resolver);\n }\n }\n\n /**\n Retrieve the application instance stored by `setApplication`.\n \n @public\n @returns {Ember.Application} the previously stored application instance under test\n */\n function getApplication() {\n return __application__;\n }\n});","define('@ember/test-helpers/build-owner', ['exports', 'ember-test-helpers/legacy-0-6-x/build-registry'], function (exports, _buildRegistry) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = buildOwner;\n\n\n /**\n Creates an \"owner\" (an object that either _is_ or duck-types like an\n `Ember.ApplicationInstance`) from the provided options.\n \n If `options.application` is present (e.g. setup by an earlier call to\n `setApplication`) an `Ember.ApplicationInstance` is built via\n `application.buildInstance()`.\n \n If `options.application` is not present, we fall back to using\n `options.resolver` instead (setup via `setResolver`). This creates a mock\n \"owner\" by using a custom created combination of `Ember.Registry`,\n `Ember.Container`, `Ember._ContainerProxyMixin`, and\n `Ember._RegistryProxyMixin`.\n \n @private\n @param {Ember.Application} [application] the Ember.Application to build an instance from\n @param {Ember.Resolver} [resolver] the resolver to use to back a \"mock owner\"\n @returns {Promise} a promise resolving to the generated \"owner\"\n */\n function buildOwner(application, resolver) {\n if (application) {\n return application.boot().then(function (app) {\n return app.buildInstance().boot();\n });\n }\n\n if (!resolver) {\n throw new Error('You must set up the ember-test-helpers environment with either `setResolver` or `setApplication` before running any tests.');\n }\n\n var _legacyBuildRegistry = (0, _buildRegistry.default)(resolver),\n owner = _legacyBuildRegistry.owner;\n\n return Ember.RSVP.Promise.resolve(owner);\n }\n});","define('@ember/test-helpers/dom/-get-element', ['exports', '@ember/test-helpers/dom/get-root-element'], function (exports, _getRootElement) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = getElement;\n\n\n /**\n Used internally by the DOM interaction helpers to find the element to trigger\n an event on.\n \n @private\n @param {string|Element} target the element or selector to retrieve\n @returns {Element} the target or selector\n */\n function getElement(target) {\n if (target.nodeType === Node.ELEMENT_NODE || target.nodeType === Node.DOCUMENT_NODE || target instanceof Window) {\n return target;\n } else if (typeof target === 'string') {\n var rootElement = (0, _getRootElement.default)();\n\n return rootElement.querySelector(target);\n } else {\n throw new Error('Must use an element or a selector string');\n }\n }\n});","define('@ember/test-helpers/dom/-is-focusable', ['exports', '@ember/test-helpers/dom/-is-form-control'], function (exports, _isFormControl) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = isFocusable;\n\n\n var FOCUSABLE_TAGS = ['A'];\n\n /**\n @private\n @param {Element} element the element to check\n @returns {boolean} `true` when the element is focusable, `false` otherwise\n */\n function isFocusable(element) {\n if ((0, _isFormControl.default)(element) || element.isContentEditable || FOCUSABLE_TAGS.indexOf(element.tagName) > -1) {\n return true;\n }\n\n return element.hasAttribute('tabindex');\n }\n});","define('@ember/test-helpers/dom/-is-form-control', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = isFormControl;\n var FORM_CONTROL_TAGS = ['INPUT', 'BUTTON', 'SELECT', 'TEXTAREA'];\n\n /**\n @private\n @param {Element} element the element to check\n @returns {boolean} `true` when the element is a form control, `false` otherwise\n */\n function isFormControl(element) {\n var tagName = element.tagName,\n type = element.type;\n\n\n if (type === 'hidden') {\n return false;\n }\n\n return FORM_CONTROL_TAGS.indexOf(tagName) > -1;\n }\n});","define('@ember/test-helpers/dom/blur', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/settled', '@ember/test-helpers/dom/-is-focusable', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _settled, _isFocusable, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.__blur__ = __blur__;\n exports.default = blur;\n\n\n /**\n @private\n @param {Element} element the element to trigger events on\n */\n function __blur__(element) {\n var browserIsNotFocused = document.hasFocus && !document.hasFocus();\n\n // makes `document.activeElement` be `body`.\n // If the browser is focused, it also fires a blur event\n element.blur();\n\n // Chrome/Firefox does not trigger the `blur` event if the window\n // does not have focus. If the document does not have focus then\n // fire `blur` event via native event.\n if (browserIsNotFocused) {\n (0, _fireEvent.default)(element, 'blur', { bubbles: false });\n (0, _fireEvent.default)(element, 'focusout');\n }\n }\n\n /**\n Unfocus the specified target.\n \n Sends a number of events intending to simulate a \"real\" user unfocusing an\n element.\n \n The following events are triggered (in order):\n \n - `blur`\n - `focusout`\n \n The exact listing of events that are triggered may change over time as needed\n to continue to emulate how actual browsers handle unfocusing a given element.\n \n @public\n @param {string|Element} [target=document.activeElement] the element or selector to unfocus\n @return {Promise} resolves when settled\n */\n function blur() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.activeElement;\n\n return (0, _utils.nextTickPromise)().then(function () {\n var element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error('Element not found when calling `blur(\\'' + target + '\\')`.');\n }\n\n if (!(0, _isFocusable.default)(element)) {\n throw new Error(target + ' is not focusable');\n }\n\n __blur__(element);\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/click', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/dom/focus', '@ember/test-helpers/settled', '@ember/test-helpers/dom/-is-focusable', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _focus, _settled, _isFocusable, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.__click__ = __click__;\n exports.default = click;\n\n\n /**\n @private\n @param {Element} element the element to click on\n */\n function __click__(element) {\n (0, _fireEvent.default)(element, 'mousedown');\n\n if ((0, _isFocusable.default)(element)) {\n (0, _focus.__focus__)(element);\n }\n\n (0, _fireEvent.default)(element, 'mouseup');\n (0, _fireEvent.default)(element, 'click');\n }\n\n /**\n Clicks on the specified target.\n \n Sends a number of events intending to simulate a \"real\" user clicking on an\n element.\n \n For non-focusable elements the following events are triggered (in order):\n \n - `mousedown`\n - `mouseup`\n - `click`\n \n For focusable (e.g. form control) elements the following events are triggered\n (in order):\n \n - `mousedown`\n - `focus`\n - `focusin`\n - `mouseup`\n - `click`\n \n The exact listing of events that are triggered may change over time as needed\n to continue to emulate how actual browsers handle clicking a given element.\n \n @public\n @param {string|Element} target the element or selector to click on\n @return {Promise} resolves when settled\n */\n function click(target) {\n return (0, _utils.nextTickPromise)().then(function () {\n if (!target) {\n throw new Error('Must pass an element or selector to `click`.');\n }\n\n var element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error('Element not found when calling `click(\\'' + target + '\\')`.');\n }\n\n __click__(element);\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/fill-in', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/-is-form-control', '@ember/test-helpers/dom/focus', '@ember/test-helpers/settled', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/-utils'], function (exports, _getElement, _isFormControl, _focus, _settled, _fireEvent, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = fillIn;\n\n\n /**\n Fill the provided text into the `value` property (or set `.innerHTML` when\n the target is a content editable element) then trigger `change` and `input`\n events on the specified target.\n \n @public\n @param {string|Element} target the element or selector to enter text into\n @param {string} text the text to fill into the target element\n @return {Promise} resolves when the application is settled\n */\n function fillIn(target, text) {\n return (0, _utils.nextTickPromise)().then(function () {\n if (!target) {\n throw new Error('Must pass an element or selector to `fillIn`.');\n }\n\n var element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error('Element not found when calling `fillIn(\\'' + target + '\\')`.');\n }\n var isControl = (0, _isFormControl.default)(element);\n if (!isControl && !element.isContentEditable) {\n throw new Error('`fillIn` is only usable on form controls or contenteditable elements.');\n }\n\n if (!text) {\n throw new Error('Must provide `text` when calling `fillIn`.');\n }\n\n (0, _focus.__focus__)(element);\n\n if (isControl) {\n element.value = text;\n } else {\n element.innerHTML = text;\n }\n\n (0, _fireEvent.default)(element, 'input');\n (0, _fireEvent.default)(element, 'change');\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/fire-event', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = fireEvent;\n\n\n var DEFAULT_EVENT_OPTIONS = { bubbles: true, cancelable: true };\n var KEYBOARD_EVENT_TYPES = exports.KEYBOARD_EVENT_TYPES = Object.freeze(['keydown', 'keypress', 'keyup']);\n var MOUSE_EVENT_TYPES = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];\n var FILE_SELECTION_EVENT_TYPES = ['change'];\n\n /**\n Internal helper used to build and dispatch events throughout the other DOM helpers.\n \n @private\n @param {Element} element the element to dispatch the event to\n @param {string} eventType the type of event\n @param {Object} [options] additional properties to be set on the event\n @returns {Event} the event that was dispatched\n */\n function fireEvent(element, eventType) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (!element) {\n throw new Error('Must pass an element to `fireEvent`');\n }\n\n var event = void 0;\n if (KEYBOARD_EVENT_TYPES.indexOf(eventType) > -1) {\n event = buildKeyboardEvent(eventType, options);\n } else if (MOUSE_EVENT_TYPES.indexOf(eventType) > -1) {\n var rect = void 0;\n if (element instanceof Window) {\n rect = element.document.documentElement.getBoundingClientRect();\n } else if (element instanceof Document) {\n rect = element.documentElement.getBoundingClientRect();\n } else if (element instanceof Element) {\n rect = element.getBoundingClientRect();\n } else {\n return;\n }\n\n var x = rect.left + 1;\n var y = rect.top + 1;\n var simulatedCoordinates = {\n screenX: x + 5, // Those numbers don't really mean anything.\n screenY: y + 95, // They're just to make the screenX/Y be different of clientX/Y..\n clientX: x,\n clientY: y\n };\n\n event = buildMouseEvent(eventType, Ember.merge(simulatedCoordinates, options));\n } else if (FILE_SELECTION_EVENT_TYPES.indexOf(eventType) > -1 && element.files) {\n event = buildFileEvent(eventType, element, options);\n } else {\n event = buildBasicEvent(eventType, options);\n }\n\n element.dispatchEvent(event);\n return event;\n }\n\n // eslint-disable-next-line require-jsdoc\n function buildBasicEvent(type) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var event = document.createEvent('Events');\n\n var bubbles = options.bubbles !== undefined ? options.bubbles : true;\n var cancelable = options.cancelable !== undefined ? options.cancelable : true;\n\n delete options.bubbles;\n delete options.cancelable;\n\n // bubbles and cancelable are readonly, so they can be\n // set when initializing event\n event.initEvent(type, bubbles, cancelable);\n Ember.merge(event, options);\n return event;\n }\n\n // eslint-disable-next-line require-jsdoc\n function buildMouseEvent(type) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var event = void 0;\n try {\n event = document.createEvent('MouseEvents');\n var eventOpts = Ember.merge(Ember.merge({}, DEFAULT_EVENT_OPTIONS), options);\n event.initMouseEvent(type, eventOpts.bubbles, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);\n } catch (e) {\n event = buildBasicEvent(type, options);\n }\n return event;\n }\n\n // eslint-disable-next-line require-jsdoc\n function buildKeyboardEvent(type) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var eventOpts = Ember.merge(Ember.merge({}, DEFAULT_EVENT_OPTIONS), options);\n var event = void 0,\n eventMethodName = void 0;\n\n try {\n event = new KeyboardEvent(type, eventOpts);\n\n // Property definitions are required for B/C for keyboard event usage\n // If this properties are not defined, when listening for key events\n // keyCode/which will be 0. Also, keyCode and which now are string\n // and if app compare it with === with integer key definitions,\n // there will be a fail.\n //\n // https://w3c.github.io/uievents/#interface-keyboardevent\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent\n Object.defineProperty(event, 'keyCode', {\n get: function get() {\n return parseInt(this.key);\n }\n });\n\n Object.defineProperty(event, 'which', {\n get: function get() {\n return parseInt(this.key);\n }\n });\n\n return event;\n } catch (e) {\n // left intentionally blank\n }\n\n try {\n event = document.createEvent('KeyboardEvents');\n eventMethodName = 'initKeyboardEvent';\n } catch (e) {\n // left intentionally blank\n }\n\n if (!event) {\n try {\n event = document.createEvent('KeyEvents');\n eventMethodName = 'initKeyEvent';\n } catch (e) {\n // left intentionally blank\n }\n }\n\n if (event) {\n event[eventMethodName](type, eventOpts.bubbles, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);\n } else {\n event = buildBasicEvent(type, options);\n }\n\n return event;\n }\n\n // eslint-disable-next-line require-jsdoc\n function buildFileEvent(type, element) {\n var files = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n var event = buildBasicEvent(type);\n\n if (files.length > 0) {\n Object.defineProperty(files, 'item', {\n value: function value(index) {\n return typeof index === 'number' ? this[index] : null;\n }\n });\n Object.defineProperty(element, 'files', {\n value: files\n });\n }\n\n Object.defineProperty(event, 'target', {\n value: element\n });\n\n return event;\n }\n});","define('@ember/test-helpers/dom/focus', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/settled', '@ember/test-helpers/dom/-is-focusable', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _settled, _isFocusable, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.__focus__ = __focus__;\n exports.default = focus;\n\n\n /**\n @private\n @param {Element} element the element to trigger events on\n */\n function __focus__(element) {\n var browserIsNotFocused = document.hasFocus && !document.hasFocus();\n\n // makes `document.activeElement` be `element`. If the browser is focused, it also fires a focus event\n element.focus();\n\n // Firefox does not trigger the `focusin` event if the window\n // does not have focus. If the document does not have focus then\n // fire `focusin` event as well.\n if (browserIsNotFocused) {\n // if the browser is not focused the previous `el.focus()` didn't fire an event, so we simulate it\n (0, _fireEvent.default)(element, 'focus', {\n bubbles: false\n });\n\n (0, _fireEvent.default)(element, 'focusin');\n }\n }\n\n /**\n Focus the specified target.\n \n Sends a number of events intending to simulate a \"real\" user focusing an\n element.\n \n The following events are triggered (in order):\n \n - `focus`\n - `focusin`\n \n The exact listing of events that are triggered may change over time as needed\n to continue to emulate how actual browsers handle focusing a given element.\n \n @public\n @param {string|Element} target the element or selector to focus\n @return {Promise} resolves when the application is settled\n */\n function focus(target) {\n return (0, _utils.nextTickPromise)().then(function () {\n if (!target) {\n throw new Error('Must pass an element or selector to `focus`.');\n }\n\n var element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error('Element not found when calling `focus(\\'' + target + '\\')`.');\n }\n\n if (!(0, _isFocusable.default)(element)) {\n throw new Error(target + ' is not focusable');\n }\n\n __focus__(element);\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/get-root-element', ['exports', '@ember/test-helpers/setup-context'], function (exports, _setupContext) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = getRootElement;\n\n\n /**\n @private\n @returns {Element} the root element\n */\n function getRootElement() {\n var context = (0, _setupContext.getContext)();\n var owner = context && context.owner;\n\n if (!owner) {\n throw new Error('Must setup rendering context before attempting to interact with elements.');\n }\n\n var rootElementSelector = void 0;\n // When the host app uses `setApplication` (instead of `setResolver`) the owner has\n // a `rootElement` set on it with the element id to be used\n if (owner && owner._emberTestHelpersMockOwner === undefined) {\n rootElementSelector = owner.rootElement;\n } else {\n rootElementSelector = '#ember-testing';\n }\n\n var rootElement = document.querySelector(rootElementSelector);\n\n return rootElement;\n }\n});","define('@ember/test-helpers/dom/tap', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/dom/click', '@ember/test-helpers/settled', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _click, _settled, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = tap;\n\n\n /**\n Taps on the specified target.\n \n Sends a number of events intending to simulate a \"real\" user tapping on an\n element.\n \n For non-focusable elements the following events are triggered (in order):\n \n - `touchstart`\n - `touchend`\n - `mousedown`\n - `mouseup`\n - `click`\n \n For focusable (e.g. form control) elements the following events are triggered\n (in order):\n \n - `touchstart`\n - `touchend`\n - `mousedown`\n - `focus`\n - `focusin`\n - `mouseup`\n - `click`\n \n The exact listing of events that are triggered may change over time as needed\n to continue to emulate how actual browsers handle tapping on a given element.\n \n @public\n @param {string|Element} target the element or selector to tap on\n @param {Object} options the options to be provided to the touch events\n @return {Promise} resolves when settled\n */\n function tap(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return (0, _utils.nextTickPromise)().then(function () {\n if (!target) {\n throw new Error('Must pass an element or selector to `tap`.');\n }\n\n var element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error('Element not found when calling `tap(\\'' + target + '\\')`.');\n }\n\n var touchstartEv = (0, _fireEvent.default)(element, 'touchstart', options);\n var touchendEv = (0, _fireEvent.default)(element, 'touchend', options);\n\n if (!touchstartEv.defaultPrevented && !touchendEv.defaultPrevented) {\n (0, _click.__click__)(element);\n }\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/trigger-event', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/settled', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _settled, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = triggerEvent;\n\n\n /**\n Triggers an event on the specified target.\n \n @public\n @param {string|Element} target the element or selector to trigger the event on\n @param {string} eventType the type of event to trigger\n @param {Object} options additional properties to be set on the event\n @return {Promise} resolves when the application is settled\n */\n function triggerEvent(target, eventType, options) {\n return (0, _utils.nextTickPromise)().then(function () {\n if (!target) {\n throw new Error('Must pass an element or selector to `triggerEvent`.');\n }\n\n var element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error('Element not found when calling `triggerEvent(\\'' + target + '\\', ...)`.');\n }\n\n if (!eventType) {\n throw new Error('Must provide an `eventType` to `triggerEvent`');\n }\n\n (0, _fireEvent.default)(element, eventType, options);\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/trigger-key-event', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/settled', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _settled, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = triggerKeyEvent;\n\n\n var DEFAULT_MODIFIERS = Object.freeze({\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false\n });\n\n /**\n Triggers a keyboard event on the specified target.\n \n @public\n @param {string|Element} target the element or selector to trigger the event on\n @param {'keydown' | 'keyup' | 'keypress'} eventType the type of event to trigger\n @param {string} keyCode the keyCode of the event being triggered\n @param {Object} [modifiers] the state of various modifier keys\n @param {boolean} [modifiers.ctrlKey=false] if true the generated event will indicate the control key was pressed during the key event\n @param {boolean} [modifiers.altKey=false] if true the generated event will indicate the alt key was pressed during the key event\n @param {boolean} [modifiers.shiftKey=false] if true the generated event will indicate the shift key was pressed during the key event\n @param {boolean} [modifiers.metaKey=false] if true the generated event will indicate the meta key was pressed during the key event\n @return {Promise} resolves when the application is settled\n */\n function triggerKeyEvent(target, eventType, keyCode) {\n var modifiers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_MODIFIERS;\n\n return (0, _utils.nextTickPromise)().then(function () {\n if (!target) {\n throw new Error('Must pass an element or selector to `triggerKeyEvent`.');\n }\n\n var element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error('Element not found when calling `triggerKeyEvent(\\'' + target + '\\', ...)`.');\n }\n\n if (!eventType) {\n throw new Error('Must provide an `eventType` to `triggerKeyEvent`');\n }\n\n if (_fireEvent.KEYBOARD_EVENT_TYPES.indexOf(eventType) === -1) {\n var validEventTypes = _fireEvent.KEYBOARD_EVENT_TYPES.join(', ');\n throw new Error('Must provide an `eventType` of ' + validEventTypes + ' to `triggerKeyEvent` but you passed `' + eventType + '`.');\n }\n\n if (!keyCode) {\n throw new Error('Must provide a `keyCode` to `triggerKeyEvent`');\n }\n\n var options = Ember.merge({ keyCode: keyCode, which: keyCode, key: keyCode }, modifiers);\n\n (0, _fireEvent.default)(element, eventType, options);\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/wait-for', ['exports', '@ember/test-helpers/wait-until', '@ember/test-helpers/dom/get-root-element', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/-utils'], function (exports, _waitUntil, _getRootElement, _getElement, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = waitFor;\n\n\n /**\n @private\n @param {NodeList} nodelist the nodelist to convert to an array\n @returns {Array} an array\n */\n function toArray(nodelist) {\n var array = new Array(nodelist.length);\n for (var i = 0; i < nodelist.length; i++) {\n array[i] = nodelist[i];\n }\n\n return array;\n }\n\n /**\n Used to wait for a particular selector to appear in the DOM. Due to the fact\n that it does not wait for general settledness, this is quite useful for testing\n interim DOM states (e.g. loading states, pending promises, etc).\n \n @param {string} selector the selector to wait for\n @param {Object} [options] the options to be used\n @param {number} [options.timeout=1000] the time to wait (in ms) for a match\n @param {number} [options.count=1] the number of elements that should match the provided selector\n @returns {Element|Array} the element (or array of elements) that were being waited upon\n */\n function waitFor(selector) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref$timeout = _ref.timeout,\n timeout = _ref$timeout === undefined ? 1000 : _ref$timeout,\n _ref$count = _ref.count,\n count = _ref$count === undefined ? null : _ref$count;\n\n return (0, _utils.nextTickPromise)().then(function () {\n if (!selector) {\n throw new Error('Must pass a selector to `waitFor`.');\n }\n\n var callback = void 0;\n if (count !== null) {\n callback = function callback() {\n var rootElement = (0, _getRootElement.default)();\n var elements = rootElement.querySelectorAll(selector);\n if (elements.length === count) {\n return toArray(elements);\n }\n };\n } else {\n callback = function callback() {\n return (0, _getElement.default)(selector);\n };\n }\n return (0, _waitUntil.default)(callback, { timeout: timeout });\n });\n }\n});","define('@ember/test-helpers/global', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n exports.default = function () {\n if (typeof self !== 'undefined') {\n return self;\n } else if (typeof window !== 'undefined') {\n return window;\n } else if (typeof global !== 'undefined') {\n return global;\n } else {\n return Function('return this')();\n }\n }();\n});","define('@ember/test-helpers/has-ember-version', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = hasEmberVersion;\n\n\n /**\n Checks if the currently running Ember version is greater than or equal to the\n specified major and minor version numbers.\n \n @private\n @param {number} major the major version number to compare\n @param {number} minor the minor version number to compare\n @returns {boolean} true if the Ember version is >= MAJOR.MINOR specified, false otherwise\n */\n function hasEmberVersion(major, minor) {\n var numbers = Ember.VERSION.split('-')[0].split('.');\n var actualMajor = parseInt(numbers[0], 10);\n var actualMinor = parseInt(numbers[1], 10);\n return actualMajor > major || actualMajor === major && actualMinor >= minor;\n }\n});","define('@ember/test-helpers/index', ['exports', '@ember/test-helpers/resolver', '@ember/test-helpers/application', '@ember/test-helpers/setup-context', '@ember/test-helpers/teardown-context', '@ember/test-helpers/setup-rendering-context', '@ember/test-helpers/teardown-rendering-context', '@ember/test-helpers/setup-application-context', '@ember/test-helpers/teardown-application-context', '@ember/test-helpers/settled', '@ember/test-helpers/wait-until', '@ember/test-helpers/validate-error-handler', '@ember/test-helpers/dom/click', '@ember/test-helpers/dom/tap', '@ember/test-helpers/dom/focus', '@ember/test-helpers/dom/blur', '@ember/test-helpers/dom/trigger-event', '@ember/test-helpers/dom/trigger-key-event', '@ember/test-helpers/dom/fill-in', '@ember/test-helpers/dom/wait-for'], function (exports, _resolver, _application, _setupContext, _teardownContext, _setupRenderingContext, _teardownRenderingContext, _setupApplicationContext, _teardownApplicationContext, _settled, _waitUntil, _validateErrorHandler, _click, _tap, _focus, _blur, _triggerEvent, _triggerKeyEvent, _fillIn, _waitFor) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, 'setResolver', {\n enumerable: true,\n get: function () {\n return _resolver.setResolver;\n }\n });\n Object.defineProperty(exports, 'getResolver', {\n enumerable: true,\n get: function () {\n return _resolver.getResolver;\n }\n });\n Object.defineProperty(exports, 'setApplication', {\n enumerable: true,\n get: function () {\n return _application.setApplication;\n }\n });\n Object.defineProperty(exports, 'setupContext', {\n enumerable: true,\n get: function () {\n return _setupContext.default;\n }\n });\n Object.defineProperty(exports, 'getContext', {\n enumerable: true,\n get: function () {\n return _setupContext.getContext;\n }\n });\n Object.defineProperty(exports, 'setContext', {\n enumerable: true,\n get: function () {\n return _setupContext.setContext;\n }\n });\n Object.defineProperty(exports, 'unsetContext', {\n enumerable: true,\n get: function () {\n return _setupContext.unsetContext;\n }\n });\n Object.defineProperty(exports, 'pauseTest', {\n enumerable: true,\n get: function () {\n return _setupContext.pauseTest;\n }\n });\n Object.defineProperty(exports, 'resumeTest', {\n enumerable: true,\n get: function () {\n return _setupContext.resumeTest;\n }\n });\n Object.defineProperty(exports, 'teardownContext', {\n enumerable: true,\n get: function () {\n return _teardownContext.default;\n }\n });\n Object.defineProperty(exports, 'setupRenderingContext', {\n enumerable: true,\n get: function () {\n return _setupRenderingContext.default;\n }\n });\n Object.defineProperty(exports, 'render', {\n enumerable: true,\n get: function () {\n return _setupRenderingContext.render;\n }\n });\n Object.defineProperty(exports, 'clearRender', {\n enumerable: true,\n get: function () {\n return _setupRenderingContext.clearRender;\n }\n });\n Object.defineProperty(exports, 'teardownRenderingContext', {\n enumerable: true,\n get: function () {\n return _teardownRenderingContext.default;\n }\n });\n Object.defineProperty(exports, 'setupApplicationContext', {\n enumerable: true,\n get: function () {\n return _setupApplicationContext.default;\n }\n });\n Object.defineProperty(exports, 'visit', {\n enumerable: true,\n get: function () {\n return _setupApplicationContext.visit;\n }\n });\n Object.defineProperty(exports, 'currentRouteName', {\n enumerable: true,\n get: function () {\n return _setupApplicationContext.currentRouteName;\n }\n });\n Object.defineProperty(exports, 'currentURL', {\n enumerable: true,\n get: function () {\n return _setupApplicationContext.currentURL;\n }\n });\n Object.defineProperty(exports, 'teardownApplicationContext', {\n enumerable: true,\n get: function () {\n return _teardownApplicationContext.default;\n }\n });\n Object.defineProperty(exports, 'settled', {\n enumerable: true,\n get: function () {\n return _settled.default;\n }\n });\n Object.defineProperty(exports, 'isSettled', {\n enumerable: true,\n get: function () {\n return _settled.isSettled;\n }\n });\n Object.defineProperty(exports, 'getSettledState', {\n enumerable: true,\n get: function () {\n return _settled.getSettledState;\n }\n });\n Object.defineProperty(exports, 'waitUntil', {\n enumerable: true,\n get: function () {\n return _waitUntil.default;\n }\n });\n Object.defineProperty(exports, 'validateErrorHandler', {\n enumerable: true,\n get: function () {\n return _validateErrorHandler.default;\n }\n });\n Object.defineProperty(exports, 'click', {\n enumerable: true,\n get: function () {\n return _click.default;\n }\n });\n Object.defineProperty(exports, 'tap', {\n enumerable: true,\n get: function () {\n return _tap.default;\n }\n });\n Object.defineProperty(exports, 'focus', {\n enumerable: true,\n get: function () {\n return _focus.default;\n }\n });\n Object.defineProperty(exports, 'blur', {\n enumerable: true,\n get: function () {\n return _blur.default;\n }\n });\n Object.defineProperty(exports, 'triggerEvent', {\n enumerable: true,\n get: function () {\n return _triggerEvent.default;\n }\n });\n Object.defineProperty(exports, 'triggerKeyEvent', {\n enumerable: true,\n get: function () {\n return _triggerKeyEvent.default;\n }\n });\n Object.defineProperty(exports, 'fillIn', {\n enumerable: true,\n get: function () {\n return _fillIn.default;\n }\n });\n Object.defineProperty(exports, 'waitFor', {\n enumerable: true,\n get: function () {\n return _waitFor.default;\n }\n });\n});","define(\"@ember/test-helpers/resolver\", [\"exports\"], function (exports) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.setResolver = setResolver;\n exports.getResolver = getResolver;\n var __resolver__;\n\n /**\n Stores the provided resolver instance so that tests being ran can resolve\n objects in the same way as a normal application.\n \n Used by `setupContext` and `setupRenderingContext` as a fallback when `setApplication` was _not_ used.\n \n @public\n @param {Ember.Resolver} resolver the resolver to be used for testing\n */\n function setResolver(resolver) {\n __resolver__ = resolver;\n }\n\n /**\n Retrieve the resolver instance stored by `setResolver`.\n \n @public\n @returns {Ember.Resolver} the previously stored resolver\n */\n function getResolver() {\n return __resolver__;\n }\n});","define('@ember/test-helpers/settled', ['exports', '@ember/test-helpers/-utils', '@ember/test-helpers/wait-until'], function (exports, _utils, _waitUntil) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports._teardownAJAXHooks = _teardownAJAXHooks;\n exports._setupAJAXHooks = _setupAJAXHooks;\n exports.getSettledState = getSettledState;\n exports.isSettled = isSettled;\n exports.default = settled;\n\n var _slicedToArray = function () {\n function sliceIterator(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"]) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n };\n }();\n\n // Ember internally tracks AJAX requests in the same way that we do here for\n // legacy style \"acceptance\" tests using the `ember-testing.js` asset provided\n // by emberjs/ember.js itself. When `@ember/test-helpers`'s `settled` utility\n // is used in a legacy acceptance test context any pending AJAX requests are\n // not properly considered during the `isSettled` check below.\n //\n // This utilizes a local utility method present in Ember since around 2.8.0 to\n // properly consider pending AJAX requests done within legacy acceptance tests.\n var _internalPendingRequests = function () {\n if (Ember.__loader.registry['ember-testing/test/pending_requests']) {\n return Ember.__loader.require('ember-testing/test/pending_requests').pendingRequests;\n }\n\n return function () {\n return 0;\n };\n }();\n\n var requests = void 0;\n\n /**\n @private\n @returns {number} the count of pending requests\n */\n function pendingRequests() {\n var localRequestsPending = requests !== undefined ? requests.length : 0;\n var internalRequestsPending = _internalPendingRequests();\n\n return localRequestsPending + internalRequestsPending;\n }\n\n /**\n @private\n @param {Event} event (unused)\n @param {XMLHTTPRequest} xhr the XHR that has initiated a request\n */\n function incrementAjaxPendingRequests(event, xhr) {\n requests.push(xhr);\n }\n\n /**\n @private\n @param {Event} event (unused)\n @param {XMLHTTPRequest} xhr the XHR that has initiated a request\n */\n function decrementAjaxPendingRequests(event, xhr) {\n // In most Ember versions to date (current version is 2.16) RSVP promises are\n // configured to flush in the actions queue of the Ember run loop, however it\n // is possible that in the future this changes to use \"true\" micro-task\n // queues.\n //\n // The entire point here, is that _whenever_ promises are resolved will be\n // before the next run of the JS event loop. Then in the next event loop this\n // counter will decrement. In the specific case of AJAX, this means that any\n // promises chained off of `$.ajax` will properly have their `.then` called\n // _before_ this is decremented (and testing continues)\n (0, _utils.nextTick)(function () {\n for (var i = 0; i < requests.length; i++) {\n if (xhr === requests[i]) {\n requests.splice(i, 1);\n }\n }\n }, 0);\n }\n\n /**\n Clears listeners that were previously setup for `ajaxSend` and `ajaxComplete`.\n \n @private\n */\n function _teardownAJAXHooks() {\n if (!Ember.$) {\n return;\n }\n\n Ember.$(document).off('ajaxSend', incrementAjaxPendingRequests);\n Ember.$(document).off('ajaxComplete', decrementAjaxPendingRequests);\n }\n\n /**\n Sets up listeners for `ajaxSend` and `ajaxComplete`.\n \n @private\n */\n function _setupAJAXHooks() {\n requests = [];\n\n if (!Ember.$) {\n return;\n }\n\n Ember.$(document).on('ajaxSend', incrementAjaxPendingRequests);\n Ember.$(document).on('ajaxComplete', decrementAjaxPendingRequests);\n }\n\n var _internalCheckWaiters = void 0;\n if (Ember.__loader.registry['ember-testing/test/waiters']) {\n _internalCheckWaiters = Ember.__loader.require('ember-testing/test/waiters').checkWaiters;\n }\n\n /**\n @private\n @returns {boolean} true if waiters are still pending\n */\n function checkWaiters() {\n if (_internalCheckWaiters) {\n return _internalCheckWaiters();\n } else if (Ember.Test.waiters) {\n if (Ember.Test.waiters.any(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n context = _ref2[0],\n callback = _ref2[1];\n\n return !callback.call(context);\n })) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n Check various settledness metrics, and return an object with the following properties:\n \n * `hasRunLoop` - Checks if a run-loop has been started. If it has, this will\n be `true` otherwise it will be `false`.\n * `hasPendingTimers` - Checks if there are scheduled timers in the run-loop.\n These pending timers are primarily registered by `Ember.run.schedule`. If\n there are pending timers, this will be `true`, otherwise `false`.\n * `hasPendingWaiters` - Checks if any registered test waiters are still\n pending (e.g. the waiter returns `true`). If there are pending waiters,\n this will be `true`, otherwise `false`.\n * `hasPendingRequests` - Checks if there are pending AJAX requests (based on\n `ajaxSend` / `ajaxComplete` events triggered by `jQuery.ajax`). If there\n are pending requests, this will be `true`, otherwise `false`.\n * `pendingRequestCount` - The count of pending AJAX requests.\n \n @public\n @returns {Object} object with properties for each of the metrics used to determine settledness\n */\n function getSettledState() {\n var pendingRequestCount = pendingRequests();\n\n return {\n hasPendingTimers: Boolean(Ember.run.hasScheduledTimers()),\n hasRunLoop: Boolean(Ember.run.currentRunLoop),\n hasPendingWaiters: checkWaiters(),\n hasPendingRequests: pendingRequestCount > 0,\n pendingRequestCount: pendingRequestCount\n };\n }\n\n /**\n Checks various settledness metrics (via `getSettledState()`) to determine if things are settled or not.\n \n Settled generally means that there are no pending timers, no pending waiters,\n no pending AJAX requests, and no current run loop. However, new settledness\n metrics may be added and used as they become available.\n \n @public\n @returns {boolean} `true` if settled, `false` otherwise\n */\n function isSettled() {\n var waitForTimers = true;\n var waitForAJAX = true;\n var waitForWaiters = true;\n\n if (arguments[0] !== undefined) {\n var options = arguments[0];\n waitForTimers = 'waitForTimers' in options ? options.waitForTimers : true;\n waitForAJAX = 'waitForAJAX' in options ? options.waitForAJAX : true;\n waitForWaiters = 'waitForWaiters' in options ? options.waitForWaiters : true;\n }\n\n var _getSettledState = getSettledState(),\n hasPendingTimers = _getSettledState.hasPendingTimers,\n hasRunLoop = _getSettledState.hasRunLoop,\n hasPendingRequests = _getSettledState.hasPendingRequests,\n hasPendingWaiters = _getSettledState.hasPendingWaiters;\n\n if (waitForTimers && (hasPendingTimers || hasRunLoop)) {\n return false;\n }\n\n if (waitForAJAX && hasPendingRequests) {\n return false;\n }\n\n if (waitForWaiters && hasPendingWaiters) {\n return false;\n }\n\n return true;\n }\n\n /**\n Returns a promise that resolves when in a settled state (see `isSettled` for\n a definition of \"settled state\").\n \n @public\n @returns {Promise} resolves when settled\n */\n function settled() {\n var options = arguments[0];\n\n return (0, _waitUntil.default)(function () {\n return isSettled(options);\n }, { timeout: Infinity });\n }\n});","define('@ember/test-helpers/setup-application-context', ['exports', '@ember/test-helpers/-utils', '@ember/test-helpers/setup-context', '@ember/test-helpers/has-ember-version', '@ember/test-helpers/settled'], function (exports, _utils, _setupContext, _hasEmberVersion, _settled) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.visit = visit;\n exports.currentRouteName = currentRouteName;\n exports.currentURL = currentURL;\n exports.default = setupApplicationContext;\n\n\n /**\n Navigate the application to the provided URL.\n \n @public\n @returns {Promise} resolves when settled\n */\n function visit() {\n var _arguments = arguments;\n\n var context = (0, _setupContext.getContext)();\n var owner = context.owner;\n\n\n return (0, _utils.nextTickPromise)().then(function () {\n return owner.visit.apply(owner, _arguments);\n }).then(function () {\n context.element = document.querySelector('#ember-testing > .ember-view');\n }).then(_settled.default);\n }\n\n /**\n @public\n @returns {string} the currently active route name\n */\n function currentRouteName() {\n var _getContext = (0, _setupContext.getContext)(),\n owner = _getContext.owner;\n\n var router = owner.lookup('router:main');\n return Ember.get(router, 'currentRouteName');\n }\n\n var HAS_CURRENT_URL_ON_ROUTER = (0, _hasEmberVersion.default)(2, 13);\n\n /**\n @public\n @returns {string} the applications current url\n */\n function currentURL() {\n var _getContext2 = (0, _setupContext.getContext)(),\n owner = _getContext2.owner;\n\n var router = owner.lookup('router:main');\n\n if (HAS_CURRENT_URL_ON_ROUTER) {\n return Ember.get(router, 'currentURL');\n } else {\n return Ember.get(router, 'location').getURL();\n }\n }\n\n /**\n Used by test framework addons to setup the provided context for working with\n an application (e.g. routing).\n \n `setupContext` must have been ran on the provided context prior to calling\n `setupApplicatinContext`.\n \n Sets up the basic framework used by application tests.\n \n @public\n @param {Object} context the context to setup\n @returns {Promise