function bindJQuery() {
	var originalCleanData;

	if (bindJQueryFired) {
		return;
	}

	// bind to jQuery if present;
	var jqName = jq();
	jQuery = isUndefined(jqName)
		? window.jQuery // use jQuery (if present)
		: !jqName
		? undefined // use jqLite
		: window[jqName]; // use jQuery specified by `ngJq`

	// Use jQuery if it exists with proper functionality, otherwise default to us.
	// Angular 1.2+ requires jQuery 1.7+ for on()/off() support.
	// Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older
	// versions. It will not work for sure with jQuery <1.7, though.
	if (jQuery && jQuery.fn.on) {
		jqLite = jQuery;
		extend(jQuery.fn, {
			scope: JQLitePrototype.scope,
			isolateScope: JQLitePrototype.isolateScope,
			controller: JQLitePrototype.controller,
			injector: JQLitePrototype.injector,
			inheritedData: JQLitePrototype.inheritedData
		});

		// All nodes removed from the DOM via various jQuery APIs like .remove()
		// are passed through jQuery.cleanData. Monkey-patch this method to fire
		// the $destroy event on all removed nodes.
		originalCleanData = jQuery.cleanData;
		jQuery.cleanData = function(elems) {
			var events;
			for (var i = 0, elem; (elem = elems[i]) != null; i++) {
				events = jQuery._data(elem, "events");
				if (events && events.$destroy) {
					jQuery(elem).triggerHandler("$destroy");
				}
			}
			originalCleanData(elems);
		};
	} else {
		jqLite = JQLite;
	}

	angular.element = jqLite;

	// Prevent double-proxying.
	bindJQueryFired = true;
}
The software constructs all or part of a command, data structure, or record using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify how it is parsed or interpreted when it is sent to a downstream component.