<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">(function( $ )
{
	$.fn.iterate = function(callback, options)
	{
		return jQuery.iterate( this, callback, options);
	};

	$.fn.iterate.defaults = {
		time    : 0,
		start   :function(total){},
		each   :function(index, total){},
		complete:function(){}
	};

	$.extend({
		iterate : function(obj, callback, options)
		{

			let settings = $.extend( {}, $.fn.iterate.defaults, options);
			let func = settings.time &lt; 200 ? setZeroTimeout : setTimeout;

			let iter = {};
			iter.deferred = $.Deferred();
			iter.keys = Object.keys(obj);
			iter.value;
			iter.length = obj.length || iter.keys.length;
			iter.index = 0;
			iter.stopIterating = function() {
				iter.index = iter.length
			};

			settings.start(iter.length);
			let iterator = function() {
				if(iter.index &lt; iter.length) {
					let tmp = window.stopIterating;
					window.stopIterating = iter.stopIterating;
					iter.value = callback.call( obj[ iter.keys[iter.index] ], iter.keys[iter.index], obj[ iter.keys[iter.index] ], iter.length );
					window.stopIterating = tmp;
					settings.each((iter.index+1), iter.length);
					if ( iter.value === false ) {
						iter.deferred.fail();
						return obj;
					}
					iter.index++;
					func(iterator, settings.time);
				}
				else {
					settings.complete();
					iter.deferred.resolve();
					return obj;
				}
			};
			func(iterator, settings.time);
			return iter.deferred;

		}
	});
})( jQuery );

(function() {
	var timeouts = [];
	var messageName = "zero-timeout-message";

	// Like setTimeout, but only takes a function argument.  There\'s
	// no time argument (always zero) and no arguments (you have to
	// use a closure).
	function setZeroTimeout(fn) {
		timeouts.push(fn);
		window.postMessage(messageName, "*");
	}

	function handleMessage(event) {
		var src  = event.source || event.srcElement || event.originalEvent.source,
		    data = event.data   || event.originalEvent.data;

		if (src == window &amp;&amp; data == messageName) {
			event.stopPropagation();
			if (timeouts.length &gt; 0) {
				var fn = timeouts.shift();
				fn();
			}
		}
	}

	$(window).on('message', handleMessage);

	// Add the one thing we want added to the window object.
	window.setZeroTimeout = setZeroTimeout;
})();
</pre></body></html>