Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

{"version":3,"file":"select2.min.js","sources":["../src/select2.js"],"sourcesContent":["/*!\n * Select2 4.0.13\n * https://select2.github.io\n *\n * Released under the MIT license\n * https://github.com/select2/select2/blob/master/LICENSE.md\n */\n;(function (factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(['jquery'], factory);\n    } else if (typeof module === 'object' && module.exports) {\n        // Node/CommonJS\n        module.exports = function (root, jQuery) {\n            if (jQuery === undefined) {\n                // require('jQuery') returns a factory that requires window to\n                // build a jQuery instance, we normalize how we use modules\n                // that require this pattern but the window provided is a noop\n                // if it's defined (how jquery works)\n                if (typeof window !== 'undefined') {\n                    jQuery = require('jquery');\n                }\n                else {\n                    jQuery = require('jquery')(root);\n                }\n            }\n            factory(jQuery);\n            return jQuery;\n        };\n    } else {\n        // Browser globals\n        factory(jQuery);\n    }\n} (function (jQuery) {\n    // This is needed so we can catch the AMD loader configuration and use it\n    // The inner file should be wrapped (by `banner.start.js`) in a function that\n    // returns the AMD loader references.\n    var S2 =(function () {\n        // Restore the Select2 AMD loader so it can be used\n        // Needed mostly in the language files, where the loader is not inserted\n        if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {\n            var S2 = jQuery.fn.select2.amd;\n        }\n        var S2;(function () { if (!S2 || !S2.requirejs) {\n            if (!S2) { S2 = {}; } else { require = S2; }\n            /**\n             * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\n             * Released under MIT license, http://github.com/requirejs/almond/LICENSE\n             */\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\n//be followed.\n            /*global setTimeout: false */\n\n            var requirejs, require, define;\n            (function (undef) {\n                var main, req, makeMap, handlers,\n                    defined = {},\n                    waiting = {},\n                    config = {},\n                    defining = {},\n                    hasOwn = Object.prototype.hasOwnProperty,\n                    aps = [].slice,\n                    jsSuffixRegExp = /\\.js$/;\n\n                function hasProp(obj, prop) {\n                    return hasOwn.call(obj, prop);\n                }\n\n                /**\n                 * Given a relative module name, like ./something, normalize it to\n                 * a real name that can be mapped to a path.\n                 * @param {String} name the relative name\n                 * @param {String} baseName a real name that the name arg is relative\n                 * to.\n                 * @returns {String} normalized name\n                 */\n                function normalize(name, baseName) {\n                    var nameParts, nameSegment, mapValue, foundMap, lastIndex,\n                        foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\n                        baseParts = baseName && baseName.split(\"/\"),\n                        map = config.map,\n                        starMap = (map && map['*']) || {};\n\n                    //Adjust any relative paths.\n                    if (name) {\n                        name = name.split('/');\n                        lastIndex = name.length - 1;\n\n                        // If wanting node ID compatibility, strip .js from end\n                        // of IDs. Have to do this here, and not in nameToUrl\n                        // because node allows either .js or non .js to map\n                        // to same file.\n                        if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n                            name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n                        }\n\n                        // Starts with a '.' so need the baseName\n                        if (name[0].charAt(0) === '.' && baseParts) {\n                            //Convert baseName to array, and lop off the last part,\n                            //so that . matches that 'directory' and not name of the baseName's\n                            //module. For instance, baseName of 'one/two/three', maps to\n                            //'one/two/three.js', but we want the directory, 'one/two' for\n                            //this normalization.\n                            normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\n                            name = normalizedBaseParts.concat(name);\n                        }\n\n                        //start trimDots\n                        for (i = 0; i < name.length; i++) {\n                            part = name[i];\n                            if (part === '.') {\n                                name.splice(i, 1);\n                                i -= 1;\n                            } else if (part === '..') {\n                                // If at the start, or previous value is still ..,\n                                // keep them so that when converted to a path it may\n                                // still work when converted to a path, even though\n                                // as an ID it is less than ideal. In larger point\n                                // releases, may be better to just kick out an error.\n                                if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\n                                    continue;\n                                } else if (i > 0) {\n                                    name.splice(i - 1, 2);\n                                    i -= 2;\n                                }\n                            }\n                        }\n                        //end trimDots\n\n                        name = name.join('/');\n                    }\n\n                    //Apply map config if available.\n                    if ((baseParts || starMap) && map) {\n                        nameParts = name.split('/');\n\n                        for (i = nameParts.length; i > 0; i -= 1) {\n                            nameSegment = nameParts.slice(0, i).join(\"/\");\n\n                            if (baseParts) {\n                                //Find the longest baseName segment match in the config.\n                                //So, do joins on the biggest to smallest lengths of baseParts.\n                                for (j = baseParts.length; j > 0; j -= 1) {\n                                    mapValue = map[baseParts.slice(0, j).join('/')];\n\n                                    //baseName segment has  config, find if it has one for\n                                    //this name.\n                                    if (mapValue) {\n                                        mapValue = mapValue[nameSegment];\n                                        if (mapValue) {\n                                            //Match, update name to the new value.\n                                            foundMap = mapValue;\n                                            foundI = i;\n                                            break;\n                                        }\n                                    }\n                                }\n                            }\n\n                            if (foundMap) {\n                                break;\n                            }\n\n                            //Check for a star map match, but just hold on to it,\n                            //if there is a shorter segment match later in a matching\n                            //config, then favor over this star map.\n                            if (!foundStarMap && starMap && starMap[nameSegment]) {\n                                foundStarMap = starMap[nameSegment];\n                                starI = i;\n                            }\n                        }\n\n                        if (!foundMap && foundStarMap) {\n                            foundMap = foundStarMap;\n                            foundI = starI;\n                        }\n\n                        if (foundMap) {\n                            nameParts.splice(0, foundI, foundMap);\n                            name = nameParts.join('/');\n                        }\n                    }\n\n                    return name;\n                }\n\n                function makeRequire(relName, forceSync) {\n                    return function () {\n                        //A version of a require function that passes a moduleName\n                        //value for items that may need to\n                        //look up paths relative to the moduleName\n                        var args = aps.call(arguments, 0);\n\n                        //If first arg is not require('string'), and there is only\n                        //one arg, it is the array form without a callback. Insert\n                        //a null so that the following concat is correct.\n                        if (typeof args[0] !== 'string' && args.length === 1) {\n                            args.push(null);\n                        }\n                        return req.apply(undef, args.concat([relName, forceSync]));\n                    };\n                }\n\n                function makeNormalize(relName) {\n                    return function (name) {\n                        return normalize(name, relName);\n                    };\n                }\n\n                function makeLoad(depName) {\n                    return function (value) {\n                        defined[depName] = value;\n                    };\n                }\n\n                function callDep(name) {\n                    if (hasProp(waiting, name)) {\n                        var args = waiting[name];\n                        delete waiting[name];\n                        defining[name] = true;\n                        main.apply(undef, args);\n                    }\n\n                    if (!hasProp(defined, name) && !hasProp(defining, name)) {\n                        throw new Error('No ' + name);\n                    }\n                    return defined[name];\n                }\n\n                //Turns a plugin!resource to [plugin, resource]\n                //with the plugin being undefined if the name\n                //did not have a plugin prefix.\n                function splitPrefix(name) {\n                    var prefix,\n                        index = name ? name.indexOf('!') : -1;\n                    if (index > -1) {\n                        prefix = name.substring(0, index);\n                        name = name.substring(index + 1, name.length);\n                    }\n                    return [prefix, name];\n                }\n\n                //Creates a parts array for a relName where first part is plugin ID,\n                //second part is resource ID. Assumes relName has already been normalized.\n                function makeRelParts(relName) {\n                    return relName ? splitPrefix(relName) : [];\n                }\n\n                /**\n                 * Makes a name map, normalizing the name, and using a plugin\n                 * for normalization if necessary. Grabs a ref to plugin\n                 * too, as an optimization.\n                 */\n                makeMap = function (name, relParts) {\n                    var plugin,\n                        parts = splitPrefix(name),\n                        prefix = parts[0],\n                        relResourceName = relParts[1];\n\n                    name = parts[1];\n\n                    if (prefix) {\n                        prefix = normalize(prefix, relResourceName);\n                        plugin = callDep(prefix);\n                    }\n\n                    //Normalize according\n                    if (prefix) {\n                        if (plugin && plugin.normalize) {\n                            name = plugin.normalize(name, makeNormalize(relResourceName));\n                        } else {\n                            name = normalize(name, relResourceName);\n                        }\n                    } else {\n                        name = normalize(name, relResourceName);\n                        parts = splitPrefix(name);\n                        prefix = parts[0];\n                        name = parts[1];\n                        if (prefix) {\n                            plugin = callDep(prefix);\n                        }\n                    }\n\n                    //Using ridiculous property names for space reasons\n                    return {\n                        f: prefix ? prefix + '!' + name : name, //fullName\n                        n: name,\n                        pr: prefix,\n                        p: plugin\n                    };\n                };\n\n                function makeConfig(name) {\n                    return function () {\n                        return (config && config.config && config.config[name]) || {};\n                    };\n                }\n\n                handlers = {\n                    require: function (name) {\n                        return makeRequire(name);\n                    },\n                    exports: function (name) {\n                        var e = defined[name];\n                        if (typeof e !== 'undefined') {\n                            return e;\n                        } else {\n                            return (defined[name] = {});\n                        }\n                    },\n                    module: function (name) {\n                        return {\n                            id: name,\n                            uri: '',\n                            exports: defined[name],\n                            config: makeConfig(name)\n                        };\n                    }\n                };\n\n                main = function (name, deps, callback, relName) {\n                    var cjsModule, depName, ret, map, i, relParts,\n                        args = [],\n                        callbackType = typeof callback,\n                        usingExports;\n\n                    //Use name if no relName\n                    relName = relName || name;\n                    relParts = makeRelParts(relName);\n\n                    //Call the callback to define the module, if necessary.\n                    if (callbackType === 'undefined' || callbackType === 'function') {\n                        //Pull out the defined dependencies and pass the ordered\n                        //values to the callback.\n                        //Default to [require, exports, module] if no deps\n                        deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\n                        for (i = 0; i < deps.length; i += 1) {\n                            map = makeMap(deps[i], relParts);\n                            depName = map.f;\n\n                            //Fast path CommonJS standard dependencies.\n                            if (depName === \"require\") {\n                                args[i] = handlers.require(name);\n                            } else if (depName === \"exports\") {\n                                //CommonJS module spec 1.1\n                                args[i] = handlers.exports(name);\n                                usingExports = true;\n                            } else if (depName === \"module\") {\n                                //CommonJS module spec 1.1\n                                cjsModule = args[i] = handlers.module(name);\n                            } else if (hasProp(defined, depName) ||\n                                hasProp(waiting, depName) ||\n                                hasProp(defining, depName)) {\n                                args[i] = callDep(depName);\n                            } else if (map.p) {\n                                map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n                                args[i] = defined[depName];\n                            } else {\n                                throw new Error(name + ' missing ' + depName);\n                            }\n                        }\n\n                        ret = callback ? callback.apply(defined[name], args) : undefined;\n\n                        if (name) {\n                            //If setting exports via \"module\" is in play,\n                            //favor that over return value and exports. After that,\n                            //favor a non-undefined return value over exports use.\n                            if (cjsModule && cjsModule.exports !== undef &&\n                                cjsModule.exports !== defined[name]) {\n                                defined[name] = cjsModule.exports;\n                            } else if (ret !== undef || !usingExports) {\n                                //Use the return value from the function.\n                                defined[name] = ret;\n                            }\n                        }\n                    } else if (name) {\n                        //May just be an object definition for the module. Only\n                        //worry about defining if have a module name.\n                        defined[name] = callback;\n                    }\n                };\n\n                requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\n                    if (typeof deps === \"string\") {\n                        if (handlers[deps]) {\n                            //callback in this case is really relName\n                            return handlers[deps](callback);\n                        }\n                        //Just return the module wanted. In this scenario, the\n                        //deps arg is the module name, and second arg (if passed)\n                        //is just the relName.\n                        //Normalize module name, if it contains . or ..\n                        return callDep(makeMap(deps, makeRelParts(callback)).f);\n                    } else if (!deps.splice) {\n                        //deps is a config object, not an array.\n                        config = deps;\n                        if (config.deps) {\n                            req(config.deps, config.callback);\n                        }\n                        if (!callback) {\n                            return;\n                        }\n\n                        if (callback.splice) {\n                            //callback is an array, which means it is a dependency list.\n                            //Adjust args if there are dependencies\n                            deps = callback;\n                            callback = relName;\n                            relName = null;\n                        } else {\n                            deps = undef;\n                        }\n                    }\n\n                    //Support require(['a'])\n                    callback = callback || function () {};\n\n                    //If relName is a function, it is an errback handler,\n                    //so remove it.\n                    if (typeof relName === 'function') {\n                        relName = forceSync;\n                        forceSync = alt;\n                    }\n\n                    //Simulate async callback;\n                    if (forceSync) {\n                        main(undef, deps, callback, relName);\n                    } else {\n                        //Using a non-zero value because of concern for what old browsers\n                        //do, and latest browsers \"upgrade\" to 4 if lower value is used:\n                        //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\n                        //If want a value immediately, use require('id') instead -- something\n                        //that works in almond on the global level, but not guaranteed and\n                        //unlikely to work in other AMD implementations.\n                        setTimeout(function () {\n                            main(undef, deps, callback, relName);\n                        }, 4);\n                    }\n\n                    return req;\n                };\n\n                /**\n                 * Just drops the config on the floor, but returns req in case\n                 * the config return value is used.\n                 */\n                req.config = function (cfg) {\n                    return req(cfg);\n                };\n\n                /**\n                 * Expose module registry for debugging and tooling\n                 */\n                requirejs._defined = defined;\n\n                define = function (name, deps, callback) {\n                    if (typeof name !== 'string') {\n                        throw new Error('See almond README: incorrect module build, no module name');\n                    }\n\n                    //This module may not have dependencies\n                    if (!deps.splice) {\n                        //deps is not an array, so probably means\n                        //an object literal or factory function for\n                        //the value. Adjust args.\n                        callback = deps;\n                        deps = [];\n                    }\n\n                    if (!hasProp(defined, name) && !hasProp(waiting, name)) {\n                        waiting[name] = [name, deps, callback];\n                    }\n                };\n\n                define.amd = {\n                    jQuery: true\n                };\n            }());\n\n            S2.requirejs = requirejs;S2.require = require;S2.define = define;\n        }\n        }());\n        S2.define(\"almond\", function(){});\n\n        /* global jQuery:false, $:false */\n        S2.define('jquery',[],function () {\n            var _$ = jQuery || $;\n\n            if (_$ == null && console && console.error) {\n                console.error(\n                    'Select2: An instance of jQuery or a jQuery-compatible library was not ' +\n                    'found. Make sure that you are including jQuery before Select2 on your ' +\n                    'web page.'\n                );\n            }\n\n            return _$;\n        });\n\n        S2.define('select2/utils',[\n            'jquery'\n        ], function ($) {\n            var Utils = {};\n\n            Utils.Extend = function (ChildClass, SuperClass) {\n                var __hasProp = {}.hasOwnProperty;\n\n                function BaseConstructor () {\n                    this.constructor = ChildClass;\n                }\n\n                for (var key in SuperClass) {\n                    if (__hasProp.call(SuperClass, key)) {\n                        ChildClass[key] = SuperClass[key];\n                    }\n                }\n\n                BaseConstructor.prototype = SuperClass.prototype;\n                ChildClass.prototype = new BaseConstructor();\n                ChildClass.__super__ = SuperClass.prototype;\n\n                return ChildClass;\n            };\n\n            function getMethods (theClass) {\n                var proto = theClass.prototype;\n\n                var methods = [];\n\n                for (var methodName in proto) {\n                    var m = proto[methodName];\n\n                    if (typeof m !== 'function') {\n                        continue;\n                    }\n\n                    if (methodName === 'constructor') {\n                        continue;\n                    }\n\n                    methods.push(methodName);\n                }\n\n                return methods;\n            }\n\n            Utils.Decorate = function (SuperClass, DecoratorClass) {\n                var decoratedMethods = getMethods(DecoratorClass);\n                var superMethods = getMethods(SuperClass);\n\n                function DecoratedClass () {\n                    var unshift = Array.prototype.unshift;\n\n                    var argCount = DecoratorClass.prototype.constructor.length;\n\n                    var calledConstructor = SuperClass.prototype.constructor;\n\n                    if (argCount > 0) {\n                        unshift.call(arguments, SuperClass.prototype.constructor);\n\n                        calledConstructor = DecoratorClass.prototype.constructor;\n                    }\n\n                    calledConstructor.apply(this, arguments);\n                }\n\n                DecoratorClass.displayName = SuperClass.displayName;\n\n                function ctr () {\n                    this.constructor = DecoratedClass;\n                }\n\n                DecoratedClass.prototype = new ctr();\n\n                for (var m = 0; m < superMethods.length; m++) {\n                    var superMethod = superMethods[m];\n\n                    DecoratedClass.prototype[superMethod] =\n                        SuperClass.prototype[superMethod];\n                }\n\n                var calledMethod = function (methodName) {\n                    // Stub out the original method if it's not decorating an actual method\n                    var originalMethod = function () {};\n\n                    if (methodName in DecoratedClass.prototype) {\n                        originalMethod = DecoratedClass.prototype[methodName];\n                    }\n\n                    var decoratedMethod = DecoratorClass.prototype[methodName];\n\n                    return function () {\n                        var unshift = Array.prototype.unshift;\n\n                        unshift.call(arguments, originalMethod);\n\n                        return decoratedMethod.apply(this, arguments);\n                    };\n                };\n\n                for (var d = 0; d < decoratedMethods.length; d++) {\n                    var decoratedMethod = decoratedMethods[d];\n\n                    DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);\n                }\n\n                return DecoratedClass;\n            };\n\n            var Observable = function () {\n                this.listeners = {};\n            };\n\n            Observable.prototype.on = function (event, callback) {\n                this.listeners = this.listeners || {};\n\n                if (event in this.listeners) {\n                    this.listeners[event].push(callback);\n                } else {\n                    this.listeners[event] = [callback];\n                }\n            };\n\n            Observable.prototype.trigger = function (event) {\n                var slice = Array.prototype.slice;\n                var params = slice.call(arguments, 1);\n\n                this.listeners = this.listeners || {};\n\n                // Params should always come in as an array\n                if (params == null) {\n                    params = [];\n                }\n\n                // If there are no arguments to the event, use a temporary object\n                if (params.length === 0) {\n                    params.push({});\n                }\n\n                // Set the `_type` of the first object to the event\n                params[0]._type = event;\n\n                if (event in this.listeners) {\n                    this.invoke(this.listeners[event], slice.call(arguments, 1));\n                }\n\n                if ('*' in this.listeners) {\n                    this.invoke(this.listeners['*'], arguments);\n                }\n            };\n\n            Observable.prototype.invoke = function (listeners, params) {\n                for (var i = 0, len = listeners.length; i < len; i++) {\n                    listeners[i].apply(this, params);\n                }\n            };\n\n            Utils.Observable = Observable;\n\n            Utils.generateChars = function (length) {\n                var chars = '';\n\n                for (var i = 0; i < length; i++) {\n                    var randomChar = Math.floor(Math.random() * 36);\n                    chars += randomChar.toString(36);\n                }\n\n                return chars;\n            };\n\n            Utils.bind = function (func, context) {\n                return function () {\n                    func.apply(context, arguments);\n                };\n            };\n\n            Utils._convertData = function (data) {\n                for (var originalKey in data) {\n                    var keys = originalKey.split('-');\n\n                    var dataLevel = data;\n\n                    if (keys.length === 1) {\n                        continue;\n                    }\n\n                    for (var k = 0; k < keys.length; k++) {\n                        var key = keys[k];\n\n                        // Lowercase the first letter\n                        // By default, dash-separated becomes camelCase\n                        key = key.substring(0, 1).toLowerCase() + key.substring(1);\n\n                        if (!(key in dataLevel)) {\n                            dataLevel[key] = {};\n                        }\n\n                        if (k == keys.length - 1) {\n                            dataLevel[key] = data[originalKey];\n                        }\n\n                        dataLevel = dataLevel[key];\n                    }\n\n                    delete data[originalKey];\n                }\n\n                return data;\n            };\n\n            Utils.hasScroll = function (index, el) {\n                // Adapted from the function created by @ShadowScripter\n                // and adapted by @BillBarry on the Stack Exchange Code Review website.\n                // The original code can be found at\n                // http://codereview.stackexchange.com/q/13338\n                // and was designed to be used with the Sizzle selector engine.\n\n                var $el = $(el);\n                var overflowX = el.style.overflowX;\n                var overflowY = el.style.overflowY;\n\n                //Check both x and y declarations\n                if (overflowX === overflowY &&\n                    (overflowY === 'hidden' || overflowY === 'visible')) {\n                    return false;\n                }\n\n                if (overflowX === 'scroll' || overflowY === 'scroll') {\n                    return true;\n                }\n\n                return ($el.innerHeight() < el.scrollHeight ||\n                    $el.innerWidth() < el.scrollWidth);\n            };\n\n            Utils.escapeMarkup = function (markup) {\n                var replaceMap = {\n                    '\\\\': '&#92;',\n                    '&': '&amp;',\n                    '<': '&lt;',\n                    '>': '&gt;',\n                    '\"': '&quot;',\n                    '\\'': '&#39;',\n                    '/': '&#47;'\n                };\n\n                // Do not try to escape the markup if it's not a string\n                if (typeof markup !== 'string') {\n                    return markup;\n                }\n\n                return String(markup).replace(/[&<>\"'\\/\\\\]/g, function (match) {\n                    return replaceMap[match];\n                });\n            };\n\n            // Append an array of jQuery nodes to a given element.\n            Utils.appendMany = function ($element, $nodes) {\n                // jQuery 1.7.x does not support $.fn.append() with an array\n                // Fall back to a jQuery object collection using $.fn.add()\n                if ($.fn.jquery.substr(0, 3) === '1.7') {\n                    var $jqNodes = $();\n\n                    $.map($nodes, function (node) {\n                        $jqNodes = $jqNodes.add(node);\n                    });\n\n                    $nodes = $jqNodes;\n                }\n\n                $element.append($nodes);\n            };\n\n            // Cache objects in Utils.__cache instead of $.data (see #4346)\n            Utils.__cache = {};\n\n            var id = 0;\n            Utils.GetUniqueElementId = function (element) {\n                // Get a unique element Id. If element has no id,\n                // creates a new unique number, stores it in the id\n                // attribute and returns the new id.\n                // If an id already exists, it simply returns it.\n\n                var select2Id = element.getAttribute('data-select2-id');\n                if (select2Id == null) {\n                    // If element has id, use it.\n                    if (element.id) {\n                        select2Id = element.id;\n                        element.setAttribute('data-select2-id', select2Id);\n                    } else {\n                        element.setAttribute('data-select2-id', ++id);\n                        select2Id = id.toString();\n                    }\n                }\n                return select2Id;\n            };\n\n            Utils.StoreData = function (element, name, value) {\n                // Stores an item in the cache for a specified element.\n                // name is the cache key.\n                var id = Utils.GetUniqueElementId(element);\n                if (!Utils.__cache[id]) {\n                    Utils.__cache[id] = {};\n                }\n\n                Utils.__cache[id][name] = value;\n            };\n\n            Utils.GetData = function (element, name) {\n                // Retrieves a value from the cache by its key (name)\n                // name is optional. If no name specified, return\n                // all cache items for the specified element.\n                // and for a specified element.\n                var id = Utils.GetUniqueElementId(element);\n                if (name) {\n                    if (Utils.__cache[id]) {\n                        if (Utils.__cache[id][name] != null) {\n                            return Utils.__cache[id][name];\n                        }\n                        return $(element).data(name); // Fallback to HTML5 data attribs.\n                    }\n                    return $(element).data(name); // Fallback to HTML5 data attribs.\n                } else {\n                    return Utils.__cache[id];\n                }\n            };\n\n            Utils.RemoveData = function (element) {\n                // Removes all cached items for a specified element.\n                var id = Utils.GetUniqueElementId(element);\n                if (Utils.__cache[id] != null) {\n                    delete Utils.__cache[id];\n                }\n\n                element.removeAttribute('data-select2-id');\n            };\n\n            return Utils;\n        });\n\n        S2.define('select2/results',[\n            'jquery',\n            './utils'\n        ], function ($, Utils) {\n            function Results ($element, options, dataAdapter) {\n                this.$element = $element;\n                this.data = dataAdapter;\n                this.options = options;\n\n                Results.__super__.constructor.call(this);\n            }\n\n            Utils.Extend(Results, Utils.Observable);\n\n            Results.prototype.render = function () {\n                var $results = $(\n                    '<ul class=\"select2-results__options\" role=\"listbox\"></ul>'\n                );\n\n                if (this.options.get('multiple')) {\n                    $results.attr('aria-multiselectable', 'true');\n                }\n\n                this.$results = $results;\n\n                return $results;\n            };\n\n            Results.prototype.clear = function () {\n                this.$results.empty();\n            };\n\n            Results.prototype.displayMessage = function (params) {\n                var escapeMarkup = this.options.get('escapeMarkup');\n\n                this.clear();\n                this.hideLoading();\n\n                var $message = $(\n                    '<li role=\"alert\" aria-live=\"assertive\"' +\n                    ' class=\"select2-results__option\"></li>'\n                );\n\n                var message = this.options.get('translations').get(params.message);\n\n                $message.append(\n                    escapeMarkup(\n                        message(params.args)\n                    )\n                );\n\n                $message[0].className += ' select2-results__message';\n\n                this.$results.append($message);\n            };\n\n            Results.prototype.hideMessages = function () {\n                this.$results.find('.select2-results__message').remove();\n            };\n\n            Results.prototype.append = function (data) {\n                this.hideLoading();\n\n                var $options = [];\n\n                if (data.results == null || data.results.length === 0) {\n                    if (this.$results.children().length === 0) {\n                        this.trigger('results:message', {\n                            message: 'noResults'\n                        });\n                    }\n\n                    return;\n                }\n\n                data.results = this.sort(data.results);\n\n                for (var d = 0; d < data.results.length; d++) {\n                    var item = data.results[d];\n\n                    var $option = this.option(item);\n\n                    $options.push($option);\n                }\n\n                this.$results.append($options);\n            };\n\n            Results.prototype.position = function ($results, $dropdown) {\n                var $resultsContainer = $dropdown.find('.select2-results');\n                $resultsContainer.append($results);\n            };\n\n            Results.prototype.sort = function (data) {\n                var sorter = this.options.get('sorter');\n\n                return sorter(data);\n            };\n\n            Results.prototype.highlightFirstItem = function () {\n                var $options = this.$results\n                    .find('.select2-results__option[aria-selected]');\n\n                var $selected = $options.filter('[aria-selected=true]');\n\n                // Check if there are any selected options\n                if ($selected.length > 0) {\n                    // If there are selected options, highlight the first\n                    $selected.first().trigger('mouseenter');\n                } else {\n                    // If there are no selected options, highlight the first option\n                    // in the dropdown\n                    $options.first().trigger('mouseenter');\n                }\n\n                this.ensureHighlightVisible();\n            };\n\n            Results.prototype.setClasses = function () {\n                var self = this;\n\n                this.data.current(function (selected) {\n                    var selectedIds = $.map(selected, function (s) {\n                        return s.id.toString();\n                    });\n\n                    var $options = self.$results\n                        .find('.select2-results__option[aria-selected]');\n\n                    $options.each(function () {\n                        var $option = $(this);\n\n                        var item = Utils.GetData(this, 'data');\n\n                        // id needs to be converted to a string when comparing\n                        var id = '' + item.id;\n\n                        if ((item.element != null && item.element.selected) ||\n                            (item.element == null && $.inArray(id, selectedIds) > -1)) {\n                            $option.attr('aria-selected', 'true');\n                        } else {\n                            $option.attr('aria-selected', 'false');\n                        }\n                    });\n\n                });\n            };\n\n            Results.prototype.showLoading = function (params) {\n                this.hideLoading();\n\n                var loadingMore = this.options.get('translations').get('searching');\n\n                var loading = {\n                    disabled: true,\n                    loading: true,\n                    text: loadingMore(params)\n                };\n                var $loading = this.option(loading);\n                $loading.className += ' loading-results';\n\n                this.$results.prepend($loading);\n            };\n\n            Results.prototype.hideLoading = function () {\n                this.$results.find('.loading-results').remove();\n            };\n\n            Results.prototype.option = function (data) {\n                var option = document.createElement('li');\n                option.className = 'select2-results__option';\n\n                var attrs = {\n                    'role': 'option',\n                    'aria-selected': 'false'\n                };\n\n                var matches = window.Element.prototype.matches ||\n                    window.Element.prototype.msMatchesSelector ||\n                    window.Element.prototype.webkitMatchesSelector;\n\n                if ((data.element != null && matches.call(data.element, ':disabled')) ||\n                    (data.element == null && data.disabled)) {\n                    delete attrs['aria-selected'];\n                    attrs['aria-disabled'] = 'true';\n                }\n\n                if (data.id == null) {\n                    delete attrs['aria-selected'];\n                }\n\n                if (data._resultId != null) {\n                    option.id = data._resultId;\n                }\n\n                if (data.title) {\n                    option.title = data.title;\n                }\n\n                if (data.children) {\n                    attrs.role = 'group';\n                    attrs['aria-label'] = data.text;\n                    delete attrs['aria-selected'];\n                }\n\n                for (var attr in attrs) {\n                    var val = attrs[attr];\n\n                    option.setAttribute(attr, val);\n                }\n\n                if (data.children) {\n                    var $option = $(option);\n\n                    var label = document.createElement('strong');\n                    label.className = 'select2-results__group';\n\n                    var $label = $(label);\n                    this.template(data, label);\n\n                    var $children = [];\n\n                    for (var c = 0; c < data.children.length; c++) {\n                        var child = data.children[c];\n\n                        var $child = this.option(child);\n\n                        $children.push($child);\n                    }\n\n                    var $childrenContainer = $('<ul></ul>', {\n                        'class': 'select2-results__options select2-results__options--nested'\n                    });\n\n                    $childrenContainer.append($children);\n\n                    $option.append(label);\n                    $option.append($childrenContainer);\n                } else {\n                    this.template(data, option);\n                }\n\n                Utils.StoreData(option, 'data', data);\n\n                return option;\n            };\n\n            Results.prototype.bind = function (container, $container) {\n                var self = this;\n\n                var id = container.id + '-results';\n\n                this.$results.attr('id', id);\n\n                container.on('results:all', function (params) {\n                    self.clear();\n                    self.append(params.data);\n\n                    if (container.isOpen()) {\n                        self.setClasses();\n                        self.highlightFirstItem();\n                    }\n                });\n\n                container.on('results:append', function (params) {\n                    self.append(params.data);\n\n                    if (container.isOpen()) {\n                        self.setClasses();\n                    }\n                });\n\n                container.on('query', function (params) {\n                    self.hideMessages();\n                    self.showLoading(params);\n                });\n\n                container.on('select', function () {\n                    if (!container.isOpen()) {\n                        return;\n                    }\n\n                    self.setClasses();\n\n                    if (self.options.get('scrollAfterSelect')) {\n                        self.highlightFirstItem();\n                    }\n                });\n\n                container.on('unselect', function () {\n                    if (!container.isOpen()) {\n                        return;\n                    }\n\n                    self.setClasses();\n\n                    if (self.options.get('scrollAfterSelect')) {\n                        self.highlightFirstItem();\n                    }\n                });\n\n                container.on('open', function () {\n                    // When the dropdown is open, aria-expended=\"true\"\n                    self.$results.attr('aria-expanded', 'true');\n                    self.$results.attr('aria-hidden', 'false');\n\n                    self.setClasses();\n                    self.ensureHighlightVisible();\n                });\n\n                container.on('close', function () {\n                    // When the dropdown is closed, aria-expended=\"false\"\n                    self.$results.attr('aria-expanded', 'false');\n                    self.$results.attr('aria-hidden', 'true');\n                    self.$results.removeAttr('aria-activedescendant');\n                });\n\n                container.on('results:toggle', function () {\n                    var $highlighted = self.getHighlightedResults();\n\n                    if ($highlighted.length === 0) {\n                        return;\n                    }\n\n                    $highlighted.trigger('mouseup');\n                });\n\n                container.on('results:select', function () {\n                    var $highlighted = self.getHighlightedResults();\n\n                    if ($highlighted.length === 0) {\n                        return;\n                    }\n\n                    var data = Utils.GetData($highlighted[0], 'data');\n\n                    if ($highlighted.attr('aria-selected') == 'true') {\n                        self.trigger('close', {});\n                    } else {\n                        self.trigger('select', {\n                            data: data\n                        });\n                    }\n                });\n\n                container.on('results:previous', function () {\n                    var $highlighted = self.getHighlightedResults();\n\n                    var $options = self.$results.find('[aria-selected]');\n\n                    var currentIndex = $options.index($highlighted);\n\n                    // If we are already at the top, don't move further\n                    // If no options, currentIndex will be -1\n                    if (currentIndex <= 0) {\n                        return;\n                    }\n\n                    var nextIndex = currentIndex - 1;\n\n                    // If none are highlighted, highlight the first\n                    if ($highlighted.length === 0) {\n                        nextIndex = 0;\n                    }\n\n                    var $next = $options.eq(nextIndex);\n\n                    $next.trigger('mouseenter');\n\n                    var currentOffset = self.$results.offset().top;\n                    var nextTop = $next.offset().top;\n                    var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);\n\n                    if (nextIndex === 0) {\n                        self.$results.scrollTop(0);\n                    } else if (nextTop - currentOffset < 0) {\n                        self.$results.scrollTop(nextOffset);\n                    }\n                });\n\n                container.on('results:next', function () {\n                    var $highlighted = self.getHighlightedResults();\n\n                    var $options = self.$results.find('[aria-selected]');\n\n                    var currentIndex = $options.index($highlighted);\n\n                    var nextIndex = currentIndex + 1;\n\n                    // If we are at the last option, stay there\n                    if (nextIndex >= $options.length) {\n                        return;\n                    }\n\n                    var $next = $options.eq(nextIndex);\n\n                    $next.trigger('mouseenter');\n\n                    var currentOffset = self.$results.offset().top +\n                        self.$results.outerHeight(false);\n                    var nextBottom = $next.offset().top + $next.outerHeight(false);\n                    var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;\n\n                    if (nextIndex === 0) {\n                        self.$results.scrollTop(0);\n                    } else if (nextBottom > currentOffset) {\n                        self.$results.scrollTop(nextOffset);\n                    }\n                });\n\n                container.on('results:focus', function (params) {\n                    params.element.addClass('select2-results__option--highlighted');\n                });\n\n                container.on('results:message', function (params) {\n                    self.displayMessage(params);\n                });\n\n                if ($.fn.mousewheel) {\n                    this.$results.on('mousewheel', function (e) {\n                        var top = self.$results.scrollTop();\n\n                        var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;\n\n                        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;\n                        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();\n\n                        if (isAtTop) {\n                            self.$results.scrollTop(0);\n\n                            e.preventDefault();\n                            e.stopPropagation();\n                        } else if (isAtBottom) {\n                            self.$results.scrollTop(\n                                self.$results.get(0).scrollHeight - self.$results.height()\n                            );\n\n                            e.preventDefault();\n                            e.stopPropagation();\n                        }\n                    });\n                }\n\n                this.$results.on('mouseup', '.select2-results__option[aria-selected]',\n                    function (evt) {\n                        var $this = $(this);\n\n                        var data = Utils.GetData(this, 'data');\n\n                        if ($this.attr('aria-selected') === 'true') {\n                            if (self.options.get('multiple')) {\n                                self.trigger('unselect', {\n                                    originalEvent: evt,\n                                    data: data\n                                });\n                            } else {\n                                self.trigger('close', {});\n                            }\n\n                            return;\n                        }\n\n                        self.trigger('select', {\n                            originalEvent: evt,\n                            data: data\n                        });\n                    });\n\n                this.$results.on('mouseenter', '.select2-results__option[aria-selected]',\n                    function (evt) {\n                        var data = Utils.GetData(this, 'data');\n\n                        self.getHighlightedResults()\n                            .removeClass('select2-results__option--highlighted');\n\n                        self.trigger('results:focus', {\n                            data: data,\n                            element: $(this)\n                        });\n                    });\n            };\n\n            Results.prototype.getHighlightedResults = function () {\n                var $highlighted = this.$results\n                    .find('.select2-results__option--highlighted');\n\n                return $highlighted;\n            };\n\n            Results.prototype.destroy = function () {\n                this.$results.remove();\n            };\n\n            Results.prototype.ensureHighlightVisible = function () {\n                var $highlighted = this.getHighlightedResults();\n\n                if ($highlighted.length === 0) {\n                    return;\n                }\n\n                var $options = this.$results.find('[aria-selected]');\n\n                var currentIndex = $options.index($highlighted);\n\n                var currentOffset = this.$results.offset().top;\n                var nextTop = $highlighted.offset().top;\n                var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);\n\n                var offsetDelta = nextTop - currentOffset;\n                nextOffset -= $highlighted.outerHeight(false) * 2;\n\n                if (currentIndex <= 2) {\n                    this.$results.scrollTop(0);\n                } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {\n                    this.$results.scrollTop(nextOffset);\n                }\n            };\n\n            Results.prototype.template = function (result, container) {\n                var template = this.options.get('templateResult');\n                var escapeMarkup = this.options.get('escapeMarkup');\n\n                var content = template(result, container);\n\n                if (content == null) {\n                    container.style.display = 'none';\n                } else if (typeof content === 'string') {\n                    container.innerHTML = escapeMarkup(content);\n                } else {\n                    $(container).append(content);\n                }\n            };\n\n            return Results;\n        });\n\n        S2.define('select2/keys',[\n\n        ], function () {\n            var KEYS = {\n                BACKSPACE: 8,\n                TAB: 9,\n                ENTER: 13,\n                SHIFT: 16,\n                CTRL: 17,\n                ALT: 18,\n                ESC: 27,\n                SPACE: 32,\n                PAGE_UP: 33,\n                PAGE_DOWN: 34,\n                END: 35,\n                HOME: 36,\n                LEFT: 37,\n                UP: 38,\n                RIGHT: 39,\n                DOWN: 40,\n                DELETE: 46\n            };\n\n            return KEYS;\n        });\n\n        S2.define('select2/selection/base',[\n            'jquery',\n            '../utils',\n            '../keys'\n        ], function ($, Utils, KEYS) {\n            function BaseSelection ($element, options) {\n                this.$element = $element;\n                this.options = options;\n\n                BaseSelection.__super__.constructor.call(this);\n            }\n\n            Utils.Extend(BaseSelection, Utils.Observable);\n\n            BaseSelection.prototype.render = function () {\n                var $selection = $(\n                    '<span class=\"select2-selection\" role=\"combobox\" ' +\n                    ' aria-haspopup=\"true\" aria-expanded=\"false\">' +\n                    '</span>'\n                );\n\n                this._tabindex = 0;\n\n                if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {\n                    this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');\n                } else if (this.$element.attr('tabindex') != null) {\n                    this._tabindex = this.$element.attr('tabindex');\n                }\n\n                $selection.attr('title', this.$element.attr('title'));\n                $selection.attr('tabindex', this._tabindex);\n                $selection.attr('aria-disabled', 'false');\n\n                this.$selection = $selection;\n\n                return $selection;\n            };\n\n            BaseSelection.prototype.bind = function (container, $container) {\n                var self = this;\n\n                var resultsId = container.id + '-results';\n\n                this.container = container;\n\n                this.$selection.on('focus', function (evt) {\n                    self.trigger('focus', evt);\n                });\n\n                this.$selection.on('blur', function (evt) {\n                    self._handleBlur(evt);\n                });\n\n                this.$selection.on('keydown', function (evt) {\n                    self.trigger('keypress', evt);\n\n                    if (evt.which === KEYS.SPACE) {\n                        evt.preventDefault();\n                    }\n                });\n\n                container.on('results:focus', function (params) {\n                    self.$selection.attr('aria-activedescendant', params.data._resultId);\n                });\n\n                container.on('selection:update', function (params) {\n                    self.update(params.data);\n                });\n\n                container.on('open', function () {\n                    // When the dropdown is open, aria-expanded=\"true\"\n                    self.$selection.attr('aria-expanded', 'true');\n                    self.$selection.attr('aria-owns', resultsId);\n\n                    self._attachCloseHandler(container);\n                });\n\n                container.on('close', function () {\n                    // When the dropdown is closed, aria-expanded=\"false\"\n                    self.$selection.attr('aria-expanded', 'false');\n                    self.$selection.removeAttr('aria-activedescendant');\n                    self.$selection.removeAttr('aria-owns');\n\n                    self.$selection.trigger('focus');\n\n                    self._detachCloseHandler(container);\n                });\n\n                container.on('enable', function () {\n                    self.$selection.attr('tabindex', self._tabindex);\n                    self.$selection.attr('aria-disabled', 'false');\n                });\n\n                container.on('disable', function () {\n                    self.$selection.attr('tabindex', '-1');\n                    self.$selection.attr('aria-disabled', 'true');\n                });\n            };\n\n            BaseSelection.prototype._handleBlur = function (evt) {\n                var self = this;\n\n                // This needs to be delayed as the active element is the body when the tab\n                // key is pressed, possibly along with others.\n                window.setTimeout(function () {\n                    // Don't trigger `blur` if the focus is still in the selection\n                    if (\n                        (document.activeElement == self.$selection[0]) ||\n                        ($.contains(self.$selection[0], document.activeElement))\n                    ) {\n                        return;\n                    }\n\n                    self.trigger('blur', evt);\n                }, 1);\n            };\n\n            BaseSelection.prototype._attachCloseHandler = function (container) {\n\n                $(document.body).on('mousedown.select2.' + container.id, function (e) {\n                    var $target = $(e.target);\n\n                    var $select = $target.closest('.select2');\n\n                    var $all = $('.select2.select2-container--open');\n\n                    $all.each(function () {\n                        if (this == $select[0]) {\n                            return;\n                        }\n\n                        var $element = Utils.GetData(this, 'element');\n\n                        $element.select2('close');\n                    });\n                });\n            };\n\n            BaseSelection.prototype._detachCloseHandler = function (container) {\n                $(document.body).off('mousedown.select2.' + container.id);\n            };\n\n            BaseSelection.prototype.position = function ($selection, $container) {\n                var $selectionContainer = $container.find('.selection');\n                $selectionContainer.append($selection);\n            };\n\n            BaseSelection.prototype.destroy = function () {\n                this._detachCloseHandler(this.container);\n            };\n\n            BaseSelection.prototype.update = function (data) {\n                throw new Error('The `update` method must be defined in child classes.');\n            };\n\n            /**\n             * Helper method to abstract the \"enabled\" (not \"disabled\") state of this\n             * object.\n             *\n             * @return {true} if the instance is not disabled.\n             * @return {false} if the instance is disabled.\n             */\n            BaseSelection.prototype.isEnabled = function () {\n                return !this.isDisabled();\n            };\n\n            /**\n             * Helper method to abstract the \"disabled\" state of this object.\n             *\n             * @return {true} if the disabled option is true.\n             * @return {false} if the disabled option is false.\n             */\n            BaseSelection.prototype.isDisabled = function () {\n                return this.options.get('disabled');\n            };\n\n            return BaseSelection;\n        });\n\n        S2.define('select2/selection/single',[\n            'jquery',\n            './base',\n            '../utils',\n            '../keys'\n        ], function ($, BaseSelection, Utils, KEYS) {\n            function SingleSelection () {\n                SingleSelection.__super__.constructor.apply(this, arguments);\n            }\n\n            Utils.Extend(SingleSelection, BaseSelection);\n\n            SingleSelection.prototype.render = function () {\n                var $selection = SingleSelection.__super__.render.call(this);\n\n                $selection.addClass('select2-selection--single');\n\n                $selection.html(\n                    '<span class=\"select2-selection__rendered\"></span>' +\n                    '<span class=\"select2-selection__arrow\" role=\"presentation\">' +\n                    '<b role=\"presentation\"></b>' +\n                    '</span>'\n                );\n\n                return $selection;\n            };\n\n            SingleSelection.prototype.bind = function (container, $container) {\n                var self = this;\n\n                SingleSelection.__super__.bind.apply(this, arguments);\n\n                var id = container.id + '-container';\n\n                this.$selection.find('.select2-selection__rendered')\n                    .attr('id', id)\n                    .attr('role', 'textbox')\n                    .attr('aria-readonly', 'true');\n                this.$selection.attr('aria-labelledby', id);\n\n                this.$selection.on('mousedown', function (evt) {\n                    // Only respond to left clicks\n                    if (evt.which !== 1) {\n                        return;\n                    }\n\n                    self.trigger('toggle', {\n                        originalEvent: evt\n                    });\n                });\n\n                this.$selection.on('focus', function (evt) {\n                    // User focuses on the container\n                });\n\n                this.$selection.on('blur', function (evt) {\n                    // User exits the container\n                });\n\n                container.on('focus', function (evt) {\n                    if (!container.isOpen()) {\n                        self.$selection.trigger('focus');\n                    }\n                });\n            };\n\n            SingleSelection.prototype.clear = function () {\n                var $rendered = this.$selection.find('.select2-selection__rendered');\n                $rendered.empty();\n                $rendered.removeAttr('title'); // clear tooltip on empty\n            };\n\n            SingleSelection.prototype.display = function (data, container) {\n                var template = this.options.get('templateSelection');\n                var escapeMarkup = this.options.get('escapeMarkup');\n\n                return escapeMarkup(template(data, container));\n            };\n\n            SingleSelection.prototype.selectionContainer = function () {\n                return $('<span></span>');\n            };\n\n            SingleSelection.prototype.update = function (data) {\n                if (data.length === 0) {\n                    this.clear();\n                    return;\n                }\n\n                var selection = data[0];\n\n                var $rendered = this.$selection.find('.select2-selection__rendered');\n                var formatted = this.display(selection, $rendered);\n\n                $rendered.empty().append(formatted);\n\n                var title = selection.title || selection.text;\n\n                if (title) {\n                    $rendered.attr('title', title);\n                } else {\n                    $rendered.removeAttr('title');\n                }\n            };\n\n            return SingleSelection;\n        });\n\n        S2.define('select2/selection/multiple',[\n            'jquery',\n            './base',\n            '../utils'\n        ], function ($, BaseSelection, Utils) {\n            function MultipleSelection ($element, options) {\n                MultipleSelection.__super__.constructor.apply(this, arguments);\n            }\n\n            Utils.Extend(MultipleSelection, BaseSelection);\n\n            MultipleSelection.prototype.render = function () {\n                var $selection = MultipleSelection.__super__.render.call(this);\n\n                $selection.addClass('select2-selection--multiple');\n\n                $selection.html(\n                    '<ul class=\"select2-selection__rendered\"></ul>'\n                );\n\n                return $selection;\n            };\n\n            MultipleSelection.prototype.bind = function (container, $container) {\n                var self = this;\n\n                MultipleSelection.__super__.bind.apply(this, arguments);\n\n                this.$selection.on('click', function (evt) {\n                    self.trigger('toggle', {\n                        originalEvent: evt\n                    });\n                });\n\n                this.$selection.on(\n                    'click',\n                    '.select2-selection__choice__remove',\n                    function (evt) {\n                        // Ignore the event if it is disabled\n                        if (self.isDisabled()) {\n                            return;\n                        }\n\n                        var $remove = $(this);\n                        var $selection = $remove.parent();\n\n                        var data = Utils.GetData($selection[0], 'data');\n\n                        self.trigger('unselect', {\n                            originalEvent: evt,\n                            data: data\n                        });\n                    }\n                );\n            };\n\n            MultipleSelection.prototype.clear = function () {\n                var $rendered = this.$selection.find('.select2-selection__rendered');\n                $rendered.empty();\n                $rendered.removeAttr('title');\n            };\n\n            MultipleSelection.prototype.display = function (data, container) {\n                var template = this.options.get('templateSelection');\n                var escapeMarkup = this.options.get('escapeMarkup');\n\n                return escapeMarkup(template(data, container));\n            };\n\n            MultipleSelection.prototype.selectionContainer = function () {\n                var $container = $(\n                    '<li class=\"select2-selection__choice\">' +\n                    '<span class=\"select2-selection__choice__remove\" role=\"presentation\">' +\n                    '&times;' +\n                    '</span>' +\n                    '</li>'\n                );\n\n                return $container;\n            };\n\n            MultipleSelection.prototype.update = function (data) {\n                this.clear();\n\n                if (data.length === 0) {\n                    return;\n                }\n\n                var $selections = [];\n\n                for (var d = 0; d < data.length; d++) {\n                    var selection = data[d];\n\n                    var $selection = this.selectionContainer();\n                    var formatted = this.display(selection, $selection);\n\n                    $selection.append(formatted);\n\n                    var title = selection.title || selection.text;\n\n                    if (title) {\n                        $selection.attr('title', title);\n                    }\n\n                    Utils.StoreData($selection[0], 'data', selection);\n\n                    $selections.push($selection);\n                }\n\n                var $rendered = this.$selection.find('.select2-selection__rendered');\n\n                Utils.appendMany($rendered, $selections);\n            };\n\n            return MultipleSelection;\n        });\n\n        S2.define('select2/selection/placeholder',[\n            '../utils'\n        ], function (Utils) {\n            function Placeholder (decorated, $element, options) {\n                this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n\n                decorated.call(this, $element, options);\n            }\n\n            Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {\n                if (typeof placeholder === 'string') {\n                    placeholder = {\n                        id: '',\n                        text: placeholder\n                    };\n                }\n\n                return placeholder;\n            };\n\n            Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {\n                var $placeholder = this.selectionContainer();\n\n                $placeholder.html(this.display(placeholder));\n                $placeholder.addClass('select2-selection__placeholder')\n                    .removeClass('select2-selection__choice');\n\n                return $placeholder;\n            };\n\n            Placeholder.prototype.update = function (decorated, data) {\n                var singlePlaceholder = (\n                    data.length == 1 && data[0].id != this.placeholder.id\n                );\n                var multipleSelections = data.length > 1;\n\n                if (multipleSelections || singlePlaceholder) {\n                    return decorated.call(this, data);\n                }\n\n                this.clear();\n\n                var $placeholder = this.createPlaceholder(this.placeholder);\n\n                this.$selection.find('.select2-selection__rendered').append($placeholder);\n            };\n\n            return Placeholder;\n        });\n\n        S2.define('select2/selection/allowClear',[\n            'jquery',\n            '../keys',\n            '../utils'\n        ], function ($, KEYS, Utils) {\n            function AllowClear () { }\n\n            AllowClear.prototype.bind = function (decorated, container, $container) {\n                var self = this;\n\n                decorated.call(this, container, $container);\n\n                if (this.placeholder == null) {\n                    if (this.options.get('debug') && window.console && console.error) {\n                        console.error(\n                            'Select2: The `allowClear` option should be used in combination ' +\n                            'with the `placeholder` option.'\n                        );\n                    }\n                }\n\n                this.$selection.on('mousedown', '.select2-selection__clear',\n                    function (evt) {\n                        self._handleClear(evt);\n                    });\n\n                container.on('keypress', function (evt) {\n                    self._handleKeyboardClear(evt, container);\n                });\n            };\n\n            AllowClear.prototype._handleClear = function (_, evt) {\n                // Ignore the event if it is disabled\n                if (this.isDisabled()) {\n                    return;\n                }\n\n                var $clear = this.$selection.find('.select2-selection__clear');\n\n                // Ignore the event if nothing has been selected\n                if ($clear.length === 0) {\n                    return;\n                }\n\n                evt.stopPropagation();\n\n                var data = Utils.GetData($clear[0], 'data');\n\n                var previousVal = this.$element.val();\n                this.$element.val(this.placeholder.id);\n\n                var unselectData = {\n                    data: data\n                };\n                this.trigger('clear', unselectData);\n                if (unselectData.prevented) {\n                    this.$element.val(previousVal);\n                    return;\n                }\n\n                for (var d = 0; d < data.length; d++) {\n                    unselectData = {\n                        data: data[d]\n                    };\n\n                    // Trigger the `unselect` event, so people can prevent it from being\n                    // cleared.\n                    this.trigger('unselect', unselectData);\n\n                    // If the event was prevented, don't clear it out.\n                    if (unselectData.prevented) {\n                        this.$element.val(previousVal);\n                        return;\n                    }\n                }\n\n                this.$element.trigger('input').trigger('change');\n\n                this.trigger('toggle', {});\n            };\n\n            AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {\n                if (container.isOpen()) {\n                    return;\n                }\n\n                if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {\n                    this._handleClear(evt);\n                }\n            };\n\n            AllowClear.prototype.update = function (decorated, data) {\n                decorated.call(this, data);\n\n                if (this.$selection.find('.select2-selection__placeholder').length > 0 ||\n                    data.length === 0) {\n                    return;\n                }\n\n                var removeAll = this.options.get('translations').get('removeAllItems');\n\n                var $remove = $(\n                    '<span class=\"select2-selection__clear\" title=\"' + removeAll() +'\">' +\n                    '&times;' +\n                    '</span>'\n                );\n                Utils.StoreData($remove[0], 'data', data);\n\n                this.$selection.find('.select2-selection__rendered').prepend($remove);\n            };\n\n            return AllowClear;\n        });\n\n        S2.define('select2/selection/search',[\n            'jquery',\n            '../utils',\n            '../keys'\n        ], function ($, Utils, KEYS) {\n            function Search (decorated, $element, options) {\n                decorated.call(this, $element, options);\n            }\n\n            Search.prototype.render = function (decorated) {\n                var $search = $(\n                    '<li class=\"select2-search select2-search--inline\">' +\n                    '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' +\n                    ' autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"none\"' +\n                    ' spellcheck=\"false\" role=\"searchbox\" aria-autocomplete=\"list\" />' +\n                    '</li>'\n                );\n\n                this.$searchContainer = $search;\n                this.$search = $search.find('input');\n\n                var $rendered = decorated.call(this);\n\n                this._transferTabIndex();\n\n                return $rendered;\n            };\n\n            Search.prototype.bind = function (decorated, container, $container) {\n                var self = this;\n\n                var resultsId = container.id + '-results';\n\n                decorated.call(this, container, $container);\n\n                container.on('open', function () {\n                    self.$search.attr('aria-controls', resultsId);\n                    self.$search.trigger('focus');\n                });\n\n                container.on('close', function () {\n                    self.$search.val('');\n                    self.$search.removeAttr('aria-controls');\n                    self.$search.removeAttr('aria-activedescendant');\n                    self.$search.trigger('focus');\n                });\n\n                container.on('enable', function () {\n                    self.$search.prop('disabled', false);\n\n                    self._transferTabIndex();\n                });\n\n                container.on('disable', function () {\n                    self.$search.prop('disabled', true);\n                });\n\n                container.on('focus', function (evt) {\n                    self.$search.trigger('focus');\n                });\n\n                container.on('results:focus', function (params) {\n                    if (params.data._resultId) {\n                        self.$search.attr('aria-activedescendant', params.data._resultId);\n                    } else {\n                        self.$search.removeAttr('aria-activedescendant');\n                    }\n                });\n\n                this.$selection.on('focusin', '.select2-search--inline', function (evt) {\n                    self.trigger('focus', evt);\n                });\n\n                this.$selection.on('focusout', '.select2-search--inline', function (evt) {\n                    self._handleBlur(evt);\n                });\n\n                this.$selection.on('keydown', '.select2-search--inline', function (evt) {\n                    evt.stopPropagation();\n\n                    self.trigger('keypress', evt);\n\n                    self._keyUpPrevented = evt.isDefaultPrevented();\n\n                    var key = evt.which;\n\n                    if (key === KEYS.BACKSPACE && self.$search.val() === '') {\n                        var $previousChoice = self.$searchContainer\n                            .prev('.select2-selection__choice');\n\n                        if ($previousChoice.length > 0) {\n                            var item = Utils.GetData($previousChoice[0], 'data');\n\n                            self.searchRemoveChoice(item);\n\n                            evt.preventDefault();\n                        }\n                    }\n                });\n\n                this.$selection.on('click', '.select2-search--inline', function (evt) {\n                    if (self.$search.val()) {\n                        evt.stopPropagation();\n                    }\n                });\n\n                // Try to detect the IE version should the `documentMode` property that\n                // is stored on the document. This is only implemented in IE and is\n                // slightly cleaner than doing a user agent check.\n                // This property is not available in Edge, but Edge also doesn't have\n                // this bug.\n                var msie = document.documentMode;\n                var disableInputEvents = msie && msie <= 11;\n\n                // Workaround for browsers which do not support the `input` event\n                // This will prevent double-triggering of events for browsers which support\n                // both the `keyup` and `input` events.\n                this.$selection.on(\n                    'input.searchcheck',\n                    '.select2-search--inline',\n                    function (evt) {\n                        // IE will trigger the `input` event when a placeholder is used on a\n                        // search box. To get around this issue, we are forced to ignore all\n                        // `input` events in IE and keep using `keyup`.\n                        if (disableInputEvents) {\n                            self.$selection.off('input.search input.searchcheck');\n                            return;\n                        }\n\n                        // Unbind the duplicated `keyup` event\n                        self.$selection.off('keyup.search');\n                    }\n                );\n\n                this.$selection.on(\n                    'keyup.search input.search',\n                    '.select2-search--inline',\n                    function (evt) {\n                        // IE will trigger the `input` event when a placeholder is used on a\n                        // search box. To get around this issue, we are forced to ignore all\n                        // `input` events in IE and keep using `keyup`.\n                        if (disableInputEvents && evt.type === 'input') {\n                            self.$selection.off('input.search input.searchcheck');\n                            return;\n                        }\n\n                        var key = evt.which;\n\n                        // We can freely ignore events from modifier keys\n                        if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {\n                            return;\n                        }\n\n                        // Tabbing will be handled during the `keydown` phase\n                        if (key == KEYS.TAB) {\n                            return;\n                        }\n\n                        self.handleSearch(evt);\n                    }\n                );\n            };\n\n            /**\n             * This method will transfer the tabindex attribute from the rendered\n             * selection to the search box. This allows for the search box to be used as\n             * the primary focus instead of the selection container.\n             *\n             * @private\n             */\n            Search.prototype._transferTabIndex = function (decorated) {\n                this.$search.attr('tabindex', this.$selection.attr('tabindex'));\n                this.$selection.attr('tabindex', '-1');\n            };\n\n            Search.prototype.createPlaceholder = function (decorated, placeholder) {\n                this.$search.attr('placeholder', placeholder.text);\n            };\n\n            Search.prototype.update = function (decorated, data) {\n                var searchHadFocus = this.$search[0] == document.activeElement;\n\n                this.$search.attr('placeholder', '');\n\n                decorated.call(this, data);\n\n                this.$selection.find('.select2-selection__rendered')\n                    .append(this.$searchContainer);\n\n                this.resizeSearch();\n                if (searchHadFocus) {\n                    this.$search.trigger('focus');\n                }\n            };\n\n            Search.prototype.handleSearch = function () {\n                this.resizeSearch();\n\n                if (!this._keyUpPrevented) {\n                    var input = this.$search.val();\n\n                    this.trigger('query', {\n                        term: input\n                    });\n                }\n\n                this._keyUpPrevented = false;\n            };\n\n            Search.prototype.searchRemoveChoice = function (decorated, item) {\n                this.trigger('unselect', {\n                    data: item\n                });\n\n                this.$search.val(item.text);\n                this.handleSearch();\n            };\n\n            Search.prototype.resizeSearch = function () {\n                this.$search.css('width', '25px');\n\n                var width = '';\n\n                if (this.$search.attr('placeholder') !== '') {\n                    width = this.$selection.find('.select2-selection__rendered').width();\n                } else {\n                    var minimumWidth = this.$search.val().length + 1;\n\n                    width = (minimumWidth * 0.75) + 'em';\n                }\n\n                this.$search.css('width', width);\n            };\n\n            return Search;\n        });\n\n        S2.define('select2/selection/eventRelay',[\n            'jquery'\n        ], function ($) {\n            function EventRelay () { }\n\n            EventRelay.prototype.bind = function (decorated, container, $container) {\n                var self = this;\n                var relayEvents = [\n                    'open', 'opening',\n                    'close', 'closing',\n                    'select', 'selecting',\n                    'unselect', 'unselecting',\n                    'clear', 'clearing'\n                ];\n\n                var preventableEvents = [\n                    'opening', 'closing', 'selecting', 'unselecting', 'clearing'\n                ];\n\n                decorated.call(this, container, $container);\n\n                container.on('*', function (name, params) {\n                    // Ignore events that should not be relayed\n                    if ($.inArray(name, relayEvents) === -1) {\n                        return;\n                    }\n\n                    // The parameters should always be an object\n                    params = params || {};\n\n                    // Generate the jQuery event for the Select2 event\n                    var evt = $.Event('select2:' + name, {\n                        params: params\n                    });\n\n                    self.$element.trigger(evt);\n\n                    // Only handle preventable events if it was one\n                    if ($.inArray(name, preventableEvents) === -1) {\n                        return;\n                    }\n\n                    params.prevented = evt.isDefaultPrevented();\n                });\n            };\n\n            return EventRelay;\n        });\n\n        S2.define('select2/translation',[\n            'jquery',\n            'require'\n        ], function ($, require) {\n            function Translation (dict) {\n                this.dict = dict || {};\n            }\n\n            Translation.prototype.all = function () {\n                return this.dict;\n            };\n\n            Translation.prototype.get = function (key) {\n                return this.dict[key];\n            };\n\n            Translation.prototype.extend = function (translation) {\n                this.dict = $.extend({}, translation.all(), this.dict);\n            };\n\n            // Static functions\n\n            Translation._cache = {};\n\n            Translation.loadPath = function (path) {\n                if (!(path in Translation._cache)) {\n                    var translations = require(path);\n\n                    Translation._cache[path] = translations;\n                }\n\n                return new Translation(Translation._cache[path]);\n            };\n\n            return Translation;\n        });\n\n        S2.define('select2/diacritics',[\n\n        ], function () {\n            var diacritics = {\n                '\\u24B6': 'A',\n                '\\uFF21': 'A',\n                '\\u00C0': 'A',\n                '\\u00C1': 'A',\n                '\\u00C2': 'A',\n                '\\u1EA6': 'A',\n                '\\u1EA4': 'A',\n                '\\u1EAA': 'A',\n                '\\u1EA8': 'A',\n                '\\u00C3': 'A',\n                '\\u0100': 'A',\n                '\\u0102': 'A',\n                '\\u1EB0': 'A',\n                '\\u1EAE': 'A',\n                '\\u1EB4': 'A',\n                '\\u1EB2': 'A',\n                '\\u0226': 'A',\n                '\\u01E0': 'A',\n                '\\u00C4': 'A',\n                '\\u01DE': 'A',\n                '\\u1EA2': 'A',\n                '\\u00C5': 'A',\n                '\\u01FA': 'A',\n                '\\u01CD': 'A',\n                '\\u0200': 'A',\n                '\\u0202': 'A',\n                '\\u1EA0': 'A',\n                '\\u1EAC': 'A',\n                '\\u1EB6': 'A',\n                '\\u1E00': 'A',\n                '\\u0104': 'A',\n                '\\u023A': 'A',\n                '\\u2C6F': 'A',\n                '\\uA732': 'AA',\n                '\\u00C6': 'AE',\n                '\\u01FC': 'AE',\n                '\\u01E2': 'AE',\n                '\\uA734': 'AO',\n                '\\uA736': 'AU',\n                '\\uA738': 'AV',\n                '\\uA73A': 'AV',\n                '\\uA73C': 'AY',\n                '\\u24B7': 'B',\n                '\\uFF22': 'B',\n                '\\u1E02': 'B',\n                '\\u1E04': 'B',\n                '\\u1E06': 'B',\n                '\\u0243': 'B',\n                '\\u0182': 'B',\n                '\\u0181': 'B',\n                '\\u24B8': 'C',\n                '\\uFF23': 'C',\n                '\\u0106': 'C',\n                '\\u0108': 'C',\n                '\\u010A': 'C',\n                '\\u010C': 'C',\n                '\\u00C7': 'C',\n                '\\u1E08': 'C',\n                '\\u0187': 'C',\n                '\\u023B': 'C',\n                '\\uA73E': 'C',\n                '\\u24B9': 'D',\n                '\\uFF24': 'D',\n                '\\u1E0A': 'D',\n                '\\u010E': 'D',\n                '\\u1E0C': 'D',\n                '\\u1E10': 'D',\n                '\\u1E12': 'D',\n                '\\u1E0E': 'D',\n                '\\u0110': 'D',\n                '\\u018B': 'D',\n                '\\u018A': 'D',\n                '\\u0189': 'D',\n                '\\uA779': 'D',\n                '\\u01F1': 'DZ',\n                '\\u01C4': 'DZ',\n                '\\u01F2': 'Dz',\n                '\\u01C5': 'Dz',\n                '\\u24BA': 'E',\n                '\\uFF25': 'E',\n                '\\u00C8': 'E',\n                '\\u00C9': 'E',\n                '\\u00CA': 'E',\n                '\\u1EC0': 'E',\n                '\\u1EBE': 'E',\n                '\\u1EC4': 'E',\n                '\\u1EC2': 'E',\n                '\\u1EBC': 'E',\n                '\\u0112': 'E',\n                '\\u1E14': 'E',\n                '\\u1E16': 'E',\n                '\\u0114': 'E',\n                '\\u0116': 'E',\n                '\\u00CB': 'E',\n                '\\u1EBA': 'E',\n                '\\u011A': 'E',\n                '\\u0204': 'E',\n                '\\u0206': 'E',\n                '\\u1EB8': 'E',\n                '\\u1EC6': 'E',\n                '\\u0228': 'E',\n                '\\u1E1C': 'E',\n                '\\u0118': 'E',\n                '\\u1E18': 'E',\n                '\\u1E1A': 'E',\n                '\\u0190': 'E',\n                '\\u018E': 'E',\n                '\\u24BB': 'F',\n                '\\uFF26': 'F',\n                '\\u1E1E': 'F',\n                '\\u0191': 'F',\n                '\\uA77B': 'F',\n                '\\u24BC': 'G',\n                '\\uFF27': 'G',\n                '\\u01F4': 'G',\n                '\\u011C': 'G',\n                '\\u1E20': 'G',\n                '\\u011E': 'G',\n                '\\u0120': 'G',\n                '\\u01E6': 'G',\n                '\\u0122': 'G',\n                '\\u01E4': 'G',\n                '\\u0193': 'G',\n                '\\uA7A0': 'G',\n                '\\uA77D': 'G',\n                '\\uA77E': 'G',\n                '\\u24BD': 'H',\n                '\\uFF28': 'H',\n                '\\u0124': 'H',\n                '\\u1E22': 'H',\n                '\\u1E26': 'H',\n                '\\u021E': 'H',\n                '\\u1E24': 'H',\n                '\\u1E28': 'H',\n                '\\u1E2A': 'H',\n                '\\u0126': 'H',\n                '\\u2C67': 'H',\n                '\\u2C75': 'H',\n                '\\uA78D': 'H',\n                '\\u24BE': 'I',\n                '\\uFF29': 'I',\n                '\\u00CC': 'I',\n                '\\u00CD': 'I',\n                '\\u00CE': 'I',\n                '\\u0128': 'I',\n                '\\u012A': 'I',\n                '\\u012C': 'I',\n                '\\u0130': 'I',\n                '\\u00CF': 'I',\n                '\\u1E2E': 'I',\n                '\\u1EC8': 'I',\n                '\\u01CF': 'I',\n                '\\u0208': 'I',\n                '\\u020A': 'I',\n                '\\u1ECA': 'I',\n                '\\u012E': 'I',\n                '\\u1E2C': 'I',\n                '\\u0197': 'I',\n                '\\u24BF': 'J',\n                '\\uFF2A': 'J',\n                '\\u0134': 'J',\n                '\\u0248': 'J',\n                '\\u24C0': 'K',\n                '\\uFF2B': 'K',\n                '\\u1E30': 'K',\n                '\\u01E8': 'K',\n                '\\u1E32': 'K',\n                '\\u0136': 'K',\n                '\\u1E34': 'K',\n                '\\u0198': 'K',\n                '\\u2C69': 'K',\n                '\\uA740': 'K',\n                '\\uA742': 'K',\n                '\\uA744': 'K',\n                '\\uA7A2': 'K',\n                '\\u24C1': 'L',\n                '\\uFF2C': 'L',\n                '\\u013F': 'L',\n                '\\u0139': 'L',\n                '\\u013D': 'L',\n                '\\u1E36': 'L',\n                '\\u1E38': 'L',\n                '\\u013B': 'L',\n                '\\u1E3C': 'L',\n                '\\u1E3A': 'L',\n                '\\u0141': 'L',\n                '\\u023D': 'L',\n                '\\u2C62': 'L',\n                '\\u2C60': 'L',\n                '\\uA748': 'L',\n                '\\uA746': 'L',\n                '\\uA780': 'L',\n                '\\u01C7': 'LJ',\n                '\\u01C8': 'Lj',\n                '\\u24C2': 'M',\n                '\\uFF2D': 'M',\n                '\\u1E3E': 'M',\n                '\\u1E40': 'M',\n                '\\u1E42': 'M',\n                '\\u2C6E': 'M',\n                '\\u019C': 'M',\n                '\\u24C3': 'N',\n                '\\uFF2E': 'N',\n                '\\u01F8': 'N',\n                '\\u0143': 'N',\n                '\\u00D1': 'N',\n                '\\u1E44': 'N',\n                '\\u0147': 'N',\n                '\\u1E46': 'N',\n                '\\u0145': 'N',\n                '\\u1E4A': 'N',\n                '\\u1E48': 'N',\n                '\\u0220': 'N',\n                '\\u019D': 'N',\n                '\\uA790': 'N',\n                '\\uA7A4': 'N',\n                '\\u01CA': 'NJ',\n                '\\u01CB': 'Nj',\n                '\\u24C4': 'O',\n                '\\uFF2F': 'O',\n                '\\u00D2': 'O',\n                '\\u00D3': 'O',\n                '\\u00D4': 'O',\n                '\\u1ED2': 'O',\n                '\\u1ED0': 'O',\n                '\\u1ED6': 'O',\n                '\\u1ED4': 'O',\n                '\\u00D5': 'O',\n                '\\u1E4C': 'O',\n                '\\u022C': 'O',\n                '\\u1E4E': 'O',\n                '\\u014C': 'O',\n                '\\u1E50': 'O',\n                '\\u1E52': 'O',\n                '\\u014E': 'O',\n                '\\u022E': 'O',\n                '\\u0230': 'O',\n                '\\u00D6': 'O',\n                '\\u022A': 'O',\n                '\\u1ECE': 'O',\n                '\\u0150': 'O',\n                '\\u01D1': 'O',\n                '\\u020C': 'O',\n                '\\u020E': 'O',\n                '\\u01A0': 'O',\n                '\\u1EDC': 'O',\n                '\\u1EDA': 'O',\n                '\\u1EE0': 'O',\n                '\\u1EDE': 'O',\n                '\\u1EE2': 'O',\n                '\\u1ECC': 'O',\n                '\\u1ED8': 'O',\n                '\\u01EA': 'O',\n                '\\u01EC': 'O',\n                '\\u00D8': 'O',\n                '\\u01FE': 'O',\n                '\\u0186': 'O',\n                '\\u019F': 'O',\n                '\\uA74A': 'O',\n                '\\uA74C': 'O',\n                '\\u0152': 'OE',\n                '\\u01A2': 'OI',\n                '\\uA74E': 'OO',\n                '\\u0222': 'OU',\n                '\\u24C5': 'P',\n                '\\uFF30': 'P',\n                '\\u1E54': 'P',\n                '\\u1E56': 'P',\n                '\\u01A4': 'P',\n                '\\u2C63': 'P',\n                '\\uA750': 'P',\n                '\\uA752': 'P',\n                '\\uA754': 'P',\n                '\\u24C6': 'Q',\n                '\\uFF31': 'Q',\n                '\\uA756': 'Q',\n                '\\uA758': 'Q',\n                '\\u024A': 'Q',\n                '\\u24C7': 'R',\n                '\\uFF32': 'R',\n                '\\u0154': 'R',\n                '\\u1E58': 'R',\n                '\\u0158': 'R',\n                '\\u0210': 'R',\n                '\\u0212': 'R',\n                '\\u1E5A': 'R',\n                '\\u1E5C': 'R',\n                '\\u0156': 'R',\n                '\\u1E5E': 'R',\n                '\\u024C': 'R',\n                '\\u2C64': 'R',\n                '\\uA75A': 'R',\n                '\\uA7A6': 'R',\n                '\\uA782': 'R',\n                '\\u24C8': 'S',\n                '\\uFF33': 'S',\n                '\\u1E9E': 'S',\n                '\\u015A': 'S',\n                '\\u1E64': 'S',\n                '\\u015C': 'S',\n                '\\u1E60': 'S',\n                '\\u0160': 'S',\n                '\\u1E66': 'S',\n                '\\u1E62': 'S',\n                '\\u1E68': 'S',\n                '\\u0218': 'S',\n                '\\u015E': 'S',\n                '\\u2C7E': 'S',\n                '\\uA7A8': 'S',\n                '\\uA784': 'S',\n                '\\u24C9': 'T',\n                '\\uFF34': 'T',\n                '\\u1E6A': 'T',\n                '\\u0164': 'T',\n                '\\u1E6C': 'T',\n                '\\u021A': 'T',\n                '\\u0162': 'T',\n                '\\u1E70': 'T',\n                '\\u1E6E': 'T',\n                '\\u0166': 'T',\n                '\\u01AC': 'T',\n                '\\u01AE': 'T',\n                '\\u023E': 'T',\n                '\\uA786': 'T',\n                '\\uA728': 'TZ',\n                '\\u24CA': 'U',\n                '\\uFF35': 'U',\n                '\\u00D9': 'U',\n                '\\u00DA': 'U',\n                '\\u00DB': 'U',\n                '\\u0168': 'U',\n                '\\u1E78': 'U',\n                '\\u016A': 'U',\n                '\\u1E7A': 'U',\n                '\\u016C': 'U',\n                '\\u00DC': 'U',\n                '\\u01DB': 'U',\n                '\\u01D7': 'U',\n                '\\u01D5': 'U',\n                '\\u01D9': 'U',\n                '\\u1EE6': 'U',\n                '\\u016E': 'U',\n                '\\u0170': 'U',\n                '\\u01D3': 'U',\n                '\\u0214': 'U',\n                '\\u0216': 'U',\n                '\\u01AF': 'U',\n                '\\u1EEA': 'U',\n                '\\u1EE8': 'U',\n                '\\u1EEE': 'U',\n                '\\u1EEC': 'U',\n                '\\u1EF0': 'U',\n                '\\u1EE4': 'U',\n                '\\u1E72': 'U',\n                '\\u0172': 'U',\n                '\\u1E76': 'U',\n                '\\u1E74': 'U',\n                '\\u0244': 'U',\n                '\\u24CB': 'V',\n                '\\uFF36': 'V',\n                '\\u1E7C': 'V',\n                '\\u1E7E': 'V',\n                '\\u01B2': 'V',\n                '\\uA75E': 'V',\n                '\\u0245': 'V',\n                '\\uA760': 'VY',\n                '\\u24CC': 'W',\n                '\\uFF37': 'W',\n                '\\u1E80': 'W',\n                '\\u1E82': 'W',\n                '\\u0174': 'W',\n                '\\u1E86': 'W',\n                '\\u1E84': 'W',\n                '\\u1E88': 'W',\n                '\\u2C72': 'W',\n                '\\u24CD': 'X',\n                '\\uFF38': 'X',\n                '\\u1E8A': 'X',\n                '\\u1E8C': 'X',\n                '\\u24CE': 'Y',\n                '\\uFF39': 'Y',\n                '\\u1EF2': 'Y',\n                '\\u00DD': 'Y',\n                '\\u0176': 'Y',\n                '\\u1EF8': 'Y',\n                '\\u0232': 'Y',\n                '\\u1E8E': 'Y',\n                '\\u0178': 'Y',\n                '\\u1EF6': 'Y',\n                '\\u1EF4': 'Y',\n                '\\u01B3': 'Y',\n                '\\u024E': 'Y',\n                '\\u1EFE': 'Y',\n                '\\u24CF': 'Z',\n                '\\uFF3A': 'Z',\n                '\\u0179': 'Z',\n                '\\u1E90': 'Z',\n                '\\u017B': 'Z',\n                '\\u017D': 'Z',\n                '\\u1E92': 'Z',\n                '\\u1E94': 'Z',\n                '\\u01B5': 'Z',\n                '\\u0224': 'Z',\n                '\\u2C7F': 'Z',\n                '\\u2C6B': 'Z',\n                '\\uA762': 'Z',\n                '\\u24D0': 'a',\n                '\\uFF41': 'a',\n                '\\u1E9A': 'a',\n                '\\u00E0': 'a',\n                '\\u00E1': 'a',\n                '\\u00E2': 'a',\n                '\\u1EA7': 'a',\n                '\\u1EA5': 'a',\n                '\\u1EAB': 'a',\n                '\\u1EA9': 'a',\n                '\\u00E3': 'a',\n                '\\u0101': 'a',\n                '\\u0103': 'a',\n                '\\u1EB1': 'a',\n                '\\u1EAF': 'a',\n                '\\u1EB5': 'a',\n                '\\u1EB3': 'a',\n                '\\u0227': 'a',\n                '\\u01E1': 'a',\n                '\\u00E4': 'a',\n                '\\u01DF': 'a',\n                '\\u1EA3': 'a',\n                '\\u00E5': 'a',\n                '\\u01FB': 'a',\n                '\\u01CE': 'a',\n                '\\u0201': 'a',\n                '\\u0203': 'a',\n                '\\u1EA1': 'a',\n                '\\u1EAD': 'a',\n                '\\u1EB7': 'a',\n                '\\u1E01': 'a',\n                '\\u0105': 'a',\n                '\\u2C65': 'a',\n                '\\u0250': 'a',\n                '\\uA733': 'aa',\n                '\\u00E6': 'ae',\n                '\\u01FD': 'ae',\n                '\\u01E3': 'ae',\n                '\\uA735': 'ao',\n                '\\uA737': 'au',\n                '\\uA739': 'av',\n                '\\uA73B': 'av',\n                '\\uA73D': 'ay',\n                '\\u24D1': 'b',\n                '\\uFF42': 'b',\n                '\\u1E03': 'b',\n                '\\u1E05': 'b',\n                '\\u1E07': 'b',\n                '\\u0180': 'b',\n                '\\u0183': 'b',\n                '\\u0253': 'b',\n                '\\u24D2': 'c',\n                '\\uFF43': 'c',\n                '\\u0107': 'c',\n                '\\u0109': 'c',\n                '\\u010B': 'c',\n                '\\u010D': 'c',\n                '\\u00E7': 'c',\n                '\\u1E09': 'c',\n                '\\u0188': 'c',\n                '\\u023C': 'c',\n                '\\uA73F': 'c',\n                '\\u2184': 'c',\n                '\\u24D3': 'd',\n                '\\uFF44': 'd',\n                '\\u1E0B': 'd',\n                '\\u010F': 'd',\n                '\\u1E0D': 'd',\n                '\\u1E11': 'd',\n                '\\u1E13': 'd',\n                '\\u1E0F': 'd',\n                '\\u0111': 'd',\n                '\\u018C': 'd',\n                '\\u0256': 'd',\n                '\\u0257': 'd',\n                '\\uA77A': 'd',\n                '\\u01F3': 'dz',\n                '\\u01C6': 'dz',\n                '\\u24D4': 'e',\n                '\\uFF45': 'e',\n                '\\u00E8': 'e',\n                '\\u00E9': 'e',\n                '\\u00EA': 'e',\n                '\\u1EC1': 'e',\n                '\\u1EBF': 'e',\n                '\\u1EC5': 'e',\n                '\\u1EC3': 'e',\n                '\\u1EBD': 'e',\n                '\\u0113': 'e',\n                '\\u1E15': 'e',\n                '\\u1E17': 'e',\n                '\\u0115': 'e',\n                '\\u0117': 'e',\n                '\\u00EB': 'e',\n                '\\u1EBB': 'e',\n                '\\u011B': 'e',\n                '\\u0205': 'e',\n                '\\u0207': 'e',\n                '\\u1EB9': 'e',\n                '\\u1EC7': 'e',\n                '\\u0229': 'e',\n                '\\u1E1D': 'e',\n                '\\u0119': 'e',\n                '\\u1E19': 'e',\n                '\\u1E1B': 'e',\n                '\\u0247': 'e',\n                '\\u025B': 'e',\n                '\\u01DD': 'e',\n                '\\u24D5': 'f',\n                '\\uFF46': 'f',\n                '\\u1E1F': 'f',\n                '\\u0192': 'f',\n                '\\uA77C': 'f',\n                '\\u24D6': 'g',\n                '\\uFF47': 'g',\n                '\\u01F5': 'g',\n                '\\u011D': 'g',\n                '\\u1E21': 'g',\n                '\\u011F': 'g',\n                '\\u0121': 'g',\n                '\\u01E7': 'g',\n                '\\u0123': 'g',\n                '\\u01E5': 'g',\n                '\\u0260': 'g',\n                '\\uA7A1': 'g',\n                '\\u1D79': 'g',\n                '\\uA77F': 'g',\n                '\\u24D7': 'h',\n                '\\uFF48': 'h',\n                '\\u0125': 'h',\n                '\\u1E23': 'h',\n                '\\u1E27': 'h',\n                '\\u021F': 'h',\n                '\\u1E25': 'h',\n                '\\u1E29': 'h',\n                '\\u1E2B': 'h',\n                '\\u1E96': 'h',\n                '\\u0127': 'h',\n                '\\u2C68': 'h',\n                '\\u2C76': 'h',\n                '\\u0265': 'h',\n                '\\u0195': 'hv',\n                '\\u24D8': 'i',\n                '\\uFF49': 'i',\n                '\\u00EC': 'i',\n                '\\u00ED': 'i',\n                '\\u00EE': 'i',\n                '\\u0129': 'i',\n                '\\u012B': 'i',\n                '\\u012D': 'i',\n                '\\u00EF': 'i',\n                '\\u1E2F': 'i',\n                '\\u1EC9': 'i',\n                '\\u01D0': 'i',\n                '\\u0209': 'i',\n                '\\u020B': 'i',\n                '\\u1ECB': 'i',\n                '\\u012F': 'i',\n                '\\u1E2D': 'i',\n                '\\u0268': 'i',\n                '\\u0131': 'i',\n                '\\u24D9': 'j',\n                '\\uFF4A': 'j',\n                '\\u0135': 'j',\n                '\\u01F0': 'j',\n                '\\u0249': 'j',\n                '\\u24DA': 'k',\n                '\\uFF4B': 'k',\n                '\\u1E31': 'k',\n                '\\u01E9': 'k',\n                '\\u1E33': 'k',\n                '\\u0137': 'k',\n                '\\u1E35': 'k',\n                '\\u0199': 'k',\n                '\\u2C6A': 'k',\n                '\\uA741': 'k',\n                '\\uA743': 'k',\n                '\\uA745': 'k',\n                '\\uA7A3': 'k',\n                '\\u24DB': 'l',\n                '\\uFF4C': 'l',\n                '\\u0140': 'l',\n                '\\u013A': 'l',\n                '\\u013E': 'l',\n                '\\u1E37': 'l',\n                '\\u1E39': 'l',\n                '\\u013C': 'l',\n                '\\u1E3D': 'l',\n                '\\u1E3B': 'l',\n                '\\u017F': 'l',\n                '\\u0142': 'l',\n                '\\u019A': 'l',\n                '\\u026B': 'l',\n                '\\u2C61': 'l',\n                '\\uA749': 'l',\n                '\\uA781': 'l',\n                '\\uA747': 'l',\n                '\\u01C9': 'lj',\n                '\\u24DC': 'm',\n                '\\uFF4D': 'm',\n                '\\u1E3F': 'm',\n                '\\u1E41': 'm',\n                '\\u1E43': 'm',\n                '\\u0271': 'm',\n                '\\u026F': 'm',\n                '\\u24DD': 'n',\n                '\\uFF4E': 'n',\n                '\\u01F9': 'n',\n                '\\u0144': 'n',\n                '\\u00F1': 'n',\n                '\\u1E45': 'n',\n                '\\u0148': 'n',\n                '\\u1E47': 'n',\n                '\\u0146': 'n',\n                '\\u1E4B': 'n',\n                '\\u1E49': 'n',\n                '\\u019E': 'n',\n                '\\u0272': 'n',\n                '\\u0149': 'n',\n                '\\uA791': 'n',\n                '\\uA7A5': 'n',\n                '\\u01CC': 'nj',\n                '\\u24DE': 'o',\n                '\\uFF4F': 'o',\n                '\\u00F2': 'o',\n                '\\u00F3': 'o',\n                '\\u00F4': 'o',\n                '\\u1ED3': 'o',\n                '\\u1ED1': 'o',\n                '\\u1ED7': 'o',\n                '\\u1ED5': 'o',\n                '\\u00F5': 'o',\n                '\\u1E4D': 'o',\n                '\\u022D': 'o',\n                '\\u1E4F': 'o',\n                '\\u014D': 'o',\n                '\\u1E51': 'o',\n                '\\u1E53': 'o',\n                '\\u014F': 'o',\n                '\\u022F': 'o',\n                '\\u0231': 'o',\n                '\\u00F6': 'o',\n                '\\u022B': 'o',\n                '\\u1ECF': 'o',\n                '\\u0151': 'o',\n                '\\u01D2': 'o',\n                '\\u020D': 'o',\n                '\\u020F': 'o',\n                '\\u01A1': 'o',\n                '\\u1EDD': 'o',\n                '\\u1EDB': 'o',\n                '\\u1EE1': 'o',\n                '\\u1EDF': 'o',\n                '\\u1EE3': 'o',\n                '\\u1ECD': 'o',\n                '\\u1ED9': 'o',\n                '\\u01EB': 'o',\n                '\\u01ED': 'o',\n                '\\u00F8': 'o',\n                '\\u01FF': 'o',\n                '\\u0254': 'o',\n                '\\uA74B': 'o',\n                '\\uA74D': 'o',\n                '\\u0275': 'o',\n                '\\u0153': 'oe',\n                '\\u01A3': 'oi',\n                '\\u0223': 'ou',\n                '\\uA74F': 'oo',\n                '\\u24DF': 'p',\n                '\\uFF50': 'p',\n                '\\u1E55': 'p',\n                '\\u1E57': 'p',\n                '\\u01A5': 'p',\n                '\\u1D7D': 'p',\n                '\\uA751': 'p',\n                '\\uA753': 'p',\n                '\\uA755': 'p',\n                '\\u24E0': 'q',\n                '\\uFF51': 'q',\n                '\\u024B': 'q',\n                '\\uA757': 'q',\n                '\\uA759': 'q',\n                '\\u24E1': 'r',\n                '\\uFF52': 'r',\n                '\\u0155': 'r',\n                '\\u1E59': 'r',\n                '\\u0159': 'r',\n                '\\u0211': 'r',\n                '\\u0213': 'r',\n                '\\u1E5B': 'r',\n                '\\u1E5D': 'r',\n                '\\u0157': 'r',\n                '\\u1E5F': 'r',\n                '\\u024D': 'r',\n                '\\u027D': 'r',\n                '\\uA75B': 'r',\n                '\\uA7A7': 'r',\n                '\\uA783': 'r',\n                '\\u24E2': 's',\n                '\\uFF53': 's',\n                '\\u00DF': 's',\n                '\\u015B': 's',\n                '\\u1E65': 's',\n                '\\u015D': 's',\n                '\\u1E61': 's',\n                '\\u0161': 's',\n                '\\u1E67': 's',\n                '\\u1E63': 's',\n                '\\u1E69': 's',\n                '\\u0219': 's',\n                '\\u015F': 's',\n                '\\u023F': 's',\n                '\\uA7A9': 's',\n                '\\uA785': 's',\n                '\\u1E9B': 's',\n                '\\u24E3': 't',\n                '\\uFF54': 't',\n                '\\u1E6B': 't',\n                '\\u1E97': 't',\n                '\\u0165': 't',\n                '\\u1E6D': 't',\n                '\\u021B': 't',\n                '\\u0163': 't',\n                '\\u1E71': 't',\n                '\\u1E6F': 't',\n                '\\u0167': 't',\n                '\\u01AD': 't',\n                '\\u0288': 't',\n                '\\u2C66': 't',\n                '\\uA787': 't',\n                '\\uA729': 'tz',\n                '\\u24E4': 'u',\n                '\\uFF55': 'u',\n                '\\u00F9': 'u',\n                '\\u00FA': 'u',\n                '\\u00FB': 'u',\n                '\\u0169': 'u',\n                '\\u1E79': 'u',\n                '\\u016B': 'u',\n                '\\u1E7B': 'u',\n                '\\u016D': 'u',\n                '\\u00FC': 'u',\n                '\\u01DC': 'u',\n                '\\u01D8': 'u',\n                '\\u01D6': 'u',\n                '\\u01DA': 'u',\n                '\\u1EE7': 'u',\n                '\\u016F': 'u',\n                '\\u0171': 'u',\n                '\\u01D4': 'u',\n                '\\u0215': 'u',\n                '\\u0217': 'u',\n                '\\u01B0': 'u',\n                '\\u1EEB': 'u',\n                '\\u1EE9': 'u',\n                '\\u1EEF': 'u',\n                '\\u1EED': 'u',\n                '\\u1EF1': 'u',\n                '\\u1EE5': 'u',\n                '\\u1E73': 'u',\n                '\\u0173': 'u',\n                '\\u1E77': 'u',\n                '\\u1E75': 'u',\n                '\\u0289': 'u',\n                '\\u24E5': 'v',\n                '\\uFF56': 'v',\n                '\\u1E7D': 'v',\n                '\\u1E7F': 'v',\n                '\\u028B': 'v',\n                '\\uA75F': 'v',\n                '\\u028C': 'v',\n                '\\uA761': 'vy',\n                '\\u24E6': 'w',\n                '\\uFF57': 'w',\n                '\\u1E81': 'w',\n                '\\u1E83': 'w',\n                '\\u0175': 'w',\n                '\\u1E87': 'w',\n                '\\u1E85': 'w',\n                '\\u1E98': 'w',\n                '\\u1E89': 'w',\n                '\\u2C73': 'w',\n                '\\u24E7': 'x',\n                '\\uFF58': 'x',\n                '\\u1E8B': 'x',\n                '\\u1E8D': 'x',\n                '\\u24E8': 'y',\n                '\\uFF59': 'y',\n                '\\u1EF3': 'y',\n                '\\u00FD': 'y',\n                '\\u0177': 'y',\n                '\\u1EF9': 'y',\n                '\\u0233': 'y',\n                '\\u1E8F': 'y',\n                '\\u00FF': 'y',\n                '\\u1EF7': 'y',\n                '\\u1E99': 'y',\n                '\\u1EF5': 'y',\n                '\\u01B4': 'y',\n                '\\u024F': 'y',\n                '\\u1EFF': 'y',\n                '\\u24E9': 'z',\n                '\\uFF5A': 'z',\n                '\\u017A': 'z',\n                '\\u1E91': 'z',\n                '\\u017C': 'z',\n                '\\u017E': 'z',\n                '\\u1E93': 'z',\n                '\\u1E95': 'z',\n                '\\u01B6': 'z',\n                '\\u0225': 'z',\n                '\\u0240': 'z',\n                '\\u2C6C': 'z',\n                '\\uA763': 'z',\n                '\\u0386': '\\u0391',\n                '\\u0388': '\\u0395',\n                '\\u0389': '\\u0397',\n                '\\u038A': '\\u0399',\n                '\\u03AA': '\\u0399',\n                '\\u038C': '\\u039F',\n                '\\u038E': '\\u03A5',\n                '\\u03AB': '\\u03A5',\n                '\\u038F': '\\u03A9',\n                '\\u03AC': '\\u03B1',\n                '\\u03AD': '\\u03B5',\n                '\\u03AE': '\\u03B7',\n                '\\u03AF': '\\u03B9',\n                '\\u03CA': '\\u03B9',\n                '\\u0390': '\\u03B9',\n                '\\u03CC': '\\u03BF',\n                '\\u03CD': '\\u03C5',\n                '\\u03CB': '\\u03C5',\n                '\\u03B0': '\\u03C5',\n                '\\u03CE': '\\u03C9',\n                '\\u03C2': '\\u03C3',\n                '\\u2019': '\\''\n            };\n\n            return diacritics;\n        });\n\n        S2.define('select2/data/base',[\n            '../utils'\n        ], function (Utils) {\n            function BaseAdapter ($element, options) {\n                BaseAdapter.__super__.constructor.call(this);\n            }\n\n            Utils.Extend(BaseAdapter, Utils.Observable);\n\n            BaseAdapter.prototype.current = function (callback) {\n                throw new Error('The `current` method must be defined in child classes.');\n            };\n\n            BaseAdapter.prototype.query = function (params, callback) {\n                throw new Error('The `query` method must be defined in child classes.');\n            };\n\n            BaseAdapter.prototype.bind = function (container, $container) {\n                // Can be implemented in subclasses\n            };\n\n            BaseAdapter.prototype.destroy = function () {\n                // Can be implemented in subclasses\n            };\n\n            BaseAdapter.prototype.generateResultId = function (container, data) {\n                var id = container.id + '-result-';\n\n                id += Utils.generateChars(4);\n\n                if (data.id != null) {\n                    id += '-' + data.id.toString();\n                } else {\n                    id += '-' + Utils.generateChars(4);\n                }\n                return id;\n            };\n\n            return BaseAdapter;\n        });\n\n        S2.define('select2/data/select',[\n            './base',\n            '../utils',\n            'jquery'\n        ], function (BaseAdapter, Utils, $) {\n            function SelectAdapter ($element, options) {\n                this.$element = $element;\n                this.options = options;\n\n                SelectAdapter.__super__.constructor.call(this);\n            }\n\n            Utils.Extend(SelectAdapter, BaseAdapter);\n\n            SelectAdapter.prototype.current = function (callback) {\n                var data = [];\n                var self = this;\n\n                this.$element.find(':selected').each(function () {\n                    var $option = $(this);\n\n                    var option = self.item($option);\n\n                    data.push(option);\n                });\n\n                callback(data);\n            };\n\n            SelectAdapter.prototype.select = function (data) {\n                var self = this;\n\n                data.selected = true;\n\n                // If data.element is a DOM node, use it instead\n                if ($(data.element).is('option')) {\n                    data.element.selected = true;\n\n                    this.$element.trigger('input').trigger('change');\n\n                    return;\n                }\n\n                if (this.$element.prop('multiple')) {\n                    this.current(function (currentData) {\n                        var val = [];\n\n                        data = [data];\n                        data.push.apply(data, currentData);\n\n                        for (var d = 0; d < data.length; d++) {\n                            var id = data[d].id;\n\n                            if ($.inArray(id, val) === -1) {\n                                val.push(id);\n                            }\n                        }\n\n                        self.$element.val(val);\n                        self.$element.trigger('input').trigger('change');\n                    });\n                } else {\n                    var val = data.id;\n\n                    this.$element.val(val);\n                    this.$element.trigger('input').trigger('change');\n                }\n            };\n\n            SelectAdapter.prototype.unselect = function (data) {\n                var self = this;\n\n                if (!this.$element.prop('multiple')) {\n                    return;\n                }\n\n                data.selected = false;\n\n                if ($(data.element).is('option')) {\n                    data.element.selected = false;\n\n                    this.$element.trigger('input').trigger('change');\n\n                    return;\n                }\n\n                this.current(function (currentData) {\n                    var val = [];\n\n                    for (var d = 0; d < currentData.length; d++) {\n                        var id = currentData[d].id;\n\n                        if (id !== data.id && $.inArray(id, val) === -1) {\n                            val.push(id);\n                        }\n                    }\n\n                    self.$element.val(val);\n\n                    self.$element.trigger('input').trigger('change');\n                });\n            };\n\n            SelectAdapter.prototype.bind = function (container, $container) {\n                var self = this;\n\n                this.container = container;\n\n                container.on('select', function (params) {\n                    self.select(params.data);\n                });\n\n                container.on('unselect', function (params) {\n                    self.unselect(params.data);\n                });\n            };\n\n            SelectAdapter.prototype.destroy = function () {\n                // Remove anything added to child elements\n                this.$element.find('*').each(function () {\n                    // Remove any custom data set by Select2\n                    Utils.RemoveData(this);\n                });\n            };\n\n            SelectAdapter.prototype.query = function (params, callback) {\n                var data = [];\n                var self = this;\n\n                var $options = this.$element.children();\n\n                $options.each(function () {\n                    var $option = $(this);\n\n                    if (!$option.is('option') && !$option.is('optgroup')) {\n                        return;\n                    }\n\n                    var option = self.item($option);\n\n                    var matches = self.matches(params, option);\n\n                    if (matches !== null) {\n                        data.push(matches);\n                    }\n                });\n\n                callback({\n                    results: data\n                });\n            };\n\n            SelectAdapter.prototype.addOptions = function ($options) {\n                Utils.appendMany(this.$element, $options);\n            };\n\n            SelectAdapter.prototype.option = function (data) {\n                var option;\n\n                if (data.children) {\n                    option = document.createElement('optgroup');\n                    option.label = data.text;\n                } else {\n                    option = document.createElement('option');\n\n                    if (option.textContent !== undefined) {\n                        option.textContent = data.text;\n                    } else {\n                        option.innerText = data.text;\n                    }\n                }\n\n                if (data.id !== undefined) {\n                    option.value = data.id;\n                }\n\n                if (data.disabled) {\n                    option.disabled = true;\n                }\n\n                if (data.selected) {\n                    option.selected = true;\n                }\n\n                if (data.title) {\n                    option.title = data.title;\n                }\n\n                var $option = $(option);\n\n                var normalizedData = this._normalizeItem(data);\n                normalizedData.element = option;\n\n                // Override the option's data with the combined data\n                Utils.StoreData(option, 'data', normalizedData);\n\n                return $option;\n            };\n\n            SelectAdapter.prototype.item = function ($option) {\n                var data = {};\n\n                data = Utils.GetData($option[0], 'data');\n\n                if (data != null) {\n                    return data;\n                }\n\n                if ($option.is('option')) {\n                    data = {\n                        id: $option.val(),\n                        text: $option.text(),\n                        disabled: $option.prop('disabled'),\n                        selected: $option.prop('selected'),\n                        title: $option.prop('title')\n                    };\n                } else if ($option.is('optgroup')) {\n                    data = {\n                        text: $option.prop('label'),\n                        children: [],\n                        title: $option.prop('title')\n                    };\n\n                    var $children = $option.children('option');\n                    var children = [];\n\n                    for (var c = 0; c < $children.length; c++) {\n                        var $child = $($children[c]);\n\n                        var child = this.item($child);\n\n                        children.push(child);\n                    }\n\n                    data.children = children;\n                }\n\n                data = this._normalizeItem(data);\n                data.element = $option[0];\n\n                Utils.StoreData($option[0], 'data', data);\n\n                return data;\n            };\n\n            SelectAdapter.prototype._normalizeItem = function (item) {\n                if (item !== Object(item)) {\n                    item = {\n                        id: item,\n                        text: item\n                    };\n                }\n\n                item = $.extend({}, {\n                    text: ''\n                }, item);\n\n                var defaults = {\n                    selected: false,\n                    disabled: false\n                };\n\n                if (item.id != null) {\n                    item.id = item.id.toString();\n                }\n\n                if (item.text != null) {\n                    item.text = item.text.toString();\n                }\n\n                if (item._resultId == null && item.id && this.container != null) {\n                    item._resultId = this.generateResultId(this.container, item);\n                }\n\n                return $.extend({}, defaults, item);\n            };\n\n            SelectAdapter.prototype.matches = function (params, data) {\n                var matcher = this.options.get('matcher');\n\n                return matcher(params, data);\n            };\n\n            return SelectAdapter;\n        });\n\n        S2.define('select2/data/array',[\n            './select',\n            '../utils',\n            'jquery'\n        ], function (SelectAdapter, Utils, $) {\n            function ArrayAdapter ($element, options) {\n                this._dataToConvert = options.get('data') || [];\n\n                ArrayAdapter.__super__.constructor.call(this, $element, options);\n            }\n\n            Utils.Extend(ArrayAdapter, SelectAdapter);\n\n            ArrayAdapter.prototype.bind = function (container, $container) {\n                ArrayAdapter.__super__.bind.call(this, container, $container);\n\n                this.addOptions(this.convertToOptions(this._dataToConvert));\n            };\n\n            ArrayAdapter.prototype.select = function (data) {\n                var $option = this.$element.find('option').filter(function (i, elm) {\n                    return elm.value == data.id.toString();\n                });\n\n                if ($option.length === 0) {\n                    $option = this.option(data);\n\n                    this.addOptions($option);\n                }\n\n                ArrayAdapter.__super__.select.call(this, data);\n            };\n\n            ArrayAdapter.prototype.convertToOptions = function (data) {\n                var self = this;\n\n                var $existing = this.$element.find('option');\n                var existingIds = $existing.map(function () {\n                    return self.item($(this)).id;\n                }).get();\n\n                var $options = [];\n\n                // Filter out all items except for the one passed in the argument\n                function onlyItem (item) {\n                    return function () {\n                        return $(this).val() == item.id;\n                    };\n                }\n\n                for (var d = 0; d < data.length; d++) {\n                    var item = this._normalizeItem(data[d]);\n\n                    // Skip items which were pre-loaded, only merge the data\n                    if ($.inArray(item.id, existingIds) >= 0) {\n                        var $existingOption = $existing.filter(onlyItem(item));\n\n                        var existingData = this.item($existingOption);\n                        var newData = $.extend(true, {}, item, existingData);\n\n                        var $newOption = this.option(newData);\n\n                        $existingOption.replaceWith($newOption);\n\n                        continue;\n                    }\n\n                    var $option = this.option(item);\n\n                    if (item.children) {\n                        var $children = this.convertToOptions(item.children);\n\n                        Utils.appendMany($option, $children);\n                    }\n\n                    $options.push($option);\n                }\n\n                return $options;\n            };\n\n            return ArrayAdapter;\n        });\n\n        S2.define('select2/data/ajax',[\n            './array',\n            '../utils',\n            'jquery'\n        ], function (ArrayAdapter, Utils, $) {\n            function AjaxAdapter ($element, options) {\n                this.ajaxOptions = this._applyDefaults(options.get('ajax'));\n\n                if (this.ajaxOptions.processResults != null) {\n                    this.processResults = this.ajaxOptions.processResults;\n                }\n\n                AjaxAdapter.__super__.constructor.call(this, $element, options);\n            }\n\n            Utils.Extend(AjaxAdapter, ArrayAdapter);\n\n            AjaxAdapter.prototype._applyDefaults = function (options) {\n                var defaults = {\n                    data: function (params) {\n                        return $.extend({}, params, {\n                            q: params.term\n                        });\n                    },\n                    transport: function (params, success, failure) {\n                        var $request = $.ajax(params);\n\n                        $request.then(success);\n                        $request.fail(failure);\n\n                        return $request;\n                    }\n                };\n\n                return $.extend({}, defaults, options, true);\n            };\n\n            AjaxAdapter.prototype.processResults = function (results) {\n                return results;\n            };\n\n            AjaxAdapter.prototype.query = function (params, callback) {\n                var matches = [];\n                var self = this;\n\n                if (this._request != null) {\n                    // JSONP requests cannot always be aborted\n                    if ($.isFunction(this._request.abort)) {\n                        this._request.abort();\n                    }\n\n                    this._request = null;\n                }\n\n                var options = $.extend({\n                    type: 'GET'\n                }, this.ajaxOptions);\n\n                if (typeof options.url === 'function') {\n                    options.url = options.url.call(this.$element, params);\n                }\n\n                if (typeof options.data === 'function') {\n                    options.data = options.data.call(this.$element, params);\n                }\n\n                function request () {\n                    var $request = options.transport(options, function (data) {\n                        var results = self.processResults(data, params);\n\n                        if (self.options.get('debug') && window.console && console.error) {\n                            // Check to make sure that the response included a `results` key.\n                            if (!results || !results.results || !$.isArray(results.results)) {\n                                console.error(\n                                    'Select2: The AJAX results did not return an array in the ' +\n                                    '`results` key of the response.'\n                                );\n                            }\n                        }\n\n                        callback(results);\n                    }, function () {\n                        // Attempt to detect if a request was aborted\n                        // Only works if the transport exposes a status property\n                        if ('status' in $request &&\n                            ($request.status === 0 || $request.status === '0')) {\n                            return;\n                        }\n\n                        self.trigger('results:message', {\n                            message: 'errorLoading'\n                        });\n                    });\n\n                    self._request = $request;\n                }\n\n                if (this.ajaxOptions.delay && params.term != null) {\n                    if (this._queryTimeout) {\n                        window.clearTimeout(this._queryTimeout);\n                    }\n\n                    this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);\n                } else {\n                    request();\n                }\n            };\n\n            return AjaxAdapter;\n        });\n\n        S2.define('select2/data/tags',[\n            'jquery'\n        ], function ($) {\n            function Tags (decorated, $element, options) {\n                var tags = options.get('tags');\n\n                var createTag = options.get('createTag');\n\n                if (createTag !== undefined) {\n                    this.createTag = createTag;\n                }\n\n                var insertTag = options.get('insertTag');\n\n                if (insertTag !== undefined) {\n                    this.insertTag = insertTag;\n                }\n\n                decorated.call(this, $element, options);\n\n                if ($.isArray(tags)) {\n                    for (var t = 0; t < tags.length; t++) {\n                        var tag = tags[t];\n                        var item = this._normalizeItem(tag);\n\n                        var $option = this.option(item);\n\n                        this.$element.append($option);\n                    }\n                }\n            }\n\n            Tags.prototype.query = function (decorated, params, callback) {\n                var self = this;\n\n                this._removeOldTags();\n\n                if (params.term == null || params.page != null) {\n                    decorated.call(this, params, callback);\n                    return;\n                }\n\n                function wrapper (obj, child) {\n                    var data = obj.results;\n\n                    for (var i = 0; i < data.length; i++) {\n                        var option = data[i];\n\n                        var checkChildren = (\n                            option.children != null &&\n                            !wrapper({\n                                results: option.children\n                            }, true)\n                        );\n\n                        var optionText = (option.text || '').toUpperCase();\n                        var paramsTerm = (params.term || '').toUpperCase();\n\n                        var checkText = optionText === paramsTerm;\n\n                        if (checkText || checkChildren) {\n                            if (child) {\n                                return false;\n                            }\n\n                            obj.data = data;\n                            callback(obj);\n\n                            return;\n                        }\n                    }\n\n                    if (child) {\n                        return true;\n                    }\n\n                    var tag = self.createTag(params);\n\n                    if (tag != null) {\n                        var $option = self.option(tag);\n                        $option.attr('data-select2-tag', true);\n\n                        self.addOptions([$option]);\n\n                        self.insertTag(data, tag);\n                    }\n\n                    obj.results = data;\n\n                    callback(obj);\n                }\n\n                decorated.call(this, params, wrapper);\n            };\n\n            Tags.prototype.createTag = function (decorated, params) {\n                var term = $.trim(params.term);\n\n                if (term === '') {\n                    return null;\n                }\n\n                return {\n                    id: term,\n                    text: term\n                };\n            };\n\n            Tags.prototype.insertTag = function (_, data, tag) {\n                data.unshift(tag);\n            };\n\n            Tags.prototype._removeOldTags = function (_) {\n                var $options = this.$element.find('option[data-select2-tag]');\n\n                $options.each(function () {\n                    if (this.selected) {\n                        return;\n                    }\n\n                    $(this).remove();\n                });\n            };\n\n            return Tags;\n        });\n\n        S2.define('select2/data/tokenizer',[\n            'jquery'\n        ], function ($) {\n            function Tokenizer (decorated, $element, options) {\n                var tokenizer = options.get('tokenizer');\n\n                if (tokenizer !== undefined) {\n                    this.tokenizer = tokenizer;\n                }\n\n                decorated.call(this, $element, options);\n            }\n\n            Tokenizer.prototype.bind = function (decorated, container, $container) {\n                decorated.call(this, container, $container);\n\n                this.$search =  container.dropdown.$search || container.selection.$search ||\n                    $container.find('.select2-search__field');\n            };\n\n            Tokenizer.prototype.query = function (decorated, params, callback) {\n                var self = this;\n\n                function createAndSelect (data) {\n                    // Normalize the data object so we can use it for checks\n                    var item = self._normalizeItem(data);\n\n                    // Check if the data object already exists as a tag\n                    // Select it if it doesn't\n                    var $existingOptions = self.$element.find('option').filter(function () {\n                        return $(this).val() === item.id;\n                    });\n\n                    // If an existing option wasn't found for it, create the option\n                    if (!$existingOptions.length) {\n                        var $option = self.option(item);\n                        $option.attr('data-select2-tag', true);\n\n                        self._removeOldTags();\n                        self.addOptions([$option]);\n                    }\n\n                    // Select the item, now that we know there is an option for it\n                    select(item);\n                }\n\n                function select (data) {\n                    self.trigger('select', {\n                        data: data\n                    });\n                }\n\n                params.term = params.term || '';\n\n                var tokenData = this.tokenizer(params, this.options, createAndSelect);\n\n                if (tokenData.term !== params.term) {\n                    // Replace the search term if we have the search box\n                    if (this.$search.length) {\n                        this.$search.val(tokenData.term);\n                        this.$search.trigger('focus');\n                    }\n\n                    params.term = tokenData.term;\n                }\n\n                decorated.call(this, params, callback);\n            };\n\n            Tokenizer.prototype.tokenizer = function (_, params, options, callback) {\n                var separators = options.get('tokenSeparators') || [];\n                var term = params.term;\n                var i = 0;\n\n                var createTag = this.createTag || function (params) {\n                    return {\n                        id: params.term,\n                        text: params.term\n                    };\n                };\n\n                while (i < term.length) {\n                    var termChar = term[i];\n\n                    if ($.inArray(termChar, separators) === -1) {\n                        i++;\n\n                        continue;\n                    }\n\n                    var part = term.substr(0, i);\n                    var partParams = $.extend({}, params, {\n                        term: part\n                    });\n\n                    var data = createTag(partParams);\n\n                    if (data == null) {\n                        i++;\n                        continue;\n                    }\n\n                    callback(data);\n\n                    // Reset the term to not include the tokenized portion\n                    term = term.substr(i + 1) || '';\n                    i = 0;\n                }\n\n                return {\n                    term: term\n                };\n            };\n\n            return Tokenizer;\n        });\n\n        S2.define('select2/data/minimumInputLength',[\n\n        ], function () {\n            function MinimumInputLength (decorated, $e, options) {\n                this.minimumInputLength = options.get('minimumInputLength');\n\n                decorated.call(this, $e, options);\n            }\n\n            MinimumInputLength.prototype.query = function (decorated, params, callback) {\n                params.term = params.term || '';\n\n                if (params.term.length < this.minimumInputLength) {\n                    this.trigger('results:message', {\n                        message: 'inputTooShort',\n                        args: {\n                            minimum: this.minimumInputLength,\n                            input: params.term,\n                            params: params\n                        }\n                    });\n\n                    return;\n                }\n\n                decorated.call(this, params, callback);\n            };\n\n            return MinimumInputLength;\n        });\n\n        S2.define('select2/data/maximumInputLength',[\n\n        ], function () {\n            function MaximumInputLength (decorated, $e, options) {\n                this.maximumInputLength = options.get('maximumInputLength');\n\n                decorated.call(this, $e, options);\n            }\n\n            MaximumInputLength.prototype.query = function (decorated, params, callback) {\n                params.term = params.term || '';\n\n                if (this.maximumInputLength > 0 &&\n                    params.term.length > this.maximumInputLength) {\n                    this.trigger('results:message', {\n                        message: 'inputTooLong',\n                        args: {\n                            maximum: this.maximumInputLength,\n                            input: params.term,\n                            params: params\n                        }\n                    });\n\n                    return;\n                }\n\n                decorated.call(this, params, callback);\n            };\n\n            return MaximumInputLength;\n        });\n\n        S2.define('select2/data/maximumSelectionLength',[\n\n        ], function (){\n            function MaximumSelectionLength (decorated, $e, options) {\n                this.maximumSelectionLength = options.get('maximumSelectionLength');\n\n                decorated.call(this, $e, options);\n            }\n\n            MaximumSelectionLength.prototype.bind =\n                function (decorated, container, $container) {\n                    var self = this;\n\n                    decorated.call(this, container, $container);\n\n                    container.on('select', function () {\n                        self._checkIfMaximumSelected();\n                    });\n                };\n\n            MaximumSelectionLength.prototype.query =\n                function (decorated, params, callback) {\n                    var self = this;\n\n                    this._checkIfMaximumSelected(function () {\n                        decorated.call(self, params, callback);\n                    });\n                };\n\n            MaximumSelectionLength.prototype._checkIfMaximumSelected =\n                function (_, successCallback) {\n                    var self = this;\n\n                    this.current(function (currentData) {\n                        var count = currentData != null ? currentData.length : 0;\n                        if (self.maximumSelectionLength > 0 &&\n                            count >= self.maximumSelectionLength) {\n                            self.trigger('results:message', {\n                                message: 'maximumSelected',\n                                args: {\n                                    maximum: self.maximumSelectionLength\n                                }\n                            });\n                            return;\n                        }\n\n                        if (successCallback) {\n                            successCallback();\n                        }\n                    });\n                };\n\n            return MaximumSelectionLength;\n        });\n\n        S2.define('select2/dropdown',[\n            'jquery',\n            './utils'\n        ], function ($, Utils) {\n            function Dropdown ($element, options) {\n                this.$element = $element;\n                this.options = options;\n\n                Dropdown.__super__.constructor.call(this);\n            }\n\n            Utils.Extend(Dropdown, Utils.Observable);\n\n            Dropdown.prototype.render = function () {\n                var $dropdown = $(\n                    '<span class=\"select2-dropdown\">' +\n                    '<span class=\"select2-results\"></span>' +\n                    '</span>'\n                );\n\n                $dropdown.attr('dir', this.options.get('dir'));\n\n                this.$dropdown = $dropdown;\n\n                return $dropdown;\n            };\n\n            Dropdown.prototype.bind = function () {\n                // Should be implemented in subclasses\n            };\n\n            Dropdown.prototype.position = function ($dropdown, $container) {\n                // Should be implemented in subclasses\n            };\n\n            Dropdown.prototype.destroy = function () {\n                // Remove the dropdown from the DOM\n                this.$dropdown.remove();\n            };\n\n            return Dropdown;\n        });\n\n        S2.define('select2/dropdown/search',[\n            'jquery',\n            '../utils'\n        ], function ($, Utils) {\n            function Search () { }\n\n            Search.prototype.render = function (decorated) {\n                var $rendered = decorated.call(this);\n\n                var $search = $(\n                    '<span class=\"select2-search select2-search--dropdown\">' +\n                    '<input class=\"select2-search__field\" type=\"search\" tabindex=\"-1\"' +\n                    ' autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"none\"' +\n                    ' spellcheck=\"false\" role=\"searchbox\" aria-autocomplete=\"list\" />' +\n                    '</span>'\n                );\n\n                this.$searchContainer = $search;\n                this.$search = $search.find('input');\n\n                $rendered.prepend($search);\n\n                return $rendered;\n            };\n\n            Search.prototype.bind = function (decorated, container, $container) {\n                var self = this;\n\n                var resultsId = container.id + '-results';\n\n                decorated.call(this, container, $container);\n\n                this.$search.on('keydown', function (evt) {\n                    self.trigger('keypress', evt);\n\n                    self._keyUpPrevented = evt.isDefaultPrevented();\n                });\n\n                // Workaround for browsers which do not support the `input` event\n                // This will prevent double-triggering of events for browsers which support\n                // both the `keyup` and `input` events.\n                this.$search.on('input', function (evt) {\n                    // Unbind the duplicated `keyup` event\n                    $(this).off('keyup');\n                });\n\n                this.$search.on('keyup input', function (evt) {\n                    self.handleSearch(evt);\n                });\n\n                container.on('open', function () {\n                    self.$search.attr('tabindex', 0);\n                    self.$search.attr('aria-controls', resultsId);\n\n                    self.$search.trigger('focus');\n\n                    window.setTimeout(function () {\n                        self.$search.trigger('focus');\n                    }, 0);\n                });\n\n                container.on('close', function () {\n                    self.$search.attr('tabindex', -1);\n                    self.$search.removeAttr('aria-controls');\n                    self.$search.removeAttr('aria-activedescendant');\n\n                    self.$search.val('');\n                    self.$search.trigger('blur');\n                });\n\n                container.on('focus', function () {\n                    if (!container.isOpen()) {\n                        self.$search.trigger('focus');\n                    }\n                });\n\n                container.on('results:all', function (params) {\n                    if (params.query.term == null || params.query.term === '') {\n                        var showSearch = self.showSearch(params);\n\n                        if (showSearch) {\n                            self.$searchContainer.removeClass('select2-search--hide');\n                        } else {\n                            self.$searchContainer.addClass('select2-search--hide');\n                        }\n                    }\n                });\n\n                container.on('results:focus', function (params) {\n                    if (params.data._resultId) {\n                        self.$search.attr('aria-activedescendant', params.data._resultId);\n                    } else {\n                        self.$search.removeAttr('aria-activedescendant');\n                    }\n                });\n            };\n\n            Search.prototype.handleSearch = function (evt) {\n                if (!this._keyUpPrevented) {\n                    var input = this.$search.val();\n\n                    this.trigger('query', {\n                        term: input\n                    });\n                }\n\n                this._keyUpPrevented = false;\n            };\n\n            Search.prototype.showSearch = function (_, params) {\n                return true;\n            };\n\n            return Search;\n        });\n\n        S2.define('select2/dropdown/hidePlaceholder',[\n\n        ], function () {\n            function HidePlaceholder (decorated, $element, options, dataAdapter) {\n                this.placeholder = this.normalizePlaceholder(options.get('placeholder'));\n\n                decorated.call(this, $element, options, dataAdapter);\n            }\n\n            HidePlaceholder.prototype.append = function (decorated, data) {\n                data.results = this.removePlaceholder(data.results);\n\n                decorated.call(this, data);\n            };\n\n            HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {\n                if (typeof placeholder === 'string') {\n                    placeholder = {\n                        id: '',\n                        text: placeholder\n                    };\n                }\n\n                return placeholder;\n            };\n\n            HidePlaceholder.prototype.removePlaceholder = function (_, data) {\n                var modifiedData = data.slice(0);\n\n                for (var d = data.length - 1; d >= 0; d--) {\n                    var item = data[d];\n\n                    if (this.placeholder.id === item.id) {\n                        modifiedData.splice(d, 1);\n                    }\n                }\n\n                return modifiedData;\n            };\n\n            return HidePlaceholder;\n        });\n\n        S2.define('select2/dropdown/infiniteScroll',[\n            'jquery'\n        ], function ($) {\n            function InfiniteScroll (decorated, $element, options, dataAdapter) {\n                this.lastParams = {};\n\n                decorated.call(this, $element, options, dataAdapter);\n\n                this.$loadingMore = this.createLoadingMore();\n                this.loading = false;\n            }\n\n            InfiniteScroll.prototype.append = function (decorated, data) {\n                this.$loadingMore.remove();\n                this.loading = false;\n\n                decorated.call(this, data);\n\n                if (this.showLoadingMore(data)) {\n                    this.$results.append(this.$loadingMore);\n                    this.loadMoreIfNeeded();\n                }\n            };\n\n            InfiniteScroll.prototype.bind = function (decorated, container, $container) {\n                var self = this;\n\n                decorated.call(this, container, $container);\n\n                container.on('query', function (params) {\n                    self.lastParams = params;\n                    self.loading = true;\n                });\n\n                container.on('query:append', function (params) {\n                    self.lastParams = params;\n                    self.loading = true;\n                });\n\n                this.$results.on('scroll', this.loadMoreIfNeeded.bind(this));\n            };\n\n            InfiniteScroll.prototype.loadMoreIfNeeded = function () {\n                var isLoadMoreVisible = $.contains(\n                    document.documentElement,\n                    this.$loadingMore[0]\n                );\n\n                if (this.loading || !isLoadMoreVisible) {\n                    return;\n                }\n\n                var currentOffset = this.$results.offset().top +\n                    this.$results.outerHeight(false);\n                var loadingMoreOffset = this.$loadingMore.offset().top +\n                    this.$loadingMore.outerHeight(false);\n\n                if (currentOffset + 50 >= loadingMoreOffset) {\n                    this.loadMore();\n                }\n            };\n\n            InfiniteScroll.prototype.loadMore = function () {\n                this.loading = true;\n\n                var params = $.extend({}, {page: 1}, this.lastParams);\n\n                params.page++;\n\n                this.trigger('query:append', params);\n            };\n\n            InfiniteScroll.prototype.showLoadingMore = function (_, data) {\n                return data.pagination && data.pagination.more;\n            };\n\n            InfiniteScroll.prototype.createLoadingMore = function () {\n                var $option = $(\n                    '<li ' +\n                    'class=\"select2-results__option select2-results__option--load-more\"' +\n                    'role=\"option\" aria-disabled=\"true\"></li>'\n                );\n\n                var message = this.options.get('translations').get('loadingMore');\n\n                $option.html(message(this.lastParams));\n\n                return $option;\n            };\n\n            return InfiniteScroll;\n        });\n\n        S2.define('select2/dropdown/attachBody',[\n            'jquery',\n            '../utils'\n        ], function ($, Utils) {\n            function AttachBody (decorated, $element, options) {\n                this.$dropdownParent = $(options.get('dropdownParent') || document.body);\n\n                decorated.call(this, $element, options);\n            }\n\n            AttachBody.prototype.bind = function (decorated, container, $container) {\n                var self = this;\n\n                decorated.call(this, container, $container);\n\n                container.on('open', function () {\n                    self._showDropdown();\n                    self._attachPositioningHandler(container);\n\n                    // Must bind after the results handlers to ensure correct sizing\n                    self._bindContainerResultHandlers(container);\n                });\n\n                container.on('close', function () {\n                    self._hideDropdown();\n                    self._detachPositioningHandler(container);\n                });\n\n                this.$dropdownContainer.on('mousedown', function (evt) {\n                    evt.stopPropagation();\n                });\n            };\n\n            AttachBody.prototype.destroy = function (decorated) {\n                decorated.call(this);\n\n                this.$dropdownContainer.remove();\n            };\n\n            AttachBody.prototype.position = function (decorated, $dropdown, $container) {\n                // Clone all of the container classes\n                $dropdown.attr('class', $container.attr('class'));\n\n                $dropdown.removeClass('select2');\n                $dropdown.addClass('select2-container--open');\n\n                $dropdown.css({\n                    position: 'absolute',\n                    top: -999999\n                });\n\n                this.$container = $container;\n            };\n\n            AttachBody.prototype.render = function (decorated) {\n                var $container = $('<span></span>');\n\n                var $dropdown = decorated.call(this);\n                $container.append($dropdown);\n\n                this.$dropdownContainer = $container;\n\n                return $container;\n            };\n\n            AttachBody.prototype._hideDropdown = function (decorated) {\n                this.$dropdownContainer.detach();\n            };\n\n            AttachBody.prototype._bindContainerResultHandlers =\n                function (decorated, container) {\n\n                    // These should only be bound once\n                    if (this._containerResultsHandlersBound) {\n                        return;\n                    }\n\n                    var self = this;\n\n                    container.on('results:all', function () {\n                        self._positionDropdown();\n                        self._resizeDropdown();\n                    });\n\n                    container.on('results:append', function () {\n                        self._positionDropdown();\n                        self._resizeDropdown();\n                    });\n\n                    container.on('results:message', function () {\n                        self._positionDropdown();\n                        self._resizeDropdown();\n                    });\n\n                    container.on('select', function () {\n                        self._positionDropdown();\n                        self._resizeDropdown();\n                    });\n\n                    container.on('unselect', function () {\n                        self._positionDropdown();\n                        self._resizeDropdown();\n                    });\n\n                    this._containerResultsHandlersBound = true;\n                };\n\n            AttachBody.prototype._attachPositioningHandler =\n                function (decorated, container) {\n                    var self = this;\n\n                    var scrollEvent = 'scroll.select2.' + container.id;\n                    var resizeEvent = 'resize.select2.' + container.id;\n                    var orientationEvent = 'orientationchange.select2.' + container.id;\n\n                    var $watchers = this.$container.parents().filter(Utils.hasScroll);\n                    $watchers.each(function () {\n                        Utils.StoreData(this, 'select2-scroll-position', {\n                            x: $(this).scrollLeft(),\n                            y: $(this).scrollTop()\n                        });\n                    });\n\n                    $watchers.on(scrollEvent, function (ev) {\n                        var position = Utils.GetData(this, 'select2-scroll-position');\n                        $(this).scrollTop(position.y);\n                    });\n\n                    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,\n                        function (e) {\n                            self._positionDropdown();\n                            self._resizeDropdown();\n                        });\n                };\n\n            AttachBody.prototype._detachPositioningHandler =\n                function (decorated, container) {\n                    var scrollEvent = 'scroll.select2.' + container.id;\n                    var resizeEvent = 'resize.select2.' + container.id;\n                    var orientationEvent = 'orientationchange.select2.' + container.id;\n\n                    var $watchers = this.$container.parents().filter(Utils.hasScroll);\n                    $watchers.off(scrollEvent);\n\n                    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);\n                };\n\n            AttachBody.prototype._positionDropdown = function () {\n                var $window = $(window);\n\n                var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');\n                var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');\n\n                var newDirection = null;\n\n                var offset = this.$container.offset();\n\n                offset.bottom = offset.top + this.$container.outerHeight(false);\n\n                var container = {\n                    height: this.$container.outerHeight(false)\n                };\n\n                container.top = offset.top;\n                container.bottom = offset.top + container.height;\n\n                var dropdown = {\n                    height: this.$dropdown.outerHeight(false)\n                };\n\n                var viewport = {\n                    top: $window.scrollTop(),\n                    bottom: $window.scrollTop() + $window.height()\n                };\n\n                var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);\n                var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);\n\n                var css = {\n                    left: offset.left,\n                    top: container.bottom\n                };\n\n                // Determine what the parent element is to use for calculating the offset\n                var $offsetParent = this.$dropdownParent;\n\n                // For statically positioned elements, we need to get the element\n                // that is determining the offset\n                if ($offsetParent.css('position') === 'static') {\n                    $offsetParent = $offsetParent.offsetParent();\n                }\n\n                var parentOffset = {\n                    top: 0,\n                    left: 0\n                };\n\n                if (\n                    $.contains(document.body, $offsetParent[0]) ||\n                    $offsetParent[0].isConnected\n                ) {\n                    parentOffset = $offsetParent.offset();\n                }\n\n                css.top -= parentOffset.top;\n                css.left -= parentOffset.left;\n\n                if (!isCurrentlyAbove && !isCurrentlyBelow) {\n                    newDirection = 'below';\n                }\n\n                if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {\n                    newDirection = 'above';\n                } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {\n                    newDirection = 'below';\n                }\n\n                if (newDirection == 'above' ||\n                    (isCurrentlyAbove && newDirection !== 'below')) {\n                    css.top = container.top - parentOffset.top - dropdown.height;\n                }\n\n                if (newDirection != null) {\n                    this.$dropdown\n                        .removeClass('select2-dropdown--below select2-dropdown--above')\n                        .addClass('select2-dropdown--' + newDirection);\n                    this.$container\n                        .removeClass('select2-container--below select2-container--above')\n                        .addClass('select2-container--' + newDirection);\n                }\n\n                this.$dropdownContainer.css(css);\n            };\n\n            AttachBody.prototype._resizeDropdown = function () {\n                var css = {\n                    width: this.$container.outerWidth(false) + 'px'\n                };\n\n                if (this.options.get('dropdownAutoWidth')) {\n                    css.minWidth = css.width;\n                    css.position = 'relative';\n                    css.width = 'auto';\n                }\n\n                this.$dropdown.css(css);\n            };\n\n            AttachBody.prototype._showDropdown = function (decorated) {\n                this.$dropdownContainer.appendTo(this.$dropdownParent);\n\n                this._positionDropdown();\n                this._resizeDropdown();\n            };\n\n            return AttachBody;\n        });\n\n        S2.define('select2/dropdown/minimumResultsForSearch',[\n\n        ], function () {\n            function countResults (data) {\n                var count = 0;\n\n                for (var d = 0; d < data.length; d++) {\n                    var item = data[d];\n\n                    if (item.children) {\n                        count += countResults(item.children);\n                    } else {\n                        count++;\n                    }\n                }\n\n                return count;\n            }\n\n            function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {\n                this.minimumResultsForSearch = options.get('minimumResultsForSearch');\n\n                if (this.minimumResultsForSearch < 0) {\n                    this.minimumResultsForSearch = Infinity;\n                }\n\n                decorated.call(this, $element, options, dataAdapter);\n            }\n\n            MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {\n                if (countResults(params.data.results) < this.minimumResultsForSearch) {\n                    return false;\n                }\n\n                return decorated.call(this, params);\n            };\n\n            return MinimumResultsForSearch;\n        });\n\n        S2.define('select2/dropdown/selectOnClose',[\n            '../utils'\n        ], function (Utils) {\n            function SelectOnClose () { }\n\n            SelectOnClose.prototype.bind = function (decorated, container, $container) {\n                var self = this;\n\n                decorated.call(this, container, $container);\n\n                container.on('close', function (params) {\n                    self._handleSelectOnClose(params);\n                });\n            };\n\n            SelectOnClose.prototype._handleSelectOnClose = function (_, params) {\n                if (params && params.originalSelect2Event != null) {\n                    var event = params.originalSelect2Event;\n\n                    // Don't select an item if the close event was triggered from a select or\n                    // unselect event\n                    if (event._type === 'select' || event._type === 'unselect') {\n                        return;\n                    }\n                }\n\n                var $highlightedResults = this.getHighlightedResults();\n\n                // Only select highlighted results\n                if ($highlightedResults.length < 1) {\n                    return;\n                }\n\n                var data = Utils.GetData($highlightedResults[0], 'data');\n\n                // Don't re-select already selected resulte\n                if (\n                    (data.element != null && data.element.selected) ||\n                    (data.element == null && data.selected)\n                ) {\n                    return;\n                }\n\n                this.trigger('select', {\n                    data: data\n                });\n            };\n\n            return SelectOnClose;\n        });\n\n        S2.define('select2/dropdown/closeOnSelect',[\n\n        ], function () {\n            function CloseOnSelect () { }\n\n            CloseOnSelect.prototype.bind = function (decorated, container, $container) {\n                var self = this;\n\n                decorated.call(this, container, $container);\n\n                container.on('select', function (evt) {\n                    self._selectTriggered(evt);\n                });\n\n                container.on('unselect', function (evt) {\n                    self._selectTriggered(evt);\n                });\n            };\n\n            CloseOnSelect.prototype._selectTriggered = function (_, evt) {\n                var originalEvent = evt.originalEvent;\n\n                // Don't close if the control key is being held\n                if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) {\n                    return;\n                }\n\n                this.trigger('close', {\n                    originalEvent: originalEvent,\n                    originalSelect2Event: evt\n                });\n            };\n\n            return CloseOnSelect;\n        });\n\n        S2.define('select2/i18n/en',[],function () {\n            // English\n            return {\n                errorLoading: function () {\n                    return 'The results could not be loaded.';\n                },\n                inputTooLong: function (args) {\n                    var overChars = args.input.length - args.maximum;\n\n                    var message = 'Please delete ' + overChars + ' character';\n\n                    if (overChars != 1) {\n                        message += 's';\n                    }\n\n                    return message;\n                },\n                inputTooShort: function (args) {\n                    var remainingChars = args.minimum - args.input.length;\n\n                    var message = 'Please enter ' + remainingChars + ' or more characters';\n\n                    return message;\n                },\n                loadingMore: function () {\n                    return 'Loading more results…';\n                },\n                maximumSelected: function (args) {\n                    var message = 'You can only select ' + args.maximum + ' item';\n\n                    if (args.maximum != 1) {\n                        message += 's';\n                    }\n\n                    return message;\n                },\n                noResults: function () {\n                    return 'No results found';\n                },\n                searching: function () {\n                    return 'Searching…';\n                },\n                removeAllItems: function () {\n                    return 'Remove all items';\n                }\n            };\n        });\n\n        S2.define('select2/defaults',[\n            'jquery',\n            'require',\n\n            './results',\n\n            './selection/single',\n            './selection/multiple',\n            './selection/placeholder',\n            './selection/allowClear',\n            './selection/search',\n            './selection/eventRelay',\n\n            './utils',\n            './translation',\n            './diacritics',\n\n            './data/select',\n            './data/array',\n            './data/ajax',\n            './data/tags',\n            './data/tokenizer',\n            './data/minimumInputLength',\n            './data/maximumInputLength',\n            './data/maximumSelectionLength',\n\n            './dropdown',\n            './dropdown/search',\n            './dropdown/hidePlaceholder',\n            './dropdown/infiniteScroll',\n            './dropdown/attachBody',\n            './dropdown/minimumResultsForSearch',\n            './dropdown/selectOnClose',\n            './dropdown/closeOnSelect',\n\n            './i18n/en'\n        ], function ($, require,\n\n                     ResultsList,\n\n                     SingleSelection, MultipleSelection, Placeholder, AllowClear,\n                     SelectionSearch, EventRelay,\n\n                     Utils, Translation, DIACRITICS,\n\n                     SelectData, ArrayData, AjaxData, Tags, Tokenizer,\n                     MinimumInputLength, MaximumInputLength, MaximumSelectionLength,\n\n                     Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,\n                     AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,\n\n                     EnglishTranslation) {\n            function Defaults () {\n                this.reset();\n            }\n\n            Defaults.prototype.apply = function (options) {\n                options = $.extend(true, {}, this.defaults, options);\n\n                if (options.dataAdapter == null) {\n                    if (options.ajax != null) {\n                        options.dataAdapter = AjaxData;\n                    } else if (options.data != null) {\n                        options.dataAdapter = ArrayData;\n                    } else {\n                        options.dataAdapter = SelectData;\n                    }\n\n                    if (options.minimumInputLength > 0) {\n                        options.dataAdapter = Utils.Decorate(\n                            options.dataAdapter,\n                            MinimumInputLength\n                        );\n                    }\n\n                    if (options.maximumInputLength > 0) {\n                        options.dataAdapter = Utils.Decorate(\n                            options.dataAdapter,\n                            MaximumInputLength\n                        );\n                    }\n\n                    if (options.maximumSelectionLength > 0) {\n                        options.dataAdapter = Utils.Decorate(\n                            options.dataAdapter,\n                            MaximumSelectionLength\n                        );\n                    }\n\n                    if (options.tags) {\n                        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);\n                    }\n\n                    if (options.tokenSeparators != null || options.tokenizer != null) {\n                        options.dataAdapter = Utils.Decorate(\n                            options.dataAdapter,\n                            Tokenizer\n                        );\n                    }\n\n                    if (options.query != null) {\n                        var Query = require(options.amdBase + 'compat/query');\n\n                        options.dataAdapter = Utils.Decorate(\n                            options.dataAdapter,\n                            Query\n                        );\n                    }\n\n                    if (options.initSelection != null) {\n                        var InitSelection = require(options.amdBase + 'compat/initSelection');\n\n                        options.dataAdapter = Utils.Decorate(\n                            options.dataAdapter,\n                            InitSelection\n                        );\n                    }\n                }\n\n                if (options.resultsAdapter == null) {\n                    options.resultsAdapter = ResultsList;\n\n                    if (options.ajax != null) {\n                        options.resultsAdapter = Utils.Decorate(\n                            options.resultsAdapter,\n                            InfiniteScroll\n                        );\n                    }\n\n                    if (options.placeholder != null) {\n                        options.resultsAdapter = Utils.Decorate(\n                            options.resultsAdapter,\n                            HidePlaceholder\n                        );\n                    }\n\n                    if (options.selectOnClose) {\n                        options.resultsAdapter = Utils.Decorate(\n                            options.resultsAdapter,\n                            SelectOnClose\n                        );\n                    }\n                }\n\n                if (options.dropdownAdapter == null) {\n                    if (options.multiple) {\n                        options.dropdownAdapter = Dropdown;\n                    } else {\n                        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);\n\n                        options.dropdownAdapter = SearchableDropdown;\n                    }\n\n                    if (options.minimumResultsForSearch !== 0) {\n                        options.dropdownAdapter = Utils.Decorate(\n                            options.dropdownAdapter,\n                            MinimumResultsForSearch\n                        );\n                    }\n\n                    if (options.closeOnSelect) {\n                        options.dropdownAdapter = Utils.Decorate(\n                            options.dropdownAdapter,\n                            CloseOnSelect\n                        );\n                    }\n\n                    if (\n                        options.dropdownCssClass != null ||\n                        options.dropdownCss != null ||\n                        options.adaptDropdownCssClass != null\n                    ) {\n                        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');\n\n                        options.dropdownAdapter = Utils.Decorate(\n                            options.dropdownAdapter,\n                            DropdownCSS\n                        );\n                    }\n\n                    options.dropdownAdapter = Utils.Decorate(\n                        options.dropdownAdapter,\n                        AttachBody\n                    );\n                }\n\n                if (options.selectionAdapter == null) {\n                    if (options.multiple) {\n                        options.selectionAdapter = MultipleSelection;\n                    } else {\n                        options.selectionAdapter = SingleSelection;\n                    }\n\n                    // Add the placeholder mixin if a placeholder was specified\n                    if (options.placeholder != null) {\n                        options.selectionAdapter = Utils.Decorate(\n                            options.selectionAdapter,\n                            Placeholder\n                        );\n                    }\n\n                    if (options.allowClear) {\n                        options.selectionAdapter = Utils.Decorate(\n                            options.selectionAdapter,\n                            AllowClear\n                        );\n                    }\n\n                    if (options.multiple) {\n                        options.selectionAdapter = Utils.Decorate(\n                            options.selectionAdapter,\n                            SelectionSearch\n                        );\n                    }\n\n                    if (\n                        options.containerCssClass != null ||\n                        options.containerCss != null ||\n                        options.adaptContainerCssClass != null\n                    ) {\n                        var ContainerCSS = require(options.amdBase + 'compat/containerCss');\n\n                        options.selectionAdapter = Utils.Decorate(\n                            options.selectionAdapter,\n                            ContainerCSS\n                        );\n                    }\n\n                    options.selectionAdapter = Utils.Decorate(\n                        options.selectionAdapter,\n                        EventRelay\n                    );\n                }\n\n                // If the defaults were not previously applied from an element, it is\n                // possible for the language option to have not been resolved\n                options.language = this._resolveLanguage(options.language);\n\n                // Always fall back to English since it will always be complete\n                options.language.push('en');\n\n                var uniqueLanguages = [];\n\n                for (var l = 0; l < options.language.length; l++) {\n                    var language = options.language[l];\n\n                    if (uniqueLanguages.indexOf(language) === -1) {\n                        uniqueLanguages.push(language);\n                    }\n                }\n\n                options.language = uniqueLanguages;\n\n                options.translations = this._processTranslations(\n                    options.language,\n                    options.debug\n                );\n\n                return options;\n            };\n\n            Defaults.prototype.reset = function () {\n                function stripDiacritics (text) {\n                    // Used 'uni range + named function' from http://jsperf.com/diacritics/18\n                    function match(a) {\n                        return DIACRITICS[a] || a;\n                    }\n\n                    return text.replace(/[^\\u0000-\\u007E]/g, match);\n                }\n\n                function matcher (params, data) {\n                    // Always return the object if there is nothing to compare\n                    if ($.trim(params.term) === '') {\n                        return data;\n                    }\n\n                    // Do a recursive check for options with children\n                    if (data.children && data.children.length > 0) {\n                        // Clone the data object if there are children\n                        // This is required as we modify the object to remove any non-matches\n                        var match = $.extend(true, {}, data);\n\n                        // Check each child of the option\n                        for (var c = data.children.length - 1; c >= 0; c--) {\n                            var child = data.children[c];\n\n                            var matches = matcher(params, child);\n\n                            // If there wasn't a match, remove the object in the array\n                            if (matches == null) {\n                                match.children.splice(c, 1);\n                            }\n                        }\n\n                        // If any children matched, return the new object\n                        if (match.children.length > 0) {\n                            return match;\n                        }\n\n                        // If there were no matching children, check just the plain object\n                        return matcher(params, match);\n                    }\n\n                    var original = stripDiacritics(data.text).toUpperCase();\n                    var term = stripDiacritics(params.term).toUpperCase();\n\n                    // Check if the text contains the term\n                    if (original.indexOf(term) > -1) {\n                        return data;\n                    }\n\n                    // If it doesn't contain the term, don't return anything\n                    return null;\n                }\n\n                this.defaults = {\n                    amdBase: './',\n                    amdLanguageBase: './i18n/',\n                    closeOnSelect: true,\n                    debug: false,\n                    dropdownAutoWidth: false,\n                    escapeMarkup: Utils.escapeMarkup,\n                    language: {},\n                    matcher: matcher,\n                    minimumInputLength: 0,\n                    maximumInputLength: 0,\n                    maximumSelectionLength: 0,\n                    minimumResultsForSearch: 0,\n                    selectOnClose: false,\n                    scrollAfterSelect: false,\n                    sorter: function (data) {\n                        return data;\n                    },\n                    templateResult: function (result) {\n                        return result.text;\n                    },\n                    templateSelection: function (selection) {\n                        return selection.text;\n                    },\n                    theme: 'default',\n                    width: 'resolve'\n                };\n            };\n\n            Defaults.prototype.applyFromElement = function (options, $element) {\n                var optionLanguage = options.language;\n                var defaultLanguage = this.defaults.language;\n                var elementLanguage = $element.prop('lang');\n                var parentLanguage = $element.closest('[lang]').prop('lang');\n\n                var languages = Array.prototype.concat.call(\n                    this._resolveLanguage(elementLanguage),\n                    this._resolveLanguage(optionLanguage),\n                    this._resolveLanguage(defaultLanguage),\n                    this._resolveLanguage(parentLanguage)\n                );\n\n                options.language = languages;\n\n                return options;\n            };\n\n            Defaults.prototype._resolveLanguage = function (language) {\n                if (!language) {\n                    return [];\n                }\n\n                if ($.isEmptyObject(language)) {\n                    return [];\n                }\n\n                if ($.isPlainObject(language)) {\n                    return [language];\n                }\n\n                var languages;\n\n                if (!$.isArray(language)) {\n                    languages = [language];\n                } else {\n                    languages = language;\n                }\n\n                var resolvedLanguages = [];\n\n                for (var l = 0; l < languages.length; l++) {\n                    resolvedLanguages.push(languages[l]);\n\n                    if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) {\n                        // Extract the region information if it is included\n                        var languageParts = languages[l].split('-');\n                        var baseLanguage = languageParts[0];\n\n                        resolvedLanguages.push(baseLanguage);\n                    }\n                }\n\n                return resolvedLanguages;\n            };\n\n            Defaults.prototype._processTranslations = function (languages, debug) {\n                var translations = new Translation();\n\n                for (var l = 0; l < languages.length; l++) {\n                    var languageData = new Translation();\n\n                    var language = languages[l];\n\n                    if (typeof language === 'string') {\n                        try {\n                            // Try to load it with the original name\n                            languageData = Translation.loadPath(language);\n                        } catch (e) {\n                            try {\n                                // If we couldn't load it, check if it wasn't the full path\n                                language = this.defaults.amdLanguageBase + language;\n                                languageData = Translation.loadPath(language);\n                            } catch (ex) {\n                                // The translation could not be loaded at all. Sometimes this is\n                                // because of a configuration problem, other times this can be\n                                // because of how Select2 helps load all possible translation files\n                                if (debug && window.console && console.warn) {\n                                    console.warn(\n                                        'Select2: The language file for \"' + language + '\" could ' +\n                                        'not be automatically loaded. A fallback will be used instead.'\n                                    );\n                                }\n                            }\n                        }\n                    } else if ($.isPlainObject(language)) {\n                        languageData = new Translation(language);\n                    } else {\n                        languageData = language;\n                    }\n\n                    translations.extend(languageData);\n                }\n\n                return translations;\n            };\n\n            Defaults.prototype.set = function (key, value) {\n                var camelKey = $.camelCase(key);\n\n                var data = {};\n                data[camelKey] = value;\n\n                var convertedData = Utils._convertData(data);\n\n                $.extend(true, this.defaults, convertedData);\n            };\n\n            var defaults = new Defaults();\n\n            return defaults;\n        });\n\n        S2.define('select2/options',[\n            'require',\n            'jquery',\n            './defaults',\n            './utils'\n        ], function (require, $, Defaults, Utils) {\n            function Options (options, $element) {\n                this.options = options;\n\n                if ($element != null) {\n                    this.fromElement($element);\n                }\n\n                if ($element != null) {\n                    this.options = Defaults.applyFromElement(this.options, $element);\n                }\n\n                this.options = Defaults.apply(this.options);\n\n                if ($element && $element.is('input')) {\n                    var InputCompat = require(this.get('amdBase') + 'compat/inputData');\n\n                    this.options.dataAdapter = Utils.Decorate(\n                        this.options.dataAdapter,\n                        InputCompat\n                    );\n                }\n            }\n\n            Options.prototype.fromElement = function ($e) {\n                var excludedData = ['select2'];\n\n                if (this.options.multiple == null) {\n                    this.options.multiple = $e.prop('multiple');\n                }\n\n                if (this.options.disabled == null) {\n                    this.options.disabled = $e.prop('disabled');\n                }\n\n                if (this.options.dir == null) {\n                    if ($e.prop('dir')) {\n                        this.options.dir = $e.prop('dir');\n                    } else if ($e.closest('[dir]').prop('dir')) {\n                        this.options.dir = $e.closest('[dir]').prop('dir');\n                    } else {\n                        this.options.dir = 'ltr';\n                    }\n                }\n\n                $e.prop('disabled', this.options.disabled);\n                $e.prop('multiple', this.options.multiple);\n\n                if (Utils.GetData($e[0], 'select2Tags')) {\n                    if (this.options.debug && window.console && console.warn) {\n                        console.warn(\n                            'Select2: The `data-select2-tags` attribute has been changed to ' +\n                            'use the `data-data` and `data-tags=\"true\"` attributes and will be ' +\n                            'removed in future versions of Select2.'\n                        );\n                    }\n\n                    Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));\n                    Utils.StoreData($e[0], 'tags', true);\n                }\n\n                if (Utils.GetData($e[0], 'ajaxUrl')) {\n                    if (this.options.debug && window.console && console.warn) {\n                        console.warn(\n                            'Select2: The `data-ajax-url` attribute has been changed to ' +\n                            '`data-ajax--url` and support for the old attribute will be removed' +\n                            ' in future versions of Select2.'\n                        );\n                    }\n\n                    $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));\n                    Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl'));\n                }\n\n                var dataset = {};\n\n                function upperCaseLetter(_, letter) {\n                    return letter.toUpperCase();\n                }\n\n                // Pre-load all of the attributes which are prefixed with `data-`\n                for (var attr = 0; attr < $e[0].attributes.length; attr++) {\n                    var attributeName = $e[0].attributes[attr].name;\n                    var prefix = 'data-';\n\n                    if (attributeName.substr(0, prefix.length) == prefix) {\n                        // Get the contents of the attribute after `data-`\n                        var dataName = attributeName.substring(prefix.length);\n\n                        // Get the data contents from the consistent source\n                        // This is more than likely the jQuery data helper\n                        var dataValue = Utils.GetData($e[0], dataName);\n\n                        // camelCase the attribute name to match the spec\n                        var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter);\n\n                        // Store the data attribute contents into the dataset since\n                        dataset[camelDataName] = dataValue;\n                    }\n                }\n\n                // Prefer the element's `dataset` attribute if it exists\n                // jQuery 1.x does not correctly handle data attributes with multiple dashes\n                if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {\n                    dataset = $.extend(true, {}, $e[0].dataset, dataset);\n                }\n\n                // Prefer our internal data cache if it exists\n                var data = $.extend(true, {}, Utils.GetData($e[0]), dataset);\n\n                data = Utils._convertData(data);\n\n                for (var key in data) {\n                    if ($.inArray(key, excludedData) > -1) {\n                        continue;\n                    }\n\n                    if ($.isPlainObject(this.options[key])) {\n                        $.extend(this.options[key], data[key]);\n                    } else {\n                        this.options[key] = data[key];\n                    }\n                }\n\n                return this;\n            };\n\n            Options.prototype.get = function (key) {\n                return this.options[key];\n            };\n\n            Options.prototype.set = function (key, val) {\n                this.options[key] = val;\n            };\n\n            return Options;\n        });\n\n        S2.define('select2/core',[\n            'jquery',\n            './options',\n            './utils',\n            './keys'\n        ], function ($, Options, Utils, KEYS) {\n            var Select2 = function ($element, options) {\n                if (Utils.GetData($element[0], 'select2') != null) {\n                    Utils.GetData($element[0], 'select2').destroy();\n                }\n\n                this.$element = $element;\n\n                this.id = this._generateId($element);\n\n                options = options || {};\n\n                this.options = new Options(options, $element);\n\n                Select2.__super__.constructor.call(this);\n\n                // Set up the tabindex\n\n                var tabindex = $element.attr('tabindex') || 0;\n                Utils.StoreData($element[0], 'old-tabindex', tabindex);\n                $element.attr('tabindex', '-1');\n\n                // Set up containers and adapters\n\n                var DataAdapter = this.options.get('dataAdapter');\n                this.dataAdapter = new DataAdapter($element, this.options);\n\n                var $container = this.render();\n\n                this._placeContainer($container);\n\n                var SelectionAdapter = this.options.get('selectionAdapter');\n                this.selection = new SelectionAdapter($element, this.options);\n                this.$selection = this.selection.render();\n\n                this.selection.position(this.$selection, $container);\n\n                var DropdownAdapter = this.options.get('dropdownAdapter');\n                this.dropdown = new DropdownAdapter($element, this.options);\n                this.$dropdown = this.dropdown.render();\n\n                this.dropdown.position(this.$dropdown, $container);\n\n                var ResultsAdapter = this.options.get('resultsAdapter');\n                this.results = new ResultsAdapter($element, this.options, this.dataAdapter);\n                this.$results = this.results.render();\n\n                this.results.position(this.$results, this.$dropdown);\n\n                // Bind events\n\n                var self = this;\n\n                // Bind the container to all of the adapters\n                this._bindAdapters();\n\n                // Register any DOM event handlers\n                this._registerDomEvents();\n\n                // Register any internal event handlers\n                this._registerDataEvents();\n                this._registerSelectionEvents();\n                this._registerDropdownEvents();\n                this._registerResultsEvents();\n                this._registerEvents();\n\n                // Set the initial state\n                this.dataAdapter.current(function (initialData) {\n                    self.trigger('selection:update', {\n                        data: initialData\n                    });\n                });\n\n                // Hide the original select\n                $element.addClass('select2-hidden-accessible');\n                $element.attr('aria-hidden', 'true');\n\n                // Synchronize any monitored attributes\n                this._syncAttributes();\n\n                Utils.StoreData($element[0], 'select2', this);\n\n                // Ensure backwards compatibility with $element.data('select2').\n                $element.data('select2', this);\n            };\n\n            Utils.Extend(Select2, Utils.Observable);\n\n            Select2.prototype._generateId = function ($element) {\n                var id = '';\n\n                if ($element.attr('id') != null) {\n                    id = $element.attr('id');\n                } else if ($element.attr('name') != null) {\n                    id = $element.attr('name') + '-' + Utils.generateChars(2);\n                } else {\n                    id = Utils.generateChars(4);\n                }\n\n                id = id.replace(/(:|\\.|\\[|\\]|,)/g, '');\n                id = 'select2-' + id;\n\n                return id;\n            };\n\n            Select2.prototype._placeContainer = function ($container) {\n                $container.insertAfter(this.$element);\n\n                var width = this._resolveWidth(this.$element, this.options.get('width'));\n\n                if (width != null) {\n                    $container.css('width', width);\n                }\n            };\n\n            Select2.prototype._resolveWidth = function ($element, method) {\n                var WIDTH = /^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;\n\n                if (method == 'resolve') {\n                    var styleWidth = this._resolveWidth($element, 'style');\n\n                    if (styleWidth != null) {\n                        return styleWidth;\n                    }\n\n                    return this._resolveWidth($element, 'element');\n                }\n\n                if (method == 'element') {\n                    var elementWidth = $element.outerWidth(false);\n\n                    if (elementWidth <= 0) {\n                        return 'auto';\n                    }\n\n                    return elementWidth + 'px';\n                }\n\n                if (method == 'style') {\n                    var style = $element.attr('style');\n\n                    if (typeof(style) !== 'string') {\n                        return null;\n                    }\n\n                    var attrs = style.split(';');\n\n                    for (var i = 0, l = attrs.length; i < l; i = i + 1) {\n                        var attr = attrs[i].replace(/\\s/g, '');\n                        var matches = attr.match(WIDTH);\n\n                        if (matches !== null && matches.length >= 1) {\n                            return matches[1];\n                        }\n                    }\n\n                    return null;\n                }\n\n                if (method == 'computedstyle') {\n                    var computedStyle = window.getComputedStyle($element[0]);\n\n                    return computedStyle.width;\n                }\n\n                return method;\n            };\n\n            Select2.prototype._bindAdapters = function () {\n                this.dataAdapter.bind(this, this.$container);\n                this.selection.bind(this, this.$container);\n\n                this.dropdown.bind(this, this.$container);\n                this.results.bind(this, this.$container);\n            };\n\n            Select2.prototype._registerDomEvents = function () {\n                var self = this;\n\n                this.$element.on('change.select2', function () {\n                    self.dataAdapter.current(function (data) {\n                        self.trigger('selection:update', {\n                            data: data\n                        });\n                    });\n                });\n\n                this.$element.on('focus.select2', function (evt) {\n                    self.trigger('focus', evt);\n                });\n\n                this._syncA = Utils.bind(this._syncAttributes, this);\n                this._syncS = Utils.bind(this._syncSubtree, this);\n\n                if (this.$element[0].attachEvent) {\n                    this.$element[0].attachEvent('onpropertychange', this._syncA);\n                }\n\n                var observer = window.MutationObserver ||\n                    window.WebKitMutationObserver ||\n                    window.MozMutationObserver\n                ;\n\n                if (observer != null) {\n                    this._observer = new observer(function (mutations) {\n                        self._syncA();\n                        self._syncS(null, mutations);\n                    });\n                    this._observer.observe(this.$element[0], {\n                        attributes: true,\n                        childList: true,\n                        subtree: false\n                    });\n                } else if (this.$element[0].addEventListener) {\n                    this.$element[0].addEventListener(\n                        'DOMAttrModified',\n                        self._syncA,\n                        false\n                    );\n                    this.$element[0].addEventListener(\n                        'DOMNodeInserted',\n                        self._syncS,\n                        false\n                    );\n                    this.$element[0].addEventListener(\n                        'DOMNodeRemoved',\n                        self._syncS,\n                        false\n                    );\n                }\n            };\n\n            Select2.prototype._registerDataEvents = function () {\n                var self = this;\n\n                this.dataAdapter.on('*', function (name, params) {\n                    self.trigger(name, params);\n                });\n            };\n\n            Select2.prototype._registerSelectionEvents = function () {\n                var self = this;\n                var nonRelayEvents = ['toggle', 'focus'];\n\n                this.selection.on('toggle', function () {\n                    self.toggleDropdown();\n                });\n\n                this.selection.on('focus', function (params) {\n                    self.focus(params);\n                });\n\n                this.selection.on('*', function (name, params) {\n                    if ($.inArray(name, nonRelayEvents) !== -1) {\n                        return;\n                    }\n\n                    self.trigger(name, params);\n                });\n            };\n\n            Select2.prototype._registerDropdownEvents = function () {\n                var self = this;\n\n                this.dropdown.on('*', function (name, params) {\n                    self.trigger(name, params);\n                });\n            };\n\n            Select2.prototype._registerResultsEvents = function () {\n                var self = this;\n\n                this.results.on('*', function (name, params) {\n                    self.trigger(name, params);\n                });\n            };\n\n            Select2.prototype._registerEvents = function () {\n                var self = this;\n\n                this.on('open', function () {\n                    self.$container.addClass('select2-container--open');\n                });\n\n                this.on('close', function () {\n                    self.$container.removeClass('select2-container--open');\n                });\n\n                this.on('enable', function () {\n                    self.$container.removeClass('select2-container--disabled');\n                });\n\n                this.on('disable', function () {\n                    self.$container.addClass('select2-container--disabled');\n                });\n\n                this.on('blur', function () {\n                    self.$container.removeClass('select2-container--focus');\n                });\n\n                this.on('query', function (params) {\n                    if (!self.isOpen()) {\n                        self.trigger('open', {});\n                    }\n\n                    this.dataAdapter.query(params, function (data) {\n                        self.trigger('results:all', {\n                            data: data,\n                            query: params\n                        });\n                    });\n                });\n\n                this.on('query:append', function (params) {\n                    this.dataAdapter.query(params, function (data) {\n                        self.trigger('results:append', {\n                            data: data,\n                            query: params\n                        });\n                    });\n                });\n\n                this.on('keypress', function (evt) {\n                    var key = evt.which;\n\n                    if (self.isOpen()) {\n                        if (key === KEYS.ESC || key === KEYS.TAB ||\n                            (key === KEYS.UP && evt.altKey)) {\n                            self.close(evt);\n\n                            evt.preventDefault();\n                        } else if (key === KEYS.ENTER) {\n                            self.trigger('results:select', {});\n\n                            evt.preventDefault();\n                        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {\n                            self.trigger('results:toggle', {});\n\n                            evt.preventDefault();\n                        } else if (key === KEYS.UP) {\n                            self.trigger('results:previous', {});\n\n                            evt.preventDefault();\n                        } else if (key === KEYS.DOWN) {\n                            self.trigger('results:next', {});\n\n                            evt.preventDefault();\n                        }\n                    } else {\n                        if (key === KEYS.ENTER || key === KEYS.SPACE ||\n                            (key === KEYS.DOWN && evt.altKey)) {\n                            self.open();\n\n                            evt.preventDefault();\n                        }\n                    }\n                });\n            };\n\n            Select2.prototype._syncAttributes = function () {\n                this.options.set('disabled', this.$element.prop('disabled'));\n\n                if (this.isDisabled()) {\n                    if (this.isOpen()) {\n                        this.close();\n                    }\n\n                    this.trigger('disable', {});\n                } else {\n                    this.trigger('enable', {});\n                }\n            };\n\n            Select2.prototype._isChangeMutation = function (evt, mutations) {\n                var changed = false;\n                var self = this;\n\n                // Ignore any mutation events raised for elements that aren't options or\n                // optgroups. This handles the case when the select element is destroyed\n                if (\n                    evt && evt.target && (\n                        evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'\n                    )\n                ) {\n                    return;\n                }\n\n                if (!mutations) {\n                    // If mutation events aren't supported, then we can only assume that the\n                    // change affected the selections\n                    changed = true;\n                } else if (mutations.addedNodes && mutations.addedNodes.length > 0) {\n                    for (var n = 0; n < mutations.addedNodes.length; n++) {\n                        var node = mutations.addedNodes[n];\n\n                        if (node.selected) {\n                            changed = true;\n                        }\n                    }\n                } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {\n                    changed = true;\n                } else if ($.isArray(mutations)) {\n                    $.each(mutations, function(evt, mutation) {\n                        if (self._isChangeMutation(evt, mutation)) {\n                            // We've found a change mutation.\n                            // Let's escape from the loop and continue\n                            changed = true;\n                            return false;\n                        }\n                    });\n                }\n                return changed;\n            };\n\n            Select2.prototype._syncSubtree = function (evt, mutations) {\n                var changed = this._isChangeMutation(evt, mutations);\n                var self = this;\n\n                // Only re-pull the data if we think there is a change\n                if (changed) {\n                    this.dataAdapter.current(function (currentData) {\n                        self.trigger('selection:update', {\n                            data: currentData\n                        });\n                    });\n                }\n            };\n\n            /**\n             * Override the trigger method to automatically trigger pre-events when\n             * there are events that can be prevented.\n             */\n            Select2.prototype.trigger = function (name, args) {\n                var actualTrigger = Select2.__super__.trigger;\n                var preTriggerMap = {\n                    'open': 'opening',\n                    'close': 'closing',\n                    'select': 'selecting',\n                    'unselect': 'unselecting',\n                    'clear': 'clearing'\n                };\n\n                if (args === undefined) {\n                    args = {};\n                }\n\n                if (name in preTriggerMap) {\n                    var preTriggerName = preTriggerMap[name];\n                    var preTriggerArgs = {\n                        prevented: false,\n                        name: name,\n                        args: args\n                    };\n\n                    actualTrigger.call(this, preTriggerName, preTriggerArgs);\n\n                    if (preTriggerArgs.prevented) {\n                        args.prevented = true;\n\n                        return;\n                    }\n                }\n\n                actualTrigger.call(this, name, args);\n            };\n\n            Select2.prototype.toggleDropdown = function () {\n                if (this.isDisabled()) {\n                    return;\n                }\n\n                if (this.isOpen()) {\n                    this.close();\n                } else {\n                    this.open();\n                }\n            };\n\n            Select2.prototype.open = function () {\n                if (this.isOpen()) {\n                    return;\n                }\n\n                if (this.isDisabled()) {\n                    return;\n                }\n\n                this.trigger('query', {});\n            };\n\n            Select2.prototype.close = function (evt) {\n                if (!this.isOpen()) {\n                    return;\n                }\n\n                this.trigger('close', { originalEvent : evt });\n            };\n\n            /**\n             * Helper method to abstract the \"enabled\" (not \"disabled\") state of this\n             * object.\n             *\n             * @return {true} if the instance is not disabled.\n             * @return {false} if the instance is disabled.\n             */\n            Select2.prototype.isEnabled = function () {\n                return !this.isDisabled();\n            };\n\n            /**\n             * Helper method to abstract the \"disabled\" state of this object.\n             *\n             * @return {true} if the disabled option is true.\n             * @return {false} if the disabled option is false.\n             */\n            Select2.prototype.isDisabled = function () {\n                return this.options.get('disabled');\n            };\n\n            Select2.prototype.isOpen = function () {\n                return this.$container.hasClass('select2-container--open');\n            };\n\n            Select2.prototype.hasFocus = function () {\n                return this.$container.hasClass('select2-container--focus');\n            };\n\n            Select2.prototype.focus = function (data) {\n                // No need to re-trigger focus events if we are already focused\n                if (this.hasFocus()) {\n                    return;\n                }\n\n                this.$container.addClass('select2-container--focus');\n                this.trigger('focus', {});\n            };\n\n            Select2.prototype.enable = function (args) {\n                if (this.options.get('debug') && window.console && console.warn) {\n                    console.warn(\n                        'Select2: The `select2(\"enable\")` method has been deprecated and will' +\n                        ' be removed in later Select2 versions. Use $element.prop(\"disabled\")' +\n                        ' instead.'\n                    );\n                }\n\n                if (args == null || args.length === 0) {\n                    args = [true];\n                }\n\n                var disabled = !args[0];\n\n                this.$element.prop('disabled', disabled);\n            };\n\n            Select2.prototype.data = function () {\n                if (this.options.get('debug') &&\n                    arguments.length > 0 && window.console && console.warn) {\n                    console.warn(\n                        'Select2: Data can no longer be set using `select2(\"data\")`. You ' +\n                        'should consider setting the value instead using `$element.val()`.'\n                    );\n                }\n\n                var data = [];\n\n                this.dataAdapter.current(function (currentData) {\n                    data = currentData;\n                });\n\n                return data;\n            };\n\n            Select2.prototype.val = function (args) {\n                if (this.options.get('debug') && window.console && console.warn) {\n                    console.warn(\n                        'Select2: The `select2(\"val\")` method has been deprecated and will be' +\n                        ' removed in later Select2 versions. Use $element.val() instead.'\n                    );\n                }\n\n                if (args == null || args.length === 0) {\n                    return this.$element.val();\n                }\n\n                var newVal = args[0];\n\n                if ($.isArray(newVal)) {\n                    newVal = $.map(newVal, function (obj) {\n                        return obj.toString();\n                    });\n                }\n\n                this.$element.val(newVal).trigger('input').trigger('change');\n            };\n\n            Select2.prototype.destroy = function () {\n                this.$container.remove();\n\n                if (this.$element[0].detachEvent) {\n                    this.$element[0].detachEvent('onpropertychange', this._syncA);\n                }\n\n                if (this._observer != null) {\n                    this._observer.disconnect();\n                    this._observer = null;\n                } else if (this.$element[0].removeEventListener) {\n                    this.$element[0]\n                        .removeEventListener('DOMAttrModified', this._syncA, false);\n                    this.$element[0]\n                        .removeEventListener('DOMNodeInserted', this._syncS, false);\n                    this.$element[0]\n                        .removeEventListener('DOMNodeRemoved', this._syncS, false);\n                }\n\n                this._syncA = null;\n                this._syncS = null;\n\n                this.$element.off('.select2');\n                this.$element.attr('tabindex',\n                    Utils.GetData(this.$element[0], 'old-tabindex'));\n\n                this.$element.removeClass('select2-hidden-accessible');\n                this.$element.attr('aria-hidden', 'false');\n                Utils.RemoveData(this.$element[0]);\n                this.$element.removeData('select2');\n\n                this.dataAdapter.destroy();\n                this.selection.destroy();\n                this.dropdown.destroy();\n                this.results.destroy();\n\n                this.dataAdapter = null;\n                this.selection = null;\n                this.dropdown = null;\n                this.results = null;\n            };\n\n            Select2.prototype.render = function () {\n                var $container = $(\n                    '<span class=\"select2 select2-container\">' +\n                    '<span class=\"selection\"></span>' +\n                    '<span class=\"dropdown-wrapper\" aria-hidden=\"true\"></span>' +\n                    '</span>'\n                );\n\n                $container.attr('dir', this.options.get('dir'));\n\n                this.$container = $container;\n\n                this.$container.addClass('select2-container--' + this.options.get('theme'));\n\n                Utils.StoreData($container[0], 'element', this.$element);\n\n                return $container;\n            };\n\n            return Select2;\n        });\n\n        S2.define('select2/compat/utils',[\n            'jquery'\n        ], function ($) {\n            function syncCssClasses ($dest, $src, adapter) {\n                var classes, replacements = [], adapted;\n\n                classes = $.trim($dest.attr('class'));\n\n                if (classes) {\n                    classes = '' + classes; // for IE which returns object\n\n                    $(classes.split(/\\s+/)).each(function () {\n                        // Save all Select2 classes\n                        if (this.indexOf('select2-') === 0) {\n                            replacements.push(this);\n                        }\n                    });\n                }\n\n                classes = $.trim($src.attr('class'));\n\n                if (classes) {\n                    classes = '' + classes; // for IE which returns object\n\n                    $(classes.split(/\\s+/)).each(function () {\n                        // Only adapt non-Select2 classes\n                        if (this.indexOf('select2-') !== 0) {\n                            adapted = adapter(this);\n\n                            if (adapted != null) {\n                                replacements.push(adapted);\n                            }\n                        }\n                    });\n                }\n\n                $dest.attr('class', replacements.join(' '));\n            }\n\n            return {\n                syncCssClasses: syncCssClasses\n            };\n        });\n\n        S2.define('select2/compat/containerCss',[\n            'jquery',\n            './utils'\n        ], function ($, CompatUtils) {\n            // No-op CSS adapter that discards all classes by default\n            function _containerAdapter (clazz) {\n                return null;\n            }\n\n            function ContainerCSS () { }\n\n            ContainerCSS.prototype.render = function (decorated) {\n                var $container = decorated.call(this);\n\n                var containerCssClass = this.options.get('containerCssClass') || '';\n\n                if ($.isFunction(containerCssClass)) {\n                    containerCssClass = containerCssClass(this.$element);\n                }\n\n                var containerCssAdapter = this.options.get('adaptContainerCssClass');\n                containerCssAdapter = containerCssAdapter || _containerAdapter;\n\n                if (containerCssClass.indexOf(':all:') !== -1) {\n                    containerCssClass = containerCssClass.replace(':all:', '');\n\n                    var _cssAdapter = containerCssAdapter;\n\n                    containerCssAdapter = function (clazz) {\n                        var adapted = _cssAdapter(clazz);\n\n                        if (adapted != null) {\n                            // Append the old one along with the adapted one\n                            return adapted + ' ' + clazz;\n                        }\n\n                        return clazz;\n                    };\n                }\n\n                var containerCss = this.options.get('containerCss') || {};\n\n                if ($.isFunction(containerCss)) {\n                    containerCss = containerCss(this.$element);\n                }\n\n                CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter);\n\n                $container.css(containerCss);\n                $container.addClass(containerCssClass);\n\n                return $container;\n            };\n\n            return ContainerCSS;\n        });\n\n        S2.define('select2/compat/dropdownCss',[\n            'jquery',\n            './utils'\n        ], function ($, CompatUtils) {\n            // No-op CSS adapter that discards all classes by default\n            function _dropdownAdapter (clazz) {\n                return null;\n            }\n\n            function DropdownCSS () { }\n\n            DropdownCSS.prototype.render = function (decorated) {\n                var $dropdown = decorated.call(this);\n\n                var dropdownCssClass = this.options.get('dropdownCssClass') || '';\n\n                if ($.isFunction(dropdownCssClass)) {\n                    dropdownCssClass = dropdownCssClass(this.$element);\n                }\n\n                var dropdownCssAdapter = this.options.get('adaptDropdownCssClass');\n                dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter;\n\n                if (dropdownCssClass.indexOf(':all:') !== -1) {\n                    dropdownCssClass = dropdownCssClass.replace(':all:', '');\n\n                    var _cssAdapter = dropdownCssAdapter;\n\n                    dropdownCssAdapter = function (clazz) {\n                        var adapted = _cssAdapter(clazz);\n\n                        if (adapted != null) {\n                            // Append the old one along with the adapted one\n                            return adapted + ' ' + clazz;\n                        }\n\n                        return clazz;\n                    };\n                }\n\n                var dropdownCss = this.options.get('dropdownCss') || {};\n\n                if ($.isFunction(dropdownCss)) {\n                    dropdownCss = dropdownCss(this.$element);\n                }\n\n                CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter);\n\n                $dropdown.css(dropdownCss);\n                $dropdown.addClass(dropdownCssClass);\n\n                return $dropdown;\n            };\n\n            return DropdownCSS;\n        });\n\n        S2.define('select2/compat/initSelection',[\n            'jquery'\n        ], function ($) {\n            function InitSelection (decorated, $element, options) {\n                if (options.get('debug') && window.console && console.warn) {\n                    console.warn(\n                        'Select2: The `initSelection` option has been deprecated in favor' +\n                        ' of a custom data adapter that overrides the `current` method. ' +\n                        'This method is now called multiple times instead of a single ' +\n                        'time when the instance is initialized. Support will be removed ' +\n                        'for the `initSelection` option in future versions of Select2'\n                    );\n                }\n\n                this.initSelection = options.get('initSelection');\n                this._isInitialized = false;\n\n                decorated.call(this, $element, options);\n            }\n\n            InitSelection.prototype.current = function (decorated, callback) {\n                var self = this;\n\n                if (this._isInitialized) {\n                    decorated.call(this, callback);\n\n                    return;\n                }\n\n                this.initSelection.call(null, this.$element, function (data) {\n                    self._isInitialized = true;\n\n                    if (!$.isArray(data)) {\n                        data = [data];\n                    }\n\n                    callback(data);\n                });\n            };\n\n            return InitSelection;\n        });\n\n        S2.define('select2/compat/inputData',[\n            'jquery',\n            '../utils'\n        ], function ($, Utils) {\n            function InputData (decorated, $element, options) {\n                this._currentData = [];\n                this._valueSeparator = options.get('valueSeparator') || ',';\n\n                if ($element.prop('type') === 'hidden') {\n                    if (options.get('debug') && console && console.warn) {\n                        console.warn(\n                            'Select2: Using a hidden input with Select2 is no longer ' +\n                            'supported and may stop working in the future. It is recommended ' +\n                            'to use a `<select>` element instead.'\n                        );\n                    }\n                }\n\n                decorated.call(this, $element, options);\n            }\n\n            InputData.prototype.current = function (_, callback) {\n                function getSelected (data, selectedIds) {\n                    var selected = [];\n\n                    if (data.selected || $.inArray(data.id, selectedIds) !== -1) {\n                        data.selected = true;\n                        selected.push(data);\n                    } else {\n                        data.selected = false;\n                    }\n\n                    if (data.children) {\n                        selected.push.apply(selected, getSelected(data.children, selectedIds));\n                    }\n\n                    return selected;\n                }\n\n                var selected = [];\n\n                for (var d = 0; d < this._currentData.length; d++) {\n                    var data = this._currentData[d];\n\n                    selected.push.apply(\n                        selected,\n                        getSelected(\n                            data,\n                            this.$element.val().split(\n                                this._valueSeparator\n                            )\n                        )\n                    );\n                }\n\n                callback(selected);\n            };\n\n            InputData.prototype.select = function (_, data) {\n                if (!this.options.get('multiple')) {\n                    this.current(function (allData) {\n                        $.map(allData, function (data) {\n                            data.selected = false;\n                        });\n                    });\n\n                    this.$element.val(data.id);\n                    this.$element.trigger('input').trigger('change');\n                } else {\n                    var value = this.$element.val();\n                    value += this._valueSeparator + data.id;\n\n                    this.$element.val(value);\n                    this.$element.trigger('input').trigger('change');\n                }\n            };\n\n            InputData.prototype.unselect = function (_, data) {\n                var self = this;\n\n                data.selected = false;\n\n                this.current(function (allData) {\n                    var values = [];\n\n                    for (var d = 0; d < allData.length; d++) {\n                        var item = allData[d];\n\n                        if (data.id == item.id) {\n                            continue;\n                        }\n\n                        values.push(item.id);\n                    }\n\n                    self.$element.val(values.join(self._valueSeparator));\n                    self.$element.trigger('input').trigger('change');\n                });\n            };\n\n            InputData.prototype.query = function (_, params, callback) {\n                var results = [];\n\n                for (var d = 0; d < this._currentData.length; d++) {\n                    var data = this._currentData[d];\n\n                    var matches = this.matches(params, data);\n\n                    if (matches !== null) {\n                        results.push(matches);\n                    }\n                }\n\n                callback({\n                    results: results\n                });\n            };\n\n            InputData.prototype.addOptions = function (_, $options) {\n                var options = $.map($options, function ($option) {\n                    return Utils.GetData($option[0], 'data');\n                });\n\n                this._currentData.push.apply(this._currentData, options);\n            };\n\n            return InputData;\n        });\n\n        S2.define('select2/compat/matcher',[\n            'jquery'\n        ], function ($) {\n            function oldMatcher (matcher) {\n                function wrappedMatcher (params, data) {\n                    var match = $.extend(true, {}, data);\n\n                    if (params.term == null || $.trim(params.term) === '') {\n                        return match;\n                    }\n\n                    if (data.children) {\n                        for (var c = data.children.length - 1; c >= 0; c--) {\n                            var child = data.children[c];\n\n                            // Check if the child object matches\n                            // The old matcher returned a boolean true or false\n                            var doesMatch = matcher(params.term, child.text, child);\n\n                            // If the child didn't match, pop it off\n                            if (!doesMatch) {\n                                match.children.splice(c, 1);\n                            }\n                        }\n\n                        if (match.children.length > 0) {\n                            return match;\n                        }\n                    }\n\n                    if (matcher(params.term, data.text, data)) {\n                        return match;\n                    }\n\n                    return null;\n                }\n\n                return wrappedMatcher;\n            }\n\n            return oldMatcher;\n        });\n\n        S2.define('select2/compat/query',[\n\n        ], function () {\n            function Query (decorated, $element, options) {\n                if (options.get('debug') && window.console && console.warn) {\n                    console.warn(\n                        'Select2: The `query` option has been deprecated in favor of a ' +\n                        'custom data adapter that overrides the `query` method. Support ' +\n                        'will be removed for the `query` option in future versions of ' +\n                        'Select2.'\n                    );\n                }\n\n                decorated.call(this, $element, options);\n            }\n\n            Query.prototype.query = function (_, params, callback) {\n                params.callback = callback;\n\n                var query = this.options.get('query');\n\n                query.call(null, params);\n            };\n\n            return Query;\n        });\n\n        S2.define('select2/dropdown/attachContainer',[\n\n        ], function () {\n            function AttachContainer (decorated, $element, options) {\n                decorated.call(this, $element, options);\n            }\n\n            AttachContainer.prototype.position =\n                function (decorated, $dropdown, $container) {\n                    var $dropdownContainer = $container.find('.dropdown-wrapper');\n                    $dropdownContainer.append($dropdown);\n\n                    $dropdown.addClass('select2-dropdown--below');\n                    $container.addClass('select2-container--below');\n                };\n\n            return AttachContainer;\n        });\n\n        S2.define('select2/dropdown/stopPropagation',[\n\n        ], function () {\n            function StopPropagation () { }\n\n            StopPropagation.prototype.bind = function (decorated, container, $container) {\n                decorated.call(this, container, $container);\n\n                var stoppedEvents = [\n                    'blur',\n                    'change',\n                    'click',\n                    'dblclick',\n                    'focus',\n                    'focusin',\n                    'focusout',\n                    'input',\n                    'keydown',\n                    'keyup',\n                    'keypress',\n                    'mousedown',\n                    'mouseenter',\n                    'mouseleave',\n                    'mousemove',\n                    'mouseover',\n                    'mouseup',\n                    'search',\n                    'touchend',\n                    'touchstart'\n                ];\n\n                this.$dropdown.on(stoppedEvents.join(' '), function (evt) {\n                    evt.stopPropagation();\n                });\n            };\n\n            return StopPropagation;\n        });\n\n        S2.define('select2/selection/stopPropagation',[\n\n        ], function () {\n            function StopPropagation () { }\n\n            StopPropagation.prototype.bind = function (decorated, container, $container) {\n                decorated.call(this, container, $container);\n\n                var stoppedEvents = [\n                    'blur',\n                    'change',\n                    'click',\n                    'dblclick',\n                    'focus',\n                    'focusin',\n                    'focusout',\n                    'input',\n                    'keydown',\n                    'keyup',\n                    'keypress',\n                    'mousedown',\n                    'mouseenter',\n                    'mouseleave',\n                    'mousemove',\n                    'mouseover',\n                    'mouseup',\n                    'search',\n                    'touchend',\n                    'touchstart'\n                ];\n\n                this.$selection.on(stoppedEvents.join(' '), function (evt) {\n                    evt.stopPropagation();\n                });\n            };\n\n            return StopPropagation;\n        });\n\n        /*!\n * jQuery Mousewheel 3.1.13\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n */\n\n        (function (factory) {\n            if ( typeof S2.define === 'function' && S2.define.amd ) {\n                // AMD. Register as an anonymous module.\n                S2.define('jquery-mousewheel',['jquery'], factory);\n            } else if (typeof exports === 'object') {\n                // Node/CommonJS style for Browserify\n                module.exports = factory;\n            } else {\n                // Browser globals\n                factory(jQuery);\n            }\n        }(function ($) {\n\n            var toFix  = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],\n                toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?\n                    ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],\n                slice  = Array.prototype.slice,\n                nullLowestDeltaTimeout, lowestDelta;\n\n            if ( $.event.fixHooks ) {\n                for ( var i = toFix.length; i; ) {\n                    $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;\n                }\n            }\n\n            var special = $.event.special.mousewheel = {\n                version: '3.1.12',\n\n                setup: function() {\n                    if ( this.addEventListener ) {\n                        for ( var i = toBind.length; i; ) {\n                            this.addEventListener( toBind[--i], handler, false );\n                        }\n                    } else {\n                        this.onmousewheel = handler;\n                    }\n                    // Store the line height and page height for this particular element\n                    $.data(this, 'mousewheel-line-height', special.getLineHeight(this));\n                    $.data(this, 'mousewheel-page-height', special.getPageHeight(this));\n                },\n\n                teardown: function() {\n                    if ( this.removeEventListener ) {\n                        for ( var i = toBind.length; i; ) {\n                            this.removeEventListener( toBind[--i], handler, false );\n                        }\n                    } else {\n                        this.onmousewheel = null;\n                    }\n                    // Clean up the data we added to the element\n                    $.removeData(this, 'mousewheel-line-height');\n                    $.removeData(this, 'mousewheel-page-height');\n                },\n\n                getLineHeight: function(elem) {\n                    var $elem = $(elem),\n                        $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();\n                    if (!$parent.length) {\n                        $parent = $('body');\n                    }\n                    return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;\n                },\n\n                getPageHeight: function(elem) {\n                    return $(elem).height();\n                },\n\n                settings: {\n                    adjustOldDeltas: true, // see shouldAdjustOldDeltas() below\n                    normalizeOffset: true  // calls getBoundingClientRect for each event\n                }\n            };\n\n            $.fn.extend({\n                mousewheel: function(fn) {\n                    return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');\n                },\n\n                unmousewheel: function(fn) {\n                    return this.unbind('mousewheel', fn);\n                }\n            });\n\n\n            function handler(event) {\n                var orgEvent   = event || window.event,\n                    args       = slice.call(arguments, 1),\n                    delta      = 0,\n                    deltaX     = 0,\n                    deltaY     = 0,\n                    absDelta   = 0,\n                    offsetX    = 0,\n                    offsetY    = 0;\n                event = $.event.fix(orgEvent);\n                event.type = 'mousewheel';\n\n                // Old school scrollwheel delta\n                if ( 'detail'      in orgEvent ) { deltaY = orgEvent.detail * -1;      }\n                if ( 'wheelDelta'  in orgEvent ) { deltaY = orgEvent.wheelDelta;       }\n                if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY;      }\n                if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }\n\n                // Firefox < 17 horizontal scrolling related to DOMMouseScroll event\n                if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {\n                    deltaX = deltaY * -1;\n                    deltaY = 0;\n                }\n\n                // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy\n                delta = deltaY === 0 ? deltaX : deltaY;\n\n                // New school wheel delta (wheel event)\n                if ( 'deltaY' in orgEvent ) {\n                    deltaY = orgEvent.deltaY * -1;\n                    delta  = deltaY;\n                }\n                if ( 'deltaX' in orgEvent ) {\n                    deltaX = orgEvent.deltaX;\n                    if ( deltaY === 0 ) { delta  = deltaX * -1; }\n                }\n\n                // No change actually happened, no reason to go any further\n                if ( deltaY === 0 && deltaX === 0 ) { return; }\n\n                // Need to convert lines and pages to pixels if we aren't already in pixels\n                // There are three delta modes:\n                //   * deltaMode 0 is by pixels, nothing to do\n                //   * deltaMode 1 is by lines\n                //   * deltaMode 2 is by pages\n                if ( orgEvent.deltaMode === 1 ) {\n                    var lineHeight = $.data(this, 'mousewheel-line-height');\n                    delta  *= lineHeight;\n                    deltaY *= lineHeight;\n                    deltaX *= lineHeight;\n                } else if ( orgEvent.deltaMode === 2 ) {\n                    var pageHeight = $.data(this, 'mousewheel-page-height');\n                    delta  *= pageHeight;\n                    deltaY *= pageHeight;\n                    deltaX *= pageHeight;\n                }\n\n                // Store lowest absolute delta to normalize the delta values\n                absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );\n\n                if ( !lowestDelta || absDelta < lowestDelta ) {\n                    lowestDelta = absDelta;\n\n                    // Adjust older deltas if necessary\n                    if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\n                        lowestDelta /= 40;\n                    }\n                }\n\n                // Adjust older deltas if necessary\n                if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\n                    // Divide all the things by 40!\n                    delta  /= 40;\n                    deltaX /= 40;\n                    deltaY /= 40;\n                }\n\n                // Get a whole, normalized value for the deltas\n                delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);\n                deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);\n                deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);\n\n                // Normalise offsetX and offsetY properties\n                if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {\n                    var boundingRect = this.getBoundingClientRect();\n                    offsetX = event.clientX - boundingRect.left;\n                    offsetY = event.clientY - boundingRect.top;\n                }\n\n                // Add information to the event object\n                event.deltaX = deltaX;\n                event.deltaY = deltaY;\n                event.deltaFactor = lowestDelta;\n                event.offsetX = offsetX;\n                event.offsetY = offsetY;\n                // Go ahead and set deltaMode to 0 since we converted to pixels\n                // Although this is a little odd since we overwrite the deltaX/Y\n                // properties with normalized deltas.\n                event.deltaMode = 0;\n\n                // Add event and delta to the front of the arguments\n                args.unshift(event, delta, deltaX, deltaY);\n\n                // Clearout lowestDelta after sometime to better\n                // handle multiple device types that give different\n                // a different lowestDelta\n                // Ex: trackpad = 3 and mouse wheel = 120\n                if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }\n                nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);\n\n                return ($.event.dispatch || $.event.handle).apply(this, args);\n            }\n\n            function nullLowestDelta() {\n                lowestDelta = null;\n            }\n\n            function shouldAdjustOldDeltas(orgEvent, absDelta) {\n                // If this is an older event and the delta is divisable by 120,\n                // then we are assuming that the browser is treating this as an\n                // older mouse wheel event and that we should divide the deltas\n                // by 40 to try and get a more usable deltaFactor.\n                // Side note, this actually impacts the reported scroll distance\n                // in older browsers and can cause scrolling to be slower than native.\n                // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.\n                return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;\n            }\n\n        }));\n\n        S2.define('jquery.select2',[\n            'jquery',\n            'jquery-mousewheel',\n\n            './select2/core',\n            './select2/defaults',\n            './select2/utils'\n        ], function ($, _, Select2, Defaults, Utils) {\n            if ($.fn.select2 == null) {\n                // All methods that should return the element\n                var thisMethods = ['open', 'close', 'destroy'];\n\n                $.fn.select2 = function (options) {\n                    options = options || {};\n\n                    if (typeof options === 'object') {\n                        this.each(function () {\n                            var instanceOptions = $.extend(true, {}, options);\n\n                            var instance = new Select2($(this), instanceOptions);\n                        });\n\n                        return this;\n                    } else if (typeof options === 'string') {\n                        var ret;\n                        var args = Array.prototype.slice.call(arguments, 1);\n\n                        this.each(function () {\n                            var instance = Utils.GetData(this, 'select2');\n\n                            if (instance == null && window.console && console.error) {\n                                console.error(\n                                    'The select2(\\'' + options + '\\') method was called on an ' +\n                                    'element that is not using Select2.'\n                                );\n                            }\n\n                            ret = instance[options].apply(instance, args);\n                        });\n\n                        // Check if we should be returning `this`\n                        if ($.inArray(options, thisMethods) > -1) {\n                            return this;\n                        }\n\n                        return ret;\n                    } else {\n                        throw new Error('Invalid arguments for Select2: ' + options);\n                    }\n                };\n            }\n\n            if ($.fn.select2.defaults == null) {\n                $.fn.select2.defaults = Defaults;\n            }\n\n            return Select2;\n        });\n\n        // Return the AMD loader configuration so it can be used outside of this file\n        return {\n            define: S2.define,\n            require: S2.require\n        };\n    }());\n\n    // Autoload the jQuery bindings\n    // We know that all of the modules exist above this, so we're safe\n    var select2 = S2.require('jquery.select2');\n\n    // Hold the AMD module references on the jQuery function that was just loaded\n    // This allows Select2 to use the internal loader outside of this file, such\n    // as in the language files.\n    jQuery.fn.select2.amd = S2;\n\n    // Return the Select2 instance for anyone who is importing it.\n    return select2;\n}));\n"],"names":["factory","jQuery","S2","fn","select2","amd","requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","_$","$","console","error","Utils","getMethods","theClass","proto","methods","methodName","Extend","ChildClass","SuperClass","__hasProp","BaseConstructor","constructor","key","__super__","Decorate","DecoratorClass","decoratedMethods","superMethods","DecoratedClass","unshift","Array","argCount","calledConstructor","this","displayName","m","superMethod","calledMethod","originalMethod","decoratedMethod","d","Observable","listeners","on","event","trigger","params","_type","invoke","len","generateChars","chars","Math","floor","random","toString","bind","func","context","_convertData","data","originalKey","keys","dataLevel","k","toLowerCase","hasScroll","el","$el","overflowX","style","overflowY","innerHeight","scrollHeight","innerWidth","scrollWidth","escapeMarkup","markup","replaceMap","String","match","appendMany","$element","$nodes","jquery","substr","$jqNodes","node","add","append","__cache","GetUniqueElementId","element","select2Id","getAttribute","setAttribute","StoreData","GetData","RemoveData","removeAttribute","Results","options","dataAdapter","render","$results","get","attr","clear","empty","displayMessage","hideLoading","$message","message","className","hideMessages","find","remove","$options","results","sort","item","$option","option","children","position","$dropdown","sorter","highlightFirstItem","$selected","filter","first","ensureHighlightVisible","setClasses","self","current","selected","selectedIds","s","each","inArray","showLoading","loading","disabled","text","loadingMore","$loading","prepend","document","createElement","attrs","matches","window","Element","msMatchesSelector","webkitMatchesSelector","_resultId","title","role","val","label","template","$children","c","child","$child","$childrenContainer","container","$container","isOpen","removeAttr","$highlighted","getHighlightedResults","currentIndex","nextIndex","$next","eq","currentOffset","offset","top","nextTop","nextOffset","scrollTop","outerHeight","nextBottom","addClass","mousewheel","bottom","deltaY","isAtTop","isAtBottom","height","preventDefault","stopPropagation","evt","$this","originalEvent","removeClass","destroy","offsetDelta","result","content","display","innerHTML","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","PAGE_UP","PAGE_DOWN","END","HOME","LEFT","UP","RIGHT","DOWN","DELETE","KEYS","BaseSelection","$selection","_tabindex","resultsId","_handleBlur","which","update","_attachCloseHandler","_detachCloseHandler","activeElement","contains","body","$select","target","closest","off","isEnabled","isDisabled","SingleSelection","html","$rendered","selectionContainer","selection","formatted","MultipleSelection","parent","$selections","Placeholder","decorated","placeholder","normalizePlaceholder","_","createPlaceholder","$placeholder","singlePlaceholder","AllowClear","_handleClear","_handleKeyboardClear","$clear","previousVal","unselectData","prevented","removeAll","$remove","Search","$search","$searchContainer","_transferTabIndex","_keyUpPrevented","isDefaultPrevented","$previousChoice","prev","searchRemoveChoice","msie","documentMode","disableInputEvents","type","handleSearch","searchHadFocus","resizeSearch","input","term","css","width","EventRelay","relayEvents","preventableEvents","Event","Translation","dict","all","extend","translation","_cache","loadPath","path","translations","BaseAdapter","query","generateResultId","SelectAdapter","select","is","currentData","unselect","addOptions","textContent","innerText","normalizedData","_normalizeItem","matcher","ArrayAdapter","_dataToConvert","convertToOptions","elm","$existing","existingIds","onlyItem","$existingOption","existingData","newData","$newOption","replaceWith","AjaxAdapter","ajaxOptions","_applyDefaults","processResults","defaults","q","transport","success","failure","$request","ajax","then","fail","_request","isFunction","abort","request","isArray","status","url","delay","_queryTimeout","clearTimeout","Tags","tags","createTag","insertTag","t","tag","_removeOldTags","page","wrapper","checkChildren","toUpperCase","trim","Tokenizer","tokenizer","dropdown","tokenData","separators","termChar","MinimumInputLength","$e","minimumInputLength","minimum","MaximumInputLength","maximumInputLength","maximum","MaximumSelectionLength","maximumSelectionLength","_checkIfMaximumSelected","successCallback","count","Dropdown","showSearch","HidePlaceholder","removePlaceholder","modifiedData","InfiniteScroll","lastParams","$loadingMore","createLoadingMore","showLoadingMore","loadMoreIfNeeded","isLoadMoreVisible","documentElement","loadMore","pagination","more","AttachBody","$dropdownParent","_showDropdown","_attachPositioningHandler","_bindContainerResultHandlers","_hideDropdown","_detachPositioningHandler","$dropdownContainer","detach","_containerResultsHandlersBound","_positionDropdown","_resizeDropdown","scrollEvent","resizeEvent","orientationEvent","$watchers","parents","x","scrollLeft","y","ev","$window","isCurrentlyAbove","hasClass","isCurrentlyBelow","newDirection","viewport","enoughRoomAbove","enoughRoomBelow","left","$offsetParent","offsetParent","parentOffset","isConnected","outerWidth","minWidth","appendTo","countResults","MinimumResultsForSearch","minimumResultsForSearch","Infinity","SelectOnClose","_handleSelectOnClose","originalSelect2Event","$highlightedResults","CloseOnSelect","_selectTriggered","ctrlKey","metaKey","errorLoading","inputTooLong","overChars","inputTooShort","maximumSelected","noResults","searching","removeAllItems","ResultsList","SelectionSearch","DIACRITICS","SelectData","ArrayData","AjaxData","DropdownSearch","EnglishTranslation","Defaults","reset","tokenSeparators","Query","amdBase","initSelection","InitSelection","resultsAdapter","selectOnClose","dropdownAdapter","multiple","SearchableDropdown","closeOnSelect","dropdownCssClass","dropdownCss","adaptDropdownCssClass","DropdownCSS","selectionAdapter","allowClear","containerCssClass","containerCss","adaptContainerCssClass","ContainerCSS","language","_resolveLanguage","uniqueLanguages","l","_processTranslations","debug","stripDiacritics","a","amdLanguageBase","dropdownAutoWidth","original","scrollAfterSelect","templateResult","templateSelection","theme","applyFromElement","optionLanguage","defaultLanguage","elementLanguage","parentLanguage","languages","isEmptyObject","isPlainObject","resolvedLanguages","baseLanguage","languageData","ex","warn","set","camelCase","convertedData","Options","fromElement","InputCompat","excludedData","dir","dataset","upperCaseLetter","letter","attributes","attributeName","dataName","dataValue","Select2","_generateId","tabindex","DataAdapter","_placeContainer","SelectionAdapter","DropdownAdapter","ResultsAdapter","_bindAdapters","_registerDomEvents","_registerDataEvents","_registerSelectionEvents","_registerDropdownEvents","_registerResultsEvents","_registerEvents","initialData","_syncAttributes","insertAfter","_resolveWidth","method","WIDTH","styleWidth","elementWidth","getComputedStyle","_syncA","_syncS","_syncSubtree","attachEvent","observer","MutationObserver","WebKitMutationObserver","MozMutationObserver","_observer","mutations","observe","childList","subtree","addEventListener","nonRelayEvents","toggleDropdown","focus","altKey","close","open","_isChangeMutation","changed","nodeName","addedNodes","removedNodes","mutation","actualTrigger","preTriggerMap","preTriggerName","preTriggerArgs","hasFocus","enable","newVal","detachEvent","disconnect","removeEventListener","removeData","syncCssClasses","$dest","$src","adapter","classes","adapted","replacements","CompatUtils","_containerAdapter","clazz","containerCssAdapter","_cssAdapter","_dropdownAdapter","dropdownCssAdapter","_isInitialized","InputData","_currentData","_valueSeparator","getSelected","allData","values","AttachContainer","StopPropagation","nullLowestDeltaTimeout","lowestDelta","toFix","toBind","fixHooks","mouseHooks","special","version","setup","handler","onmousewheel","getLineHeight","getPageHeight","teardown","elem","$elem","$parent","parseInt","settings","adjustOldDeltas","normalizeOffset","orgEvent","delta","deltaX","absDelta","offsetX","offsetY","fix","detail","wheelDelta","wheelDeltaY","wheelDeltaX","axis","HORIZONTAL_AXIS","deltaMode","lineHeight","pageHeight","max","abs","shouldAdjustOldDeltas","getBoundingClientRect","boundingRect","clientX","clientY","deltaFactor","nullLowestDelta","dispatch","handle","unmousewheel","unbind","thisMethods","instanceOptions","instance","root"],"mappings":"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EAAE6R,OAAO,GAAIC,YAAYF,MAAOlQ,KAAKiQ,OAKrDD,YAAYK,OAAS,GAErBL,YAAYM,SAAW,SAAUC,WACvBA,QAAQP,YAAYK,QAAS,KAC3BG,aAAe/X,QAAQ8X,MAE3BP,YAAYK,OAAOE,MAAQC,oBAGxB,IAAIR,YAAYA,YAAYK,OAAOE,QAGvCP,eAGX5X,GAAGM,OAAO,qBAAqB,IAE5B,iBACkB,KACH,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QAMlBN,GAAGM,OAAO,oBAAoB,CAC1B,aACD,SAAU+F,gBACAgS,YAAaxN,SAAUmB,SAC5BqM,YAAYnR,UAAUF,YAAYtF,KAAKkG,aAG3CvB,MAAMM,OAAO0R,YAAahS,MAAM+B,YAEhCiQ,YAAYnX,UAAU+M,QAAU,SAAU3I,gBAChC,IAAItB,MAAM,2DAGpBqU,YAAYnX,UAAUoX,MAAQ,SAAU7P,OAAQnD,gBACtC,IAAItB,MAAM,yDAGpBqU,YAAYnX,UAAUiI,KAAO,SAAU8G,UAAWC,cAIlDmI,YAAYnX,UAAU8Q,QAAU,aAIhCqG,YAAYnX,UAAUqX,iBAAmB,SAAUtI,UAAW1G,UACt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"}