PageSourceSearch

https://kammeraadfinancial.com/assets/frameworks/assets/dist/js/global-2.0.2.js

js kammeraadfinancial.com collected 2026-09-30 19:06:15 UTC 1,908,695 bytes, 36,818 lines download raw bytes

1(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2(function (global){(function (){
3'use strict';
4
5(typeof window !== "undefined" ? window['$'] : typeof global !== "undefined" ? global['$'] : null);
6var vidim = require('vidim');
7
8$('.video-bg').each(function () {
9  var $bg = $(this),
10      type = $bg.data('type'),
11      src = $bg.data('src'),
12      poster = $bg.data('poster'),
13      control = $bg.data('control-target');
14  var videoBG = void 0;
15
16  if (type === 'youtube') {
17    videoBG = new vidim($bg[0], {
18      type: 'YouTube',
19      src: src,
20      poster: poster
21    });
22  } else if (type === 'hosted') {
23    videoBG = new vidim($bg[0], {
24      src: [{
25        type: 'video/mp4',
26        src: src
27      }],
28      poster: poster
29    });
30  }
31
32  $('[data-video-control="' + control + '"]').on("click", function (e) {
33    e.preventDefault();
34    var $toggle = $(this);
35    var isPressed = $toggle.attr("aria-pressed") === "true";
36
37    $toggle.attr("aria-pressed", isPressed ? "false" : "true").attr("aria-label", isPressed ? "Pause Video" : "Play Video");
38    $("svg title", this).text(isPressed ? "Pause Video" : "Play Video");
39    $("svg use", this).attr("xlink:href", isPressed ? "#icon-pause" : "#icon-play");
40
41    if (isPressed) {
42      videoBG.play();
43    } else {
44      videoBG.pause();
45    }
46  });
47});
48
49}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
50},{"vidim":30}],2:[function(require,module,exports){
51"use strict";
52
53if (!window.suppress && window.calendlyActive) {
54  $('a[href*="calendly.com"]').on("click", function (e) {
55    e.preventDefault();
56    var URL = $(this).attr("href");
57    Calendly.initPopupWidget({ url: URL });
58  });
59}
60
61},{}],3:[function(require,module,exports){
62(function (global){(function (){
63"use strict";
64
65var serialize = require("./serialize");
66var _ = require("lodash");
67(typeof window !== "undefined" ? window['$'] : typeof global !== "undefined" ? global['$'] : null);
68require("jquery-validation");
69
70$(".contact-form").each(function () {
71  var self = this;
72
73  $(this).on("submit", function (e) {
74    e.preventDefault();
75  }).validate({
76    errorPlacement: function errorPlacement(error, element) {},
77    highlight: function highlight(element, errorClass) {
78      $(element).parents('.form-item').addClass(errorClass);
79    },
80    unhighlight: function unhighlight(element, errorClass) {
81      $(element).parents('.form-item').removeClass(errorClass);
82    },
83    rules: {
84      email: {
85        required: true
86      },
87      required: {
88        required: true
89      }
90    },
91    submitHandler: function submitHandler(form) {
92      var $formBtn = $(".contact-submit", form),
93          btnOrigText = $formBtn.text(),
94          btnActiveText = $formBtn.data("submit-text");
95
96      $formBtn.text(btnActiveText);
97      $formBtn.attr("disabled", true);
98      $(self).find(".is-recaptcha .required-message").remove();
99
100      var data = $(form).serialize();
101
102      $.post({
103        url: "/contact",
104        data: data,
105        error: function error(err) {
106          console.log(err);
107        },
108        success: function success(res) {
109          console.log(res);
110          $formBtn.attr("disabled", false);
111
112          if (_(res).has("error")) {
113            $(self).find('input[type="' + res.field + '"]').parent().addClass("error");
114            $formBtn.text("Error! Try Again");
115          } else if (res.captcha && !res.success) {
116            $(self).find(".is-recaptcha").append('<p class="required-message">This field is required</p>');
117            $formBtn.text(btnOrigText);
118          } else {
119            var successRedirect = $(self).find('input[name="success_redirect"]');
120            if (successRedirect.length) {
121              return window.location = successRedirect.val();
122            }
123
124            var successMessage = $(self).find(".form-success");
125            if (successMessage.length) {
126              $(self).addClass("has-success");
127            }
128
129            $(self).find(".is-recaptcha required-message").remove();
130
131            $formBtn.text("Success!");
132            $(self).find("input, textarea").not("input[type='hidden']").val("");
133
134            setTimeout(function () {
135              $formBtn.text(btnOrigText);
136            }, 3000);
137          }
138        }
139      });
140      return false;
141    }
142  });
143});
144
145}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
146},{"./serialize":7,"jquery-validation":26,"lodash":28}],4:[function(require,module,exports){
147'use strict';
148
149$.fn.doubleTapToGo = function (params) {
150
151	if (!('ontouchstart' in window) && !navigator.msMaxTouchPoints && !navigator.userAgent.toLowerCase().match(/windows phone os 7/i)) return false;
152
153	this.each(function () {
154		var curItem = false;
155
156		$(this).on('click', function (e) {
157			var item = $(this);
158			if (item[0] != curItem[0]) {
159				e.preventDefault();
160				curItem = item;
161			}
162		});
163
164		// $(document).on('click touchstart MSPointerDown', function(e) {
165		// 	var resetItem = true;
166		// 	var parents	  = $( e.target ).parents();
167		// 	for (var i = 0; i < parents.length; i++) {
168		// 		if (parents[i] == curItem[0])
169		// 			resetItem = false;
170		// 		if (resetItem) {
171		//       //curItem = false;
172		// 		}
173		//   }
174		// });
175	});
176	return this;
177};
178
179if ($('.menu-toggle').is(':hidden')) {
180	$('#main-navigation li:has(ul)').doubleTapToGo();
181}
182
183},{}],5:[function(require,module,exports){
184'use strict';
185
186$('.emoney-video').each(function () {
187  var $video = $(this);
188  var videoID = $video.data('video');
189  var videoToken = $video.data('token');
190
191  $video.empty().append('<div id="video-player-' + videoID + '"></div><div id="video-player-disclaimer-part-' + videoID + '"></div>');
192  $('<script />', { type: 'text/javascript', src: 'https://abm.emaplan.com/ABM/MediaServe/Embed?token=' 
192+ videoToken }).appendTo('head');
193});
194
195},{}],6:[function(require,module,exports){
196"use strict";
197
198require("velocity-animate");
199
200window.addEventListener("load", function () {
201  $("html").addClass("is-loaded");
202});
203
204document.addEventListener("DOMContentLoaded", function () {
205  require("./bg-video");
206  require("./emoney-video");
207  require("./contact");
208  require("./dropdown");
209  require("./calendly");
210});
211
212if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/.test(navigator.userAgent)) {
213  $("html").addClass("is-mobile");
214}
215
216document.documentElement.className = document.documentElement.className.replace("no-js", "js");
217
218var domains = location.hostname.split(".");
219if (domains.length > 3) {
220  var dom = domains.slice(-3).join(".");
221} else {
222  var dom = domains.slice(-2).join(".");
223}
224
225var domain = window.location.protocol + "//" + dom + (location.port ? ":" + location.port : "");
226
227var cleanBuild = true;
228var contentChanged = false;
229var heroContentChanged = false;
230var footerChanged = false;
231
232var FroalaEditor = require("froala-editor/js/froala_editor.min");
233require("froala-editor/js/plugins/align.min");
234require("froala-editor/js/plugins/inline_style.min");
235require("froala-editor/js/plugins/lists.min");
236require("froala-editor/js/plugins/code_beautifier.min");
237require("froala-editor/js/plugins/draggable.min");
238require("froala-editor/js/plugins/file.min");
239require("froala-editor/js/plugins/image.min");
240require("froala-editor/js/plugins/link.min");
241require("froala-editor/js/plugins/table.min");
242require("froala-editor/js/plugins/video.min");
243require("froala-editor/js/plugins/paragraph_format.min");
244require("froala-editor/js/plugins/paragraph_style.min");
245require("froala-editor/js/plugins/quote.min");
246require("froala-editor/js/plugins/colors.min");
247require("froala-editor/js/plugins/save.min");
248require("froala-editor/js/plugins/code_view.min");
249require("froala-editor/js/third_party/font_awesome.min");
250
251var site_id = $("input[name='site_id']").val();
252var recaptcha_sitekey = $("input[name='recaptcha_sitekey']").val();
253
254FroalaEditor.VIDEO_PROVIDERS = [{
255  test_regex: /^.*((youtu.be)|(youtube.com))\/((v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))?\??v?=?([^#\&\?]*).*/,
256  url_regex: /(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?v=|embed\/)?([0-9a-zA-Z_\-]+)(.+)?/g,
257  url_text: "//www.youtube.com/embed/$1",
258  html: '<iframe width="640" height="360" src="{url}?wmode=opaque" frameborder="0" allowfullscreen></iframe>',
259  provider: "youtube"
260}, {
261  test_regex: /^.*(?:vimeo.com)\/(?:channels(\/\w+\/)?|groups\/*\/videos\/​\d+\/|video\/|)(\d+)(?:$|\/|\?)/,
262  url_regex: /(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/(?:[^\/]*)\/videos\/|album\/(?:\d+)\/video\/|video\/|)(\d+)(?:[a-zA-Z0-9_\-]+)?/i,
263  url_text: "//player.vimeo.com/video/$1",
264  html: '<iframe width="640" height="360" src="{url}" frameborder="0" allowfullscreen></iframe>',
265  provider: "vimeo"
266}, {
267  test_regex: /^.+(dailymotion.com|dai.ly)\/(video|hub)?\/?([^_]+)[^#]*(#video=([^_&]+))?/,
268  url_regex: /(?:https?:\/\/)?(?:www\.)?(?:dailymotion\.com|dai\.ly)\/(?:video|hub)?\/?(.+)/g,
269  url_text: "//www.dailymotion.com/embed/video/$1",
270  html: '<iframe width="640" height="360" src="{url}" frameborder="0" allowfullscreen></iframe>',
271  provider: "dailymotion"
272}, {
273  test_regex: /^.+(screen.yahoo.com)\/[^_&]+/,
274  url_regex: "",
275  url_text: "",
276  html: '<iframe width="640" height="360" src="{url}?format=embed" frameborder="0" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true" allowtransparency="true"></iframe>',
277  provider: "yahoo"
278}, {
279  test_regex: /^.+(rutube.ru)\/[^_&]+/,
280  url_regex: /(?:https?:\/\/)?(?:www\.)?(?:rutube\.ru)\/(?:video)?\/?(.+)/g,
281  url_text: "//rutube.ru/play/embed/$1",
282  html: '<iframe width="640" height="360" src="{url}" frameborder="0" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true" allowtransparency="true"></iframe>',
283  provider: "rutube"
284}, {
285  test_regex: /^(?:.+)vidyard.com\/(?:watch)?\/?([^.&/]+)\/?(?:[^_.&]+)?/,
286  url_regex: /^(?:.+)vidyard.com\/(?:watch)?\/?([^.&/]+)\/?(?:[^_.&]+)?/g,
287  url_text: "//play.vidyard.com/$1",
288  html: '<iframe width="640" height="360" src="{url}" frameborder="0" allowfullscreen></iframe>',
289  provider: "vidyard"
290}, {
291  test_regex: /(\.|\/)(mp4)$/i,
292  url_regex: "",
293  url_text: "",
294  html: '<video width="640" height="360" controls><source src="{url}" type="video/mp4"></video>',
295  provider: "mp4"
296}];
297
298FroalaEditor.DefineIcon("insertLayout", {
299  NAME: "plus",
300  template: "font_awesome"
301});
302FroalaEditor.DefineIcon("insertForm", {
303  NAME: "send",
304  template: "font_awesome"
305});
306FroalaEditor.DefineIcon("insertSocial", {
307  NAME: "share-alt",
308  template: "font_awesome"
309});
310
311FroalaEditor.RegisterCommand("insertLayout", {
312  title: "Insert Layout",
313  focus: false,
314  undo: true,
315  type: "dropdown",
316  refreshAfterCallback: true,
317  options: {
318    halves: "<svg class='icon'><use xlink:href='#icon-grid-2-column'></use></svg> 2 Column Split",
319    thirds: "<svg class='icon'><use xlink:href='#icon-grid-3-column'></use></svg> 3 Column Split",
320    "sidebar-right": "<svg class='icon'><use xlink:href='#icon-grid-sidebar-right'></use></svg> Sidebar (Right)",
321    "sidebar-left": "<svg class='icon'><use xlink:href='#icon-grid-sidebar-left'></use></svg> Sidebar (Left)"
322  },
323  callback: function callback(cmd, val) {
324    if (val === "halves") {
325      this.html.insert("\n        <div class=\"row\"><span class=\"delete-row\"></span>\n          <div class=\"col-xs-12 col-sm-6\">\n            <h2>Column 1</h2>\n            <p>Duis minim cupidatat occaecat officia et ut consequat reprehenderit aute sint commodo laboris est anim est commodo duis irure dolore mollit reprehenderit qui.</p>\n          </div>\n          <div class=\"col-xs-12 col-sm-6\">\n            <h2>Column 2</h2>\n            <p>Duis minim cupidatat occaecat officia et ut consequat reprehenderit aute sint commodo laboris est anim est commodo duis irure dolore mollit reprehenderit qui.</p>\n          </div>\n        </div><p><br></p>");
326    } else if (val === "thirds") {
327      this.html.insert("\n        <div class=\"row\"><span class=\"delete-row\"></span>\n          <div class=\"col-xs-12 col-sm-4\">\n            <h2>Column 1</h2>\n            <p>Duis minim cupidatat occaecat officia et ut consequat reprehenderit aute sint commodo laboris est anim est commodo duis irure dolore mollit reprehenderit qui.</p>\n          </div>\n          <div class=\"col-xs-12 col-sm-4\">\n            <h2>Column 2</h2>\n            <p>Duis minim cupidatat occaecat officia et ut consequat reprehenderit aute sint commodo laboris est anim est commodo duis irure dolore mollit reprehenderit qui.</p>\n          </div>\n          <div class=\"col-xs-12 col-sm-4\">\n            <h2>Column 3</h2>\n            <p>Duis minim cupidatat occaecat officia et ut consequat reprehenderit aute sint commodo laboris est anim est commodo duis irure dolore mollit reprehenderit qui.</p>\n          </div>\n        </div><p><br></p>");
328    } else if (val === "sidebar-right") {
329      this.html.insert("\n        <div class=\"row\"><span class=\"delete-row\"></span>\n          <div class=\"col-xs-12 col-sm-7 col-md-8\">\n            <h2>Column Content</h2>\n            <p>Duis minim cupidatat occaecat officia et ut consequat reprehenderit aute sint commodo laboris est anim est commodo duis irure dolore mollit reprehenderit qui.</p>\n          </div>\n          <div class=\"col-xs-12 col-sm-5 col-md-4\">\n            <aside class=\"sidebar\"><h2>Sidebar (right)</h2><p>Enter your sidebar content here...</p></aside>\n          </div>\n        </div><p><br></p>");
330    } else if (val === "sidebar-left") {
331      this.html.insert("\n        <div class=\"row\"><span class=\"delete-row\"></span>\n          <div class=\"col-xs-12 col-sm-5 col-md-4\">\n            <aside class=\"sidebar sidebar-left\"><h2>Sidebar (left)</h2><p>Enter your sidebar content here...</p></aside>\n          </div>\n          <div class=\"col-xs-12 col-sm-7 col-md-8\">\n            <h2>Column Content</h2>\n            <p>Duis minim cupidatat occaecat officia et ut consequat reprehenderit aute sint commodo laboris est anim est commodo duis irure dolore mollit reprehenderit qui.</p>\n          </div>\n        </div><p><br></p>");
332    }
333  }
334});
335FroalaEditor.RegisterCommand("insertForm", {
336  title: "Insert Contact Form",
337  focus: false,
338  undo: true,
339  type: "dropdown",
340  refreshAfterCallback: true,
341  options: {
342    minimal: "Minimal",
343    full: "Full"
344  },
345  callback: function callback(cmd, val) {
346    var recapatcha = recaptcha_sitekey ? '<div class="form-item is-recaptcha"><div class="g-recaptcha" data-sitekey="' + recaptcha_sitekey + '"></div></div>' : "";
347
348    if (val === "minimal") {
349      this.html.insert("\n        <form class=\"form minimal contact-form\">\n          <span class=\"delete-contact-form\"></span>\n          <span class=\"mask-contact-form\" contenteditable=\"false\"></span>\n          <div class=\"form-wrapper\">\n            <div class=\"form-item form-fit\">\n              <input type=\"email\" aria-label=\"Email\" name=\"contact[email]\" class=\"form-control\" placeholder=\"Email Address\">\n            </div>\n            <div class=\"form-item\">\n              <button type=\"submit\" class=\"btn contact-submit\" aria-label=\"
349Submit\" data-submit-text=\"Sending...\">Join</button>\n            </div>\n          </div>\n          " + recapatcha + "\n        </form><p><br></p>");
350    } else if (val === "full") {
351      this.html.insert("\n        <form class=\"form contact-form\">\n          <span class=\"delete-contact-form\"></span>\n          <span class=\"mask-contact-form\" contenteditable=\"false\"></span>\n          <div class=\"form-wrapper\">\n            <div class=\"form-item\"><label>Name</label>\n              <input type=\"text\" aria-label=\"Name\" name=\"contact[name]\" class=\"form-control\">\n            </div>\n            <div class=\"form-item\"><label>Email</label>\n              <input type=\"email\" aria-label=\"Email\" name=\"contact[email]\" class=\"form-control\">\n            </div>\n            <div class=\"form-item\"><label>Phone</label>\n              <input type=\"text\" aria-label=\"Phone\" name=\"contact[phone]\" class=\"form-control\">\n            </div>\n            <div class=\"form-item\"><label>Message</label>\n              <textarea name=\"contact[message]\" aria-label=\"Message\" class=\"form-control\"></textarea>\n            </div>\n            " + recapatcha + "\n            <div class=\"form-item\">\n              <button type=\"submit\" aria-label=\"Submit\" class=\"btn contact-submit\" data-submit-text=\"Sending...\">Send</button>\n            </div>\n\n          </div>\n        </form><p><br></p>");
352    }
353  }
354});
355FroalaEditor.RegisterCommand("insertSocial", {
356  title: "Insert Social Icon",
357  focus: true,
358  undo: true,
359  type: "dropdown",
360  refreshAfterCallback: true,
361  options: {
362    facebook: "<svg class='icon'><use xlink:href='#icon-facebook'></use></svg> Facebook",
363    twitter: "<svg class='icon'><use xlink:href='#icon-twitter'></use></svg> Twitter",
364    instagram: "<svg class='icon'><use xlink:href='#icon-instagram'></use></svg> Instagram",
365    linkedin: "<svg class='icon'><use xlink:href='#icon-linkedin'></use></svg> Linkedin",
366    youtube: "<svg class='icon'><use xlink:href='#icon-youtube'></use></svg> YouTube",
367    vimeo: "<svg class='icon'><use xlink:href='#icon-vimeo'></use></svg> Vimeo",
368    tumblr: "<svg class='icon'><use xlink:href='#icon-tumblr'></use></svg> Tumblr",
369    yelp: "<svg class='icon'><use xlink:href='#icon-yelp'></use></svg> Yelp",
370    rss: "<svg class='icon'><use xlink:href='#icon-rss'></use></svg> RSS Feed",
371    email: "<svg class='icon'><use xlink:href='#icon-email'></use></svg> Email",
372    podcast: "<svg class='icon'><use xlink:href='#icon-podcast'></use></svg> Podcast",
373    phone: "<svg class='icon'><use xlink:href='#icon-phone'></use></svg> Phone",
374    blog: "<svg class='icon'><use xlink:href='#icon-blog'></use></svg> Blog"
375  },
376  callback: function callback(cmd, val) {
377    if (val == "email") {
378      this.html.insert('<a href="mailto:[email protected]" target="_blank" class="social-link fr-deletable" aria-label="' + val + '"><svg class="icon"><use xlink:href="#icon-' + val + '"></use></svg></a>');
379    } else {
380      this.html.insert('<a href="#' + val + '" target="_blank" class="social-link fr-deletable" aria-label="' + val + '"><svg class="icon"><use xlink:href="#icon-' + val + '"></use></svg></a>');
381    }
382  }
383});
384
385var allowedTags = ["a", "abbr", "address", "area", "article", "aside", "audio", "b", "base", "bdi", "bdo", "blockquote", "br", "button", "canvas", "caption", "cite", "code", "col", "colgroup", "datalist", "dd", "del", "details", "dfn", "dialog", "div", "dl", "dt", "em", "embed", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hgroup", "hr", "i", "iframe", "img", "input", "ins", "kbd", "keygen", "label", "loading", "legend", "li", "link", "main", "map", "mark", "menu", "menuitem", "meter", "nav", "noscript", "object", "ol", "optgroup", "option", "output", "p", "param", "pre", "progress", "queue", "rp", "rt", "ruby", "s", "samp", "script", "style", "section", "select", "small", "source", "span", "strike", "strong", "sub", "summary", "sup", "svg", "table", "tbody", "td", "textarea", "tfoot", "th", "thead", "time", "title", "tr", "track", "u", "ul", "use", "var", "video", "wbr"];
386var allowedEmptyTags = ["textarea", "a", "iframe", "object", "video", "span", "style", "script", "svg", "use", "i", "loading"];
387var allowedAttrs = ["lazy", "accept", "accept-charset", "accesskey", "action", "align", "alt", "aria-.*", "async", "autocomplete", "autofocus", "autoplay", "autosave", "background", "bgcolor", "border", "charset", "cellpadding", "cellspacing", "checked", "cite", "class", "color", "cols", "colspan", "content", "contenteditable", "contextmenu", "controls", "coords", "data", "data-.*", "datetime", "default", "defer", "dir", "dirname", "disabled", "download", "draggable", "dropzone", "enctype", "focu
387sable", "for", "form", "formaction", "headers", "height", "hidden", "high", "href", "hreflang", "http-equiv", "icon", "id", "ismap", "itemprop", "keytype", "kind", "label", "lang", "language", "list", "loop", "low", "max", "maxlength", "media", "method", "min", "multiple", "name", "novalidate", "open", "optimum", "pattern", "ping", "placeholder", "poster", "preload", "pubdate", "radiogroup", "readonly", "rel", "required", "reversed", "role", "rows", "rowspan", "sandbox", "scope", "scoped", "scrolling", "seamless", "selected", "shape", "size", "sizes", "span", "src", "srcdoc", "srclang", "srcset", "start", "step", "summary", "spellcheck", "style", "tabindex", "target", "title", "type", "translate", "usemap", "value", "valign", "width", "wrap", "xlink:href", "loading"];
388var toolbarOptions = [["paragraphFormat", "paragraphStyle", "bold", "italic", "align", "insertLink", "-", "formatOL", "formatUL", "insertHR", "quote", "superscript", "subscript", "insertTable", "insertSocial", "-", "insertImage", "insertFile", "insertVideo", "insertForm", "insertLayout", "undo", "redo", "html"]];
389
390// initialize the editor
391var editor = new FroalaEditor(".editable", {
392  attribution: false,
393  theme: "gray",
394  placeholderText: "Start typing something...",
395  key: "mPD4tB3G2A1G1I1A3sGXd1WWTDSGXYOUKh1KINLb1OG1g1H-8D1B3D3C2E6D1D1B4E4B3==",
396  toolbarInline: true,
397  toolbarVisibleWithoutSelection: true,
398  tableResizerOffset: 10,
399  toolbarButtons: toolbarOptions,
400  toolbarButtonsMD: toolbarOptions,
401  toolbarButtonsSM: toolbarOptions,
402  toolbarButtonsXS: toolbarOptions,
403  htmlAllowedTags: allowedTags,
404  htmlAllowedEmptyTags: allowedEmptyTags,
405  htmlAllowedAttrs: allowedAttrs,
406  htmlUntouched: true,
407  htmlExecuteScripts: false,
408  paragraphFormatSelection: true,
409  videoInsertButtons: ["videoBack", "|", "videoByURL", "videoEmbed"],
410  videoEditButtons: ["videoReplace", "videoRemove"],
411  videoDefaultDisplay: "block",
412  videoDefaultWidth: 0,
413  videoResize: false,
414  paragraphStyles: {
415    hero: "Hero",
416    jumbo: "Jumbo",
417    disclaimer: "Disclaimer",
418    accented: "Accent",
419    "is-m0": "+ No Margins",
420    "is-mt0": "+ No Top Margin",
421    "is-mb0": "+ No Bottom Margin",
422    "is-h1": "+ Match H1",
423    "is-h2": "+ Match H2",
424    "is-h3": "+ Match H3",
425    "is-h4": "+ Match H4"
426  },
427  linkList: [],
428  linkStyles: {
429    "is-clean": "Remove Underline",
430    btn: "Button",
431    primary: "+ Primary",
432    secondary: "+ Secondary",
433    "is-pill": "+ Pill",
434    "btn-block": "+ Full Width"
435  },
436  linkInsertButtons: ["linkBack"],
437  linkEditButtons: ["linkOpen", "linkStyle", "linkEdit", "linkRemove"],
438  linkAttributes: {
439    class: "Class"
440  },
441  tableStyles: {
442    "no-borders": "No Borders",
443    "is-striped": "Stripe Rows",
444    "is-framed": "Outline Table",
445    "uses-accent": "Use Accent Color"
446  },
447  tableCellStyles: {
448    "is-highlighted": "Highlighted"
449  },
450  codeMirror: window.CodeMirror,
451  codeMirrorOptions: {
452    theme: "monokai",
453    indentWithTabs: true,
454    lineNumbers: true,
455    lineWrapping: true,
456    mode: "text/html",
457    tabMode: "indent",
458    tabSize: 2,
459    autoCloseTags: {
460      whenClosing: true,
461      whenOpening: true,
462      indentTags: []
463    },
464    extraKeys: {
465      Esc: function Esc() {
466        $(editor).each(function () {
467          if (this.codeView.isActive()) {
468            this.codeView.toggle();
469          }
470        });
471      },
472      Tab: "emmet.expand_abbreviation_with_tab",
473      "Cmd-/": "emmet.toggle_comment",
474      "Ctrl-/": "emmet.toggle_comment"
475    }
476  },
477  saveMethod: "PUT",
478  saveInterval: 0,
479  fileUploadParam: "objects",
480  fileUploadURL: domain + "/api/objects",
481  fileUploadParams: { site_id: site_id, editor: true },
482  fileUploadMethod: "POST",
483  imageUploadParam: "objects",
484  imageUploadURL: domain + "/api/objects",
485  imageUploadParams: { site_id: site_id, editor: true },
486  imageUploadMethod: "POST",
487  imageMaxSize: 10 * 1024 * 1024,
488  imageAllowedTypes: ["jpeg", "jpg", "png", "svg+xml", "gif"],
489  imageStyles: {
490    spread: "Bigger Margins",
491    rounded: "Rounded",
492    bw: "Grayscale",
493    "full-bleed": "Full Bleed Width"
494  },
495  imageDefaultWidth: 0,
496  imageDefaultMargin: 0,
497  imageDefaultDisplay: "block",
498  pastePlain: true,
499  pasteDeniedAttrs: ["class", "id", "style", "aria-level", "dir"],
500
501  events: {
502    initialized: function initialized() {
503      // Event callback.
504      var editor = this;
505      var contentLoc = $(editor.el).parents(".editable").data("location");
506      var contentType = $(editor.el).parents(".editable").data("type");
507      var contentID = $(editor.el).parents(".editable").data("id");
508
509      editor.opts.saveParam = contentLoc;
510      editor.opts.saveURL = domain + "/api/pages/content?id=" + contentID + "&t
510ype=" + contentType + "&site_id=" + site_id;
511
512      // Mouse down on link.
513      editor.events.$on(editor.$el, editor._mousedown, ".social-link", function () {
514        var range = editor.doc.createRange();
515        range.selectNodeContents(this);
516
517        if ($(this).text().length == 0 || !$(this).prev().hasClass("social-link")) {
518          $(this).prepend(FroalaEditor.INVISIBLE_SPACE);
519        }
520
521        var sel = editor.win.getSelection();
522        sel.removeAllRanges();
523        sel.addRange(range);
524      });
525
526      // Mouseup on link.
527      editor.events.$on(editor.$el, editor._mouseup, ".social-link, .delete-contact-form, .delete-row", function (e) {
528        e.preventDefault();
529      });
530
531      //Custom contact form
532      editor.events.$on(editor.$el, editor._mousedown, ".delete-contact-form", function (e) {
533        e.preventDefault();
534        $(this).closest(".contact-form").remove();
535      });
536
537      editor.events.$on(editor.$el, editor._mousedown, ".delete-row", function (e) {
538        e.preventDefault();
539        $(this).closest(".row").remove();
540      });
541    },
542    focus: function focus() {
543      var editor = this;
544      $(editor.el).parents(".editable").addClass("editing");
545      $(".brokercheck").addClass("remove-distraction");
546    },
547    blur: function blur() {
548      var editor = this;
549      $(editor.el).parents(".editable").removeClass("editing");
550      $(".brokercheck").removeClass("remove-distraction");
551    },
552    contentChanged: function contentChanged() {
553      var editor = this;
554      $("#tot_content-save").show();
555      $(editor).data("changed", true);
556      cleanBuild = false;
557    },
558    "save.after": function saveAfter(data) {
559      var editor = this;
560      $("#tot_content-save").removeClass("loading").text("Success!").delay(500).fadeOut(300);
561      setTimeout(function () {
562        $("#tot_content-save").text("Save Changes");
563      }, 1200);
564      $(editor).data("changed", false);
565      cleanBuild = true;
566    },
567    "save.error": function saveError(error, response) {
568      $("#tot_content-save").removeClass("loading").text("Error!");
569      setTimeout(function () {
570        $("#tot_content-save").text("Try Again");
571      }, 800);
572    },
573    keydown: function keydown(keydownEvent) {
574      var editor = this;
575      if (keydownEvent.defaultPrevented) {
576        return;
577      }
578      var key = keydownEvent.key || keydownEvent.keyCode;
579      if (key === "Escape" || key === "Esc" || key === 27) {
580        editor.codeView.toggle();
581      }
582    }
583  }
584});
585
586$(".content-save").on("click", function (e) {
587  e.preventDefault();
588
589  $(this).addClass("loading").text("Saving...");
590
591  $(editor).each(function () {
592    if ($(this).data("changed")) {
593      this.save.save();
594    }
595  });
596});
597
598$(window).bind("beforeunload", function (e) {
599  if (!cleanBuild) {
600    e.preventDefault();
601    return "Are you sure?";
602  }
603});
604
605if (window.devHelper && document.querySelector(".site-data")) {
606  // show dev helper button if activated
607  document.querySelector(".site-data").classList.add("is-active");
608  document.getElementById("tot_content-save").classList.add("has-helper");
609
610  // calculate missing alt tags
611  var imgs = document.querySelectorAll("img");
612  var imgErrorCount = 0;
613  Array.from(imgs).forEach(function (img) {
614    if (!img.getAttribute("alt") && !img.classList.contains("is-alternate")) {
615      imgErrorCount++;
616      var src = img.getAttribute("src");
617      document.querySelector(".calc--alt-srcs").insertAdjacentHTML("beforeend", "<span>" + src.substring(src.lastIndexOf("/") + 1) + "</span>");
618    }
619  });
620  document.querySelector(".calc--alt").innerText = imgErrorCount;
621
622  // calculate headline
623  var headline = document.querySelector("h1");
624  document.querySelector(".calc--headline").innerText = headline ? headline.innerText : "not set";
625
626  // attach click handler to show/hide dev helper drawer
627  var toggler = document.querySelector(".site-data--toggle");
628  toggler.addEventListener("click", function (e) {
629    e.preventDefault();
630    toggler.classList.toggle("is-open");
631    document.querySelector(".site-data--content").classList.toggle("is-showing");
632  });
633}
634
635window.parent.postMessage(window.location.href, "*");
636
637},{"./bg-video":1,"./calendly":2,"./contact":3,"./dropdown":4,"./emoney-video":5,"froala-editor/js/froala_editor.min":8,"froala-editor/js/plugins/align.min":9,"froala-editor/js/plugins/code_beautifier.min":10,"froala-editor/js/plugins/code_view.min":11,"froala-editor/js/plugins/colors.min":12,"froala-editor/js/plugins/draggable.min":13,"froala-editor/js/plugins/file.min":14,"froala-editor/js/plugins/image.min":15,"froala-editor/js/plugins/inline_style.min":16,"froala-editor/js/plugins/link.min":17,"froala-editor/js/plugins/lists.min":18,"froala-editor/js/plugins/paragraph_format.min":19,"froala-editor/js/plugins/paragraph_style.min":20,"froala-editor/js/plugins/quote.min":21,"froala-editor/js/plugins/save.min":22,"froala-editor/js/plugins/table.min":23,"froala-editor/js/plugins/video.min":24,"froala-editor/js/third_party/font_awesome.min":25,"velocity-animate":29}],7:[function(require,module,exports){
638'use strict';
639
640/**
641 * Return a JSON representation of a form
642 * @param  {[type]} form [description]
643 * @return {[type]}      [description]
644 */
645module.exports = function (form) {
646
647  var _ = require('lodash');
648
649  try {
650    var formArray = JSON.parse(JSON.stringify($(form).serializeArray()));
651    var obj = {};
652    formArray.forEach(function (val) {
653      if (obj[val.name]) {
654        var tmpval = obj[val.name];
655        if (!_.isArray(obj[val.name])) {
656          obj[val.name] = [tmpval];
657          obj[val.name].push(val.value);
658        } else {
659          obj[val.name].push(val.value);
660        }
661      } else {
662        obj[val.name] = val.value;
663      }
664    });
665    console.log(obj);
666    return obj;
667  } catch (e) {
668    console.error(e);
669  }
670};
671
672},{"lodash":28}],8:[function(require,module,exports){
673/*!
674 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
675 * License https://froala.com/wysiwyg-editor/terms/
676 * Copyright 2014-2023 Froala Labs
677 */
678
679!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.FroalaEditor=t()}(this,function(){"use strict";function M(e){return(M="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest||(Element.prototype.closest=function(e){var t=this;if(!document.documentElement.contains(t))return null;do{if(t.matches(e))return t;t=t.parentElement||t.parentNode}while(null!==t&&1===t.nodeType);return null}),Element.prototype.matches||(Element.prototype.matches=Element.prototype.matchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector||Element.prototype.webkitMatchesSelector||function(e){for(var t=(this.document||this.ownerDocument).querySelectorAll(e),n=t.length;0<=--n&&t.item(n)!==this;);return-1<n}),Array.isArray||(Array.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)}),"function"!=typeof Object.assign&&Object.defineProperty(Object,"assign",{value:function(e,t){if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var n=Object(e),r=1;r<arguments.length;r++){var o=arguments[r];if(null!=o)for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])}return n},writable:!0,configurable:!0}),function(){var a=/^\s*:scope/gi,s=/,\s*:scope/gi,l=document.createElement("div");function e(e,t){var i=e[t];e[t]=function(e){var t,n=!1,r=!1;if(!e||Array.isArray(e)||!e.match(a)&&!e.match(s))return i.call(this,e);this.parentNode||(l.appendChild(this),r=!0);var o=this.parentNode;return this.id||(this.id="rootedQuerySelector_id_".concat((new Date).getTime()),n=!0),t=i.call(o,e.replace(a,"#".concat(this.id
679)).replace(s,",#".concat(this.id))),n&&(this.id=""),r&&l.removeChild(this),t}}try{var t=l.querySelectorAll(":scope *");if(!t||Array.isArray(t))throw"error"}catch(n){e(Element.prototype,"querySelector"),e(Element.prototype,"querySelectorAll"),e(HTMLElement.prototype,"querySelector"),e(HTMLElement.prototype,"querySelectorAll")}}(),"document"in self&&("classList"in document.createElement("_")&&(!document.createElementNS||"classList"in document.createElementNS("http://www.w3.org/2000/svg","g"))||function(e){if("Element"in e){var t="classList",n="prototype",r=e.Element[n],o=Object,i=String[n].trim||function(){return this.replace(/^\s+|\s+$/g,"")},a=Array[n].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;return-1},s=function s(e,t){this.name=e,this.code=DOMException[e],this.message=t},l=function l(e,t){if(""===t)throw new s("SYNTAX_ERR","The token must not be empty.");if(/\s/.test(t))throw new s("INVALID_CHARACTER_ERR","The token must not contain space characters.");return a.call(e,t)},c=function c(e){for(var t=i.call(e.getAttribute("class")||""),n=t?t.split(/\s+/):[],r=0,o=n.length;r<o;r++)this.push(n[r]);this._updateClassName=function(){e.setAttribute("class",this.toString())}},d=c[n]=[],f=function f(){return new c(this)};if(s[n]=Error[n],d.item=function(e){return this[e]||null},d.contains=function(e){return~l(this,e+"")},d.add=function(){for(var e,t=arguments,n=0,r=t.length,o=!1;e=t[n]+"",~l(this,e)||(this.push(e),o=!0),++n<r;);o&&this._updateClassName()},d.remove=function(){var e,t,n=arguments,r=0,o=n.length,i=!1;do{for(e=n[r]+"",t=l(this,e);~t;)this.splice(t,1),i=!0,t=l(this,e)}while(++r<o);i&&this._updateClassName()},d.toggle=function(e,t){var n=this.contains(e),r=n?!0!==t&&"remove":!1!==t&&"add";return r&&this[r](e),!0===t||!1===t?t:!n},d.replace=function(e,t){var n=l(e+"");~n&&(this.splice(n,1,t),this._updateClassName())},d.toString=function(){return this.join(" ")},o.defineProperty){var p={get:f,enumerable:!0,configurable:!0};try{o.defineProperty(r,t,p)}catch(h){void 0!==h.number&&-2146823252!==h.number||(p.enumerable=!1,o.defineProperty(r,t,p))}}else o[n].__defineGetter__&&r.__defineGetter__(t,f)}}(self),function(){var e=document.createElement("_");if(e.classList.add("c1","c2"),!e.classList.contains("c2")){var t=function yc(e){var yc=DOMTokenList.prototype[e];DOMTokenList.prototype[e]=function(e){var t,n=arguments.length;for(t=0;t<n;t++)e=arguments[t],yc.call(this,e)}};t("add"),t("remove")}if(e.classList.toggle("c3",!1),e.classList.contains("c3")){var n=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(e,t){return 1 in arguments&&!this.contains(e)==!t?t:n.call(this,e)}}"replace"in document.createElement("_").classList||(DOMTokenList.prototype.replace=function(e,t){var n=this.toString().split(" "),r=n.indexOf(e+"");~r&&(n=n.slice(r),this.remove.apply(this,n),this.add(t),this.add.apply(this,n.slice(1)))}),e=null}()),function(){var e,t=-1;if("Microsoft Internet Explorer"===navigator.appName?(e=navigator.userAgent,null!==new RegExp("MSIE ([0-9]{1,}[\\.0-9]{0,})").exec(e)&&(t=parseFloat(RegExp.$1))):"Netscape"===navigator.appName&&(e=navigator.userAgent,null!==new RegExp("Trident/.*rv:([0-9]{1,}[\\.0-9]{0,})").exec(e)&&(t=parseFloat(RegExp.$1))),!("undefined"==typeof window||"undefined"==typeof document||"undefined"==typeof HTMLElement||t<0)){var n=!1;try{var r=document.createElement("div");r.addEventListener("focus",function(e){e.preventDefault(),e.stopPropagation()},!0),r.focus(Object.defineProperty({},"preventScroll",{get:function(){if(navigator&&"undefined"!=typeof navigator.userAgent&&navigator.userAgent&&navigator.userAgent.match(/Edge\/1[7-8]/))return n=!1;n=!0}}))}catch(s){}if(HTMLElement.prototype.nativeFocus===undefined&&!n){HTMLElement.prototype.nativeFocus=HTMLElement.prototype.focus;var o=function o(e){for(var t=e.parentNode,n=[],r=document.scrollingElement||document.documentElement;t&&t!==r;)(t.offsetHeight<t.scrollHeight||t.offsetWidth<t.scrollWidth)&&n.push([t,t.scrollTop,t.scrollLeft]),t=t.parentNode;return t=r,n.push([t,t.scrollTop,t.scrollLeft]),n},i=function i(e){for(var t=0;t<e.length;t++)e[t][0].scrollTop=e[t][1],e[t][0].scrollLeft=e[t][2];e=[]},a=function a(e){if(e&&e.preventScroll){var t=o(this);if("function"==typeof setTimeout){var n=this;setTimeout(function(){n.nativeFocus(),i(t)},0)}else this.nativeFocus(),i(t)}else this.nativeFocus()};
vendor: 5,277 bytes, line 679
679HTMLElement.prototype.focus=a}}}();function V(e,t,n){if("string"!=typeof e)return new V.Bootstrap(e,t,n);var r=document.querySelectorAll(e);t&&t.iframe_document&&(r=t.iframe_document.querySelectorAll(e));for(var o=[],i=0;i<r.length;i++){var a=r[i]["data-froala.editor"];a?o.push(a):o.push(new V.Bootstrap(r[i],t,n))}return 1==o.length?o[0]:o}V.RegisterPlugins=function(e){for(var t=0;t<e.length;t++)e[t].call(V)},Object.assign(V,{DEFAULTS:{initOnClick:!1,pluginsEnabled:null},MODULES:{},PLUGINS:{},VERSION:"4.0.17",INSTANCES:[],OPTS_MAPPING:{},SHARED:{},ID:0}),V.MODULES.node=function(a){var n=a.$;function s(e){return e&&"IFRAME"!==e.tagName?Array.prototype.slice.call(e.childNodes||[]):[]}function l(e){return!!e&&(e.nodeType===Node.ELEMENT_NODE&&0<=V.BLOCK_TAGS.indexOf(e.tagName.toLowerCase()))}function c(e){var t={},n=e.attributes;if(n)for(var r=0;r<n.length;r++){var o=n[r];t[o.nodeName]=o.value}return t}function t(e){for(var t="",n=c(e),r=Object.keys(n).sort(),o=0;o<r.length;o++){var i=r[o],a=n[i];a.indexOf("'")<0&&0<=a.indexOf('"')?t+=" ".concat(i,"='").concat(a,"'"):(0<=a.indexOf('"')&&0<=a.indexOf("'")&&(a=a.replace(/"/g,"&quot;")),t+=" ".concat(i,'="').concat(a,'"'))}return t}function r(e){return e===a.el}return{isBlock:l,isEmpty:function d(e,t){if(!e)return!0;if(e.querySelector("table"))return!1;var n=s(e);1===n.length&&l(n[0])&&(n=s(n[0]));for(var r=!1,o=0;o<n.length;o++){var i=n[o];if(!(t&&a.node.hasClass(i,"fr-marker")||i.nodeType===Node.TEXT_NODE&&0===i.textContent.length)){if("BR"!==i.tagName&&0<(i.textContent||"").replace(/\u200B/gi,"").replace(/\n/g,"").length)return!1;if(r)return!1;"BR"===i.tagName&&(r=!0)}}return!(e.querySelectorAll(V.VOID_ELEMENTS.join(",")).length-e.querySelectorAll("br").length||e.querySelector("".concat(a.opts.htmlAllowedEmptyTags.join(":not(.fr-marker),"),":not(.fr-marker)"))||1<e.querySelectorAll(V.BLOCK_TAGS.join(",")).length||e.querySelector("".concat(a.opts.htmlDoNotWrapTags.join(":not(.fr-marker),"),":not(.fr-marker)")))},blockParent:function o(e){for(;e&&e.parentNode!==a.el&&(!e.parentNode||!a.node.hasClass(e.parentNode,"fr-inner"));)if(l(e=e.parentNode))return e;return null},deepestParent:function i(e,t,n){if(void 0===t&&(t=[]),void 0===n&&(n=!0),t.push(a.el),0<=t.indexOf(e.parentNode)||e.parentNode&&a.node.hasClass(e.parentNode,"fr-inner")||e.parentNode&&0<=V.SIMPLE_ENTER_TAGS.indexOf(e.parentNode.tagName)&&n)return null;for(;t.indexOf(e.parentNode)<0&&e.parentNode&&!a.node.hasClass(e.parentNode,"fr-inner")&&(V.SIMPLE_ENTER_TAGS.indexOf(e.parentNode.tagName)<0||!n)&&(!l(e)||l(e.parentNode))&&(!l(e)||!l(e.parentNode)||!n);)e=e.parentNode;return e},rawAttributes:c,attributes:t,clearAttributes:function f(e){for(var t=e.attributes,n=t.length-1;0<=n;n--){var r=t[n];e.removeAttribute(r.nodeName)}},openTagString:function p(e){return"<".concat(e.tagName.toLowerCase()).concat(t(e),">")},closeTagString:function h(e){return"</".concat(e.tagName.toLowerCase(),">")},isFirstSibling:function u(e,t){void 0===t&&(t=!0);for(var n=e.previousSibling;n&&t&&a.node.hasClass(n,"fr-marker");)n=n.previousSibling;return!n||n.nodeType===Node.TEXT_NODE&&""===n.textContent&&u(n)},isLastSibling:function g(e,t){void 0===t&&(t=!0);for(var n=e.nextSibling;n&&t&&a.node.hasClass(n,"fr-marker");)n=n.nextSibling;return!n||n.nodeType===Node.TEXT_NODE&&""===n.textContent&&g(n)},isList:function C(e){return!!e&&0<=["UL","OL"].indexOf(e.tagName)},isLink:function m(e){return!!e&&e.nodeType===Node.ELEMENT_NODE&&"a"===e.tagName.toLowerCase()},isElement:r,contents:s,isVoid:function v(e){return e&&e.nodeType===Node.ELEMENT_NODE&&0<=V.VOID_ELEMENTS.indexOf((e.tagName||"").toLowerCase())},hasFocus:function b(e){return e===a.doc.activeElement&&(!a.doc.hasFocus||a.doc.hasFocus())&&Boolean(r(e)||e.type||e.href||~e.tabIndex)},isEditable:function L(e){return(!e.getAttribute||"false"!==e.getAttribute("contenteditable"))&&["STYLE","SCRIPT"].indexOf(e.tagName)<0},isDeletable:function E(e){return e&&e.nodeType===Node.ELEMENT_NODE&&e.getAttribute("class")&&0<=(e.getAttribute("class")||"").indexOf("fr-deletable")},hasClass:function y(e,t){return e instanceof n&&(e=e.get(0)),e&&e.classList&&e.classList.contains(t)},filter:function S(e){return a.browser.msie?e:{acceptNode:e}}}},Object.assign(V.DEFAULTS,{DOMPurify:window.DOMPurify,htmlAllowedTags:["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","br","button","canvas","caption","cite","code","col","colgroup","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meter","nav","noscript","object","ol","optgroup","option","output","p","param","pre","progress","queue","rp","rt","ruby","s","samp","script","style","section","select","small","source","span","strike","strong","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","var","video","wbr"],htmlRemoveTags:["script","style"],htmlAllowedAttrs:["accept","accept-charset","accesskey","action","align","allowfullscreen","allowtransparency","alt","async","autocomplete","autofocus","auto
679play","autosave","background","bgcolor","border","charset","cellpadding","cellspacing","checked","cite","class","color","cols","colspan","content","contenteditable","contextmenu","controls","coords","data","data-.*","datetime","default","defer","dir","dirname","disabled","download","draggable","dropzone","enctype","for","form","formaction","frameborder","headers","height","hidden","high","href","hreflang","http-equiv","icon","id","ismap","itemprop","keytype","kind","label","lang","language","list","loop","low","max","maxlength","media","method","min","mozallowfullscreen","multiple","muted","name","novalidate","open","optimum","pattern","ping","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","reversed","rows","rowspan","sandbox","scope","scoped","scrolling","seamless","selected","shape","size","sizes","span","src","srcdoc","srclang","srcset","start","step","summary","spellcheck","style","tabindex","target","title","type","translate","usemap","value","valign","webkitallowfullscreen","width","wrap"],htmlAllowedStyleProps:[".*"],htmlAllowComments:!0,htmlUntouched:!1,fullPage:!1}),V.HTML5Map={B:"STRONG",I:"EM",STRIKE:"S"},V.MODULES.clean=function(f){var d,p,h,u,g=f.$;function o(e){if(e.nodeType===Node.ELEMENT_NODE&&e.getAttribute("class")&&0<=e.getAttribute("class").indexOf("fr-marker"))return!1;var t,n=f.node.contents(e),r=[];for(t=0;t<n.length;t++)n[t].nodeType!==Node.ELEMENT_NODE||f.node.isVoid(n[t])?n[t].nodeType===Node.TEXT_NODE&&(n[t].textContent=n[t].textContent.replace(/\u200b/g,"")):n[t].textContent.replace(/\u200b/g,"").length!==n[t].textContent.length&&o(n[t]);if(e.nodeType===Node.ELEMENT_NODE&&!f.node.isVoid(e)&&(e.normalize(),n=f.node.contents(e),r=e.querySelectorAll(".fr-marker"),n.length-r.length==0)){for(t=0;t<n.length;t++)if(n[t].nodeType===Node.ELEMENT_NODE&&(n[t].getAttribute("class")||"").indexOf("fr-marker")<0)return!1;for(t=0;t<r.length;t++)e.parentNode.insertBefore(r[t].cloneNode(!0),e);return e.parentNode.removeChild(e),!1}}function s(e,t){if(e.nodeType===Node.COMMENT_NODE)return"\x3c!--".concat(e.nodeValue,"--\x3e");if(e.nodeType===Node.TEXT_NODE)return t?e.textContent.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"):e.textContent.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\u00A0/g,"&nbsp;").replace(/\u0009/g,"");if(e.nodeType!==Node.ELEMENT_NODE)return e.outerHTML;if(e.nodeType===Node.ELEMENT_NODE&&0<=["STYLE","SCRIPT","NOSCRIPT"].indexOf(e.tagName))return e.outerHTML;if(e.nodeType===Node.ELEMENT_NODE&&"svg"===e.tagName){var n=document.createElement("div"),r=e.cloneNode(!0);return n.appendChild(r),n.innerHTML}if("IFRAME"===e.tagName)return e.outerHTML.replace(/&lt;/g,"<").replace(/&gt;/g,">");var o=e.childNodes;if(0===o.length)return e.outerHTML;for(var i="",a=0;a<o.length;a++)"PRE"===e.tagName&&(t=!0),i+=s(o[a],t);return f.node.openTagString(e)+i+f.node.closeTagString(e)}var l=[];function C(e){var t=e.replace(/;;/gi,";");return";"!==(t=t.replace(/^;/gi,"")).charAt(t.length)&&(t+=";"),t}function c(e){var t;for(t in e)if(Object.prototype.hasOwnProperty.call(e,t)){var n=t.match(h),r=null;"style"===t&&f.opts.htmlAllowedStyleProps.length&&(r=e[t].match(u)),n&&r?e[t]=C(r.join(";")):n&&("style"!==t||r)||delete e[t]}for(var o="",i=Object.keys(e).sort(),a=0;a<i.length;a++)e[t=i[a]].indexOf('"')<0?o+=" ".concat(t,'="').concat(e[t],'"'):o+=" ".concat(t,"='").concat(e[t],"'");return o}function m(e,t){var n,r=document.implementation.createHTMLDocument("Froala DOC").createElement("DIV");g(r).append(e);var o="";if(r){var i=f.node.contents(r);for(n=0;n<i.length;n++)t(i[n]);for(i=f.node.contents(r),n=0;n<i.length;n++)o+=s(i[n])}return o}function v(e,t,n){var r=e=function i(e){return l=[],e=(e=(e=(e=e.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,function(e){return l.push(e),"[FROALA.EDITOR.SCRIPT ".concat(l.length-1,"]")})).replace(/<noscript\b[^<]*(?:(?!<\/noscript>)<[^<]*)*<\/noscript>/gi,function(e){return l.push(e),"[FROALA.EDITOR.NOSCRIPT ".concat(l.length-1,"]")})).replace(/<meta((?:[\w\W]*?)) http-equiv="/g,'<meta$1 data-fr-http-equiv="')).replace(/<img((?:[\w\W]*?)) src="/g,'<img$1 data-fr-src="')}(e),o=null;return f.opts.fullPage&&(r=f.html.extractNode(e,"body")||(0<=e.indexOf("<body")?"":e),n&&(o=f.html.extractNode(e,"head")||"")),r=m(r,t),o&&(o=m(o,t)),function a(e){return e=(e=(e=e.replace(/\[FROALA\.EDITOR\.SCRIPT ([\d]*)\]/gi,function(e,t){return 0<=f.opts.htmlRemoveTags.indexOf("script")?"":l[parseInt(t,10)]})).replace(/\[FROALA\.EDITOR\.NOSCRIPT ([\d]*)\]/gi,function(e,t){if(0<=f.opts.htmlRemoveTags.indexOf("noscript"))return"";var n=l[parseInt(t,10)].replace(/&lt;/g,"<").replace(/&gt;/g,">"),r=g(n);if(r&&r.length){var o=m(r.html(),L);r.html(o),n=r.get(0).outerHTML}return n})).replace(/<img((?:[\w\W]*?)) data-fr-src="/g,'<img$1 src="')}(function s(e,t,n){if(f.opts.fullPage){var r=f.html.extractDoctype(n),o=c(f.html.extractNodeAttrs(n,"html"));t=null===t?f.html.extractNode(n,"head")||"<title></title>":t;var i=c(f.html.extractNodeAttrs(n,"head")),a=c(f.html.extractNodeAttrs(n,"body"));return"".concat(r,"<html").concat(o,"><head").concat(i,">").concat(t,"</head><body").concat(a,">").concat(e,"</body></html>")}return e}(r,o,e))}function b(e){var t=f.doc.createElement("DIV");return t.innerText=e,t.textContent}function L(e){for(var t=f.node.contents(e),n=0;n<t.length;n++)t[n].nodeType!==Node.TEXT_NODE&&L(t[n]);!function c(a){if("SPAN"===a.tagName&&0<=(a.getAttribute("class")||"").indexOf("fr-marker"))return!1;if("PRE"===a.tagName&&function l(e){var t=e.innerHTML;0<=t.indexOf("\n")&&(e.innerHTML=t.replace(/\n/g,"<br>"))}(a),a.nodeType===Node.ELEMENT_NODE&&(a.getAttribute("data-fr-src")&&0!==a.getAttribute("data-fr-src").indexOf("blob:")&&a.setAttribute("data-fr-src",f.helpers.sanitizeURL(b(a.getAttribute("data-fr-src")))),a.getAttribute("href")&&a.setAttribute("href",f.helpers.sanitizeURL(b(a.getAttribute("href")))),a.getAttribute("src")&&a.setAttribute("src",f.helpers.sanitizeURL(b(a.getAttribute("src")))),a.getAttribute("srcdoc")&&a.setAttribute("srcdoc",f.clean.html(a.getAttribute("srcdoc"))),0<=["TABLE","TBODY","TFOOT","TR"].indexOf(a.tagName)&&(a.innerHTML=a.innerHTML.trim())),!f.opts.pasteAllowLocalImages&&a.nodeType===Node.ELEMENT_NODE&&"IMG"===a.tagName&&a.getAttribute("data-fr-src")&&0===a.getAttribute("data-fr-src").indexOf("file://"))return a.parentNode.removeChild(a),!1;if(a.nodeType===Node.ELEMENT_NODE&&V.HTML5Map[a.tagName]&&""===f.node.attributes(a)){var e=V.HTML5Map[a.tagName],t="<".concat(e,">").concat(a.innerHTML,"</").concat(e,">");a.insertAdjacentHTML("beforebegin",t),(a=a.previousSibling).parentNode.removeChild(a.nextSibling)}if(f.opts.htmlAllowComments||a.nodeType!==Node.COMMENT_NODE)if(a.tagName&&a.tagName.match(p))"STYLE"==a.tagName&&f.helpers.isMac()&&function(){var e,n=a.innerHTML.trim(),r
vendor: 5,175 bytes, line 679
679=[],t=/{([^}]+)}/g;for(n=n.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*|<!--[\s\S]*?-->$/,"");e=t.exec(n);)r.push(e[1]);for(var o=function o(t){var e=n.substring(0,n.indexOf("{")).trim();0==!/^[a-z_-][a-z\d_-]*$/i.test(e)&&a.parentNode.querySelectorAll(e).forEach(function(e){e.removeAttribute("class"),e.setAttribute("style",r[t])}),n=n.substring(n.indexOf("}")+1)},i=0;-1!=n.indexOf("{");i++)o(i)}(),a.parentNode.removeChild(a);else if(a.tagName&&!a.tagName.match(d))"svg"===a.tagName?a.parentNode.removeChild(a):f.browser.safari&&"path"===a.tagName&&a.parentNode&&"svg"===a.parentNode.tagName||(a.outerHTML=a.innerHTML);else{var n=a.attributes;if(n)for(var r=n.length-1;0<=r;r--){var o=n[r],i=o.nodeName.match(h),s=null;"style"===o.nodeName&&f.opts.htmlAllowedStyleProps.length&&(s=o.value.match(u)),i&&s?o.value=C(s.join(";")):i&&("style"!==o.nodeName||s)||a.removeAttribute(o.nodeName)}}else 0!==a.data.indexOf("[FROALA.EDITOR")&&a.parentNode.removeChild(a)}(e)}return{_init:function e(){f.opts.fullPage&&g.merge(f.opts.htmlAllowedTags,["head","title","style","link","base","body","html","meta"])},html:function E(e,t,n,r){void 0===t&&(t=[]),void 0===n&&(n=[]),void 0===r&&(r=!1);var o,i=g.merge([],f.opts.htmlAllowedTags);for(o=0;o<t.length;o++)0<=i.indexOf(t[o])&&i.splice(i.indexOf(t[o]),1);var a=g.merge([],f.opts.htmlAllowedAttrs);for(o=0;o<n.length;o++)0<=a.indexOf(n[o])&&a.splice(a.indexOf(n[o]),1);return a.push("data-fr-.*"),a.push("fr-.*"),d=new RegExp("^".concat(i.join("$|^"),"$"),"gi"),h=new RegExp("^".concat(a.join("$|^"),"$"),"gi"),p=new RegExp("^".concat(f.opts.htmlRemoveTags.join("$|^"),"$"),"gi"),u=f.opts.htmlAllowedStyleProps.length?new RegExp("((^|;|\\s)".concat(f.opts.htmlAllowedStyleProps.join(":.+?(?=;|$))|((^|;|\\s)"),":.+?(?=(;)|$))"),"gi"):null,e=v(e,L,!0),"undefined"!=typeof f.opts.DOMPurify&&(e=f.opts.DOMPurify.sanitize(e,{ADD_TAGS:f.opts.htmlAllowedTags,ALLOW_UNKNOWN_PROTOCOLS:!0})),e},toHTML5:function r(){var e=f.el.querySelectorAll(Object.keys(V.HTML5Map).join(","));if(e.length){var t=!1;f.el.querySelector(".fr-marker")||(f.selection.save(),t=!0);for(var n=0;n<e.length;n++)""===f.node.attributes(e[n])&&g(e[n]).replaceWith("<".concat(V.HTML5Map[e[n].tagName],">").concat(e[n].innerHTML,"</").concat(V.HTML5Map[e[n].tagName],">"));t&&f.selection.restore()}},tables:function t(){!function s(){for(var e=f.el.querySelectorAll("tr"),t=0;t<e.length;t++){for(var n=e[t].children,r=!0,o=0;o<n.length;o++)if("TH"!==n[o].tagName){r=!1;break}if(!1!==r&&0!==n.length){for(var i=e[t];i&&"TABLE"!==i.tagName&&"THEAD"!==i.tagName;)i=i.parentNode;var a=i;"THEAD"!==a.tagName&&(a=f.doc.createElement("THEAD"),i.insertBefore(a,i.firstChild)),a.appendChild(e[t])}}}()},lists:function y(){!function s(){var e,t=[];do{if(t.length){var n=t[0],r=f.doc.createElement("ul");n.parentNode.insertBefore(r,n);do{var o=n;n=n.nextSibling,r.appendChild(o)}while(n&&"LI"===n.tagName)}t=[];for(var i=f.el.querySelectorAll("li"),a=0;a<i.length;a++)e=i[a],f.node.isList(e.parentNode)||t.push(i[a])}while(0<t.length)}(),function i(){for(var e=f.el.querySelectorAll("ol + ol, ul + ul"),t=0;t<e.length;t++){var n=e[t];if(f.node.isList(n.previousSibling)&&f.node.openTagString(n)===f.node.openTagString(n.previousSibling)){for(var r=f.node.contents(n),o=0;o<r.length;o++)n.previousSibling.appendChild(r[o]);n.parentNode.removeChild(n)}}}(),function a(){for(var e=f.el.querySelectorAll("ul, ol"),t=0;t<e.length;t++)for(var n=f.node.contents(e[t]),r=null,o=n.length-1;0<=o;o--)!n[o].tagName&&f.opts.htmlUntouched||"LI"===n[o].tagName||"UL"==n[o].tagName||"OL"==n[o].tagName?r=null:"BR"==n[o].tagName?g(n[o]).remove():(r||(r=g(f.doc.createElement("LI"))).insertBefore(n[o]),r.prepend(n[o]))}(),function l(){var e,t,n;do{t=!1;var r=f.el.querySelectorAll("li:empty");for(e=0;e<r.length;e++)r[e].parentNode.removeChild(r[e]);var o=f.el.querySelectorAll("ul, ol");for(e=0;e<o.length;e++)(n=o[e]).querySelector("LI")||(t=!0,n.parentNode.removeChild(n))}while(!0===t)}(),function o(){for(var e=f.el.querySelectorAll("ul > ul, ol > ol, ul > ol, ol > ul"),t=0;t<e.length;t++){var n=e[t],r=n.previousSibling;r&&("LI"===r.tagName?r.appendChild(n):g(n).wrap("<li></li>"))}}(),function c(){for(var e=f.el.querySelectorAll("li > ul, li > ol"),t=0;t<e.length;t++){var n=e[t];if(n.nextSibling)for(var r=n.nextSibling;0<r.childNodes.length;)n.append(r.childNodes[0])}}(),function d(){for(var e=f.el.querySelectorAll("li > ul, li > ol"),t=0;t<e.length;t++){var n=e[t];if(f.node.isFirstSibling(n)&&"none"!=n.parentNode.style.listStyleType)g(n).before("<br/>");else if(n.previousSibling&&"BR"===n.previousSibling.tagName){for(var r=n.previousSibling.previousSibling;r&&f.node.hasClass(r,"fr-marker");)r=r.previousSibling;r&&"BR"!==r.tagName&&g(n.previousSibling).remove()}}}(),function n(){for(var e=f.el.querySelectorAll("li:empty"),t=0;t<e.length;t++)g(e[t]).remove()}()},invisibleSpaces:function n(e){return e.replace(/\u200b/g,"").length===e.length?e:f.clean.exec(e,o)},exec:v}},V.XS=0,V.SM=1,V.MD=2,V.LG=3;V.LinkRegExCommon="[".concat("a-z\\u0080-\\u009f\\u00a1-\\uffff0-9-_\\.","]{1,}"),V.LinkRegExEnd="((:[0-9]{1,5})|)(((\\/|\\?|#)[a-z\\u00a1-\\uffff0-9@?\\|!^=%&amp;\\/~+#-\\'*-_{}
679]*)|())",V.LinkRegExTLD="((".concat(V.LinkRegExCommon,")(\\.(com|net|org|edu|mil|gov|co|biz|info|me|dev)))"),V.LinkRegExHTTP="((ftp|http|https):\\/\\/".concat(V.LinkRegExCommon,")"),V.LinkRegExAuth="((ftp|http|https):\\/\\/[\\u0021-\\uffff]{1,}@".concat(V.LinkRegExCommon,")"),V.LinkRegExWWW="(www\\.".concat(V.LinkRegExCommon,"\\.[a-z0-9-]{2,24})"),V.LinkRegEx="(".concat(V.LinkRegExTLD,"|").concat(V.LinkRegExHTTP,"|").concat(V.LinkRegExWWW,"|").concat(V.LinkRegExAuth,")").concat(V.LinkRegExEnd),V.LinkProtocols=["mailto","tel","sms","notes","data"],V.MAIL_REGEX=/.+@.+\..+/i,V.MODULES.helpers=function(i){var a,s=i.$;function e(){var e={},t=function i(){var e,t=-1;return"Microsoft Internet Explorer"===navigator.appName?(e=navigator.userAgent,null!==new RegExp("MSIE ([0-9]{1,}[\\.0-9]{0,})").exec(e)&&(t=parseFloat(RegExp.$1))):"Netscape"===navigator.appName&&(e=navigator.userAgent,null!==new RegExp("Trident/.*rv:([0-9]{1,}[\\.0-9]{0,})").exec(e)&&(t=parseFloat(RegExp.$1))),t}();if(0<t)e.msie=!0;else{var n=navigator.userAgent.toLowerCase(),r=/(edge)[ /]([\w.]+)/.exec(n)||/(chrome)[ /]([\w.]+)/.exec(n)||/(webkit)[ /]([\w.]+)/.exec(n)||/(opera)(?:.*version|)[ /]([\w.]+)/.exec(n)||/(msie) ([\w.]+)/.exec(n)||n.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(n)||[],o=r[1]||"";r[2];r[1]&&(e[o]=!0),e.chrome?e.webkit=!0:e.webkit&&(e.safari=!0)}return e.msie&&(e.version=t),e}function t(){return/(iPad|iPhone|iPod)/g.test(navigator.userAgent)&&!o()}function n(){return/(Android)/g.test(navigator.userAgent)&&!o()}function r(){return/(Blackberry)/g.test(navigator.userAgent)}function o(){return/(Windows Phone)/gi.test(navigator.userAgent)}var l=null;return{_init:function c(){i.browser=e()},isIOS:t,isMac:function d(){return null===l&&(l=0<=navigator.platform.toUpperCase().indexOf("MAC")),l},isAndroid:n,isBlackberry:r,isWindowsPhone:o,isMobile:function f(){return n()||t()||r()},isEmail:function p(e){return!/^(https?:|ftps?:|)\/\//i.test(e)&&V.MAIL_REGEX.test(e)},requestAnimationFrame:function h(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)}},getPX:function u(e){return parseInt(e,10)||0},screenSize:function g(e){try{var t=0;if((t=e?i.$box.width():i.$sc.width())<768)return V.XS;if(768<=t&&t<992)return V.SM;if(992<=t&&t<1200)return V.MD;if(1200<=t)return V.LG}catch(n){return V.LG}},isTouch:function C(){return"ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch},sanitizeURL:function m(e){return i.opts.DOMPurify&&(e=i.opts.DOMPurify.sanitize(e,{ADD_TAGS:i.opts.htmlAllowedTags,ALLOW_UNKNOWN_PROTOCOLS:!0,ALLOWED_URI_REGEXP:/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|xxx):|[^a-z]|[a-z+.]+(?:[^a-z+.\-:]|$))/i})),/^(https?:|ftps?:|)\/\//i.test(e)?e:/^([A-Za-z]:(\\){1,2}|[A-Za-z]:((\\){1,2}[^\\]+)+)(\\)?$/i.test(e)?e:new RegExp("^(".concat(V.LinkProtocols.join("|"),"):"),"i").test(e)?e:e=encodeURIComponent(e).replace(/%23/g,"#").replace(/%2F/g,"/").replace(/%25/g,"%").replace(/mailto%3A/gi,"mailto:").replace(/file%3A/gi,"file:").replace(/sms%3A/gi,"sms:").replace(/tel%3A/gi,"tel:").replace(/notes%3A/gi,"notes:").replace(/data%3Aimage/gi,"data:image").replace(/blob%3A/gi,"blob:").replace(/%3A(\d)/gi,":$1").replace(/webkit-fake-url%3A/gi,"webkit-fake-url:").replace(/%3F/g,"?").replace(/%3D/g,"=").replace(/%26/g,"&").replace(/&amp;/g,"&").replace(/%2C/g,",").replace(/%3B/g,";").replace(/%2B/g,"+").replace(/%40/g,"@").replace(/%5B/g,"[").replace(/%5D/g,"]").replace(/%7B/g,"{").replace(/%7D/g,"}").replace(/%[0-1]+[0-9]+|%[0-1]+[A-F]+/g,"")},isArray:function v(e){return e&&!Object.prototype.propertyIsEnumerable.call(e,"length")&&"object"===M(e)&&"number"==typeof e.length},RGBToHex:function b(e){function t(e){return"0".concat(parseInt(e,10).toString(16)).slice(-2)}try{return e&&"transparent"!==e?/^#[0-9A-F]{6}$/i.test(e)?e:(e=e.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/),"#".concat(t(e[1])).concat(t(e[2])).concat(t(e[3])).toUpperCase()):""}catch(n){return null}},HEXtoRGB:function L(e){e=e.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,function(e,t,n,r){return t+t+n+n+r+r});var t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?"rgb(".concat(parseInt(t[1],16),", ").concat(parseInt(t[2],16),", ").concat(parseInt(t[3],16),")"):""},isURL:function E(e){return!!/^(https?:|ftps?:|)\/\//i.test(e)&&(e=String(e).replace(/</g,"%3C").replace(/>/g,"%3E").replace(/"/g,"%22").replace(/ /g,"%20"),new RegExp("^".concat(V.LinkRegExHTTP).concat(V.LinkRegExEnd,"$"),"gi").test(e))},getAlignment:function y(e){e.css||(e=s(e));var t=(e.css("text-align")||"").replace(/-(.*)-/g,"");if(["left","right","justify","center"].indexOf(t)<0){if(!a){var n=s('<div dir="'.concat("rtl"===i.opts.direction?"rtl":"auto",'" style="text-align: ').concat(i.$el.css("text-align"),'; position: fixed; left: -3000px;"><span id="s1">.</span><span id="s2">.</span></div>'));s("body").first().append(n);var r=n.find("#s1").get(0).getBoundingClientRect().left,o=n.find("#s2").get(0).getBoundingClientRect().left;n.remove(),a=r<o?"left":"right"}t=a}return t},scrollTop:function S(){return i.o_win.pageYOffset?i.o_win.pageYOffset:i.o_doc.documentElement&&i.o_doc.documentElement.scrollTop?i.o_doc.documentElement.scrollTop:i.o_doc.body.scrollTop?i.o_doc.body.scrollTop:0},scrollLeft:function N(){return i.o_win.pageXOffset?i.o_win.pageXOffset:i.o_doc.documentElement&&i.o_doc.documentElement.scrollLeft?i.o_doc.documentElement.scrollLeft:i.o_doc.body.scrollLeft?i.o_doc.body.scrollLeft:0},isInViewPort:function T(e){var t=e.getBoundingClientRect();return 0<=(t={top:Math.round(t.top),bottom:Math.round(t.bottom)}).top&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)||t.top<=0&&t.bottom>=(window.innerHeight||document.documentElement.clientHeight)}}},V.MODULES.events=function(l){var e,i=l.$,a={};
vendor: 4,247 bytes, line 679
679function s(e,t,n){C(e,t,n)}function c(e){if(void 0===e&&(e=!0),!l.$wp)return!1;if(l.helpers.isIOS()&&l.$win.get(0).focus(),l.core.hasFocus())return!1;if(!l.core.hasFocus()&&e){var t=l.$win.scrollTop();if(l.browser.msie&&l.$box&&l.$box.css("position","fixed"),l.browser.msie&&l.$wp&&l.$wp.css("overflow","visible"),l.browser.msie&&l.$sc&&l.$sc.css("position","fixed"),l.browser.msie||(p(),l.el.focus(),l.events.trigger("focus"),f()),l.browser.msie&&l.$sc&&l.$sc.css("position",""),l.browser.msie&&l.$box&&l.$box.css("position",""),l.browser.msie&&l.$wp&&l.$wp.css("overflow","auto"),t!==l.$win.scrollTop()&&l.$win.scrollTop(t),!l.selection.info(l.el).atStart)return!1}if(!l.core.hasFocus()||0<l.$el.find(".fr-marker").length)return!1;if(l.selection.info(l.el).atStart&&l.selection.isCollapsed()&&null!==l.html.defaultTag()){var n=l.markers.insert();if(n&&!l.node.blockParent(n)){i(n).remove();var r=l.$el.find(l.html.blockTagsQuery()).get(0);r&&(i(r).prepend(V.MARKERS),l.selection.restore())}else n&&i(n).remove()}}var d=!1;function f(){e=!0}function p(){e=!1}function h(){return e}function u(e,t,n){var r,o=e.split(" ");if(1<o.length){for(var i=0;i<o.length;i++)u(o[i],t,n);return!0}void 0===n&&(n=!1),r=0!==e.indexOf("shared.")?(a[e]=a[e]||[],a[e]):(l.shared._events[e]=l.shared._events[e]||[],l.shared._events[e]),n?r.unshift(t):r.push(t)}var g=[];function C(e,t,n,r,o){"function"==typeof n&&(o=r,r=n,n=!1);var i=o?l.shared.$_events:g,a=o?l.sid:l.id,s="".concat(t.trim().split(" ").join(".ed".concat(a," ")),".ed").concat(a);n?e.on(s,n,r):e.on(s,r),i.push([e,s])}function t(e){for(var t=0;t<e.length;t++)e[t][0].off(e[t][1])}function m(e,t,n){if(!l.edit.isDisabled()||n){var r,o;if(0!==e.indexOf("shared."))r=a[e];else{if(0<l.shared.count)return!1;r=l.shared._events[e]}if(r)for(var i=0;i<r.length;i++)if(!1===(o=r[i].apply(l,t)))return!1;return(!l.opts.events||!l.opts.events[e]||!1!==(o=l.opts.events[e].apply(l,t)))&&o}}function v(){for(var e in a)Object.prototype.hasOwnProperty.call(a,e)&&delete a[e]}function b(){for(var e in l.shared._events)Object.prototype.hasOwnProperty.call(l.shared._events,e)&&delete l.shared._events[e]}return{_init:function L(){l.shared.$_events=l.shared.$_events||[],l.shared._events={},function e(){l.helpers.isMobile()?(l._mousedown="touchstart",l._mouseup="touchend",l._move="touchmove",l._mousemove="touchmove"):(l._mousedown="mousedown",l._mouseup="mouseup",l._move="",l._mousemove="mousemove")}(),function t(){s(l.$el,"click mouseup mousemove mousedown touchstart touchend dragenter dragover dragleave dragend drop dragstart",function(e){m(e.type,[e])}),u("mousedown",function(){for(var e=0;e<V.INSTANCES.length;e++)V.INSTANCES[e]!==l&&V.INSTANCES[e].popups&&V.INSTANCES[e].popups.areVisible()&&V.INSTANCES[e].$el.find(".fr-marker").remove()})}(),function n(){s(l.$win,l._mousedown,function(e){m("window.mousedown",[e]),f()}),s(l.$win,l._mouseup,function(e){m("window.mouseup",[e])}),s(l.$win,"beforeinput cut copy keydown keyup touchmove touchend",function(e){m("window.".concat(e.type),[e])})}(),function r(){s(l.$doc,"dragend drop",function(e){m("document.".concat(e.type),[e])})}(),function o(){s(l.$el,"beforeinput keydown keypress keyup input",function(e){m(e.type,[e])})}(),function i(){s(l.$el,"focus",function(e){h()&&(c(!1),!1===d&&(m(e.type,[e]),l.helpers.isMobile()&&p()))}),s(l.$el,"blur",function(e){h()&&!0===d&&(m(e.type,[e]),l.helpers.isMobile()&&l.opts.toolbarContainer&&(l.shared.selected_editor=l.id),f())}),C(l.$el,"mousedown",'[contenteditable="true"]',function(){p(),l.$el.blur()}),u("focus",function(){d=!0}),u("blur",function(){d=!1})}(),f(),function a(){s(l.$el,"cut copy paste beforepaste",function(e){m(e.type,[e])})}(),u("destroy",v),u("shared.destroy",b)},on:u,trigger:m,bindClick:function r(e,t,n){C(e,l._mousedown,t,function(e){l.edit.isDisabled()||function n(e){var t=i(e.currentTarget);return l.edit.isDisabled()||l.node.hasClass(t.get(0),"fr-disabled")?(e.preventDefault(),!1):"mousedown"===e.type&&1!==e.which||(l.helpers.isMobile()||e.preventDefault(),(l.helpers.isAndroid()||l.helpers.isWindowsPhone())&&0===t.parents(".fr-dropdown-menu").length&&(e.preventDefault(),e.stopPropagation()),t.addClass("fr-selected"),void l.events.trigger("commands.mousedown",[t]))}(e)}
vendor: 5,064 bytes, line 679
679,!0),C(e,"".concat(l._mouseup," ").concat(l._move),t,function(e){l.edit.isDisabled()||function o(e,t){var n=i(e.currentTarget);if(l.edit.isDisabled()||l.node.hasClass(n.get(0),"fr-disabled"))return e.preventDefault(),!1;if("mouseup"===e.type&&1!==e.which)return!0;if(l.button.getButtons(".fr-selected",!0).get(0)==n.get(0)&&!l.node.hasClass(n.get(0),"fr-selected"))return!0;if("touchmove"!==e.type){if(e.stopPropagation(),e.stopImmediatePropagation(),e.preventDefault(),!l.node.hasClass(n.get(0),"fr-selected"))return l.button.getButtons(".fr-selected",!0).removeClass("fr-selected"),!1;if(l.button.getButtons(".fr-selected",!0).removeClass("fr-selected"),n.data("dragging")||n.attr("disabled"))return n.removeData("dragging"),!1;var r=n.data("timeout");r&&(clearTimeout(r),n.removeData("timeout")),t.apply(l,[e])}else n.data("timeout")||n.data("timeout",setTimeout(function(){n.data("dragging",!0)},100))}(e,n)},!0),C(e,"mousedown click mouseup",t,function(e){l.edit.isDisabled()||e.stopPropagation()},!0),u("window.mouseup",function(){l.edit.isDisabled()||(e.find(t).removeClass("fr-selected"),f())}),C(e,"mouseover",t,function(){i(this).hasClass("fr-options")&&i(this).prev(".fr-btn").addClass("fr-btn-hover"),i(this).next(".fr-btn").hasClass("fr-options")&&i(this).next(".fr-btn").addClass("fr-btn-hover")}),C(e,"mouseout",t,function(){i(this).hasClass("fr-options")&&i(this).prev(".fr-btn").removeClass("fr-btn-hover"),i(this).next(".fr-btn").hasClass("fr-options")&&i(this).next(".fr-btn").removeClass("fr-btn-hover")})},disableBlur:p,enableBlur:f,blurActive:h,focus:c,chainTrigger:function E(e,t,n){if(!l.edit.isDisabled()||n){var r,o;if(0!==e.indexOf("shared."))r=a[e];else{if(0<l.shared.count)return!1;r=l.shared._events[e]}if(r)for(var i=0;i<r.length;i++)void 0!==(o=r[i].apply(l,[t]))&&(t=o);return l.opts.events&&l.opts.events[e]&&void 0!==(o=l.opts.events[e].apply(l,[t]))&&(t=o),t}},$on:C,$off:function n(){t(g),g=[],0===l.shared.count&&(t(l.shared.$_events),l.shared.$_events=[])}}},Object.assign(V.DEFAULTS,{indentMargin:20}),V.COMMANDS={bold:{title:"Bold",toggle:!0,refresh:function(e){var t=this.format.is("strong");e.toggleClass("fr-active",t).attr("aria-pressed",t)}},italic:{title:"Italic",toggle:!0,refresh:function(e){var t=this.format.is("em");e.toggleClass("fr-active",t).attr("aria-pressed",t)}},underline:{title:"Underline",toggle:!0,refresh:function(e){var t=this.format.is("u");e.toggleClass("fr-active",t).attr("aria-pressed",t)}},strikeThrough:{title:"Strikethrough",toggle:!0,refresh:function(e){var t=this.format.is("s");e.toggleClass("fr-active",t).attr("aria-pressed",t)}},subscript:{title:"Subscript",toggle:!0,refresh:function(e){var t=this.format.is("sub");e.toggleClass("fr-active",t).attr("aria-pressed",t)}},superscript:{title:"Superscript",toggle:!0,refresh:function(e){var t=this.format.is("sup");e.toggleClass("fr-active",t).attr("aria-pressed",t)}},outdent:{title:"Decrease Indent"},indent:{title:"Increase Indent"},undo:{title:"Undo",undo:!1,forcedRefresh:!0,disabled:!0},redo:{title:"Redo",undo:!1,forcedRefresh:!0,disabled:!0},insertHR:{title:"Insert Horizontal Line"},clearFormatting:{title:"Clear Formatting"},selectAll:{title:"Select All",undo:!1},moreText:{title:"More Text",undo:!1},moreParagraph:{title:"More Paragraph",undo:!1},moreRich:{title:"More Rich",undo:!1},moreMisc:{title:"More Misc",undo:!1}},V.RegisterCommand=function(e,t){V.COMMANDS[e]=t},V.MODULES.commands=function(a){var s=a.$;function l(e){return a.html.defaultTag()&&(e="<".concat(a.html.defaultTag(),">").concat(e,"</").concat(a.html.defaultTag(),">")),e}var i={bold:function(){e("bold","strong")},subscript:function(){a.format.is("sup")&&a.format.remove("sup"),e("subscript","sub")},superscript:function(){a.format.is("sub")&&a.format.remove("sub"),e("superscript","sup")},italic:function(){e("italic","em")},strikeThrough:function(){e("strikeThrough","s")},underline:function(){e("underline","u")},undo:function(){a.undo.run()},redo:function(){a.undo.redo()},indent:function(){r(1)},outdent:function(){r(-1)},show:function(){a.opts.toolbarInline&&a.toolbar.showInline(null,!0)},insertHR:function(){a.selection.remove();var e="";a.core.isEmpty()&&(e=l(e="<br>"));var t='<hr id="fr-just" class="fr-just">'.concat(e);a.opts.trackChangesEnabled&&(t=a.track_changes.wrapInTracking(s(t),"hrWrapper").get(0).outerHTML);a.html.insert(t);var n,r=a.$el.find("hr#fr-just").length?a.$el.find("hr#fr-just"):a.$el.find(".fr-just");r.removeAttr("id"),r.removeAttr("class");var o=a.opts.trackChangesEnabled&&"SPAN"===r[0].parentNode.tagName&&"P"===r[0].parentNode.parentNode.tagName;if(0===r.next().length){var i=a.html.defaultTag();i&&!o?r.after(s(a.doc.createElement(i)).append("<br>").get(0)):o?r[0].parentNode.after(s(a.doc.createElement(i)).append("<br>").get(0)):r.after("<br>")}r.prev().is("hr")?n=a.selection.setAfter(r.get(0),!1):r.next().is("hr")?n=a.selection.setBefore(r.get(0),!1):o||a.selection.setAfter(r.get(0),!1)?a.selection.setAfter(r[0].parentNode,!1):a.selection.setBefore(r.get(0),!1),n||void 0===n||(e=l(e="".concat(V.MARKERS,"<br>
679")),r.after(e)),a.selection.restore()},clearFormatting:function(){a.format.remove()},selectAll:function(){a.doc.execCommand("selectAll",!1,!1)},moreText:function(e){t(e)},moreParagraph:function(e){t(e)},moreRich:function(e){t(e)},moreMisc:function(e){t(e)},moreTrackChanges:function(){t("trackChanges")}};function t(e){var t=a.$tb.find("[data-cmd=".concat(e,"]")),n=a.$tb.find("[data-cmd=html]");a.opts.trackChangesEnabled?n&&n.addClass("fr-disabled"):n&&n.removeClass("fr-disabled"),function r(n){a.helpers.isMobile()&&a.opts.toolbarInline&&a.events.disableBlur();var e=a.$tb.find('.fr-more-toolbar[data-name="'.concat(n.attr("data-group-name"),'"]'));"trackChanges"===n.data("cmd")&&(e=a.$tb.find('.fr-more-toolbar[data-name="'.concat(n.attr("id"),'"]')));if(a.$tb.find(".fr-open").not(n).not('[data-cmd="trackChanges"]').removeClass("fr-open"),n.toggleClass("fr-open"),a.$tb.find(".fr-more-toolbar").removeClass("fr-overflow-visible"),a.$tb.find(".fr-expanded").not(e).length){var t=a.$tb.find(".fr-expanded").not(e);t.each(function(e,t){0!=s(t).data("name").indexOf("trackChanges-")&&0!=s(t).data("name").indexOf("moreRich-")?s(t).toggleClass("fr-expanded"):n.parents('[data-name^="moreRich-"]').length||0==s(t).data("name").indexOf("trackChanges-")||s(t).find('[id^="trackChanges-"]').length&&a.opts.trackChangesEnabled||s(t).toggleClass("fr-expanded")}),e.toggleClass("fr-expanded")}else e.toggleClass("fr-expanded"),a.$box.toggleClass("fr-toolbar-open"),a.$tb.toggleClass("fr-toolbar-open")}(t),a.toolbar.setMoreToolbarsHeight()}function n(e,t){if(!(a.markdown&&a.markdown.isEnabled()&&("bold"===e||"italic"===e||"underline"===e)||a.opts.trackChangesEnabled&&"markdown"===e)&&!1!==a.events.trigger("commands.before",s.merge([e],t||[]))){var n=V.COMMANDS[e]&&V.COMMANDS[e].callback||i[e],r=!0,o=!1;V.COMMANDS[e]&&("undefined"!=typeof V.COMMANDS[e].focus&&(r=V.COMMANDS[e].focus),"undefined"!=typeof V.COMMANDS[e].accessibilityFocus&&(o=V.COMMANDS[e].accessibilityFocus)),(!a.core.hasFocus()&&r||!a.core.hasFocus()&&o&&a.accessibility.hasFocus())&&(a.el.focus({preventScroll:!0}),a.events.trigger("focus")),V.COMMANDS[e]&&!1!==V.COMMANDS[e].undo&&(a.$el.find(".fr-marker").length&&(a.events.disableBlur(),a.selection.restore()),a.undo.saveStep()),n&&n.apply(a,s.merge([e],t||[])),a.events.trigger("commands.after",s.merge([e],t||[])),V.COMMANDS[e]&&!1!==V.COMMANDS[e].undo&&a.undo.saveStep()}}function e(e,t){a.format.toggle(t)}function r(e){a.selection.save(),a.html.wrap(!0,!0,!0,!0),a.selection.restore();for(var t=a.selection.blocks(),n=0;n<t.length;n++)if("LI"!==t[n].tagName&&"LI"!=t[n].parentNode.tagName&&("LI"!==t[n].tagName||"LI"!==t[n].parentNode.tagName)){var r=s(t[n]);"LI"!=t[n].tagName&&"LI"==t[n].parentNode.tagName&&(r=s(t[n].parentNode));var o="rtl"===a.opts.direction||"rtl"===r.css("direction")?"margin-right":"margin-left",i=a.helpers.getPX(r.css(o));if(r.width()<2*a.opts.indentMargin&&0<e)continue;"UL"!=t[n].parentNode.tagName&&"OL"!=t[n].parentNode.tagName&&"LI"!=t[n].parentNode.tagName&&r.css(o,Math.max(i+e*a.opts.indentMargin,0)||""),r.removeClass("fr-temp-div")}a.selection.save(),a.html.unwrap(),a.selection.restore()}function o(e){return function(){n(e)}}var c={};for(var d in i)Object.prototype.hasOwnProperty.call(i,d)&&(c[d]=o(d));return Object.assign(c,{exec:n,_init:function f(){a.events.on("keydown",function(e){var t=a.selection.element();if(t&&"HR"===t.tagName&&!a.keys.isArrow(e.which))return e.preventDefault(),!1}),a.events.on("keyup",function(e){var t=a.selection.element();if(t&&"HR"===t.tagName)if(e.which===V.KEYCODE.ARROW_LEFT||e.which===V.KEYCODE.ARROW_UP){if(t.previousSibling)return a.node.isBlock(t.previousSibling)?a.selection.setAtEnd(t.previousSibling):s(t).before(V.MARKERS),a.selection.restore(),!1}else if((e.which===V.KEYCODE.ARROW_RIGHT||e.which===V.KEYCODE.ARROW_DOWN)&&t.nextSibling)return a.node.isBlock(t.nextSibling)?a.selection.setAtStart(t.nextSibling):s(t).after(V.MARKERS),a.selection.restore(),!1}),a.events.on("mousedown",function(e){if(e.target&&"HR"===e.target.tagName)return e.preventDefault(),e.stopPropagation(),!1}
vendor: 29,409 bytes, line 679
679),a.events.on("mouseup",function(){var e=a.selection.element();e===a.selection.endElement()&&e&&"HR"===e.tagName&&(e.nextSibling&&(a.node.isBlock(e.nextSibling)?a.selection.setAtStart(e.nextSibling):s(e).after(V.MARKERS)),a.selection.restore())})}})},V.MODULES.cursorLists=function(v){var b=v.$;function L(e){for(var t=e;"LI"!==t.tagName;)t=t.parentNode;return t}function E(e){for(var t=e;!v.node.isList(t);)t=t.parentNode;return t}function y(e){for(var t="",n=0;n<e.length;n++){var r=e[n];t+="".concat(r.name,"='").concat(r.value,"' ")}return t}return{_startEnter:function S(e){var t,n=L(e),r=n.nextSibling,o=n.previousSibling,i=v.html.defaultTag();if(v.node.isEmpty(n,!0)&&r){for(var a="",s="",l=e.parentNode;!v.node.isList(l)&&l.parentNode&&("LI"!==l.parentNode.tagName||l.parentNode===n);)-1<["OL","LI","UL"].indexOf(l.tagName)&&(a=v.node.openTagString(l)+a,s+=v.node.closeTagString(l)),l=l.parentNode;a=v.node.openTagString(l)+a,s+=v.node.closeTagString(l);var c="";if(l.parentNode&&"LI"===l.parentNode.tagName)if(l.parentNode.attributes.length){var d=y(l.parentNode.attributes);c="".concat(s,"<li ").concat(d,">").concat(V.MARKERS,"<br>").concat(a)}else c="".concat(s,"<li>").concat(V.MARKERS,"<br>").concat(a);else c=i?"".concat(s,"<").concat(i,">").concat(V.MARKERS,"<br></").concat(i,">").concat(a):"".concat(s+V.MARKERS,"<br>").concat(a);for(;["UL","OL"].indexOf(l.tagName)<0||l.parentNode&&"LI"===l.parentNode.tagName;)l=l.parentNode;b(n).replaceWith('<span id="fr-break"></span>');var f=v.node.openTagString(l)+b(l).html()+v.node.closeTagString(l);f=f.replace(/<span id="fr-break"><\/span>/g,c),b(l).replaceWith(f),v.$el.find("li:empty").remove(),v.$el.find("li > p > span:empty").length&&v.$el.find("li > p > span:empty")[0].parentNode.parentNode.remove()}else if(o&&r||!v.node.isEmpty(n,!0)){var p="<br>",h=e.parentNode;for(h&&"A"===h.tagName&&(h=null);h&&"LI"!==h.tagName;)p=v.node.openTagString(h)+p+v.node.closeTagString(h),h=h.parentNode;if(h&&h.attributes.length){var u=y(h.attributes);b(n).before("<li ".concat(u,">").concat(p,"</li>"))}else b(n).before("<li>".concat(p,"</li>"));b(e).remove()}else if(o){t=E(n);for(var g="".concat(V.MARKERS,"<br>"),C=e.parentNode;C&&"LI"!==C.tagName;)g=v.node.openTagString(C)+g+v.node.closeTagString(C),C=C.parentNode;if(t.parentNode&&"LI"===t.parentNode.tagName)if(t.parentNode.attributes.length){var m=y(t.parentNode.attributes);b(t.parentNode).after("<li ".concat(m,">").concat(g,"</li>"))}else b(t.parentNode).after("<li>".concat(g,"</li>"));else i?b(t).after("<".concat(i,">").concat(g,"</").concat(i,">")):b(t).after(g);b(n).remove()}else(t=E(n)).parentNode&&"LI"===t.parentNode.tagName?r?b(t.parentNode).before("".concat(v.node.openTagString(n)+V.MARKERS,"<br></li>")):b(t.parentNode).after("".concat(v.node.openTagString(n)+V.MARKERS,"<br></li>")):i?b(t).before("<".concat(i,">").concat(V.MARKERS,"<br></").concat(i,">")):b(t).before("".concat(V.MARKERS,"<br>")),b(n).remove()},_middleEnter:function c(e){for(var t=L(e),n="",r=e,o="",i="",a=!1;r!==t;){var s="A"===(r=r.parentNode).tagName&&v.cursor.isAtEnd(e,r)?"fr-to-remove":"";a||r==t||v.node.isBlock(r)||(a=!0,o+=V.INVISIBLE_SPACE),o=v.node.openTagString(b(r).clone().addClass(s).get(0))+o,i+=v.node.closeTagString(r)}n=i+n+o+V.MARKERS+(v.opts.keepFormatOnDelete?V.INVISIBLE_SPACE:""),b(e).replaceWith('<span id="fr-break"></span>');var l=v.node.openTagString(t)+b(t).html()+v.node.closeTagString(t);l=l.replace(/<span id="fr-break"><\/span>/g,n),b(t).replaceWith(l)},_endEnter:function l(e){for(var t=L(e),n=V.MARKERS,r="",o=e,i=!1;o!==t;)if(!(o=o.parentNode).classList.contains("fr-img-space-wrap")&&!o.classList.contains("fr-img-space-wrap2")){var a="A"===o.tagName&&v.cursor.isAtEnd(e,o)?"fr-to-remove":"";i||o===t||v.node.isBlock(o)||(i=!0,r+=V.INVISIBLE_SPACE),r=v.node.openTagString(b(o).clone().addClass(a).get(0))+r,n+=v.node.closeTagString(o)}var s=r+n;b(e).remove(),b(t).after(s)},_backspace:function d(e){var t=L(e),n=t.previousSibling;if(n){n=b(n).find(v.html.blockTagsQuery()).get(-1)||n,b(e).replaceWith(V.MARKERS);var r=v.node.contents(n);r.length&&"BR"===r[r.length-1].tagName&&b(r[r.length-1]).remove(),b(t).find(v.html.blockTagsQuery()).not("ol, ul, table").each(function(){this.parentNode===t&&b(this).replaceWith(b(this).html()+(v.node.isEmpty(this)?"":"<br>"))});for(var o,i=v.node.contents(t)[0];i&&!v.node.isList(i);)o=i.nextSibling,b(n).append(i),i=o;for(n=t.previousSibling;i;)o=i.nextSibling,b(n).append(i),i=o;1<(r=v.node.contents(n)).length&&"BR"===r[r.length-1].tagName&&b(r[r.length-1]).remove(),b(t).remove()}else{var a=E(t);if(b(e).replaceWith(V.MARKERS),a.parentNode&&"LI"===a.parentNode.tagName){var s=a.previousSibling;v.node.isBlock(s)?(b(t).find(v.html.blockTagsQuery()).not("ol, ul, table").each(function(){this.parentNode===t&&b(this).replaceWith(b(this).html()+(v.node.isEmpty(this)?"":"<br>"))}),b(s).append(b(t).html())):b(a).before(b(t).html())}else{var l=v.html.defaultTag();l&&0===b(t).find(v.html.blockTagsQuery()).length?b(a).before("<".concat(l,">").concat(b(t).html(),"</").concat(l,">")):b(a).before(b(t).html())}b(t).remove(),v.html.wrap(),0===b(a).find("li").length&&b(a).remove()}},_del:function f(e){var t,n=L(e),r=n.nextSibling;if(r){(t=v.node.contents(r)).length&&"BR"===t[0].tagName&&b(t[0]).remove(),b(r).find(v.html.blockTagsQuery()).not("ol, ul, table").each(function(){this.parentNode===r&&b(this).replaceWith(b(this).html()+(v.node.isEmpty(this)?"":"<br>"))});for(var o,i=e,a=v.node.contents(r)[0];a&&!v.node.isList(a);)o=a.nextSibling,b(i).after(a),i=a,a=o;for(;a;)o=a.nextSibling,b(n).append(a),a=o;b(e).replaceWith(V.MARKERS),b(r).remove()}else{for(var s=n;!s.nextSibling&&s!==v.el;)s=s.parentNode;if(s===v.el)return!1;if(s=s.nextSibling,v.node.isBlock(s)){if(V.NO_DELETE_TAGS.indexOf(s.tagName)<0){if(b(e).replaceWith(V.MARKERS),(t=v.node.contents(n)).length&&"BR"===t[t.length-1].tagName&&b(t[t.length-1]).remove(),s.isContentEditable&&"DIV"===s.tagName&&(!v.node.isBlock(s.previousSibling)||"DIV"===s.previousSibling.tagName))return;b(n).append(b(s).html()),b(s).remove()}}else{for((t=v.node.contents(n)).length&&"BR"===t[t.length-1].tagName&&b(t[t.length-1]).remove(),b(e).replaceWith(V.MARKERS);s&&!v.node.isBlock(s)&&"BR"!==s.tagName;)b(n).append(b(s)),s=s.nextSibling;b(s).remove()}}}}},V.NO_DELETE_TAGS=["TH","TD","TR","TABLE","FORM"],V.SIMPLE_ENTER_TAGS=["TH","TD","LI","DL","DT","FORM"],V.MODULES.cursor=function(g){var C=g.$;function h(e){return!!e&&(g.node.isBlock(e)?"P"!==e.tagName||!e.nextElementSibling||!e.parentElement||"OL"!==e.nextElementSibling.tagName||"LI"!==e.parentElement.tagName:e.nextSibling&&e.nextSibling.nodeType===Node.TEXT_NODE&&0===e.nextSibling.textContent.replace(/\u200b/g,"").length?h(e.nextSibling):!(e.nextSibling&&(!e.previousSibling||"BR"!==e.nextSibling.tagName||e.nextSibling.nextSibling))&&h(e.parentNode))}function u(e){return!!e&&(!!g.node.isBlock(e)||(e.previousSibling&&e.previousSibling.nodeType===Node.TEXT_NODE&&0===e.previousSibling.textContent.replace(/\u200b/g,"").length?u(e.previousSibling):!e.previousSibling&&(!(e.previousSibling||!g.node.hasClass(e.parentNode,"fr-inner"))||u(e.parentNode))))}function m(e,t){return!!e&&(e!==g.$wp.get(0)&&(e.previousSibling&&e.previousSibling.nodeType===Node.TEXT_NODE&&0===e.previousSibling.textContent.replace(/\u200b/g,"").length?m(e.previousSibling,t):!e.previousSibling&&(e.parentNode===t||m(e.parentNode,t))))}function v(e,t){return!!e&&(e!==g.$wp.get(0)&&(e.nextSibling&&e.nextSibling.nodeType===Node.TEXT_NODE&&0===e.nextSibling.textContent.replace(/\u200b/g,"").length?v(e.nextSibling,t):!(e.nextSibling&&(!e.previousSibling||"BR"!==e.nextSibling.tagName||e.nextSibling.nextSibling))&&(e.parentNode===t||v(e.parentNode,t))))}function b(e){return 0<C(e).parentsUntil(g.$el,"LI").length&&0===C(e).parentsUntil("LI","TABLE").length}function L(e,t){var n=new RegExp("".concat(t?"^":"","(([\\uD83C-\\uDBFF\\uDC00-\\uDFFF]+\\u200D)*[\\uD83C-\\uDBFF\\uDC00-\\uDFFF]{2})").concat(t?"":"$"),"i"),r=e.match(n);return r?r[0].length:1}function E(e){for(var t,n=e;!n.previousSibling;)if(n=n.parentNode,g.node.isElement(n))return!1;n=n.previousSibling;var r=g.opts.htmlAllowedEmptyTags,o=n.tagName&&n.tagName.toLowerCase();if((!g.node.isBlock(n)||n.lastChild&&o&&0<=r.indexOf(o))&&g.node.isEditable(n)){for(t=g.node.contents(n);n.nodeType!==Node.TEXT_NODE&&!g.node.isDeletable(n)&&t.length&&g.node.isEditable(n);)n=t[t.length-1],t=g.node.contents(n);if(n.nodeType===Node.TEXT_NODE){var i=n.textContent,a=i.length;if(i.length&&"\n"===i[i.length-1])return n.textContent=i.substring(0,a-2),0===n.textContent.length&&n.parentNode.removeChild(n),E(e);if(g.opts.tabSpaces&&i.length>=g.opts.tabSpaces)0===i.substr(i.length-g.opts.tabSpaces,i.length-1).replace(/ /g,"").replace(new RegExp(V.UNICODE_NBSP,"g"),"").length&&(a=i.length-g.opts.tabSpaces+1);n.textContent=i.substring(0,a-L(i));var s=n.textContent;(g.opts.enter===V.ENTER_BR&&0<s.length&&" "===s.charAt(s.length-1)||0===s.length&&e.previousSibling&&3===e.previousSibling.nodeType&&"TD"!==e.parentNode.tagName&&"LI"!==e.parentNode.tagName&&i!==String.fromCharCode(8203))&&(e.insertAdjacentHTML("beforebegin",V.INVISIBLE_SPACE),n=n.nextSibling),g.opts.trackChangesEnabled&&0===n.textContent.length&&C(n.parentElement).data("tracking")&&0===C(n.parentElement).find("[data-tracking-deleted=true]").length&&(C(e).insertBefore(n.parentElement),C(n.parentElement).remove(),n=C(e)[0].previousSibling),g.opts.htmlUntouched&&!e.nextSibling&&n.textContent.length&&" "===n.textContent[n.textContent.length-1]&&(n.textContent=n.textContent.substring(0,n.textContent.length-1)+V.UNICODE_NBSP);var l=i.length!==n.textContent.length;if(g.opts.enter!==V.ENTER_BR&&n&&n.previousSibling&&n.previousSibling.previousSibling&&"BR"===n.previousSibling.previousSibling.tagName&&0===n.textContent.length&&n.previousSibling.previousSibling.remove(),0===n.textContent.length&&"LI"===n.parentNode.tagName&&n.previousSibling&&"BR"===n.previousSibling.tagName&&n.previousSibling.remove(),0===n.textContent.length)if(l&&g.opts.keepFormatOnDelete)C(n).after(V.INVISIBLE_SPACE+V.MARKERS);else if(0!==i.length&&g.node.isBlock(n.parentNode))C(n).after(V.MARKERS);else if((2!=n.parentNode.childNodes.length||n.parentNode!=e.parentNode)&&1!=n.parentNode.childNodes.length||g.node.isBlock(n.parentNode)||g.node.isElement(n.parentNode)||!g.node.isDeletable(n.parentNode)){for(var c,d=n;!g.node.isElement(n.parentNode)&&g.node.isEmpty(n.parentNode)&&V.NO_DELETE_TAGS.indexOf(n.parentNode.tagName)<0;)if("A"===(n=n.parentNode).tagName){var f=n.childNodes[0];for(C(n).before(f),c=!0;0<f.childNodes.length;)f=f.childNodes[0];n.parentNode.removeChild(n),n=f;break}c||(n=d),C(n).after(V.MARKERS),g.node.isElement(n.parentNode)&&!e.nextSibling&&n.previousSibling&&"BR"===n.previousSibling.tagName&&C(e).after("<br>");var p=n.parentNode;n.parentNode.removeChild(n),g.node.isEmpty(p)&&C(p).html(V.INVISIBLE_SPACE+V.MARKERS)}else C(n.parentNode).after(V.MARKERS),C(n.parentNode).remove();else C(n).after(V.MARKERS)}else g.node.isDeletable(n)?(C(n).after(V.MARKERS),C(n).remove()):e.nextSibling&&"BR"===e.nextSibling.tagName&&g.node.isVoid(n)&&"BR"!==n.tagName?(C(e.nextSibling).remove(),C(e).replaceWith(V.MARKERS)):!1!==g.events.trigger("node.remove",[C(n)])&&(C(n).after(V.MARKERS),C(n).remove())}else if(V.NO_DELETE_TAGS.indexOf(n.tagName)<0&&(g.node.isEditable(n)||g.node.isDeletable(n)))if(g.node.isDeletable(n))C(e).replaceWith(V.MARKERS),C(n).remove();else if(g.node.isEmpty(n)&&!g.node.isList(n))C(n).remove(),C(e).replaceWith(V.MARKERS);else{for(g.node.isList(n)&&(n=C(n).find("li").last().get(0)),(t=g.node.contents(n))&&0<t.length&&"BR"===t[t.length-1].tagName&&C(t[t.length-1]).remove(),t=g.node.contents(n);t&&0<t.length&&g.node.isBlock(t[t.length-1]);)n=t[t.length-1],t=g.node.contents(n);C(n).append(V.MARKERS);for(var h=e;!h.previousSibling;)h=h.parentNode;for(;h&&"BR"!==h.tagName&&!g.node.isBlock(h);){var u=h;h=h.nextSibling,C(n).append(u)}h&&"BR"===h.tagName&&C(h).remove(),C(e).remove()}else e.nextSibling&&"BR"===e.nextSibling.tagName&&C(e.nextSibling).remove();return!0}function i(e){var t=0<C(e).parentsUntil(g.$el,"BLOCKQUOTE").length,n=g.node.deepestParent(e,[],!t);if(n&&"BLOCKQUOTE"===n.tagName){var r=g.node.deepestParent(e,[C(e).parentsUntil(g.$el,"BLOCKQUOTE").get(0)]);r&&r.nextSibling&&(n=r)}if(null!==n){var o,i=n.nextSibling;if(g.node.isBlock(n)&&(g.node.isEditable(n)||g.node.isDeletable(n))&&i&&V.NO_DELETE_TAGS.indexOf(i.tagName)<0)if(g.node.isDeletable(i))C(i).remove(),C(e).replaceWith(V.MARKERS);else if(g.node.isBlock(i)&&g.node.isEditable(i))if(g.node.isList(i))if(g.node.isEmpty(n,!0))C(n).remove(),C(i).find("li").first().prepend(V.MARKERS);else{var a=C(i).find("li").first();"BLOCKQUOTE"===n.tagName&&(o=g.node.contents(n)).length&&g.node.isBlock(o[o.length-1])&&(n=o[o.length-1]),0===a.find("ul, ol").length&&(C(e).replaceWith(V.MARKERS),a.find(g.html.blockTagsQuery()).not("ol, ul, table").each(function(){this.parentNode===a.get(0)&&C(this).replaceWith(C(this).html()+(g.node.isEmpty(this)?"":"<br>"))}),C(n).append(g.node.contents(a.get(0))),a.remove(),0===C(i).find("li").length&&C(i).remove())}else{if((o=g.node.contents(i)).length&&"BR"===o[0].tagName&&C(o[0]).remove(),"BLOCKQUOTE"!==i.tagName&&"BLOCKQUOTE"===n.tagName)for(o=g.node.contents(n);o.length&&g.node.isBlock(o[o.length-1]);)n=o[o.length-1],o=g.node.contents(n);else if("BLOCKQUOTE"===i.tagName&&"BLOCKQUOTE"!==n.tagName)for(o=g.node.contents(i);o.length&&g.node.isBlock(o[0]);)i=o[0],o=g.node.contents(i);C(e).replaceWith(V.MARKERS),C(n).append(i.innerHTML),C(i).remove()}else{for(C(e).replaceWith(V.MARKERS);i&&"BR"!==i.tagName&&!g.node.isBlock(i)&&g.node.isEditable(i);){var s=i;i=i.nextSibling,C(n).append(s)}i&&"BR"===i.tagName&&g.node.isEditable(i)&&C(i).remove()}}}function n(e){for(var t,n=e;!n.nextSibling;)if(n=n.parentNode,g.node.isElement(n))return!1;if("BR"===(n=n.nextSibling).tagName&&g.node.isEditable(n))if(n.nextSibling){if(g.node.isBlock(n.nextSibling)&&g.node.isEditable(n.nextSibling)){if(!(V.NO_DELETE_TAGS.indexOf(n.nextSibling.tagName)<0))return void C(n).remove();n=n.nextSibling,C(n.previousSibling).remove()}}else if(h(n)){if(b(e))g.cursorLists._del(e);else g.node.deepestParent(n)&&((!g.node.isEmpty(g.node.blockParent(n))||(g.node.blockParent(n).nextSibling&&V.NO_DELETE_TAGS.indexOf(g.node.blockParent(n).nextSibling.tagName))<0)&&C(n).remove(),n&&n.parentNode&&8203===n.parentNode.textContent.charCodeAt()&&n.parentNode.childNodes[1]&&"BR"===n.parentNode.childNodes[1].tagName&&n.parentNode.tagName.toLowerCase()===g.html.defaultTag()&&n.parentNode.nextSibling&&"TABLE"===n.parentNode.nextSibling.tagName&&C(n.parentNode).remove(),i(e));return}if(!g.node.isBlock(n)&&g.node.isEditable(n)){for(t=g.node.contents(n);n.nodeType!==Node.TEXT_NODE&&t.length&&!g.node.isDeletable(n)&&g.node.isEditable(n);)n=t[0],t=g.node.contents(n);n.nodeType===Node.TEXT_NODE?(C(n).before(V.MARKERS),n.textContent.length&&(n.textContent=n.textContent.substring(L(n.textContent,!0),n.textContent.length))):g.node.isDeletable(n)?(C(n).before(V.MARKERS),C(n).remove()):!1!==g.events.trigger("node.remove",[C(n)])&&(C(n).before(V.MARKERS),C(n).remove()),C(e).remove()}else if(V.NO_DELETE_TAGS.indexOf(n.tagName)<0&&(g.node.isEditable(n)||g.node.isDeletable(n)))if(g.node.isDeletable(n))C(e).replaceWith(V.MARKERS),C(n).remove();else if(g.node.isList(n))e.previousSibling?(C(n).find("li").first().prepend(e),g.cursorLists._backspace(e)):(C(n).find("li").first().prepend(V.MARKERS),C(e).remove());else if((t=g.node.contents(n))&&0<t.length&&"BR"===t[0].tagName&&C(t[0]).remove(),t&&0<t.length&&"BLOCKQUOTE"===n.tagName){var r=t[0];for(C(e).before(V.MARKERS);r&&"BR"!==r.tagName;){var o=r;r=r.nextSibling,C(e).before(o)}r&&"BR"===r.tagName&&C(r).remove()}else C(e).after(C(n).html()).after(V.MARKERS),C(n).remove()}function a(){for(var e=g.el.querySelectorAll("blockquote:empty"),t=0;t<e.length;t++)e[t].parentNode.removeChild(e[t])}function y(e,t,n){var r,o=g.node.deepestParent(e,[],!n);if(o&&"BLOCKQUOTE"===o.tagName)return v(e,o)?(r=g.html.defaultTag(),t?C(e).replaceWith("<br>"+V.MARKERS):r?C(o).after("<".concat(r,">").concat(V.MARKERS,"<br></").concat(r,">")):C(o).after("".concat(V.MARKERS,"<br>")),C(e).remove()):S(e,t,n),!1;if(null===o)(r=g.html.defaultTag())&&g.node.isElement(e.parentNode)?C(e).replaceWith("<".concat(r,">").concat(V.MARKERS,"<br></").concat(r,">")):!e.previousSibling||C(e.previousSibling).is("br")||e.nextSibling?C(e).replaceWith("<br>".concat(V.MARKERS)):C(e).replaceWith("<br>".concat(V.MARKERS,"<br>"));else{var i=e,a="";"PRE"!=o.tagName||e.nextSibling||(t=!0),g.node.isBlock(o)&&!t||(a="<br/>");var s,l="",c="",d="",f="";(r=g.html.defaultTag())&&g.node.isBlock(o)&&(d="<".concat(r,">"),f="</".concat(r,">"),o.tagName===r.toUpperCase()&&(d=g.node.openTagString(C(o).clone().removeAttr("id").get(0))));do{if(i=i.parentNode,!t||i!==o||t&&!g.node.isBlock(o))if(l+=g.node.closeTagString(i),i===o&&g.node.isBlock(o))c=d+c;else{var p=("A"===i.tagName||g.node.hasClass(i,"fa"))&&v(e,i)?"fr-to-remove":"";c="isPasted"===i.getAttribute("id")?g.node.openTagString(C(i).clone().attr("style","").addClass(p).get(0))+c:g.node.openTagString(C(i).clone().addClass(p).get(0))+c}}while(i!==o);a=l+a+c+(e.parentNode===o&&g.node.isBlock(o)?"":V.INVISIBLE_SPACE)+V.MARKERS,g.node.isBlock(o)&&!C(o).find("*").last().is("br")&&C(o).append("<br/>"),C(e).after('<span id="fr-break"></span>'),C(e).remove(),o.nextSibling&&!g.node.isBlock(o.nextSibling)||g.node.isBlock(o)||C(o).after("<br>"),s=(s=!t&&g.node.isBlock(o)?g.node.openTagString(o)+C(o).html()+f:g.node.openTagString(o)+C(o).html()+g.node.closeTagString(o)).replace(/<span id="fr-break"><\/span>/g,a),C(o).replaceWith(s)}}function S(e,t,n){var r=g.node.deepestParent(e,[],!n);if(null===r)g.html.defaultTag()&&e.parentNode===g.el?C(e).replaceWith("<".concat(g.html.defaultTag(),">").concat(V.MARKERS,"<br></").concat(g.html.defaultTag(),">")):(e.nextSibling&&!g.node.isBlock(e.nextSibling)||C(e).after("<br>"),C(e).replaceWith("<br>".concat(V.MARKERS)));else if(e.previousSibling&&"IMG"==e.previousSibling.tagName||e.nextSibling&&"IMG"==e.nextSibling.tagName)C(e).replaceWith("<"+g.html.defaultTag()+">"+V.MARKERS+"<br></"+g.html.defaultTag()+">");else{var o=e,i="";"PRE"===r.tagName&&(t=!0),g.node.isBlock(r)&&!t||(i="<br>");var a="",s="";do{var l=o;if(o=o.parentNode,"BLOCKQUOTE"===r.tagName&&g.node.isEmpty(l)&&!g.node.hasClass(l,"fr-marker")&&C(l).contains(e)&&C(l).after(e),"BLOCKQUOTE"!==r.tagName||!v(e,o)&&!m(e,o))if(!t||o!==r||t&&!g.node.isBlock(r)){a+=g.node.closeTagString(o);var c="A"==o.tagName&&v(e,o)||g.node.hasClass(o,"fa")?"fr-to-remove":"";s=g.node.openTagString(C(o).clone().addClass(c).removeAttr("id").get(0))+s,g.opts.enter!==V.ENTER_DIV&&o===r&&"DIV"===r.tagName&&(a="<br>",s="")}else"BLOCKQUOTE"==r.tagName&&t&&(s=a="")}while(o!==r);var d=r===e.parentNode&&g.node.isBlock(r)||e.nextSibling;if("BLOCKQUOTE"===r.tagName)if(e.previousSibling&&g.node.isBlock(e.previousSibling)&&e.nextSibling&&"BR"===e.nextSibling.tagName&&(C(e.nextSibling).after(e),e.nextSibling&&"BR"===e.nextSibling.tagName&&C(e.nextSibling).remove()),t)i=a+i+V.MARKERS+s;else{var f=g.html.defaultTag();i="".concat(a+i+(f?"<".concat(f,">"):"")+V.MARKERS,"<br>").concat(f?"</".concat(f,">"):"").concat(s)}else i=a+i+s+(d?"":V.INVISIBLE_SPACE)+V.MARKERS;C(e).replaceWith('<span id="fr-break"></span>');var p=g.node.openTagString(r)+C(r).html()+g.node.closeTagString(r);p=p.replace(/<span id="fr-break"><\/span>/g,i),C(r).replaceWith(p)}}function N(e){var t=e.getBoundingClientRect(),n=window.pageXOffset||document.documentElement.scrollLeft,r=window.pageYOffset||document.documentElement.scrollTop;return{top:t.top+r,left:t.left+n}}function T(){var e=g.selection.get(),t=null;if(g.selection.inEditor()&&e.rangeCount)for(var n=g.selection.ranges(),r=0;r<n.length;r++){var o=n[r];t=g.selection.rangeElement(o.startContainer,o.startOffset);break}return t}return{enter:function M(e){var t=g.markers.insert();if(!t)return!0;for(var n=t.parentNode;n&&!g.node.isElement(n);){if("false"===n.getAttribute("contenteditable"))return C(t).replaceWith(V.MARKERS),g.selection.restore(),!1;if("true"===n.getAttribute("contenteditable"))break;n=n.parentNode}g.el.normalize();var r=!1;0<C(t).parentsUntil(g.$el,"BLOCKQUOTE").length&&(r=!0),C(t).parentsUntil(g.$el,"TD, TH").length&&(r=!1),h(t)?!b(t)||e||r?y(t,e,r):g.cursorLists._endEnter(t):u(t)?!b(t)||e||r?function f(e,t,n){var r,o=g.node.deepestParent(e,[],!n);if(o&&"TABLE"===o.tagName)return C(o).find("td, th").first().prepend(e),f(e,t,n);if(o&&"BLOCKQUOTE"===o.tagName)if(m(e,o)){if(!t)return(r=g.html.defaultTag())?C(o).before("<".concat(r,">").concat(V.MARKERS,"<br></").concat(r,">")):C(o).before("".concat(V.MARKERS,"<br>")),C(e).remove(),!1}else v(e,o)?y(e,t,!0):S(e,t,!0);if(null===o)(r=g.html.defaultTag())&&g.node.isElement(e.parentNode)?C(e).replaceWith("<".concat(r,">").concat(V.MARKERS,"<br></").concat(r,">")):C(e).replaceWith("<br>".concat(V.MARKERS));else{if(r=g.html.defaultTag(),g.node.isBlock(o))if("PRE"===o.tagName&&(t=!0),t)C(e).remove(),C(o).prepend("<br>".concat(V.MARKERS));else if(e.nextSibling&&"IMG"==e.nextSibling.tagName||e.nextSibling&&e.nextSibling.nextElementSibling&&"IMG"==e.nextSibling.nextElementSibling)C(e).replaceWith("<"+g.html.defaultTag()+">"+V.MARKERS+"<br></"+g.html.defaultTag()+">");else{if(g.node.isEmpty(o,!0))return y(e,t,n);if(g.opts.keepFormatOnDelete||"DIV"===o.tagName||"div"===g.html.defaultTag())if(!g.opts.keepFormatOnDelete&&"DIV"===o.tagName||"div"===g.html.defaultTag())C(o).before("<"+g.html.defaultTag()+"><br></"+g.html.defaultTag()+">");else if(g.opts.keepFormatOnDelete&&!g.opts.htmlUntouched&&"DIV"!==o.tagName&&"div"!==g.html.defaultTag()&&u(g.selection.get().focusNode))C(o).before("".concat(g.node.openTagString(C(o).clone().removeAttr("id").get(0)),"<br>").concat(g.node.closeTagString(o)));else{for(var i=e,a=V.INVISIBLE_SPACE;i!==o&&!g.node.isElement(i);)i=i.parentNode,a=g.node.openTagString(i)+a+g.node.closeTagString(i);C(o).before(a)}else C(o).before("".concat(g.node.openTagString(C(o).clone().removeAttr("id").get(0)),"<br>").concat(g.node.closeTagString(o)))}else C(o).before("<br>");C(e).remove()}}(t,e,r):g.cursorLists._startEnter(t):!b(t)||e||r?S(t,e,r):g.cursorLists._middleEnter(t),function p(){g.$el.find(".fr-to-remove").each(function(){for(var e=g.node.contents(this),t=0;t<e.length;t++)e[t].nodeType===Node.TEXT_NODE&&(e[t].textContent=e[t].textContent.replace(/\u200B/g,""));C(this).replaceWith(this.innerHTML)})}(),g.html.fillEmptyBlocks(!0),g.opts.htmlUntouched||(g.html.cleanEmptyTags(),g.clean.lists(),g.spaces.normalizeAroundCursor()),g.selection.restore();var o=g.o_win.innerHeight;if(g.$oel[0].offsetHeight>o){var i=T();if(i){var a=N(i);a=a.top;var s=i.getBoundingClientRect().top;g.opts.scrollableContainer&&g.opts.enter!==V.ENTER_BR&&"BR"===i.tagName&&(s=a=i.parentNode.offsetTop),i.parentNode&&"TD"===i.parentNode.tagName&&o<s?g.o_win.scroll(0,s-50):s<0?g.o_win.scroll(0,a-80):!g.opts.scrollableContainer&&o<s+20?g.o_win.scroll(0,a-o+50):g.opts.scrollableContainer&&s+2*g.$tb.height()>g.$sc[0].scrollTop+C(g.$sc).height()&&g.$sc[0].scroll(0,a-C(g.$sc).height()+2*g.$tb.height())}}else if(g.opts.scrollableContainer&&g.opts.toolbarSticky){var l=T();if(l){var c=N(l);c=c.top;var d=l.getBoundingClientRect().top;g.opts.enter!==V.ENTER_BR&&"BR"===l.tagName&&(d=c=l.parentNode.offsetTop),(g.opts.iframe&&d+2*g.$tb.height()>g.$sc[0].scrollTop+C(g.$sc).height()||d+2*g.$tb.height()>C(g.$sc).height())&&g.$sc[0].scroll(0,c-C(g.$sc).height()+2*g.$tb.height())}}},backspace:function s(){var e=!1,t=g.markers.insert();if(!t)return!0;for(var n=t.parentNode;n&&!g.node.isElement(n);){if("false"===n.getAttribute("contenteditable"))return C(t).replaceWith(V.MARKERS),g.selection.restore(),!1;if(n.innerText.length&&"true"===n.getAttribute("contenteditable"))break;n=n.parentNode}g.el.normalize();var r=t.previousSibling;if(r){var o=r.textContent;o&&o.length&&8203===o.charCodeAt(o.length-1)&&(1===o.length?C(r).remove():r.textContent=r.textContent.substr(0,o.length-L(o)))}return h(t)?b(t)&&m(t,C(t).parents("li").first().get(0))?g.cursorLists._backspace(t):e=E(t):u(t)?b(t)&&m(t,C(t).parents("li").first().get(0))?g.cursorLists._backspace(t):function c(e){for(var t=0<C(e).parentsUntil(g.$el,"BLOCKQUOTE").length,n=g.node.deepestParent(e,[],!t),r=n;n&&!n.previousSibling&&"BLOCKQUOTE"!==n.tagName&&n.parentElement!==g.el&&!g.node.hasClass(n.parentElement,"fr-inner")&&V.SIMPLE_ENTER_TAGS.indexOf(n.parentElement.tagName)<0;)n=n.parentElement;if(n&&"BLOCKQUOTE"===n.tagName){var o=g.node.deepestParent(e,[C(e).parentsUntil(g.$el,"BLOCKQUOTE").get(0)]);o&&o.previousSibling&&(r=n=o)}if(null!==n){var i,a=n.previousSibling;if(g.node.isBlock(n)&&g.node.isEditable(n))if(a&&V.NO_DELETE_TAGS.indexOf(a.tagName)<0){if(g.node.isDeletable(a))C(a).remove(),C(e).replaceWith(V.MARKERS);else if(g.node.isEditable(a))if(g.node.isBlock(a))if(g.node.isEmpty(a)&&!g.node.isList(a))C(a).remove(),C(e).after(g.opts.keepFormatOnDelete?V.INVISIBLE_SPACE:"");else{if(g.node.isList(a)&&(a=C(a).find("li").last().get(0)),(i=g.node.contents(a)).length&&"BR"===i[i.length-1].tagName&&C(i[i.length-1]).remove(),"BLOCKQUOTE"===a.tagName&&"BLOCKQUOTE"!==n.tagName)for(i=g.node.contents(a);i.length&&g.node.isBlock(i[i.length-1]);)a=i[i.length-1],i=g.node.contents(a);else if("BLOCKQUOTE"!==a.tagName&&"BLOCKQUOTE"===r.tagName)for(i=g.node.contents(r);i.length&&g.node.isBlock(i[0]);)r=i[0],i=g.node.contents(r);if(g.node.isEmpty(n))C(e).remove(),g.selection.setAtEnd(a,!0);else{C(e).replaceWith(V.MARKERS);var s=a.childNodes;g.node.isBlock(s[s.length-1])?C(s[s.length-1]).append(r.innerHTML):C(a).append(r.innerHTML)}C(r).remove(),g.node.isEmpty(n)&&C(n).remove()}else C(e).replaceWith(V.MARKERS),"BLOCKQUOTE"===n.tagName&&a.nodeType===Node.ELEMENT_NODE?C(a).remove():(C(a).after(g.node.isEmpty(n)?"":C(n).html()),C(n).remove(),"BR"===a.tagName&&C(a).remove())}else if(a)8203===n.textContent.charCodeAt()&&n.childNodes[1]&&"BR"===n.childNodes[1].tagName&&n.tagName.toLowerCase()===g.html.defaultTag()&&n.previousSibling&&"TABLE"===n.previousSibling.tagName&&C(n).remove();else if(n&&"BLOCKQUOTE"===n.tagName&&0===C(n).text().replace(/\u200B/g,"").length)C(n).remove();else{var l=n.nextSibling;g.node.isEmpty(n)&&n.parentNode&&g.node.isEditable(n.parentNode)&&!l&&(n.parentNode!=g.el&&"TD"!==n.parentNode.tagName?C(n.parentNode).remove():n.parentNode!=g.el&&"TD"===n.parentNode.tagName&&C(n).remove())}}}(t):e=E(t),C(t).remove(),a(),g.html.fillEmptyBlocks(!0),g.opts.htmlUntouched||(g.html.cleanEmptyTags(),g.clean.lists(),g.spaces.normalizeAroundCursor()),g.selection.restore(),e},del:function r(){var e=g.markers.insert();if(!e)return!1;if(g.el.normalize(),h(e))if(b(e))if(0===C(e).parents("li").first().find("ul, ol").length)g.cursorLists._del(e);else{var t=C(e).parents("li").first().find("ul, ol").first().find("li").first();(t=t.find(g.html.blockTagsQuery()).get(-1)||t).prepend(e),g.cursorLists._backspace(e)}else i(e);else u(e),n(e);C(e).remove(),a(),g.html.fillEmptyBlocks(!0),g.opts.htmlUntouched||(g.html.cleanEmptyTags(),g.clean.lists()),g.spaces.normalizeAroundCursor(),g.selection.restore()},isAtEnd:v,isAtStart:m}},V.MODULES.data=function(f){function p(e){return e}function c(e){for(var t=e.toString(),n=0,r=0;r<t.length;r++)n+=parseInt(t.charAt(r),10);return 10<n?n%9+1:n}function d(e,t,n){for(var r=Math.abs(n);0<r--;)e-=t;return n<0&&(e+=123),e}function h(e){return e&&"block"!==e.css("display")?(e.remove(),!0):e&&0===f.helpers.getPX(e.css("height"))?(e.remove(),!0):!(!e||"absolute"!==e.css("position")&&"fixed"!==e.css("position")||(e.remove(),0))}function u(e){return e&&0===f.$box.find(e).length}function g(){if(10<e&&(f[p(M("0ppecjvc=="))](),setTimeout(function(){L.FE=null},10)),!f.$box)return!1;f.$wp.prepend(M(p(M(N)))),v=f.$wp.find("> div").first(),b=v.find("> a"),"rtl"===f.opts.direction&&v.css("left","auto").css("right",0).attr("direction","rtl"),e++}function C(e){for(var t=[M("9qqG-7amjlwq=="),M("KA3B3C2A6D1D5H5H1A3=="),M("3B9B3B5F3C4G3E3=="),M("QzbzvxyB2yA-9m=="),M("ji1kacwmgG5bc=="),M("nmA-13aogi1A3c1jd=="),M("BA9ggq=="),M("emznbjbH3fij=="),M("tkC-22d1qC-13sD1wzF-7=="),M("tA3jjf=="),M("1D1brkm==")],n=0;n<t.length;n++)if(String.prototype.endsWith||(String.prototype.endsWith=function(e,t){return(void 0===t||t>this.length)&&(t=this.length),this.substring(t-e.length,t)===e}),e.endsWith(t[n]))return!0;return!1}function m(){var e=M(p(n)),t=M(p("tzgatD-13eD1dtdrvmF3c1nrC-7saQcdav==")).split(".");try{return window.parent.document.querySelector(e)&&window[t[1]][t[2]]}catch(e){return!1}}var v,b,L=f.$,E="sC-7OB2fwhVC4vsG-7ohPA4ZD4D-8f1J3stzB-11bFE2FC1A3NB2IF1HE1TH4WB8eB-11zVG2F3I3yYB5ZG4CB2DA15CC5AD3F1A1KG1oLA10B1A6wQF1H3vgale2C4F4XA2qc2A5D5B3pepmriKB3OE1HD1fUC10pjD-11E-11TB4YJ3bC-16zE-11yc1B2CE2BC3jhjKC1pdA-21OA6C1D5B-8vF4QA11pD6sqf1C3lldA-16BD4A2H3qoEA7bB-16rmNH5H1F1vSB7RE2A3TH4YC5A5b1A4d1B3whepyAC3AA2zknC3mbgf1SC4WH4PD8TC5ZB2C3H3jb2A5ZA2EF2aoFC5qqHC4B1H1zeGA7UA5RF4TA29TA6ZC4d1C3hyWA10A3rBB2E3decorationRD3QC10UD3E6E6ZD2F3F3fme2E5uxxrEC9C3E4fB-11azhHB1LD7D6VF4VVTPC6b1C4TYG3qzDD6B3B3AH4I2H2kxbHE1JD1yihfd1QD6WB1D4mhrc1B5rvFG3A14A7cDA2OC1AA1JB5zC-16KA6WB4C-8wvlTB5A5lkZB2C2C7zynBD2D2bI-7C-21d1HE2cubyvPC8A6VB3aroxxZE4C4F4e1I2BE1WjdifH1H4A14NA1GB1YG-10tWA3A14A9sVA2C5XH2A29b2A6gsleGG2jaED2D-13fhE1OA8NjwytyTD4e1sc1D-16ZC3B5C-9e1C2FB6EFF5B2C2JH4E1C2tdLE5A3UG4G-7b2D3B4fA-9oh1G3kqvB4AG3ibnjcAC6D2B1cDA9KC2QA6bRC4VA3
6790RB8hYB2A4A-8h1A21A2B2==",y="7D4YH4fkhHB3pqDC3H2E1fkMD1IB1NF1D3QD9wB5rxqlh1A8c2B4ZA3FD2AA6FB5EB3jJG4D2J-7aC-21GB6PC5RE4TC11QD6XC4XE3XH3mlvnqjbaOA2OC2BE6A1fmI-7ujwbc1G5f1F3e1C11mXF4owBG3E1yD1E4F1D2D-8B-8C-7yC-22HD1MF5UE4cWA3D8D6a1B2C3H3a3I3sZA4B3A2akfwEB3xHD5D1F1wIC11pA-16xdxtVI2C9A6YC4a1A2F3B2GA6B4C3lsjyJB1eMA1D-11MF5PE4ja1D3D7byrf1C3e1C7D-16lwqAF3H2A1B-21wNE1MA1OG1HB2A-16tSE5UD4RB3icRA4F-10wtwzBB3E1C3CC2DA8LA2LA1EB1kdH-8uVB7decorg1J2B7B6qjrqGI2J1C6ijehIB1hkemC-13hqkrH4H-7QD6XF5XF3HLNAC3CB2aD2CD2KB10B4ycg1A-8KA4H4B11jVB5TC4yqpB-21pd1E4pedzGB6MD5B3ncB-7MA4LD2JB6PD5uH-8TB9C7YD5XD2E3I3jmiDB3zeimhLD8E2F2JC1H-9ivkPC5lG-10SB1D3H3A-21rc1A3d1E3fsdqwfGA2KA1OrC-22LA6D1B4afUB16SC7AitC-8qYA11fsxcajGA15avjNE2A-9h1hDB16B9tPC1C5F5UC1G3B8d2A5d1D4RnHJ3C3JB5D3ucMG1yzD-17hafjC-8VD3yWC6e1YD2H3ZE2C8C5oBA3H3D2vFA4WzJC4C2i1A-65fNB8afWA1H4A26mvkC-13ZB3E3h1A21BC4eFB2GD2AA5ghqND2A2B2==",n="MekC-11nB-8tIzpD7pewxvzC6mD-16xerg1==",S="lC4B3A3B2B5A1C2E4G1A2==",N="sC-7OB2fwhVC4vsG-7ohPA4ZD4D-8f1J3stzB-11bFE2EE1MA2ND1KD1IE4cA-21pSD2D5ve1G3h1A8b1E5ZC3CD2FA16mC5OC5E1hpnG1NA10B1D7hkUD4I-7b2C3C5nXD2E3F3whidEC2EH3GI2mJE2E2bxci1WA10VC7pllSG2F3A7xd1A4ZC3DB2aaeGA2DE4H2E1j1ywD-13FD1A3VE4WA3D8C6wuc1A2hf1B5B7vnrrjA1B9ic1mpbD1oMB1iSB7rWC4RI4G-7upB6jd1A2F3H2EA4FD3kDF4A2moc1anJD1TD4VI4b2C7oeQF4c1E3XC7ZA3C3G3uDB2wGB6D1JC4D1JD4C1hTE6QC5pH4pD3C-22D7c1A3textAA4gdlB2mpozkmhNC1mrxA3yWA5edhg1I2H3B7ozgmvAI3I2B5GD1LD2RSNH1KA1XA5SB4PA3sA9tlmC-9tnf1G3nd1coBH4I2I2JC3C-16LE6A1tnUA3vbwQB1G3f1A20a3A8a1C6pxAB2eniuE1F3kH2lnjB2hB-16XA5PF1G4zwtYA5B-11mzTG2B9pHB3BE2hGH3B3B2cMD5C1F1wzPA8E7VG5H5vD3H-7C8tyvsVF2I1G2A5fE3bg1mgajoyxMA4fhuzSD8aQB2B4g1A20ukb1A4B3F3GG2CujjanIC1ObiB11SD1C5pWC1D4YB8YE5FE-11jXE2F-7jB4CC2G-10uLH4E1C2tA-13yjUH5d1H1A7sWD5E4hmjF-7pykafoGA16hDD4joyD-8OA33B3C2tC7cRE4SA31a1B8d1e2A4F4g1A2A22CC5zwlAC2C1A12==",T=function(){for(var e=0,t=document.domain,n=t.split("."),r="_gd".concat((new Date).getTime());e<n.length-1&&-1===document.cookie.indexOf("".concat(r,"=").concat(r));)t=n.slice(-1-++e).join("."),document.cookie="".concat(r,"=").concat(r,";domain=").concat(t,";");return document.cookie="".concat(r,"=;expires=Thu, 01 Jan 1970 00:00:01 GMT;domain=").concat(t,";"),(t||"").replace(/(^\.*)|(\.*$)/g,"")}(),M=p(function A(e){if(!e)return e;for(var t="",n=p("charCodeAt"),r=p("fromCharCode"),o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".indexOf(e[0]),i=1;i<e.length-2;i++){for(var a=c(++o),s=e[n](i),l="";/[0-9-]/.test(e[i+1]);)l+=e[++i];s=d(s,a,l=parseInt(l,10)||0),s^=o-1&31,t+=String[r](s)}return t}),e=0;return{_init:function x(){var e=f.opts.key||[""],t=M(p("ziRA1E3B9pA5B-11D-11xg1A3ZB5D1D4B-11ED2EG2pdeoC1clIH4wB-22yQD5uF4YE3E3A9=="));"string"==typeof e&&(e=[e]);for(var n,r,o,i=!(f.ul=!0),a=0,s=0;s<e.length;s++){var l=(r=e[s],4===(o=(M(r)||"").split("|")).length&&"V3"===o[0]?[o[1],o[3],o[2]]:[null,null,""]),c=l[2];if(c===M(p(M("LGnD1KNZf1CPBYCAZB-8F3UDSLLSG1VFf1A3C2==")))||0<=c.indexOf(T,c.length-T.length)||C(T)||m()){if(null!==(n=l[1])&&!(0==n.indexOf("TRIAL")?(n=new Date(n.replace(/TRIAL/,"")),new Date(n)<new Date&&(E=y,1)):new Date(n)<new Date(M(S)))||!(0<(T||"").length)||C(T)||m()){f.ul=!1;break}i=!0,N=E,a=l[0]||-1}}var d=new Image;!0===f.ul&&(g(),d.src=i?"".concat(p(M(t)),"e=").concat(a):"".concat(p(M(t)),"u")),!0===f.ul&&(f.events.on("contentChanged",function(){(function e(){return h(v)||h(b)||u(v)||u(b)})()&&g()}),f.events.on("html.get",function(e){return e+M("qD2H-9G3ioD-17qA1tE1B-8qI3A4hA-13C-11E2C1njfldD1E6pg1C-8sC3hfbkcD2G3stC-22gqgB3G2B-7vtoA4nweeD1A31A15B9uC-16A1F5dkykdc1B8dE-11bA3F2D3A9gd1E7F2tlI-8H-7vtxB2A5B2C3B2F2B5A6ldbyC4iqC-22D-17E-13mA3D2dywiB3oxlvfC1H4C2TjqbzlnI3ntB4E3qA2zaqsC6D3pmnkoE3C6D5wvuE3bwifdhB6hch1E4xibD-17dmrC1rG-7pntnF6nB-8F1D2A11C8plrkmF2F3MC-16bocqA2WwA-21ayeA1C4d1isC-22rD-13D6DfjpjtC2E6hB2G2G4A-7D2==")})),f.events.on("html.set",function(){var e=f.el.querySelector('[data-f-id="pbf"]');e&&L(e).remove()}),f.events.on("destroy",function(){v&&v.length&&v.remove()},!0)}}},V.MODULES.edit=function(t){function e(){if(t.browser.mozilla)try{t.doc.execCommand("enableObjectResizing",!1,"false"),t.doc.execCommand("enableInlineTableEditing",!1,"false")}catch(e){}
vendor: 19,602 bytes, line 679
679if(t.browser.msie)try{t.doc.body.addEventListener("mscontrolselect",function(e){return e.srcElement.focus(),!1})}catch(e){}}var n=!1;function r(){return n}return{_init:function o(){t.events.on("focus",function(){r()?t.edit.off():t.edit.on()})},on:function i(){t.$wp?(t.$el.attr("contenteditable",!0),t.$el.removeClass("fr-disabled").attr("aria-disabled",!1),e()):t.$el.is("a")&&t.$el.attr("contenteditable",!0),t.events.trigger("edit.on",[],!0),n=!1},off:function a(){t.events.disableBlur(),t.$wp?(t.$el.attr("contenteditable",!1),t.$el.addClass("fr-disabled").attr("aria-disabled",!0)):t.$el.is("a")&&t.$el.attr("contenteditable",!1),t.events.trigger("edit.off"),t.events.enableBlur(),n=!0},disableDesign:e,isDisabled:r}},V.MODULES.format=function(x){var O=x.$;function w(e,t){var n=e;for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n+="id"===r?"#".concat(t[r]):"class"===r?".".concat(t[r]):"[".concat(r,'="').concat(t[r],'"]'));return n}function k(e,t){return!(!e||e.nodeType!==Node.ELEMENT_NODE)&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector).call(e,t)}function v(e,t,n){var r,o,i,a={strong:{prop:"font-weight",val:"bold"},em:{prop:"font-style",val:"italic"}};if(e){if(x.node.isBlock(e)&&e.hasAttribute("contenteditable")&&"false"===e.getAttribute("contenteditable")||e.parentNode&&e.parentNode.hasAttribute("contenteditable")&&"false"===e.parentNode.getAttribute("contenteditable")){if(e.nextSibling&&O(e.nextSibling).hasClass("fr-marker"))return;if(e.nextSibling)return void v(e.nextSibling,t,n);if(e.parentNode&&x.node.isEditable(e.parentNode))return void v(e.parentNode,t,n)}for(;e&&e.nodeType===Node.COMMENT_NODE;)e=e.nextSibling;if(e){if(x.node.isBlock(e)&&"HR"!==e.tagName&&"LI"!==e.tagName)return x.node.hasClass(e.firstChild,"fr-marker")?v(e.firstChild.nextSibling,t,n):v(e.firstChild,t,n),!1;var s=O(x.doc.createElement(t));s.attr(n),s.insertBefore(e),(r=b(e))&&(0<=["strong","em"].indexOf(t)||"span"===t&&n.hasOwnProperty("style"))&&(i="span"===t?(o=(a=n.style.replace(/;$/,"").split(":"))[0].trim(),a[1].trim()):(o=a[t].prop,a[t].val),"background-color"!==o&&(O(r).css(o,i),function p(e,t){var n,r=e.childNodes;for(n=0;n<r.length;n++)0<=["UL","OL","LI"].indexOf(r[n].tagName)&&""===r[n].style[t]&&O(r[n]).css(t,"initial")}(r,o)));for(var l=e;l&&!O(l).hasClass("fr-marker")&&0===O(l).find(".fr-marker").length&&"UL"!==l.tagName&&"OL"!==l.tagName;){var c=l;if("SPAN"===l.tagName&&O(l).hasClass("fr-tracking-deleted"))l=l.nextSibling;else{if(x.node.isBlock(l)&&"HR"!==e.tagName)return v(l.firstChild,t,n),!1;if("SPAN"===l.tagName&&x.node.isEditable(l))return s.is(":empty")&&s.remove(),v(l.firstChild,t,n),!1;if(l.tagName&&l.hasAttribute("contenteditable")&&"false"===l.getAttribute("contenteditable"))return void v(l.nextSibling,t,n);if(!x.node.isEditable(l.parentNode))return x.selection.restore(),void x.toolbar.disable();l=l.nextSibling,s.append(c)}}if(l)(O(l).find(".fr-marker").length||"UL"===l.tagName||"OL"===l.tagName)&&v(l.firstChild,t,n);else{for(var d=s.get(0).parentNode;d&&!d.nextSibling&&!x.node.isElement(d);)d=d.parentNode;if(d){var f=d.nextSibling;f&&(x.node.isBlock(f)?"HR"===f.tagName?v(f.nextSibling,t,n):v(f.firstChild,t,n):v(f,t,n))}}s.is(":empty")&&s.remove()}}}function n(e,t){var n;if(void 0===t&&(t={}),t.style&&delete t.style,x.selection.isCollapsed()){x.markers.insert();var r=x.$el.find(".fr-marker");r.get(0).nextSibling&&x.node.isBlock(r.get(0).nextSibling)&&!r.get(0).previousSibling&&"LI"===r.get(0).parentNode.tagName&&r.get(0).nextSibling.prepend(r.get(0)),r.replaceWith(function l(e,t){var n="<".concat(e);for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n+=" ".concat(r,'="').concat(t[r],'"'));return n+=">"}(e,t)+V.INVISIBLE_SPACE+V.MARKERS+function c(e){return"</".concat(e,">")}(e)),x.selection.restore()}else{x.selection.save();var o,i=x.$el.find('.fr-marker[data-type="true"]').length&&x.$el.find('.fr-marker[data-type="true"]').get(0).nextSibling;v(i,e,t),O(i).parent().find("a:empty").remove();do{for(o=x.$el.find("".concat(w(e,t)," > ").concat(w(e,t))),n=0;n<o.length;n++)o[n].outerHTML=o[n].innerHTML}while(o.length);x.el.normalize();var a=x.el.querySelectorAll(".fr-marker");for(n=0;n<a.length;n++){var s=O(a[n]);!0===s.data("type")?k(s.get(0).nextSibling,w(e,t))&&s.next().prepend(s):k(s.get(0).previousSibling,w(e,t))&&s.prev().append(s)}x.selection.restore()}}function $(e,t,n,r){if(!r){var o=!1;if(!0===e.data("type"))for(;x.node.isFirstSibling(e.get(0))&&!e.parent().is(x.$el)&&!e.parent().is("ol")&&!e.parent().is("ul");)e.parent().before(e),o=!0;else if(!1===e.data("type"))for(;x.node.isLastSibling(e.get(0))&&!e.parent().is(x.$el)&&!e.parent().is("ol")&&!e.parent().is("ul");)e.parent().after(e),o=!0;if(o)return!0}if(e.parents(t).length||void 0===t){var i,a="",s="",l=e.parent();if("A"===l[0].tagName&&(l=l.parent()),l.is(x.$el)||x.node.isBlock(l.get(0)))return!1;for(;!(x.node.isBlock(l.parent().get(0))||void 0!==t&&k(l.get(0),w(t,n)));)a+=x.node.closeTagString(l.get(0)),s=x.node.openTagString(l.get(0))+s,l=l.parent();var c=e.get(0).outerHTML;return e.replaceWith('<span id="mark"></span>'),i=l.html().replace(/<span id="mark"><\/span>/,a+x.node.closeTagString(l.get(0))+s+c+a+x.node.openTagString(l.get(0))+s),l.replaceWith(x.node.openTagString(l.get(0))+i+x.node.closeTagString(l.get(0))),!0}return!1}function r(e,t){void 0===t&&(t={}),t.style&&delete t.style;var n=x.selection.isCollapsed();x.selection.save();var r=x.$el.find(".fr-marker");if(e&&(r[0].parentNode.tagName===e.toUpperCase()||r[1].parentNode.tagName===e.toUpperCase())){var o=r[0];r[0].parentNode.tagName!==e.toUpperCase()&&(o=r[1]);for(var i=o.parentNode.previousSibling;null!=i;)i.nodeType===Node.TEXT_NODE&&(i.textContent=i.textContent.replace(/\u200B/g,"")),i=i.previousSibling;for(var a=o.parentNode.nextSibling;null!=a;)a.nodeType===Node.TEXT_NODE&&(a.textContent=a.textContent.replace(/\u200B/g,"")),a=a.nextSibling}for(var s=!0;s;){s=!1;for(var l=x.$el.find(".fr-marker"),c=0;c<l.length;c++){var d=O(l[c]),f=null;if(d.attr("data-cloned")||n||(f=d.clone().removeClass("fr-marker").addClass("fr-clone"),d.data("type")&&"true"===d.data("type").toString()?d.attr("data-cloned",!0).after(f):d.attr("data-cloned",!0).before(f)),$(d,e,t,n)){s=!0;break}}}!function M(e,t,n,r){for(var o,i={strong:{prop:"font-weight",val:"bold"},em:{prop:"font-style",val:"italic"}},a=x.node.contents(e.get(0)),s=0;s<a.length;s++){var l=a[s];if(l.innerHTML&&8203==l.innerHTML.charCodeAt()&&l.tagName.toLocaleLowerCase()==n&&l.childNodes.length<2&&!x.helpers.isMobile()&&(l.outerHTML=l.innerHTML),x.node.hasClass(l,"fr-marker"))t=(t+1)%2;else if(t)if(0<O(l).find(".fr-marker").length)t=M(O(l),t,n,r);else{(o="LI"===l.tagName?l:O(l).parentsUntil(x.$el,"li").get(0))&&(void 0===n||0<=["strong","em"].indexOf(n))&&(n?O(o).css(i[n].prop,""):o.style=""),(o=l.parentNode!==x.el?l.parentNode:null)&&1===o.nodeType&&["p","strong","u","em","s","sub","sup","a"].indexOf(n)<0&&o.hasAttribute("style")&&"SPAN"!==o.tagName&&"LI"!==o.tagName?o.style="":l&&1===l.nodeType&&l.hasAttribute("style")&&["p","strong","u","em","s","sub","sup","a"].indexOf(n)<0&&(x.browser.msie?O(l).attr("style",""):l.style="");for(var c=O(l).find(n||"*:not(br)"),d=c.length-1;0<=d;d--){var f=c[d];(o="LI"===f.tagName?f:O(f).parentsUntil(x.$el,"li").get(0))&&(!n||0<=["strong","em"].indexOf(n))&&(n?O(o).css(i[n].prop,""):o.style=""),"A"===f.tagName||x.node.isBlock(f)||x.node.isVoid(f)||void 0!==n&&!k(f,w(n,r))?x.node.isBlock(f)&&void 0===n&&"TABLE"!==l.tagName&&x.node.clearAttributes(f):x.node.hasClass(f,"fr-clone")||x.node.hasClass(f,"fr-tracking-deleted")||O(f).data("tracking")||(f.outerHTML=f.innerHTML)}"A"!==l.tagName&&void 0===n&&l.nodeType===Node.ELEMENT_NODE&&!x.node.isVoid(l)||k(l,w(n,r))?x.node.isBlock(l)||(x.node.hasClass(l,"fr-clone")||x.opts.trackChangesEnabled?!x.node.hasClass(l,"fr-clone")&&x.opts.trackChangesEnabled&&l.parentNode&&(l.outerHTML=l.innerHTML):l.outerHTML=l.innerHTML):void 0===n&&l.nodeType===Node.ELEMENT_NODE&&x.node.isBlock(l)&&"TABLE"!==l.tagName&&x.node.clearAttributes(l)}else 0<O(l).find(".fr-marker").length&&(t=M(O(l),t,n,r))}return t}(x.$el,0,e,t),n||(x.$el.find(".fr-marker").remove(),x.$el.find(".fr-clone").removeClass("fr-clone").addClass("fr-marker")),n&&x.$el.find(".fr-marker").before(V.INVISIBLE_SPACE).after(V.INVISIBLE_SPACE),x.html.cleanEmptyTags(),x.el.normalize(),x.selection.restore();var p=x.win.getSelection()&&x.win.getSelection().anchorNode;if(p){var h=x.node.blockParent(p),u=!!p.textContent.replace(/\u200B/g,"").length,g=x.win.getSelection().getRangeAt(0),C=g.startOffset,m=g.endOffset;x.selection.text().replace(/\u200B/g,"").length||function A(e,t){if(e&&t){if(e.isSameNode(t)?e.textContent=e.textContent.replace(/\u200B(?=.*\u200B)/g,""):e.nodeType===Node.TEXT_NODE&&(e.textContent=e.textContent.replace(/\u200B/g,"")),!e.childNodes.length)return!1;(!x.browser.msie||x.browser.msie&&Array.isArray(e.childNodes))&&e.childNodes.forEach(function(e){A(e,t)})}}(h,p);var v=x.win.getSelection().getRangeAt(0);if(p.nodeType===Node.TEXT_NODE){if(!u||!x.selection.text().length&&C===m){var b=p.textContent.search(/\u200B/g)+1;if(x.browser.msie){var L=x.doc.createRange();x.selection.get().removeAllRanges(),L.setStart(p,b),L.setEnd(p,b),x.selection.get().addRange(L)}else"a"!==e&&(v.setStart(p,b),v.setEnd(p,b))}}else{var E,y,S=0,N=O(p).contents();if(x.browser.msie){for(;y=N[S];)y.nodeType===Node.TEXT_NODE&&0<=y.textContent.search(/\u200B/g)&&(E=y),S++;E=O(E)}else E=N.filter(function(e){return e.nodeType===Node.TEXT_NODE&&0<=e.textContent.search(/\u200B/g)});if(E.length&&!x.opts.trackChangesEnabled){var T=E.text().search(/\u200B/g)+1;v.setStart(E.get(0),T),v.setEnd(E.get(0),T)}}}}function t(e,t){var n,r,o,i,a,s,l,c=null;if(x.selection.isCollapsed()){x.markers.insert();var d=(r=x.$el.find(".fr-marker")).parent();if(x.node.openTagString(d.get(0))==='<span style="'.concat(e,": ").concat(d.css(e),';">')){if(x.node.isEmpty(d.get(0)))c=O(x.doc.createElement("span")).attr("style","".concat(e,": ").concat(t,";")).html("".concat(V.INVISIBLE_SPACE).concat(V.MARKERS)),d.replaceWith(c);else{var f={};f["style*"]="".concat(e,":"),$(r,"span",f,!0),r=x.$el.find(".fr-marker"),t?(c=O(x.doc.createElement("span")).attr("style","".concat(e,": ").concat(t,";")).html("".concat(V.INVISIBLE_SPACE).concat(V.MARKERS)),r.replaceWith(c)):r.replaceWith(V.INVISIBLE_SPACE+V.MARKERS)}x.html.cleanEmptyTags()}else x.node.isEmpty(d.get(0))&&d.is("span")?(r.replaceWith(V.MARKERS),d.css(e,t)):(r.get(0).nextSibling&&x.node.isBlock(r.get(0).nextSibling)&&!r.get(0).previousSibling&&"LI"===r.get(0).parentNode.tagName&&r.get(0).nextSibling.prepend(r.get(0)),c=O('<span style="'.concat(e,": ").concat(t,';">').concat(V.INVISIBLE_SPACE).concat(V.MARKERS,"</span>")),r.replaceWith(c));c&&L(c,e,t)}else{if(x.selection.save(),null===t||"color"===e&&0<x.$el.find(".fr-marker").parents("u, a").length){var p=x.$el.find(".fr-marker");for(n=0;n<p.length;n++)if(!0===(r=O(p[n])).data("type")||"true"===r.data("type"))for(;x.node.isFirstSibling(r.get(0))&&!r.parent().is(x.$el)&&!x.node.isElement(r.parent().get(0))&&!x.node.isBlock(r.parent().get(0));)r.parent().before(r);else for(;x.node.isLastSibling(r.get(0))&&!r.parent().is(x.$el)&&!x.node.isElement(r.parent().get(0))&&!x.node.isBlock(r.parent().get(0));)r.parent().after(r)}for(var h=x.$el.find('.fr-marker[data-type="true"]').get(0).nextSibling;h.firstChild;)h=h.firstChild;var u={"class":"fr-unprocessed"};for(t&&(u.style="".concat(e,": ").concat(t,";")),v(h,"span",u),x.$el.find(".fr-marker + .fr-unprocessed").each(function(){O(this).prepend(O(this).prev())}),x.$el.find(".fr-unprocessed + .fr-marker").each(function(){O(this).prev().append(O(this))}),(t||"").match(/\dem$/)&&x.$el.find("span.fr-unprocessed").removeClass("fr-unprocessed");0<x.$el.find("span.fr-unprocessed").length;){if(o=b(c=x.$el.find("span.fr-unprocessed").first().removeClass("fr-unprocessed")),c.parent().get(0).normalize(),c.parent().is("span")&&1===c.parent().get(0).childNodes.length){var g=t;x.browser.msie&&!t&&(g=""),c.parent().css(e,g);var C=c;c=c.parent(),C.replaceWith(C.html())}for(i=c.find("span"),o&&"background-color"!==e&&(o.normalize(),i=O(o).find("span:not(.fr-unprocessed)")),n=i.length-1;0<=n;n--)a=i[n],s=e,l=void 0,(l=O(a)).css(s,""),""===l.attr("style")&&l.replaceWith(l.html());L(c,e,t)}}!function m(){var e;for(;0<x.$el.find(".fr-split:empty").length;)x.$el.find(".fr-split:empty").remove();x.$el.find(".fr-split").removeClass("fr-split"),x.$el.find('[style=""]').removeAttr("style"),x.$el.find('[class=""]').removeAttr("class"),x.html.cleanEmptyTags();for(var t=x.$el.find("span"),n=t.length-1;0<=n;n--){var r=t[n];r.attributes&&0!==r.attributes.length||O(r).replaceWith(r.innerHTML)}x.el.normalize();var o=x.$el.find("span[style] + span[style]");for(e=0;e<o.length;e++){var i=O(o[e]),a=O(o[e]).prev();i.get(0).previousSibling===a.get(0)&&x.node.openTagString(i.get(0))===x.node.openTagString(a.get(0))&&(i.prepend(a.html()),a.remove())}x.$el.find("span[style] span[style]").each(function(){if(0<=O(this).attr("style").indexOf("font-size")){var e=O(this).parents("span[style]");e.attr("style")&&0<=e.attr("style").indexOf("background-color")&&(O(this).attr("style","".concat(O(this).attr("style"),";").concat(e.attr("style"))),$(O(this),"span[style]",{},!1))}}),x.el.normalize(),x.selection.restore()}()}function b(e){var t,n,r,o,i,a;if(t="LI"===e.tagName?e:O(e).parentsUntil(x.$el,"li").get(0)){if((a=x.selection.info(t)).atStart&&a.atEnd)return t;if(a.atStart&&!a.atEnd&&(n=O(t).find(".fr-marker[data-type=false]").get(0),r=O(n).parentsUntil(x.$el,"li").get(0),o=O(n).parent().get(0),(i=n.nextSibling)&&0<=["UL","OL"].indexOf(i.tagName)||!r.isSameNode(t)||!i&&("LI"===o.tagName||!o.nextSibling||0<=["UL","OL"].indexOf(o.nextSibling.tagName)||x.node.isVoid(o.nextSibling))))return t}}function L(e,t,n){var r,o,i,a=e.parentsUntil(x.$el,"span[style]"),s=[];for(r=a.length-1;0<=r;r--)o=a[r],i=t,0===O(o).attr("style").indexOf("".concat(i,":"))||0<=O(o).attr("style").indexOf(";".concat(i,":"))||0<=O(o).attr("style").indexOf("; ".concat(i,":"))||s.push(a[r]);if((a=a.not(s)).length){for(var l="",c="",d="",f="",p=e.get(0);p=p.parentNode,O(p).addClass("fr-split"),l+=x.node.closeTagString(p),c=x.node.openTagString(O(p).clone().addClass("fr-split").get(0))+c,a.get(0)!==p&&(d+=x.node.closeTagString(p),f=x.node.openTagString(O(p).clone().addClass("fr-split").get(0))+f),a.get(0)!==p;);var h="".concat(l+x.node.openTagString(O(a.get(0)).clone().css(t,n||"").get(0))+f+e.css(t,"").get(0).outerHTML+d,"</span>").concat(c);e.replaceWith('<span id="fr-break"></span>');var u=a.get(0).outerHTML;O(a.get(0)).replaceWith(u.replace(/<span id="fr-break"><\/span>/g,function(){return h}))}}function o(e,t){void 0===t&&(t={}),t.style&&delete t.style;var n=x.selection.ranges(0),r=n.startContainer;if(r.nodeType===Node.ELEMENT_NODE&&0<r.childNodes.length&&r.childNodes[n.startOffset]&&(r=r.childNodes[n.startOffset]),!n.collapsed&&r.nodeType===Node.TEXT_NODE&&n.startOffset===(r.textContent||"").length){for(;!x.node.isBlock(r.parentNode)&&!r.nextSibling;)r=r.parentNode;r.nextSibling&&(r=r.nextSibling)}for(var o=r;o&&o.nodeType===Node.ELEMENT_NODE&&!k(o,w(e,t));)o=o.firstChild;if(o&&o.nodeType===Node.ELEMENT_NODE&&k(o,w(e,t)))return!0;var i=r;for(i&&i.nodeType!==Node.ELEMENT_NODE&&(i=i.parentNode);i&&i.nodeType===Node.ELEMENT_NODE&&i!==x.el&&!k(i,w(e,t));)i=i.parentNode;return!(!i||i.nodeType!==Node.ELEMENT_NODE||i===x.el||!k(i,w(e,t)))}return{is:o,toggle:function i(e,t){o(e,t)?r(e,t):n(e,t)},apply:n,remove:r,applyStyle:t,removeStyle:function a(e){t(e,null)}}},V.MODULES.spaces=function(c){function r(e,t){var n=e.previousSibling,r=e.nextSibling,o=e.textContent,i=e.parentNode,a=[V.ENTER_P,V.ENTER_DIV,V.ENTER_BR];if(!c.html.isPreformatted(i)){t&&(o=o.replace(/[\f\n\r\t\v ]{2,}/g," "),r&&"BR"!==r.tagName&&!c.node.isBlock(r)||!(c.node.isBlock(i)||c.node.isLink(i)&&!i.nextSibling||c.node.isElement(i))||(o=o.replace(/[\f\n\r\t\v ]{1,}$/g,"")),n&&"BR"!==n.tagName&&!c.node.isBlock(n)||!(c.node.isBlock(i)||c.node.isLink(i)&&!i.previousSibling||c.node.isElement(i))||(o=o.replace(/^[\f\n\r\t\v ]{1,}/g,"")),(c.node.isBlock(r)||c.node.isBlock(n))&&(!n||n&&"A"!==n.tagName)&&(o=o.replace(/^[\f\n\r\t\v ]{1,}/g,""))," "===o&&(n&&c.node.isVoid(n)||r&&c.node.isVoid(r))&&!(n&&r&&c.node.isVoid(n)||r&&n&&c.node.isVoid(r))&&(o="")),(!n&&c.node.isBlock(r)||!r&&c.node.isBlock(n))&&c.node.isBlock(i)&&i!==c.el&&(o=o.replace(/^[\f\n\r\t\v ]{1,}/g,"")),t||(o=o.replace(new RegExp(V.UNICODE_NBSP,"g")," "));for(var s="",l=0;l<o.length;l++)32!=o.charCodeAt(l)||0!==l&&32!=s.charCodeAt(l-1)||!((c.opts.enter===V.ENTER_BR||c.opts.enter===V.ENTER_DIV)&&(n&&"BR"===n.tagName||r&&"BR"===r.tagName)||n&&r&&n.tagName===r.tagName||!(n&&r&&c.node.isVoid(n)||n&&r&&c.node.isVoid(r))||n&&r&&0<=["STRONG","U","EM"].indexOf(n.tagName)&&"BR"===r.tagName)?s+=o[l]:s+=V.UNICODE_NBSP;c.browser.chrome&&1<s.length&&32===s.charCodeAt(s.length-1)&&(r&&r.nextSibling&&r.nextSibling.nextSibling&&"BR"===r.nextSibling.nextSibling.tagName||r&&"BR"===r.tagName)&&(s=s.substring(0,s.length-1)+V.UNICODE_NBSP),(!r||r&&c.node.isBlock(r)||r&&r.nodeType===Node.ELEMENT_NODE&&c.win.getComputedStyle(r)&&"block"===c.win.getComputedStyle(r).display)&&(!c.node.isVoid(n)||n&&-1!==["P","DIV","BR"].indexOf(n.tagName)&&-1!==a.indexOf(c.opts.enter))&&(s=s.replace(/ $/,V.UNICODE_NBSP)),!n||c.node.isVoid(n)||c.node.isBlock(n)||1!==(s=s.replace(/^\u00A0([^ $])/," $1")).length||160!==s.charCodeAt(0)||!r||c.node.isVoid(r)||c.node.isBlock(r)||c.node.hasClass(n,"fr-marker")&&c.node.hasClass(r,"fr-marker")||(s=" "),t||(s=s.replace(/([^ \u00A0])\u00A0([^ \u00A0])/g,"$1 $2")),e.textContent!==s&&(e.textContent=s)}}function l(e,t){if(void 0!==e&&e||(e=c.el),void 0===t&&(t=!1),!e.getAttribute||"false"!==e.getAttribute("contenteditable"))if(e.nodeType===Node.TEXT_NODE)r(e,t);else if(e.nodeType===Node.ELEMENT_NODE)for(var n=c.doc.createTreeWalker(e,NodeFilter.SHOW_TEXT,c.node.filter(function(e){for(var t=e.parentNode;t&&t!==c.el;){if("STYLE"===t.tagName||"IFRAME"===t.tagName)return!1;if("PRE"===t.tagName)return!1;t=t.parentNode}return null!==e.textContent.match(/([ \u00A0\f\n\r\t\v]{2,})|(^[ \u00A0\f\n\r\t\v]{1,})|([ \u00A0\f\n\r\t\v]{1,}$)/g)&&!c.node.hasClass(e.parentNode,"fr-marker")}),!1);n.nextNode();)r(n.currentNode,t)}return{normalize:l,normalizeAroundCursor:function d(){for(var e=[],t=c.el.querySelectorAll(".fr-marker"),n=0;n<t.length;n++){for(var r=null,o=c.node.blockParent(t[n]),i=(r=o||t[n]).nextSibling,a=r.previousSibling;i&&"BR"===i.tagName;)i=i.nextSibling;for(;a&&"BR"===a.tagName;)a=a.previousSibling;r&&e.indexOf(r)<0&&e.push(r),a&&e.indexOf(a)<0&&e.push(a),i&&e.indexOf(i)<0&&e.push(i)}for(var s=0;s<e.length;s++)l(e[s])}}},V.INVISIBLE_SPACE="&#8203;",V.HAIR_SPACE="&#8202;",V.START_MARKER='<span class="fr-marker" data-id="0" data-type="true" style="display: none; line-height: 0;">'.concat(V.INVISIBLE_SPACE,"</span>"),V.END_MARKER='<span class="fr-marker" data-id="0" data-type="false" style="display: none; line-height: 0;">'.concat(V.INVISIBLE_SPACE,"</span>"),V.MARKERS=V.START_MARKER+V.END_MARKER,V.MODULES.markers=function(d){var f=d.$;function l(){if(!d.$wp)return null;try{var e=d.selection.ranges(0),t=e.commonAncestorContainer;if(t!==d.el&&!d.$el.contains(t))return null;var n=e.cloneRange(),r=e.cloneRange();n.collapse(!0);var o=f(d.doc.createElement("SPAN")).addClass("fr-marker").attr("style","display: none; line-height: 0;").html(V.INVISIBLE_SPACE).get(0);if(n.insertNode(o),o=d.$el.find("span.fr-marker").get(0)){for(var i=o.nextSibling;
vendor: 4,590 bytes, line 679
679i&&i.nodeType===Node.TEXT_NODE&&0===i.textContent.length;)f(i).remove(),i=d.$el.find("span.fr-marker").get(0).nextSibling;return d.selection.clear(),d.selection.get().addRange(r),o}return null}catch(a){}}function c(){d.$el.find(".fr-marker").remove()}return{place:function p(e,t,n){var r,o,i;try{var a=e.cloneRange();if(a.collapse(t),a.insertNode(function l(e,t){var n=f(d.doc.createElement("SPAN"));return n.addClass("fr-marker").attr("data-id",t).attr("data-type",e).attr("style","display: ".concat(d.browser.safari?"none":"inline-block","; line-height: 0;")).html(V.INVISIBLE_SPACE),n.get(0)}(t,n)),!0===t)for(i=(r=d.$el.find('span.fr-marker[data-type="true"][data-id="'.concat(n,'"]')).get(0)).nextSibling;i&&i.nodeType===Node.TEXT_NODE&&0===i.textContent.length;)f(i).remove(),i=r.nextSibling;if(!0===t&&!e.collapsed){for(;!d.node.isElement(r.parentNode)&&!i;)-1</\bfa\b/g.test(r.parentNode.className)&&"I"===r.parentNode.tagName?f(r.parentNode).before(r):f(r.parentNode).after(r),i=r.nextSibling;if(i&&i.nodeType===Node.ELEMENT_NODE&&d.node.isBlock(i)&&"HR"!==i.tagName){for(o=[i];i=o[0],(o=d.node.contents(i))[0]&&d.node.isBlock(o[0]););f(i).prepend(f(r))}}if(!1===t&&!e.collapsed){if((i=(r=d.$el.find('span.fr-marker[data-type="false"][data-id="'.concat(n,'"]')).get(0)).previousSibling)&&i.nodeType===Node.ELEMENT_NODE&&d.node.isBlock(i)&&"HR"!==i.tagName){for(o=[i];i=o[o.length-1],(o=d.node.contents(i))[o.length-1]&&d.node.isBlock(o[o.length-1]););f(i).append(f(r))}(r.parentNode&&0<=["TD","TH"].indexOf(r.parentNode.tagName)||!r.previousSibling&&d.node.isBlock(r.parentElement))&&(r.parentNode.previousSibling&&!r.previousSibling?f(r.parentNode.previousSibling).append(r):0<=["TD","TH"].indexOf(r.parentNode.tagName)&&r.parentNode.firstChild===r&&(r.parentNode.previousSibling?f(r.parentNode.previousSibling).append(r):r.parentNode.parentNode&&r.parentNode.parentNode.previousSibling&&f(r.parentNode.parentNode.previousSibling).append(r)))}var s=d.$el.find('span.fr-marker[data-type="'.concat(t,'"][data-id="').concat(n,'"]')).get(0);return s&&(s.style.display="none"),s}catch(c){return null}},insert:l,split:function a(){d.selection.isCollapsed()||d.selection.remove();var e=d.$el.find(".fr-marker").get(0);if(e||(e=l()),!e)return null;var t=d.node.deepestParent(e);if(t||(t=d.node.blockParent(e))&&"LI"!==t.tagName&&(t=null),t)if(d.node.isBlock(t)&&d.node.isEmpty(t))"LI"!==t.tagName||t.parentNode.firstElementChild!==t||d.node.isEmpty(t.parentNode)?f(t).replaceWith('<span class="fr-marker"></span>'):f(t).append('<span class="fr-marker"></span>');else if(d.cursor.isAtStart(e,t))f(t).before('<span class="fr-marker"></span>'),f(e).remove();else if(d.cursor.isAtEnd(e,t))f(t).after('<span class="fr-marker"></span>'),f(e).remove();else{for(var n=e,r="",o="";n=n.parentNode,r+=d.node.closeTagString(n),o=d.node.openTagString(n)+o,n!==t;);f(e).replaceWith('<span id="fr-break"></span>');var i=d.node.openTagString(t)+f(t).html()+d.node.closeTagString(t);i=i.replace(/<span id="fr-break"><\/span>/g,"".concat(r,'<span class="fr-marker"></span>').concat(o)),f(t).replaceWith(i)}return d.$el.find(".fr-marker").get(0)},insertAtPoint:function h(e){var t,n=e.clientX,r=e.clientY;c();var o=null;if("undefined"!=typeof d.doc.caretPositionFromPoint?(t=d.doc.caretPositionFromPoint(n,r),(o=d.doc.createRange()).setStart(t.offsetNode,t.offset),o.setEnd(t.offsetNode,t.offset)):"undefined"!=typeof d.doc.caretRangeFromPoint&&(t=d.doc.caretRangeFromPoint(n,r),(o=d.doc.createRange()).setStart(t.startContainer,t.startOffset),o.setEnd(t.startContainer,t.startOffset)),null!==o&&"undefined"!=typeof d.win.getSelection){var i=d.win.getSelection();i.removeAllRanges(),i.addRange(o)}else if("undefined"!=typeof d.doc.body.createTextRange)try{(o=d.doc.body.createTextRange()).moveToPoint(n,r);var a=o.duplicate();a.moveToPoint(n,r),o.setEndPoint("EndToEnd",a),o.select()}catch(s){return!1}l()},remove:c}},V.MODULES.selection=function(E){var y=E.$;function s(){var e="";return E.win.getSelection?e=E.win.getSelection():E.doc.getSelection?e=E.doc.getSelection():E.doc.selection&&(e=E.doc.selection.createRange().text),e.toString()}function L(){return E.win.getSelection?E.win.getSelection():E.doc.getSelection?E.doc.getSelection():E.doc.selection.createRange()}function f(e){var t=L(),n=[];if(t&&t.getRangeAt&&t.rangeCount){n=[];for(var r=0;r<t.rangeCount;r++)n.push(t.getRangeAt(r))}else n=E.doc.createRange?[E.doc.createRange()]:[];return void 0!==e?n[e]:n}function S(){var e=L();try{e.removeAllRanges?e.removeAllRanges():e.empty?e.empty():e.clear&&e.clear()}catch(t){}}function p(e,t){var n=e;
vendor: 4,422 bytes, line 679
679return n.nodeType===Node.ELEMENT_NODE&&0<n.childNodes.length&&n.childNodes[t]&&(n=n.childNodes[t]),n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),n}function N(){if(E.$wp){E.markers.remove();var e,t,n=f(),r=[];for(t=0;t<n.length;t++)if(n[t].startContainer!==E.doc||E.browser.msie){var o=(e=n[t]).collapsed,i=E.markers.place(e,!0,t),a=E.markers.place(e,!1,t);if(void 0!==i&&i||!o||(y(".fr-marker").remove(),E.selection.setAtEnd(E.el)),E.el.normalize(),E.browser.safari&&!o)try{(e=E.doc.createRange()).setStartAfter(i),e.setEndBefore(a),r.push(e)}catch(s){}}if(E.browser.safari&&r.length)for(E.selection.clear(),t=0;t<r.length;t++)E.selection.get().addRange(r[t])}}function T(){var e,t=E.el.querySelectorAll('.fr-marker[data-type="true"]');if(!E.$wp)return E.markers.remove(),!1;if(0===t.length)return!1;if(E.browser.msie||E.browser.edge)for(e=0;e<t.length;e++)t[e].style.display="inline-block";E.core.hasFocus()||E.browser.msie||E.browser.webkit||E.$el.focus(),S();var n=L();for(e=0;e<t.length;e++){var r=y(t[e]).data("id"),o=t[e],i=E.doc.createRange(),a=E.$el.find('.fr-marker[data-type="false"][data-id="'.concat(r,'"]'));(E.browser.msie||E.browser.edge)&&a.css("display","inline-block");var s=null;if(0<a.length){a=a[0];try{for(var l=!1,c=o.nextSibling,d=null;c&&c.nodeType===Node.TEXT_NODE&&0===c.textContent.length;)c=(d=c).nextSibling,y(d).remove();for(var f=a.nextSibling;f&&f.nodeType===Node.TEXT_NODE&&0===f.textContent.length;)f=(d=f).nextSibling,y(d).remove();if(o.nextSibling===a||a.nextSibling===o){for(var p=o.nextSibling===a?o:a,h=p===o?a:o,u=p.previousSibling;u&&u.nodeType===Node.TEXT_NODE&&0===u.length;)u=(d=u).previousSibling,y(d).remove();if(u&&u.nodeType===Node.TEXT_NODE)for(;u&&u.previousSibling&&u.previousSibling.nodeType===Node.TEXT_NODE;)u.previousSibling.textContent+=u.textContent,u=u.previousSibling,y(u.nextSibling).remove();for(var g=h.nextSibling;g&&g.nodeType===Node.TEXT_NODE&&0===g.length;)g=(d=g).nextSibling,y(d).remove();if(g&&g.nodeType===Node.TEXT_NODE)for(;g&&g.nextSibling&&g.nextSibling.nodeType===Node.TEXT_NODE;)g.nextSibling.textContent=g.textContent+g.nextSibling.textContent,g=g.nextSibling,y(g.previousSibling).remove();if(u&&(E.node.isVoid(u)||E.node.isBlock(u))&&(u=null),g&&(E.node.isVoid(g)||E.node.isBlock(g))&&(g=null),u&&g&&u.nodeType===Node.TEXT_NODE&&g.nodeType===Node.TEXT_NODE){y(o).remove(),y(a).remove();var C=u.textContent.length;u.textContent+=g.textContent,y(g).remove(),E.spaces.normalize(u),i.setStart(u,C),i.setEnd(u,C),l=!0}else!u&&g&&g.nodeType===Node.TEXT_NODE?(y(o).remove(),y(a).remove(),E.opts.htmlUntouched||E.spaces.normalize(g),s=y(E.doc.createTextNode("\u200b")).get(0),y(g).before(s),i.setStart(g,0),i.setEnd(g,0),l=!0):!g&&u&&u.nodeType===Node.TEXT_NODE&&(y(o).remove(),y(a).remove(),E.opts.htmlUntouched||E.spaces.normalize(u),s=y(E.doc.createTextNode("\u200b")).get(0),y(u).after(s),i.setStart(u,u.textContent.length),i.setEnd(u,u.textContent.length),l=!0)}if(!l){var m=void 0,v=void 0;v=(E.browser.chrome||E.browser.edge)&&o.nextSibling===a?(m=M(a,i,!0)||i.setStartAfter(a),M(o,i,!1)||i.setEndBefore(o)):(o.previousSibling===a&&(a=(o=a).nextSibling),a.nextSibling&&"BR"===a.nextSibling.tagName||!a.nextSibling&&E.node.isBlock(o.previousSibling)||o.previousSibling&&"BR"===o.previousSibling.tagName||(o.style.display="inline",a.style.display="inline",s=y(E.doc.createTextNode("\u200b")).get(0)),m=M(o,i,!0)||y(o).before(s)&&i.setStartBefore(o),M(a,i,!1)||y(a).after(s)&&i.setEndAfter(a)),"function"==typeof m&&m(),"function"==typeof v&&v()}}catch(b){}}s&&y(s).remove();try{n.addRange(i)}catch(b){}}E.markers.remove()}function M(e,t,n){var r,o=e.previousSibling,i=e.nextSibling;return o&&i&&o.nodeType===Node.TEXT_NODE&&i.nodeType===Node.TEXT_NODE?(r=o.textContent.length,n?(i.textContent=o.textContent+i.textContent,y(o).remove(),y(e).remove(),E.opts.htmlUntouched||E.spaces.normalize(i),function(){t.setStart(i,r)}):(o.textContent+=i.textContent,y(i).remove(),y(e).remove(),E.opts.htmlUntouched||E.spaces.normalize(o),function(){t.setEnd(o,r)})):o&&!i&&o.nodeType===Node.TEXT_NODE?(r=o.textContent.length,n?(E.opts.htmlUntouched||E.spaces.normalize(o),function(){t.setStart(o,r)}):(E.opts.htmlUntouched||E.spaces.normalize(o),function(){t.setEnd(o,r)})):!(!i||o||i.nodeType!==Node.TEXT_NODE)&&(n?(E.opts.htmlUntouched||E.spaces.normalize(i),function(){t.setStart(i,0)}):(E.opts.htmlUntouched||E.spaces.normalize(i),function(){t.setEnd(i,0)}
vendor: 4,570 bytes, line 679
679))}function A(){for(var e=f(),t=0;t<e.length;t++)if(!e[t].collapsed)return!1;return!0}function o(e){var t,n,r=!1,o=!1;if(E.win.getSelection){var i=E.win.getSelection();i.rangeCount&&((n=(t=i.getRangeAt(0)).cloneRange()).selectNodeContents(e),n.setEnd(t.startContainer,t.startOffset),r=a(n),n.selectNodeContents(e),n.setStart(t.endContainer,t.endOffset),o=a(n))}else E.doc.selection&&"Control"!==E.doc.selection.type&&((n=(t=E.doc.selection.createRange()).duplicate()).moveToElementText(e),n.setEndPoint("EndToStart",t),r=a(n),n.moveToElementText(e),n.setEndPoint("StartToEnd",t),o=a(n));return{atStart:r,atEnd:o}}function a(e){return""===e.toString().replace(/[\u200B-\u200D\uFEFF]/g,"")}function x(e,t){void 0===t&&(t=!0);var n=y(e).html();n&&n.replace(/\u200b/g,"").length!==n.length&&y(e).html(n.replace(/\u200b/g,""));for(var r=E.node.contents(e),o=0;o<r.length;o++)r[o].nodeType!==Node.ELEMENT_NODE?y(r[o]).remove():(x(r[o],0===o),0===o&&(t=!1));if(e.nodeType===Node.TEXT_NODE){var i=y(document.createElement("span")).attr("data-first","true").attr("data-text","true");y(e)[0].replaceWith(i[0])}else t&&y(e).attr("data-first",!0)}function O(){return 0===y(this).find("fr-inner").length}function h(){try{if(!E.$wp)return!1;for(var e=f(0).commonAncestorContainer;e&&!E.node.isElement(e);)e=e.parentNode;return!!E.node.isElement(e)}catch(t){return!1}}function r(e,t){if(!e||0<e.getElementsByClassName("fr-marker").length)return!1;for(var n=e.firstChild;n&&(E.node.isBlock(n)||t&&!E.node.isVoid(n)&&n.nodeType===Node.ELEMENT_NODE);)n=(e=n).firstChild;e.innerHTML=V.MARKERS+e.innerHTML}function i(e,t){if(!e||0<e.getElementsByClassName("fr-marker").length)return!1;for(var n=e.lastChild;n&&(E.node.isBlock(n)||t&&!E.node.isVoid(n)&&n.nodeType===Node.ELEMENT_NODE);)n=(e=n).lastChild;var r=E.doc.createElement("SPAN");for(r.setAttribute("id","fr-sel-markers"),r.innerHTML=V.MARKERS;e.parentNode&&E.opts.htmlAllowedEmptyTags&&0<=E.opts.htmlAllowedEmptyTags.indexOf(e.tagName.toLowerCase());)e=e.parentNode;e.appendChild(r);var o=e.querySelector("#fr-sel-markers");o.outerHTML=o.innerHTML}return{text:s,get:L,ranges:f,clear:S,element:function l(){var e=L();try{if(e.rangeCount){var t,n=f(0),r=n.startContainer;if(E.node.isElement(r)&&0===n.startOffset&&r.childNodes.length)for(;r.childNodes.length&&r.childNodes[0].nodeType===Node.ELEMENT_NODE;)r=r.childNodes[0];if(r.nodeType===Node.TEXT_NODE&&n.startOffset===(r.textContent||"").length&&r.nextSibling&&(r=r.nextSibling),r.nodeType===Node.ELEMENT_NODE){var o=!1;if(E.node.isElement(r)&&""==r.textContent&&"IMG"==r.childNodes[0].tagName&&r.childNodes.length)for(;r.childNodes.length&&r.childNodes[0].nodeType===Node.ELEMENT_NODE;)r=r.childNodes[0];if(0<r.childNodes.length&&r.childNodes[n.startOffset]){for(t=r.childNodes[n.startOffset];t&&t.nodeType===Node.TEXT_NODE&&0===t.textContent.length;)t=t.nextSibling;if(t&&t.textContent.replace(/\u200B/g,"")===s().replace(/\u200B/g,"")&&(r=t,o=!0),!o&&1<r.childNodes.length&&0<n.startOffset&&r.childNodes[n.startOffset-1]){for(t=r.childNodes[n.startOffset-1];t&&t.nodeType===Node.TEXT_NODE&&0===t.textContent.length;)t=t.nextSibling;t&&t.textContent.replace(/\u200B/g,"")===s().replace(/\u200B/g,"")&&(r=t,o=!0)}}else!n.collapsed&&r.nextSibling&&r.nextSibling.nodeType===Node.ELEMENT_NODE&&(t=r.nextSibling)&&t.textContent.replace(/\u200B/g,"")===s().replace(/\u200B/g,"")&&(r=t,o=!0);!o&&0<r.childNodes.length&&y(r.childNodes[0]).text().replace(/\u200B/g,"")===s().replace(/\u200B/g,"")&&["BR","IMG","HR"].indexOf(r.childNodes[0].tagName)<0&&(r=r.childNodes[0])}for(;r.nodeType!==Node.ELEMENT_NODE&&r.parentNode;)r=r.parentNode;for(var i=r;i&&"HTML"!==i.tagName;){if(i===E.el)return r;i=y(i).parent()[0]}}}catch(a){}return E.el},endElement:function c(){var e=L();try{if(e.rangeCount){var t,n=f(0),r=n.endContainer;if(r.nodeType===Node.ELEMENT_NODE){var o=!1;0<r.childNodes.length&&r.childNodes[n.endOffset]&&y(r.childNodes[n.endOffset]).text()===s()?(r=r.childNodes[n.endOffset],o=!0):!n.collapsed&&r.previousSibling&&r.previousSibling.nodeType===Node.ELEMENT_NODE?(t=r.previousSibling)&&t.textContent.replace(/\u200B/g,"")===s().replace(/\u200B/g,"")&&(r=t,o=!0):!n.collapsed&&0<r.childNodes.length&&r.childNodes[n.endOffset]&&(t=r.childNodes[n.endOffset].previousSibling).nodeType===Node.ELEMENT_NODE&&t&&t.textContent.replace(/\u200B/g,"")===s().replace(/\u200B/g,"")&&(r=t,o=!0),!o&&0<r.childNodes.length&&y(r.childNodes[r.childNodes.length-1]).text()===s()&&["BR","IMG","HR"].indexOf(r.childNodes[r.childNodes.length-1].tagName)<0&&(r=r.childNodes[r.childNodes.length-1])}
vendor: 4,719 bytes, line 679
679for(r.nodeType===Node.TEXT_NODE&&0===n.endOffset&&r.previousSibling&&r.previousSibling.nodeType===Node.ELEMENT_NODE&&(r=r.previousSibling);r.nodeType!==Node.ELEMENT_NODE&&r.parentNode;)r=r.parentNode;for(var i=r;i&&"HTML"!==i.tagName;){if(i===E.el)return r;i=y(i).parent()[0]}}}catch(a){}return E.el},save:N,restore:T,isCollapsed:A,isFull:function d(){if(A())return!1;E.selection.save();var e,t=E.el.querySelectorAll("td, th, img, br, iframe");for(e=0;e<t.length;e++)(t[e].nextSibling||"IMG"===t[e].tagName||"IFRAME"===t[e].tagName)&&(t[e].innerHTML='<span class="fr-mk" style="display: none;">&nbsp;</span>'.concat(t[e].innerHTML));var n=!1,r=o(E.el);for(r.atStart&&r.atEnd&&(n=!0),t=E.el.querySelectorAll(".fr-mk"),e=0;e<t.length;e++)t[e].parentNode.removeChild(t[e]);return E.selection.restore(),n},inEditor:h,remove:function w(){if(A())return!0;var e;function t(e){for(var t=e.previousSibling;t&&t.nodeType===Node.TEXT_NODE&&0===t.textContent.length;){var n=t;t=t.previousSibling,y(n).remove()}return t}function n(e){for(var t=e.nextSibling;t&&t.nodeType===Node.TEXT_NODE&&0===t.textContent.length;){var n=t;t=t.nextSibling,y(n).remove()}return t}N();var r=E.$el.find('.fr-marker[data-type="true"]');for(e=0;e<r.length;e++)for(var o=r[e];!(t(o)||E.node.isBlock(o.parentNode)||E.$el.is(o.parentNode)||E.node.hasClass(o.parentNode,"fr-inner"));)y(o.parentNode).before(o);var i=E.$el.find('.fr-marker[data-type="false"]');for(e=0;e<i.length;e++){for(var a=i[e];!(n(a)||E.node.isBlock(a.parentNode)||E.$el.is(a.parentNode)||E.node.hasClass(a.parentNode,"fr-inner"));)y(a.parentNode).after(a);a.parentNode&&E.node.isBlock(a.parentNode)&&E.node.isEmpty(a.parentNode)&&!E.$el.is(a.parentNode)&&!E.node.hasClass(a.parentNode,"fr-inner")&&E.opts.keepFormatOnDelete&&y(a.parentNode).after(a)}if(function b(){for(var e=E.$el.find(".fr-marker"),t=0;t<e.length;t++)if(y(e[t]).parentsUntil('.fr-element, [contenteditable="true"]','[contenteditable="false"]').length)return!1;return!0}()){!function L(e,t){var n=E.node.contents(e.get(0));0<=["TD","TH"].indexOf(e.get(0).tagName)&&1===e.find(".fr-marker").length&&(E.node.hasClass(n[0],"fr-marker")||"BR"==n[0].tagName&&E.node.hasClass(n[0].nextElementSibling,"fr-marker"))&&e.attr("data-del-cell",!0);for(var r=0;r<n.length;r++){var o=n[r];E.node.hasClass(o,"fr-marker")?t=(t+1)%2:t?0<y(o).find(".fr-marker").length?t=L(y(o),t):["TD","TH"].indexOf(o.tagName)<0&&!E.node.hasClass(o,"fr-inner")?!E.opts.keepFormatOnDelete||0<E.$el.find("[data-first]").length||E.node.isVoid(o)?y(o).remove():x(o):E.node.hasClass(o,"fr-inner")?0===y(o).find(".fr-inner").length?y(o).html("<br>"):y(o).find(".fr-inner").filter(O).html("<br>"):(y(o).empty(),y(o).attr("data-del-cell",!0)):0<y(o).find(".fr-marker").length&&(t=L(y(o),t))}return t}(E.$el,0);var s=E.$el.find('[data-first="true"]');if(s.length)E.$el.find(".fr-marker").remove(),s.append(V.INVISIBLE_SPACE+V.MARKERS).removeAttr("data-first"),s.attr("data-text")&&s.replaceWith(s.html());else for(E.$el.find("table").filter(function(){return 0<y(this).find("[data-del-cell]").length&&y(this).find("[data-del-cell]").length===y(this).find("td, th").length}).remove(),E.$el.find("[data-del-cell]").removeAttr("data-del-cell"),r=E.$el.find('.fr-marker[data-type="true"]'),e=0;e<r.length;e++){var l=r[e],c=l.nextSibling,d=E.$el.find('.fr-marker[data-type="false"][data-id="'.concat(y(l).data("id"),'"]')).get(0);if(d){if(l&&(!c||c!==d)){var f=E.node.blockParent(l),p=E.node.blockParent(d),h=!1,u=!1;if(f&&0<=["UL","OL"].indexOf(f.tagName)&&(h=!(f=null)),p&&0<=["UL","OL"].indexOf(p.tagName)&&(u=!(p=null)),y(l).after(d),f!==p)if(null!==f||h)if(null!==p||u||0!==y(f).parentsUntil(E.$el,"table").length)f&&p&&0===y(f).parentsUntil(E.$el,"table").length&&0===y(p).parentsUntil(E.$el,"table").length&&!y(f).contains(p)&&!y(p).contains(f)&&(y(f).append(y(p).html()),y(p).remove());else{for(c=f;!c.nextSibling&&c.parentNode!==E.el;)c=c.parentNode;for(c=c.nextSibling;c&&"BR"!==c.tagName;){var g=c.nextSibling;y(f).append(c),c=g}c&&"BR"===c.tagName&&y(c).remove()}else{var C=E.node.deepestParent(l);C?(y(C).after(y(p).html()),y(p).remove()):0===y(p).parentsUntil(E.$el,"table").length&&(y(l).next().after(y(p).html()),y(p).remove())}}}else d=y(l).clone().attr("data-type",!1),y(l).after(d)}}E.$el.find("li:empty").remove(),E.opts.keepFormatOnDelete||E.html.fillEmptyBlocks(),E.html.cleanEmptyTags(!0),E.opts.htmlUntouched||(E.clean.lists(),E.$el.find("li:empty").append("<br>"),E.spaces.normalize());var m=E.$el.find(".fr-marker").last().get(0),v=E.$el.find(".fr-marker").first().get(0);void 0!==m&&void 0!==v&&!m.nextSibling&&v.previousSibling&&"BR"===v.previousSibling.tagName&&E.node.isElement(m.parentNode)&&E.node.isElement(v.parentNode)&&E.$el.a
vendor: 25,663 bytes, line 679
679ppend("<br>"),T()},blocks:function u(e){var t,n,r=[],o=L();if(h()&&o.rangeCount){var i=f();for(t=0;t<i.length;t++){var a=i[t],s=p(a.startContainer,a.startOffset),l=p(a.endContainer,a.endOffset);(n=E.node.blockParent(s))&&r.indexOf(n)<0&&r.push(n),(E.node.isBlock(s)||E.node.hasClass(s,"fr-inner"))&&r.indexOf(s)<0&&r.push(s);for(var c=[],d=s;d!==l&&d!==E.el;)c.indexOf(d)<0&&d.children&&d.children.length?(c.push(d),d=d.children[0]):d.nextSibling?d=d.nextSibling:d.parentNode&&(d=d.parentNode,c.push(d)),E.node.isBlock(d)&&c.indexOf(d)<0&&r.indexOf(d)<0&&(d!==l||0<a.endOffset)&&r.push(d);E.node.isBlock(l)&&r.indexOf(l)<0&&0<a.endOffset&&r.push(l),(n=E.node.blockParent(l))&&r.indexOf(n)<0&&r.push(n)}}for(t=r.length-1;0<t;t--)if(y(r[t-1]).contains(r[t])){if(e&&y(r[t]).find("ul, ol").length)continue;r.splice(t-1,1)}else if(y(r[t]).contains(r[t-1])){if(e&&y(r[t]).find("ul, ol").length)continue;r.splice(t,1)}return r},info:o,setAtEnd:i,setAtStart:r,setBefore:function g(e,t){void 0===t&&(t=!0);for(var n=e.previousSibling;n&&n.nodeType===Node.TEXT_NODE&&0===n.textContent.length;)n=n.previousSibling;return n?(E.node.isBlock(n)?i(n):"BR"===n.tagName?y(n).before(V.MARKERS):y(n).after(V.MARKERS),!0):!!t&&(E.node.isBlock(e)?r(e):y(e).before(V.MARKERS),!0)},setAfter:function C(e,t){void 0===t&&(t=!0);for(var n=e.nextSibling;n&&n.nodeType===Node.TEXT_NODE&&0===n.textContent.length;)n=n.nextSibling;return n?(E.node.isBlock(n)?r(n):y(n).before(V.MARKERS),!0):!!t&&(E.node.isBlock(e)?i(e):y(e).after(V.MARKERS),!0)},rangeElement:p}},Object.assign(V.DEFAULTS,{language:null}),V.LANGUAGE={},V.MODULES.language=function(e){var t;return{_init:function n(){V.LANGUAGE&&(t=V.LANGUAGE[e.opts.language]),t&&t.direction&&(e.opts.direction=t.direction)},translate:function r(e){return t&&t.translation[e]&&t.translation[e].length?t.translation[e]:e}}},Object.assign(V.DEFAULTS,{placeholderText:"Type something"}),V.MODULES.placeholder=function(f){var p=f.$;function e(){f.$placeholder||function d(){f.$placeholder=p(f.doc.createElement("SPAN")).addClass("fr-placeholder"),f.$wp.append(f.$placeholder)}();var e=f.opts.iframe?f.$iframe.prev().outerHeight(!0):f.$el.prev().outerHeight(!0),t=0,n=0,r=0,o=0,i=0,a=0,s=f.node.contents(f.el),l=p(f.selection.element()).css("text-align");if(s.length&&s[0].nodeType===Node.ELEMENT_NODE){var c=p(s[0]);(0<f.$wp.prev().length||0<f.$el.prev().length)&&f.ready&&(t=f.helpers.getPX(c.css("margin-top")),o=f.helpers.getPX(c.css("padding-top")),n=f.helpers.getPX(c.css("margin-left")),r=f.helpers.getPX(c.css("margin-right")),i=f.helpers.getPX(c.css("padding-left")),a=f.helpers.getPX(c.css("padding-right"))),f.$placeholder.css("font-size",c.css("font-size")),f.$placeholder.css("line-height",c.css("line-height"))}else f.$placeholder.css("font-size",f.$el.css("font-size")),f.$placeholder.css("line-height",f.$el.css("line-height"));f.$wp.addClass("show-placeholder"),f.$placeholder.css({marginTop:Math.max(f.helpers.getPX(f.$el.css("margin-top")),t)+(e||0),paddingTop:Math.max(f.helpers.getPX(f.$el.css("padding-top")),o),paddingLeft:Math.max(f.helpers.getPX(f.$el.css("padding-left")),i),marginLeft:Math.max(f.helpers.getPX(f.$el.css("margin-left")),n),paddingRight:Math.max(f.helpers.getPX(f.$el.css("padding-right")),a),marginRight:Math.max(f.helpers.getPX(f.$el.css("margin-right")),r),textAlign:l}).text(f.language.translate(f.opts.placeholderText||f.$oel.attr("placeholder")||"")),f.$placeholder.html(f.$placeholder.text().replace(/\n/g,"<br>"))}function t(){f.$wp.removeClass("show-placeholder")}function n(){if(!f.$wp)return!1;f.core.isEmpty()?e():t()}return{_init:function r(){if(!f.$wp)return!1;f.events.on("init input keydown keyup contentChanged initialized",n)},show:e,hide:t,refresh:n,isVisible:function o(){return!f.$wp||f.node.hasClass(f.$wp.get(0),"show-placeholder")}}},V.UNICODE_NBSP=String.fromCharCode(160),V.VOID_ELEMENTS=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"],V.BLOCK_TAGS=["address","article","aside","audio","blockquote","canvas","details","dd","div","dl","dt","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","main","nav","noscript","ol","output","p","pre","section","table","tbody","td","tfoot","th","thead","tr","ul","video"],Object.assign(V.DEFAULTS,{htmlAllowedEmptyTags:["textarea","a","iframe","object","video","style","script",".fa",".fr-emoticon",".fr-inner","path","line","hr"],htmlDoNotWrapTags:["script","style"],htmlSimpleAmpersand:!1,htmlIgnoreCSSProperties:[],htmlExecuteScripts:!0}),V.MODULES.html=function(w){var u=w.$;function d(){return w.opts.enter===V.ENTER_P?"p":w.opts.enter===V.ENTER_DIV?"div":w.opts.enter===V.ENTER_BR?null:void 0}function s(e,t){return!(!e||e===w.el)&&(t?-1!=["PRE","SCRIPT","STYLE"].indexOf(e.tagName)||s(e.parentNode,t):-1!==["PRE","SCRIPT","STYLE"].indexOf(e.tagName))}function i(e){var t,n=[],r=[];if(e){var o=w.el.querySelectorAll(".fr-marker");for(t=0;t<o.length;t++){var i=w.node.blockParent(o[t])||o[t];if(i){var a=i.nextSibling,s=i.previousSibling;i&&r.indexOf(i)<0&&w.node.isBlock(i)&&r.push(i),s&&w.node.isBlock(s)&&r.indexOf(s)<0&&r.push(s),a&&w.node.isBlock(a)&&r.indexOf(a)<0&&r.push(a)}}}else r=w.el.querySelectorAll(p());var l=p();for(l+=",".concat(V.VOID_ELEMENTS.join(",")),l+=", .fr-inner",l+=",".concat(w.opts.htmlAllowedEmptyTags.join(":not(.fr-marker),"),":not(.fr-marker)"),t=r.length-1;0<=t;t--)if(!(r[t].textContent&&0<r[t].textContent.replace(/\u200B|\n/g,"").length||0<r[t].querySelectorAll(l).length)){for(var c=w.node.contents(r[t]),d=!1,f=0;f<c.length;f++)if(c[f].nodeType!==Node.COMMENT_NODE&&c[f].textContent&&0<c[f].textContent.replace(/\u200B|\n/g,"").length){d=!0;break}d||n.push(r[t])}return n}function p(){return V.BLOCK_TAGS.join(", ")}function e(e){var t,n,r=u.merge([],V.VOID_ELEMENTS);r=u.merge(r,w.opts.htmlAllowedEmptyTags),r=void 0===e?u.merge(r,V.BLOCK_TAGS):u.merge(r,V.NO_DELETE_TAGS),t=w.el.querySelectorAll("*:empty:not(".concat(r.join("):not("),"):not(.fr-marker):not(template)"));do{n=!1;for(var o=0;o<t.length;o++)0!==t[o].attributes.length&&void 0===t[o].getAttribute("href")||(t[o].parentNode.removeChild(t[o]),n=!0);(t=w.el.querySelectorAll("*:empty:not(".concat(r.join("):not("),"):not(.fr-marker):not(template)"))).length||(t=w.el.querySelectorAll("a[href]:not([name]):empty"))}while(t.length&&n)}function a(e,t){var n=d();if(t&&(n="div"),n){for(var r=w.doc.createDocumentFragment(),o=null,i=!1,a=e.firstChild,s=!1;a;){var l=a.nextSibling;if(a.nodeType===Node.ELEMENT_NODE&&(w.node.isBlock(a)||0<=w.opts.htmlDoNotWrapTags.indexOf(a.tagName.toLowerCase())&&!w.node.hasClass(a,"fr-marker")))o=null,r.appendChild(a.cloneNode(!0));else if(a.nodeType!==Node.ELEMENT_NODE&&a.nodeType!==Node.TEXT_NODE)o=null,r.appendChild(a.cloneNode(!0));else if("BR"===a.tagName)null===o?(o=w.doc.createElement(n),s=!0,t&&(o.setAttribute("class","fr-temp-div"),o.setAttribute("data-empty",!0)),o.appendChild(a.cloneNode(!0)),r.appendChild(o)):!1===i&&(o.appendChild(w.doc.createElement("br")),t&&(o.setAttribute("class","fr-temp-div"),o.setAttribute("data-empty",!0))),o=null;else{var c=a.textContent;if(a.nodeType!==Node.TEXT_NODE||0<c.replace(/\n/g,"").replace(/(^ *)|( *$)/g,"").length||c.replace(/(^ *)|( *$)/g,"").length&&c.indexOf("\n")<0){if("SPAN"===a.tagName&&u(a).hasClass("fr-marker")&&!a.previousSibling&&(a.nextSibling&&"TABLE"==a.nextSibling.tagName||a.nextSibling&&a.nextSibling.nextSibling&&"TABLE"==a.nextSibling.nextSibling.tagName)){r.appendChild(a),a=l;continue}if("SPAN"===a.tagName&&u(a).hasClass("fr-marker")&&a.previousSibling&&a.previousSibling.nodeType===Node.ELEMENT_NODE&&(a.nextSibling&&"TABLE"==a.nextSibling.tagName||a.nextSibling&&a.nextSibling.nextSibling&&"TABLE"==a.nextSibling.nextSibling.tagName)){r.appendChild(a),s=!0,a=l;continue}null===o&&(o=w.doc.createElement(n),s=!0,t&&o.setAttribute("class","fr-temp-div"),r.appendChild(o),i=!1),o.appendChild(a.cloneNode(!0)),i||w.node.hasClass(a,"fr-marker")||a.nodeType===Node.TEXT_NODE&&0===c.replace(/ /g,"").length||(i=!0)}else s=!0}a=l}s&&(e.innerHTML="",e.appendChild(r))}}function l(e,t){for(var n=e.length-1;0<=n;n--)a(e[n],t)}function t(e,t,n,r,o){if(!w.$wp)return!1;void 0===e&&(e=!1),void 0===t&&(t=!1),void 0===n&&(n=!1),void 0===r&&(r=!1),void 0===o&&(o=!1);var i=w.$wp.scrollTop();a(w.el,e),r&&l(w.el.querySelectorAll(".fr-inner"),e),t&&l(w.el.querySelectorAll("td, th"),e),n&&l(w.el.querySelectorAll("blockquote"),e),o&&l(w.el.querySelectorAll("li"),e),i!==w.$wp.scrollTop()&&w.$wp.scrollTop(i)}function n(e){if(void 0===e&&(e=w.el),e&&0<=["SCRIPT","STYLE","PRE"].indexOf(e.tagName))return!1;for(var t=w.doc.createTreeWalker(e,NodeFilter.SHOW_TEXT,w.node.filter(function(e){return null!==e.textContent.match(/([ \n]{2,})|(^[ \n]{1,})|([ \n]{1,}$)/g)}),!1);t.nextNode();){var n=t.currentNode;if(!s(n.parentNode,!0)){var r=w.node.isBlock(n.parentNode)||w.node.isElement(n.parentNode),o=n.textContent.replace(/(?!^)( ){2,}(?!$)/g," ").replace(/\n/g," ").replace(/^[ ]{2,}/g," ").replace(/[ ]{2,}$/g," ");if(r){var i=n.previousSibling,a=n.nextSibling;i&&a&&" "===o?o=w.node.isBlock(i)&&w.node.isBlock(a)?"":" ":(i||(o=o.replace(/^ */,"")),a||(o=o.replace(/ *$/,"")))}n.textContent=o}}}function r(e,t,n){var r=new RegExp(t,"gi").exec(e);return r?r[n]:null}function k(e){var t=e.doctype,n="<!DOCTYPE html>";return t&&(n="<!DOCTYPE ".concat(t.name).concat(t.publicId?' PUBLIC "'.concat(t.publicId,'"'):"").concat(!t.publicId&&t.systemId?" SYSTEM":"").concat(t.systemId?' "'.concat(t.systemId,'"'):"",">")),n}function c(e){var t=e.parentNode;if(t&&(w.node.isBlock(t)||w.node.isElement(t))&&["TD","TH"].indexOf(t.tagName)<0){for(var n=e.previousSibling,r=e.nextSibling;n&&(n.nodeType===Node.TEXT_NODE&&0===n.textContent.replace(/\n|\r/g,"").length||w.node.hasClass(n,"fr-tmp"));)n=n.previousSibling;if(r)return!1;n&&t&&"BR"!==n.tagName&&!w.node.isBlock(n)&&!r&&0<t.textContent.replace(/\u200B/g,"").length&&0<n.textContent.length&&!w.node.hasClass(n,"fr-marker")&&(w.el===t&&!r&&w.opts.enter===V.ENTER_BR&&w.browser.msie||e.parentNode.removeChild(e))}else!t||w.node.isBlock(t)||w.node.isElement(t)||e.previousSibling||e.nextSibling||!w.node.isDeletable(e.parentNode)||c(e.parentNode)}function g(){w.opts.htmlUntouched||(e(),t(),n(),w.spaces.normalize(null,!0),w.html.fillEmptyBlocks(),w.clean.lists(),w.clean.tables(),w.clean.toHTML5(),w.html.cleanBRs()),w.selection.restore(),o(),w.placeholder.refresh()}function o(){w.node.isEmpty(w.el)&&(null!==d()?w.el.querySelector(p())||w.el.querySelector("".concat(w.opts.htmlDoNotWrapTags.join(":not(.fr-marker),"),":not(.fr-marker)"))||(w.core.hasFocus()?(w.$el.html("<".concat(d(),">").concat(V.MARKERS,"<br/></").concat(d(),">")),w.selection.restore()):w.$el.html("<".concat(d(),"><br/></").concat(d(),">"))):w.el.querySelector("*:not(.fr-marker):not(br)")||(w.core.hasFocus()?(w.$el.html("".concat(V.MARKERS,"<br/>")),w.selection.restore()):w.$el.html("<br/>")))}function C(e,t){return r(e,"<".concat(t,"[^>]*?>([\\w\\W]*)</").concat(t,">"),1)}function m(e,t){var n=u("<div ".concat(r(e,"<".concat(t,"([^>]*?)>"),1)||"",">"));return w.node.rawAttributes(n.get(0))}function v(e){return(r(e,"<!DOCTYPE([^>]*?)>",0)||"<!DOCTYPE html>").replace(/\n/g," ").replace(/ {2,}/g," ")}function b(e,t){w.opts.htmlExecuteScripts?e.html(t):e.get(0).innerHTML=t}function $(e){var t;(t=/:not\(([^)]*)\)/g).test(e)&&(e=e.replace(t,"     $1 "));var n=100*(e.match(/(#[^\s+>~.[:]+)/g)||[]).length+10*(e.match(/(\[[^]]+\])/g)||[]).length+10*(e.match(/(\.[^\s+>~.[:]+)/g)||[]).length+10*(e.match(/(:[\w-]+\([^)]*\))/gi)||[]).length+10*(e.match(/(:[^\s+>~.[:]+)/g)||[]).length+(e.match(/(::[^\s+>~.[:]+|:first-line|:first-letter|:before|:after)/gi)||[]).length;return n+=((e=(e=e.replace(/[*\s+>~]/g," ")).replace(/[#.]/g," ")).match(/([^\s+>~.[:]+)/g)||[]).length}function H(e){if(w.events.trigger("html.processGet",[e]),e&&e.getAttribute&&""===e.getAttribute("class")&&e.removeAttribute("class"),e&&e.getAttribute&&""===e.getAttribute("style")&&e.removeAttribute("style"),e&&e.nodeType===Node.ELEMENT_NODE){var t,n=e.querySelectorAll('[class=""],[style=""]');for(t=0;t<n.length;t++){var r=n[t];""===r.getAttribute("class")&&r.removeAttribute("class"),""===r.getAttribute("style")&&r.removeAttribute("style")}if("BR"===e.tagName)c(e);else{var o=e.querySelectorAll("br");for(t=0;t<o.length;t++)c(o[t])}}}function D(e,t){return e[3]-t[3]}function B(){for(var e=w.el.querySelectorAll("input, textarea"),t=0;t<e.length;t++)"checkbox"!==e[t].type&&"radio"!==e[t].type||(e[t].checked?e[t].setAttribute("checked",e[t].checked):w.$(e[t]).removeAttr("checked")),e[t].getAttribute("value")&&e[t].setAttribute("value",e[t].value)}function f(e){var t=w.doc.createElement("div");return t.innerHTML=e,null!==t.querySelector(p())}function h(e){var t=null;if(void 0===e&&(t=w.selection.element()),w.opts.keepFormatOnDelete)return!1;var n,r,o=t?(t.textContent.match(/\u200B/g)||[]).length-t.querySelectorAll(".fr-marker").length:0;if((w.el.textContent.match(/\u200B/g)||[]).length-w.el.querySelectorAll(".fr-marker").length===o)return!1;do{r=!1,n=w.el.querySelectorAll("*:not(.fr-marker)");for(var i=0;i<n.length;i++){var a=n[i];if(t!==a){var s=a.textContent;0===a.children.length&&1===s.length&&8203===s.charCodeAt(0)&&["TD","STRONG","SPAN","EM","U","S","SUB","SUP"].indexOf(a.tagName)<0&&(u(a).remove(),r=!0)}}}while(r)}function L(){h(),w.placeholder&&setTimeout(w.placeholder.refresh,0)}return{defaultTag:d,isPreformatted:s,emptyBlocks:i,emptyBlockTagsQuery:function E(){return"".concat(V.BLOCK_TAGS.join(":empty, "),":empty")},blockTagsQuery:p,fillEmptyBlocks:function y(e){var t=i(e);w.node.isEmpty(w.el)&&w.opts.enter===V.ENTER_BR&&t.push(w.el);for(var n=0;n<t.length;n++){var r=t[n];"false"===r.getAttribute("contenteditable")||r.querySelector("".concat(w.opts.htmlAllowedEmptyTags.join(":not(.fr-marker),"),":not(.fr-marker)"))||w.node.isVoid(r)||"TABLE"===r.tagName||"TBODY"===r.tagName||"TR"===r.tagName||"UL"===r.tagName||"OL"===r.tagName||r.querySelector("br")||r.appendChild(w.doc.createElement("br"))}if(w.browser.msie&&w.opts.enter===V.ENTER_BR){var o=w.node.contents(w.el);o.length&&o[o.length-1].nodeType===Node.TEXT_NODE&&w.$el.append("<br>")}},cleanEmptyTags:e,cleanWhiteTags:h,cleanBlankSpaces:n,blocks:function S(){return w.$el.get(0).querySelectorAll(p())},getDoctype:k,set:function N(e){var t=w.clean.html((e||"").trim(),[],[],w.opts.fullPage),n=new RegExp("%3A//","g"),r=t.replace(n,"://");if(w.opts.fullPage){var o=C(r,"body")||(0<=r.indexOf("<body")?"":r),i=m(r,"body"),a=C(r,"head")||"<title></title>",s=m(r,"head"),l=u("<div>");l.append(a).contents().each(function(){(this.nodeType===Node.COMMENT_NODE||0<=["BASE","LINK","META","NOSCRIPT","SCRIPT","STYLE","TEMPLATE","TITLE"].indexOf(this.tagName))&&this.parentNode.removeChild(this)});var c=l.html().trim();a=u("<div>").append(a).contents().map(function(){return this.nodeType===Node.COMMENT_NODE?"\x3c!--".concat(this.nodeValue,"--\x3e"):0<=["BASE","LINK","META","NOSCRIPT","SCRIPT","STYLE","TEMPLATE","TITLE"].indexOf(this.tagName)?this.outerHTML:""}).toArray().join("");var d=v(r),f=m(r,"html");b(w.$el,"".concat(c,"\n").concat(o)),w.node.clearAttributes(w.el),w.$el.attr(i),w.$el.addClass("fr-view"),w.$el.attr("spellcheck",w.opts.spellcheck),w.$el.attr("dir",w.opts.direction),b(w.$head,a),w.node.clearAttributes(w.$head.get(0)),w.$head.attr(s),w.node.clearAttributes(w.$html.get(0)),w.$html.attr(f),w.iframe_document.doctype.parentNode.replaceChild(function h(e,t){var n=e.match(/<!DOCTYPE ?([^ ]*) ?([^ ]*) ?"?([^"]*)"? ?"?([^"]*)"?>/i);return n?t.implementation.createDocumentType(n[1],n[3],n[4]):t.implementation.createDocumentType("html")}(d,w.iframe_document),w.iframe_document.doctype)}else b(w.$el,r);var p=w.edit.isDisabled();w.edit.on(),w.core.injectStyle(w.opts.iframeDefaultStyle+w.opts.iframeStyle),g(),w.opts.useClasses||(w.$el.find("[fr-original-class]").each(function(){this.setAttribute("class",this.getAttribute("fr-original-class")),this.removeAttribute("fr-original-class")}),w.$el.find("[fr-original-style]").each(function(){this.setAttribute("style",this.getAttribute("fr-original-style")),this.removeAttribute("fr-original-style")})),p&&w.edit.off(),w.events.trigger("html.set"),w.events.trigger("charCounter.update")},syncInputs:B,get:function _(e,t){if(!w.$wp)return w.$oel.clone().removeClass("fr-view").removeAttr("contenteditable").get(0).outerHTML;var n="";w.events.trigger("html.beforeGet");var r,o,i=[],a={},s=[];if(B(),!w.opts.useClasses&&!t){var l=new RegExp("^".concat(w.opts.htmlIgnoreCSSProperties.join("$|^"),"$"),"gi");for(r=0;r<w.doc.styleSheets.length;r++){var c=void 0,d=0;try{c=w.doc.styleSheets[r].cssRules,w.doc.styleSheets[r].ownerNode&&"STYLE"===w.doc.styleSheets[r].ownerNode.nodeType&&(d=1)}catch(O){}if(c)for(var f=0,p=c.length;f<p;f++)if(c[f].selectorText&&0<c[f].style.cssText.length){var h=c[f].selectorText.replace(/body \s tbody \.fr-view /g,"").replace(/::/g,":"),u=void 0;try{u=w.el.querySelectorAll(h)}catch(O){u=[]}for(o=0;o<u.length;o++){!u[o].getAttribute("fr-original-style")&&u[o].getAttribute("style")?(u[o].setAttribute("fr-original-style",u[o].getAttribute("style")),i.push(u[o])):u[o].getAttribute("fr-original-style")||(u[o].setAttribute("fr-original-style",""),i.push(u[o])),a[u[o]]||(a[u[o]]={});for(var g=1e3*d+$(c[f].selectorText),C=c[f].style.cssText.split(";"),m=0;m<C.length;m++){var v=C[m].trim().split(":")[0];if(v&&!v.match(l)&&(a[u[o]][v]||(a[u[o]][v]=0)<=(u[o].getAttribute("fr-original-style")||"").indexOf("".concat(v,":"))&&(a[u[o]][v]=1e4),g>=a[u[o]][v]&&(a[u[o]][v]=g,C[m].trim().length))){var b=C[m].trim().split(":");b.splice(0,1);var L=b.join(":").trim();-1<L.indexOf("!important")&&(g+=1),s.push([u[o],v.trim(),L,g])}}}}}for(s.sort(D),r=0;r<s.length;r++){var E=s[r];E[0].style[E[1]]=E[2].replace(/!important/,"")}for(r=0;r<i.length;r++)if(i[r].getAttribute("class")&&(i[r].setAttribute("fr-original-class",i[r].getAttribute("class")),i[r].removeAttribute("class")),0<(i[r].getAttribute("fr-original-style")||"").trim().length){var y=i[r].getAttribute("fr-original-style").split(";");for(o=0;o<y.length;o++)if(0<y[o].indexOf(":")){var S=y[o].split(":"),N=S[0];S.splice(0,1),i[r].style[N.trim()]=S.join(":").trim()}}}if(w.node.isEmpty(w.el))w.opts.fullPage&&(n=k(w.iframe_document),n+="<html".concat(w.node.attributes(w.$html.get(0)),">").concat(w.$html.find("head").get(0).outerHTML,"<body></body></html>"));else if(void 0===e&&(e=!1),w.opts.fullPage){n=k(w.iframe_document),w.$el.removeClass("fr-view");var T=w.opts.heightMin,M=w.opts.height,A=w.opts.heightMax;w.opts.heightMin=null,w.opts.height=null,w.opts.heightMax=null,w.size.refresh(),n+="<html".concat(w.node.attributes(w.$html.get(0)),">").concat(w.$html.html(),"</html>"),w.opts.heightMin=T,w.opts.height=M,w.opts.heightMax=A,w.size.refresh(),w.$el.addClass("fr-view")}else n=w.$el.html();if(!w.opts.useClasses&&!t)for(r=0;r<i.length;r++)i[r].getAttribute("fr-original-class")&&(i[r].setAttribute("class",i[r].getAttribute("fr-original-class")),i[r].removeAttribute("fr-original-class")),null!==i[r].getAttribute("fr-original-style")&&void 0!==i[r].getAttribute("fr-original-style")?(0!==i[r].getAttribute("fr-original-style").length?i[r].setAttribute("style",i[r].getAttribute("fr-original-style")):i[r].removeAttribute("style"),i[r].removeAttribute("fr-original-style")):i[r].removeAttribute("style");w.opts.fullPage&&(n=(n=(n=(n=(n=(n=(n=(n=n.replace(/<style data-fr-style="true">(?:[\w\W]*?)<\/style>/g,"")).replace(/<link([^>]*)data-fr-style="true"([^>]*)>/g,"")).replace(/<style(?:[\w\W]*?)class="firebugResetStyles"(?:[\w\W]*?)>(?:[\w\W]*?)<\/style>/g,"")).replace(/<body((?:[\w\W]*?)) spellcheck="true"((?:[\w\W]*?))>((?:[\w\W]*?))<\/body>/g,"<body$1$2>$3</body>")).replace(/<body((?:[\w\W]*?)) contenteditable="(true|false)"((?:[\w\W]*?))>((?:[\w\W]*?))<\/body>/g,"<body$1$3>$4</body>")).replace(/<body((?:[\w\W]*?)) dir="([\w]*)"((?:[\w\W]*?))>((?:[\w\W]*?))<\/body>/g,"<body$1$3>$4</body>")).replace(/<body((?:[\w\W]*?))class="([\w\W]*?)(fr-rtl|fr-ltr)([\w\W]*?)"((?:[\w\W]*?))>((?:[\w\W]*?))<\/body>/g,'<body$1class="$2$4"$5>$6</body>')).replace(/<body((?:[\w\W]*?)) class=""((?:[\w\W]*?))>((?:[\w\W]*?))<\/body>/g,"<body$1$2>$3</body>")),w.opts.htmlSimpleAmpersand&&(n=n.replace(/&amp;/gi,"&")),w.events.trigger("html.afterGet"),e||(n=n.replace(/<span[^>]*? class\s*=\s*["']?fr-marker["']?[^>]+>\u200b<\/span>/gi,"")),n=w.clean.invisibleSpaces(n),n=w.clean.exec(n,H);var x=w.events.chainTrigger("html.get",n);return"string"==typeof x&&(n=x),n=(n=n.replace(/<pre(?:[\w\W]*?)>(?:[\w\W]*?)<\/pre>/g,function(e){return e.replace(/<br>/g,"\n")})).replace(/<meta((?:[\w\W]*?)) data-fr-http-equiv="/g,'<meta$1 http-equiv="')},getSelected:function T(){function e(e,t){for(;t&&(t.nodeType===Node.TEXT_NODE||!w.node.isBlock(t))&&!w.node.isElement(t)&&!w.node.hasClass(t,"fr-inner")&&!(t.nextSibling&&("BR"===t.nextSibling.nodeName||w.node.isBlock(t.nextSibling))||t.previousSibling&&("BR"===t.previousSibling.nodeName||w.node.isBlock(t.previousSibling))||w.node.hasClass(t.parentNode,"fr-view"));)t&&t.nodeType!==Node.TEXT_NODE&&u(e).wrapInner(w.node.openTagString(t)+w.node.closeTagString(t)),t=t.parentNode;t&&e.innerHTML===t.innerHTML?e.innerHTML=t.outerHTML:t&&t.innerText&&-1!=t.innerText.indexOf(e.innerHTML)?e.innerHTML=w.node.openTagString(t)+t.innerHTML+w.node.closeTagString(t):t&&(t.nextSibling&&("BR"===t.nextSibling.nodeName||w.node.isBlock(t.nextSibling))||t.previousSibling&&("BR"===t.previousSibling.nodeName||w.node.isBlock(t.previousSibling)))&&t.wholeText&&(e.innerHTML=t.wholeText)}function t(e){var t,n=null;if(w.win.getSelection){if((t=w.win.getSelection())&&t.rangeCount){if(n=t.getRangeAt(0).commonAncestorContainer,1==e.childNodes.length&&e.childNodes[0].nodeType==Node.TEXT_NODE){var r=n.parentNode.tagName,o=w.doc.createElement(r),i=n.parentNode.getAttribute("style");for(i&&o.setAttribute("style",i),o.append(e.textContent),n=n.parentNode;n&&n.parentNode&&n.parentNode!=w.$el.get(0);){r=n.parentNode.tagName;var a=w.doc.createElement(r);(i=n.parentNode.getAttribute("style"))&&a.setAttribute("style",i),a.append(o),o=a,n=n.parentNode}return e.innerHTML=o.outerHTML,null}n.nodeType!==Node.ELEMENT_NODE&&w.opts.enter!==V.ENTER_BR&&(n=n.parentNode)}}else(t=w.doc.selection)&&"Control"!==t.type&&(n=t.createRange().parentElement());return null!==n&&(0<=u(n).parents().toArray().indexOf(w.el)||n===w.el)?n:null}var n="";if("undefined"!=typeof w.win.getSelection){w.browser.mozilla&&(w.selection.save(),1<w.$el.find('.fr-marker[data-type="false"]').length&&(w.$el.find('.fr-marker[data-type="false"][data-id="0"]').remove(),w.$el.find('.fr-marker[data-type="false"]:last').attr("data-id","0"),w.$el.find(".fr-marker").not('[data-id="0"]').remove()),w.selection.restore());for(var r=w.selection.ranges(),o=0;o<r.length;o++){var i=document.createElement("div");i.appendChild(r[o].cloneContents()),e(i,t(i)),0<u(i).find(".fr-element").length&&(i=w.el),n+=i.innerHTML}}else"undefined"!=typeof w.doc.selection&&"Text"===w.doc.selection.type&&(n=w.doc.selection.createRange().htmlText);return n},insert:function M(e,t,n){var r;if(w.selection.isCollapsed()||w.selection.remove(),r=t?e:w.clean.html(e),0===e.indexOf('<i class="fa ')&&(r="<span>&nbsp;".concat(r,"</span>")),e.indexOf('class="fr-marker"')<0&&(r=function a(e){var t=w.doc.createElement("div");return t.innerHTML=e,w.selection.setAtEnd(t,!0),t.innerHTML}(r)),w.node.isEmpty(w.el)&&!w.opts.keepFormatOnDelete&&f(r))w.opts.trackChangesEnabled?w.track_changes.pasteInEmptyEdior(r):w.el.innerHTML=r;else{(function s(){var e=w.selection.ranges(0).commonAncestorContainer;return e!==w.el&&!w.$el.contains(e)})()&&w.selection.restore();var o=w.markers.insert();if(o)if(w.opts.trackChangesEnabled)w.track_changes.pasteInEdior(r);else{w.node.isLastSibling(o)&&u(o).parent().hasClass("fr-deletable")&&u(o).insertAfter(u(o).parent());var i=w.node.blockParent(o);if((f(r)||n)&&(w.node.deepestParent(o)||i&&"LI"===i.tagName)){if(i&&"LI"===i.tagName&&(r=function l(e){if(!w.html.defaultTag())return e;var t=w.doc.createElement("div");t.innerHTML=e;for(var n=t.querySelectorAll(":scope > ".concat(w.html.defaultTag())),r=n.length-1;0<=r;r--){var o=n[r];w.node.isBlock(o.previousSibling)||(o.previousSibling&&!w.node.isEmpty(o)&&u("<br>").insertAfter(o.previousSibling),o.outerHTML=o.innerHTML)}return t.innerHTML}(r)),!(o=w.markers.split()))return!1;o.outerHTML=r}else o.outerHTML=r}else w.el.innerHTML+=r}g(),w.keys.positionCaret(),w.events.trigger("html.inserted")},wrap:t,unwrap:function A(){w.$el.find("div.fr-temp-div").each(function(){this.previousSibling&&this.previousSibling.nodeType===Node.TEXT_NODE&&u(this).before("<br>"),u(this).attr("data-empty")||!this.nextSibling||w.node.isBlock(this.nextSibling)&&!u(this.nextSibling).hasClass("fr-temp-div")?u(this).replaceWith(u(this).html()):u(this).replaceWith("".concat(u(this).html(),"<br>"))}),w.$el.find(".fr-temp-div").removeClass("fr-temp-div").filter(function(){return""===u(this).attr("class")}).removeAttr("class")},escapeEntities:function x(e){return e.replace(/</gi,"&lt;").replace(/>/gi,"&gt;").replace(/"/gi,"&quot;").replace(/'/gi,"&#39;")},checkIfEmpty:o,extractNode:C,extractNodeAttrs:m,extractDoctype:v,cleanBRs:function O(){for(var e=w.el.getElementsByTagName("br"),t=0;t<e.length;t++)c(e[t])},_init:function R(){w.events.$on(w.$el,"mousemove","span.fr-word-select",function(e){var t=window.getSelection();t=window.getSelection();var n=document.createRange();n.selectNodeContents(e.target),t.removeAllRanges(),t.addRange(n)}),w.$wp&&(w.events.on("mouseup",L),w.events.on("keydown",L),w.events.on("contentChanged",o))},_setHtml:b}}
679,V.ENTER_P=0,V.ENTER_DIV=1,V.ENTER_BR=2,V.KEYCODE={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,ARROW_LEFT:37,ARROW_UP:38,ARROW_RIGHT:39,ARROW_DOWN:40,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,FF_SEMICOLON:59,FF_EQUALS:61,QUESTION_MARK:63,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,META:91,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,FF_HYPHEN:173,SEMICOLON:186,DASH:189,EQUALS:187,COMMA:188,HYPHEN:189,PERIOD:190,SLASH:191,APOSTROPHE:192,TILDE:192,SINGLE_QUOTE:222,OPEN_SQUARE_BRACKET:219,BACKSLASH:220,CLOSE_SQUARE_BRACKET:221,IME:229},Object.assign(V.DEFAULTS,{enter:V.ENTER_P,multiLine:!0,tabSpaces:0}),V.MODULES.keys=function(d){var f,n,r,i=d.$,p=!1;function h(e){if(d.selection.isCollapsed())if(["INPUT","BUTTON","TEXTAREA"].indexOf(e.target&&e.target.tagName)<0&&d.cursor.backspace(),d.helpers.isIOS()){var t=d.selection.ranges(0);
vendor: 4,169 bytes, line 679
679t.deleteContents(),t.insertNode(document.createTextNode("\u200b")),d.selection.get().modify("move","forward","character")}else["INPUT","BUTTON","TEXTAREA"].indexOf(e.target&&e.target.tagName)<0&&e.preventDefault(),e.stopPropagation();else e.preventDefault(),e.stopPropagation(),d.selection.remove();d.placeholder.refresh()}function u(e){["INPUT","BUTTON","TEXTAREA"].indexOf(e.target&&e.target.tagName)<0&&e.preventDefault(),e.stopPropagation(),""!==d.selection.text()||d.selection.element().hasAttribute("contenteditable")&&"false"===d.selection.element().getAttribute("contenteditable")||!d.selection.isCollapsed()&&"IMG"==d.selection.element().tagName?d.selection.remove():d.cursor.del(),d.placeholder.refresh()}function e(){if(d.browser.mozilla&&d.selection.isCollapsed()&&!p){var e=d.selection.ranges(0),t=e.startContainer,n=e.startOffset;t&&t.nodeType===Node.TEXT_NODE&&n<=t.textContent.length&&0<n&&32===t.textContent.charCodeAt(n-1)&&(d.selection.save(),d.spaces.normalize(),d.selection.restore())}}function t(){d.selection.isFull()&&setTimeout(function(){var e=d.html.defaultTag();e?d.$el.html("<".concat(e,">").concat(V.MARKERS,"<br/></").concat(e,">")):d.$el.html("".concat(V.MARKERS,"<br/>")),d.selection.restore(),d.placeholder.refresh(),d.button.bulkRefresh(),d.undo.saveStep()},0)}function o(){p=!1}function a(){p=!1}function g(){var e=d.html.defaultTag();e?d.$el.html("<".concat(e,">").concat(V.MARKERS,"<br/></").concat(e,">")):d.$el.html("".concat(V.MARKERS,"<br/>")),d.selection.restore()}function C(e,t){var n=(e&&e.parentElement).parentElement;if(e.parentElement&&(-1<e.innerHTML.indexOf("<span")||-1<e.parentElement.innerHTML.indexOf("<span")||n&&-1<e.parentElement.parentElement.innerHTML.indexOf("<span"))&&(e.classList.contains("fr-img-space-wrap")||e.parentElement.classList.contains("fr-img-space-wrap")||n&&e.parentElement.parentElement.classList.contains("fr-img-space-wrap"))){if(i(e.parentElement).is("p")){var r=e.parentElement.innerHTML;return(r=r.replace(/<br>/g,"")).length<1?e.parentElement.insertAdjacentHTML("afterbegin","&nbsp;"):"&nbsp;"!=r&&" "!=r&&"Backspace"==t.key?h(t):"&nbsp;"!=r&&" "!=r&&"Delete"==t.key&&u(t),!0}if(i(e).is("p")){var o=e.innerHTML.replace(/<br>/g,"");return o.length<1?e.insertAdjacentHTML("afterbegin","&nbsp;"):"&nbsp;"!=o&&" "!=o&&"Backspace"==t.key?h(t):"&nbsp;"!=o&&" "!=o&&"Delete"==t.key&&u(t),!0}}return!1}function s(e){var t=d.selection.element();if(t&&0<=["INPUT","TEXTAREA"].indexOf(t.tagName))return!0;if(e&&v(e.which))return!0;d.events.disableBlur();var n=e.which;if(16===n)return!0;if((f=n)===V.KEYCODE.IME)return p=!0;if(p=!1,m(e))return!0;var r=b(n)&&!m(e)&&!e.altKey,o=n===V.KEYCODE.BACKSPACE||n===V.KEYCODE.DELETE;if((d.selection.isFull()&&!d.opts.keepFormatOnDelete&&!d.placeholder.isVisible()||o&&d.placeholder.isVisible()&&d.opts.keepFormatOnDelete)&&(r||o)&&(g(),!b(n)))return e.preventDefault(),!0;if(n===V.KEYCODE.ENTER)!d.helpers.isIOS()&&e.shiftKey||t.classList.contains("fr-inner")||t.parentElement.classList.contains("fr-inner")?function i(e){e.preventDefault(),e.stopPropagation(),d.opts.multiLine&&(d.selection.isCollapsed()||d.selection.remove(),d.cursor.enter(!0))}(e):function a(e){d.opts.multiLine?(d.helpers.isIOS()||(e.preventDefault(),e.stopPropagation()),d.selection.isCollapsed()||d.selection.remove(),d.cursor.enter()):(e.preventDefault(),e.stopPropagation())}(e);else if(n===V.KEYCODE.BACKSPACE&&(e.metaKey||e.ctrlKey))!function s(){setTimeout(function(){d.events.disableBlur(),d.events.focus()},0)}();else if(n!==V.KEYCODE.BACKSPACE||m(e)||e.altKey)if(n!==V.KEYCODE.DELETE||m(e)||e.altKey||e.shiftKey)n===V.KEYCODE.SPACE?function l(e){var t=d.selection.element();if(!d.helpers.isMobile()&&t&&"A"===t.tagName){e.preventDefault(),e.stopPropagation(),d.selection.isCollapsed()||d.selection.remove();var n=d.markers.insert();if(n){var r=n.previousSibling;!n.nextSibling&&n.parentNode&&"A"===n.parentNode.tagName?(n.parentNode.insertAdjacentHTML("afterend","&nbsp;".concat(V.MARKERS)),n.parentNode.removeChild(n)):(r&&r.nodeType===Node.TEXT_NODE&&1===r.textContent.length&&160===r.textContent.charCodeAt(0)?r.textContent+=" ":n.insertAdjacentHTML("beforebegin","&nbsp;
vendor: 5,768 bytes, line 679
679"),n.outerHTML=V.MARKERS),d.selection.restore()}}}(e):n===V.KEYCODE.TAB?function c(e){if(0<d.opts.tabSpaces)if(d.selection.isCollapsed()){d.undo.saveStep(),e.preventDefault(),e.stopPropagation();for(var t="",n=0;n<d.opts.tabSpaces;n++)t+="&nbsp;";d.html.insert(t),d.placeholder.refresh(),d.undo.saveStep()}else e.preventDefault(),e.stopPropagation(),e.shiftKey?d.commands.outdent():d.commands.indent()}(e):m(e)||!b(e.which)||d.selection.isCollapsed()||e.ctrlKey||e.altKey||d.selection.remove();else{if(C(t,e))return e.preventDefault(),void e.stopPropagation();d.placeholder.isVisible()?(d.opts.keepFormatOnDelete||g(),e.preventDefault(),e.stopPropagation()):u(e)}else{if(C(t,e))return e.preventDefault(),void e.stopPropagation();d.placeholder.isVisible()?(d.opts.keepFormatOnDelete||g(),e.preventDefault(),e.stopPropagation()):h(e)}d.events.enableBlur()}function l(){if(!d.$wp)return!0;var e;if(d.opts.height||d.opts.heightMax){e=d.position.getBoundingRect().top,(d.helpers.isIOS()||d.helpers.isAndroid())&&(e-=d.helpers.scrollTop()),d.opts.iframe&&(e+=d.$iframe.offset().top);var t=d.selection.blocks(),n=null;t&&0<t.length&&t[0].offsetTop&&(n=t[0].getBoundingClientRect().top),!d.opts.iframe&&e>d.$wp.offset().top-d.helpers.scrollTop()+d.$wp.height()-20?d.$wp.scrollTop(e+d.$wp.scrollTop()-(d.$wp.height()+d.$wp.offset().top)+d.helpers.scrollTop()+20):d.opts.iframe&&e>d.$wp.height()&&e&&d.$wp.scrollTop(n-d.$wp.height()+80)}else e=d.position.getBoundingRect().top,d.opts.toolbarBottom&&(e+=d.opts.toolbarStickyOffset),(d.helpers.isIOS()||d.helpers.isAndroid())&&(e-=d.helpers.scrollTop()),d.opts.iframe&&(e+=d.$iframe.offset().top,e-=d.helpers.scrollTop()),(e+=d.opts.toolbarStickyOffset)>d.o_win.innerHeight-20&&i(d.o_win).scrollTop(e+d.helpers.scrollTop()-d.o_win.innerHeight+20),e=d.position.getBoundingRect().top,d.opts.toolbarBottom||(e-=d.opts.toolbarStickyOffset),(d.helpers.isIOS()||d.helpers.isAndroid())&&(e-=d.helpers.scrollTop()),d.opts.iframe&&(e+=d.$iframe.offset().top,e-=d.helpers.scrollTop()),e<100&&i(d.o_win).scrollTop(e+d.helpers.scrollTop()-100)}function c(e){var t=d.selection.element();if(t&&0<=["INPUT","TEXTAREA"].indexOf(t.tagName))return!0;if(e&&0===e.which&&f&&(e.which=f),d.helpers.isAndroid()&&d.browser.mozilla)return!0;if(p)return!1;if(e&&d.helpers.isIOS()&&e.which===V.KEYCODE.ENTER&&d.doc.execCommand("undo"),!d.selection.isCollapsed())return!0;if(e&&(e.which===V.KEYCODE.META||e.which===V.KEYCODE.CTRL))return!0;if(e&&v(e.which))return!0;if(e&&!d.helpers.isIOS()&&(e.which===V.KEYCODE.ENTER||e.which===V.KEYCODE.BACKSPACE||37<=e.which&&e.which<=40&&!d.browser.msie))try{l()}catch(o){}var n=d.selection.element();if(function i(e){if(!e)return!1;var t=e.innerHTML;return!!((t=t.replace(/<span[^>]*? class\s*=\s*["']?fr-marker["']?[^>]+>\u200b<\/span>/gi,""))&&/\u200B/.test(t)&&0<t.replace(/\u200B/gi,"").length)}(n)&&!d.node.hasClass(n,"fr-marker")&&"IFRAME"!==n.tagName&&function a(e){return!d.helpers.isIOS()||0===((e.textContent||"").match(/[\u3041-\u3096\u30A0-\u30FF\u4E00-\u9FFF\u3130-\u318F\uAC00-\uD7AF]/gi)||[]).length}(n)){d.selection.save();var r=d.$el.find(".fr-marker")[1];d.opts.enter===V.ENTER_BR&&n===d.$el.get(0)&&8===e.which&&null==r.nextSibling||function s(e){var t=e;-1<["STRONG","U","EM"].indexOf(e.nodeName)&&e.parentNode&&(t=e.parentNode);for(var n=d.doc.createTreeWalker(t,NodeFilter.SHOW_TEXT,d.node.filter(function(e){return/\u200B/gi.test(e.textContent)}),!1);n.nextNode();){var r=n.currentNode;r.textContent=r.textContent.replace(/\u200B/gi,"")}}(n),d.selection.restore()}}function m(e){if(-1!==navigator.userAgent.indexOf("Mac OS X")){if(e.metaKey&&!e.altKey)return!0}else if(e.ctrlKey&&!e.altKey)return!0;return!1}function v(e){if(e>=V.KEYCODE.ARROW_LEFT&&e<=V.KEYCODE.ARROW_DOWN)return!0}function b(e){if(e>=V.KEYCODE.ZERO&&e<=V.KEYCODE.NINE)return!0;if(e>=V.KEYCODE.NUM_ZERO&&e<=V.KEYCODE.NUM_MULTIPLY)return!0;if(e>=V.KEYCODE.A&&e<=V.KEYCODE.Z)return!0;if(d.browser.webkit&&0===e)return!0;switch(e){case V.KEYCODE.SPACE:case V.KEYCODE.QUESTION_MARK:case V.KEYCODE.NUM_PLUS:case V.KEYCODE.NUM_MINUS:case V.KEYCODE.NUM_PERIOD:case V.KEYCODE.NUM_DIVISION:case V.KEYCODE.SEMICOLON:case V.KEYCODE.FF_SEMICOLON:case V.KEYCODE.DASH:case V.KEYCODE.EQUALS:case V.KEYCODE.FF_EQUALS:case V.KEYCODE.COMMA:case V.KEYCODE.PERIOD:case V.KEYCODE.SLASH:case V.KEYCODE.APOSTROPHE:case V.KEYCODE.SINGLE_QUOTE:case V.KEYCODE.OPEN_SQUARE_BRACKET:case V.KEYCODE.BACKSLASH:case V.KEYCODE.CLOSE_SQUARE_BRACKET:return!0;default:return!1}}function L(e){var t=e.which;if(m(e)||37<=t&&t<=40||!b(t)&&t!==V.KEYCODE.DELETE&&t!==V.KEYCODE.BACKSPACE&&t!==V.KEYCODE.ENTER&&t!==V.KEYCODE.IME)return!0;n||(r=d.snapshot.get(),d.undo.canDo()||d.undo.saveStep()),clearTimeout(n),n=setTimeout(function(){n=null,d.undo.saveStep()},Math.max(250,d.opts.typingTimer))}function E(e){var t=e.which;if(m(e)||37<=t&&t<=40)return!0;r&&n?(d.undo.saveStep(r),r=null):void 0!==t&&0!==t||r||n||d.undo.saveStep()}function y(e){if(e&&"BR"===e.tagName)return!1;try{return 0===(e.textContent||"").length&&e.querySelector&&!e.querySelector(":scope > br")||e.childNodes&&1===e.childNodes.length&&e.childNodes[0].getAttribute&&("false"===e.childNodes[0].getAttribute("contenteditable")||d.node.hasClass(e.childNodes[0],"fr-img-caption"))}catch(t){return!1}}function S(e){var t=d.el.childNodes,n=d.html.defaultTag(),r=d.node.blockParent(d.selection.blocks()[0]);return r&&"TR"==r.tagName&&r.getAttribute("contenteditable")==undefined&&(r=r.closest("table")),!d.node.isEditable(e.target)||r&&"false"===r.getAttribute("contenteditable")?d.toolbar.disable():d.toolbar.enable(),!(!e.target||e.target===d.el)||(0===t.length||void(t[0].offsetHeight+t[0].offsetTop<=e.offsetY?y(t[t.length-1])&&(n?d.$el.append("<".concat(n,">").concat(V.MARKERS,"<br></").concat(n,">
vendor: 4,128 bytes, line 679
679")):d.$el.append("".concat(V.MARKERS,"<br>")),d.selection.restore(),l()):e.offsetY<=10&&y(t[0])&&(n?d.$el.prepend("<".concat(n,">").concat(V.MARKERS,"<br></").concat(n,">")):d.$el.prepend("".concat(V.MARKERS,"<br>")),d.selection.restore(),l())))}function N(){n&&clearTimeout(n)}return{_init:function T(){d.events.on("keydown",L),d.events.on("input",e),d.events.on("mousedown",a),d.events.on("keyup input",E),d.events.on("keypress",o),d.events.on("keydown",s),d.events.on("keyup",c),d.events.on("destroy",N),d.events.on("html.inserted",c),d.events.on("cut",t),d.opts.multiLine&&d.events.on("click",S),d.events.on("initialized",function(){d.el.addEventListener("compositionstart",function(){if(d.selection.isCollapsed()){var e=d.selection.ranges(0),t=e.startContainer,n=e.startOffset;if(t&&t.nodeType===Node.TEXT_NODE&&n<=t.textContent.length&&0<n&&8203===t.textContent.charCodeAt(n-1)){d.selection.save();var r=d.$el.find(".fr-marker");i(r.get(0).previousSibling).before(V.HAIR_SPACE),r.get(0).previousSibling.textContent=r.get(0).previousSibling.textContent.replace(/\u200B/gi,""),d.selection.restore()}}}),d.el.addEventListener("compositionend",function(){if(d.selection.isCollapsed()){var e=d.selection.ranges(0),t=e.startContainer,n=e.startOffset;if(t&&t.nodeType===Node.TEXT_NODE&&n<=t.textContent.length&&0<n&&8202===t.textContent.charCodeAt(0)){d.selection.save();var r=d.$el.find(".fr-marker");r.get(0).previousSibling.textContent=r.get(0).previousSibling.textContent.replace(/\u200A/gi,""),d.selection.restore()}}})})},ctrlKey:m,isCharacter:b,isArrow:v,forceUndo:function M(){n&&(clearTimeout(n),d.undo.saveStep(),r=null)},isIME:function A(){return p},isBrowserAction:function x(e){var t=e.which;return m(e)||t===V.KEYCODE.F5},positionCaret:l}},Object.assign(V.DEFAULTS,{pastePlain:!1,pasteDeniedTags:["colgroup","col","meta"],pasteDeniedAttrs:["class","id"],pasteAllowedStyleProps:[".*"],pasteAllowLocalImages:!1}),V.MODULES.paste=function(A){var a,s,x,O,l,w,k=A.$;function n(e,t){try{A.win.localStorage.setItem("fr-copied-html",e),A.win.localStorage.setItem("fr-copied-text",t)}catch(n){}}function e(e){var t=A.html.getSelected();n(t,k(A.doc.createElement("div")).html(t).text()),"cut"===e.type&&(A.undo.saveStep(),setTimeout(function(){A.selection.save(),A.html.wrap(),A.selection.restore(),A.events.focus(),A.undo.saveStep()},0))}var r=!1;function t(e){if("INPUT"===e.target.nodeName&&"text"===e.target.type)return!0;if(A.edit.isDisabled())return!1;if(c(e.target))return!1;if(r)return!1;if((e.originalEvent&&(e=e.originalEvent),e&&e.clipboardData&&e.clipboardData.getData)&&((e.clipboardData||window.clipboardData).getData("text/html")||"").match('content="Microsoft OneNote'))return!1;if(!1===A.events.trigger("paste.before",[e]))return e.preventDefault(),!1;if(e&&e.clipboardData&&e.clipboardData.getData){var t="";if(O=e.clipboardData.types,A.helpers.isArray(O))for(var n=0;n<O.length;n++)t+="".concat(O[n],";");else t=O;if(a="",/text\/rtf/.test(t)&&(s=e.clipboardData.getData("text/rtf")),/text\/html/.test(t)?(a=e.clipboardData.getData("text/html"),A.browser.mozilla&&("<p></p>"===a||""===a||/<!--StartFragment-->([ ])<!--EndFragment-->/.test(a)||/<!--StartFragment-->([<p></p>]*)<!--EndFragment-->/.test(a))&&(a=A.win.localStorage.getItem("fr-copied-html"))):/text\/rtf/.test(t)&&A.browser.safari?a=s:/public.rtf/.test(t)&&A.browser.safari&&(a=e.clipboardData.getData("text/rtf")),x=e.clipboardData.getData("text"),""!==a)return f(),e.preventDefault&&(e.stopPropagation(),e.preventDefault()),!1;a=null}return function i(){if(A.selection.save(),A.events.disableBlur(),a=null,l){l.html("");var e=d(A.selection.get().anchorNode)+A.$wp.offset().top;l.css("top",e),A.browser.edge&&A.opts.iframe&&A.$el.append(l)}else{var t=document.getElementsByTagName("BODY")[0],n=window.getComputedStyle(t).transform;if("none"!==n){var r=d(A.selection.get().anchorNode)+A.$wp.offset().top;l=k('<div contenteditable="true" style="position: fixed; top: '+r+'px; left: -9999px; height: 100%; width: 0; word-break: break-all; overflow:hidden; z-index: 2147483647; line-height: 140%; -moz-user-select: text; -webkit-user-select: text;
679 -ms-user-select: text; user-select: text;" tabIndex="-1"></div>')}else l=k('<div contenteditable="true" style="position: fixed; top: 0; left: -9999px; height: 100%; width: 0; word-break: break-all; overflow:hidden; z-index: 2147483647; line-height: 140%; -moz-user-select: text; -webkit-user-select: text; -ms-user-select: text; user-select: text;" tabIndex="-1"></div>');A.browser.webkit||A.browser.mozilla?("none"===n&&l.css("top",A.$sc.scrollTop()),A.$el.after(l)):A.browser.edge&&A.opts.iframe?A.$el.append(l):A.$box.after(l),A.events.on("destroy",function(){l.remove()})}var o;A.helpers.isIOS()&&A.$sc&&(o=A.$sc.scrollTop());A.opts.iframe&&A.$el.attr("contenteditable","false");l.focus(),A.helpers.isIOS()&&A.$sc&&A.$sc.scrollTop(o);A.win.setTimeout(f,1)}(),!1}function c(e){return e&&"false"===e.contentEditable}function o(e){if(e.originalEvent&&(e=e.originalEvent),c(e.target))return!1;if(e&&e.dataTransfer&&e.dataTransfer.getData){var t="";if(O=e.dataTransfer.types,A.helpers.isArray(O))for(var n=0;n<O.length;n++)t+="".concat(O[n],";");else t=O;if(a="",/text\/rtf/.test(t)&&(s=e.dataTransfer.getData("text/rtf")),/text\/html/.test(t)?a=e.dataTransfer.getData("text/html"):/text\/rtf/.test(t)&&A.browser.safari?a=s:/text\/plain/.test(t)&&!this.browser.mozilla&&(a=A.html.escapeEntities(e.dataTransfer.getData("text/plain")).replace(/\n/g,"<br>")),""!==a){A.keys.forceUndo(),w=A.snapshot.get(),A.selection.save(),A.$el.find(".fr-marker").removeClass("fr-marker").addClass("fr-marker-helper");var r=A.markers.insertAtPoint(e);if(A.$el.find(".fr-marker").removeClass("fr-marker").addClass("fr-marker-placeholder"),A.$el.find(".fr-marker-helper").addClass("fr-marker").removeClass("fr-marker-helper"),A.selection.restore(),A.selection.remove(),A.$el.find(".fr-marker-placeholder").addClass("fr-marker").removeClass("fr-marker-placeholder"),!1!==r){var o=A.el.querySelector(".fr-marker");return k(o).replaceWith(V.MARKERS),A.selection.restore(),f(),e.preventDefault&&(e.stopPropagation(),e.preventDefault()),!1}}else a=null}}function d(e){return e.nodeType===Node.TEXT_NODE?e.parentNode.offsetTop:e.offsetTop}function f(){A.opts.iframe&&A.$el.attr("contenteditable","true"),A.browser.edge&&A.opts.iframe&&A.$box.after(l),w||(A.keys.forceUndo(),w=A.snapshot.get()),a||(a=l.get(0).innerHTML,x=l.text(),A.$el[0].setAttribute("plainpaste",!0),A.selection.restore(),A.events.enableBlur());var e=a.match(/(class="?Mso|class='?Mso|class="?Xl|class='?Xl|class=Xl|style="[^"]*\bmso-|style='[^']*\bmso-|w:WordDocument|LibreOffice)/gi),t=A.events.chainTrigger("paste.beforeCleanup",a);if(t&&"string"==typeof t){a=t;var n=(new DOMParser).parseFromString(t,"text/html");x=n.body.innerText}(!e||e&&!1!==A.events.trigger("paste.wordPaste",[a]))&&i(a,e)}function $(e){for(var t="",n=0;n++<e;)t+="&nbsp;";return t}function i(e,t,n){var r,o=null,i=null;if(0<=e.toLowerCase().indexOf("<body")){var a="";0<=e.indexOf("<style")&&(a=e.replace(/[.\s\S\w\W<>]*(<style[^>]*>[\s]*[.\s\S\w\W<>]*[\s]*<\/style>)[.\s\S\w\W<>]*/gi,"$1")),e=(e=(e=a+e.replace(/[.\s\S\w\W<>]*<body[^>]*>[\s]*([.\s\S\w\W<>]*)[\s]*<\/body>[.\s\S\w\W<>]*/gi,"$1")).replace(/<pre(?:[\w\W]*?)>(?:[\w\W]*?)<\/pre>/g,function(e){return e.replace(/\n/g,"<br />")})).replace(/ \n/g," ").replace(/\n /g," ").replace(/([^>])\n([^<])/g,"$1 $2")}var s=!1;0<=e.indexOf('id="docs-internal-guid')&&(e=e.replace(/^[\w\W\s\S]* id="docs-internal-guid[^>]*>([\w\W\s\S]*)<\/b>[\w\W\s\S]*$/g,"$1"),s=!0),(0<=e.indexOf('content="Sheets"')||0<=e.indexOf("google-sheets-html-origin"))&&(e=e.replace(/width:0px;/g,""));var l=!1;if(!t)if((l=function y(){var e=null;try{e=A.win.localStorage.getItem("fr-copied-text")}catch(t){}return!(!e||!x||O&&-1===O.indexOf("text/html")||x.replace(/\u00A0/gi," ").replace(/\r|\n/gi,"")!==e.replace(/\u00A0/gi," ").replace(/\r|\n/gi,"")&&x.replace(/\s/g,"")!==e.replace(/\s/g,""))}())&&(e=A.win.localStorage.getItem("fr-copied-html")),l)e=A.clean.html(e,A.opts.pasteDeniedTags,A.opts.pasteDeniedAttrs);else{var c=A.opts.htmlAllowedStyleProps;A.opts.htmlAllowedStyleProps=A.opts.pasteAllowedStyleProps,A.opts.htmlAllowComments=!1,e=(e=(e=e.replace(/<span class="Apple-tab-span">\s*<\/span>/g,$(A.opts.tabSpaces||4))).replace(/<span class="Apple-tab-span" style="white-space:pre">(\t*)<\/span>/g,function(e,t){return $(t.length*(A.opts.tabSpaces||4))})).replace(/\t/g,$(A.opts.tabSpaces||4)),e=A.clean.html(e,A.opts.pasteDeniedTags,A.opts.pasteDeniedAttrs),A.opts.htmlAllowedStyleProps=c,A.o
679pts.htmlAllowComments=!0,A.html.defaultTag()&&"div"===A.html.defaultTag()||(e=H(e)),e=(e=e.replace(/\r/g,"")).replace(/^ */g,"").replace(/ *$/g,"")}!t||A.wordPaste&&n||(0===(e=e.replace(/^\n*/g,"").replace(/^ /g,"")).indexOf("<colgroup>")&&(e="<table>".concat(e,"</table>")),e=H(e=function S(e){var t;e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=e.replace(/<p(.*?)class="?'?MsoListParagraph"?'? ([\s\S]*?)>([\s\S]*?)<\/p>/gi,"<ul><li>$3</li></ul>")).replace(/<p(.*?)class="?'?NumberedText"?'? ([\s\S]*?)>([\s\S]*?)<\/p>/gi,"<ol><li>$3</li></ol>")).replace(/<p(.*?)class="?'?MsoListParagraphCxSpFirst"?'?([\s\S]*?)(level\d)?([\s\S]*?)>([\s\S]*?)<\/p>/gi,"<ul><li$3>$5</li>")).replace(/<p(.*?)class="?'?NumberedTextCxSpFirst"?'?([\s\S]*?)(level\d)?([\s\S]*?)>([\s\S]*?)<\/p>/gi,"<ol><li$3>$5</li>")).replace(/<p(.*?)class="?'?MsoListParagraphCxSpMiddle"?'?([\s\S]*?)(level\d)?([\s\S]*?)>([\s\S]*?)<\/p>/gi,"<li$3>$5</li>")).replace(/<p(.*?)class="?'?NumberedTextCxSpMiddle"?'?([\s\S]*?)(level\d)?([\s\S]*?)>([\s\S]*?)<\/p>/gi,"<li$3>$5</li>")).replace(/<p(.*?)class="?'?MsoListBullet"?'?([\s\S]*?)(level\d)?([\s\S]*?)>([\s\S]*?)<\/p>/gi,"<li$3>$5</li>")).replace(/<p(.*?)class="?'?MsoListParagraphCxSpLast"?'?([\s\S]*?)(level\d)?([\s\S]*?)>([\s\S]*?)<\/p>/gi,"<li$3>$5</li></ul>")).replace(/<p(.*?)class="?'?NumberedTextCxSpLast"?'?([\s\S]*?)(level\d)?([\s\S]*?)>([\s\S]*?)<\/p>/gi,"<li$3>$5</li></ol>")).replace(/<span([^<]*?)style="?'?mso-list:Ignore"?'?([\s\S]*?)>([\s\S]*?)<span/gi,"<span><span")).replace(/<!--\[if !supportLists\]-->([\s\S]*?)<!--\[endif\]-->/gi,"")).replace(/<!\[if !supportLists\]>([\s\S]*?)<!\[endif\]>/gi,"")).replace(/(\n|\r| class=(")?Mso[a-zA-Z0-9]+(")?)/gi," ")).replace(/<!--[\s\S]*?-->/gi,"")).replace(/<(\/)*(meta|link|span|\\?xml:|st1:|o:|font)(.*?)>
vendor: 5,947 bytes, line 679
679/gi,"");var n,r=["style","script","applet","embed","noframes","noscript"];for(t=0;t<r.length;t++){var o=new RegExp("<".concat(r[t],".*?").concat(r[t],"(.*?)>"),"gi");e=e.replace(o,"")}for(e=(e=(e=e.replace(/&nbsp;/gi," ")).replace(/<td([^>]*)><\/td>/g,"<td$1><br></td>")).replace(/<th([^>]*)><\/th>/g,"<th$1><br></th>");(e=(n=e).replace(/<[^/>][^>]*><\/[^>]+>/gi,""))!==n;);e=(e=e.replace(/<lilevel([^1])([^>]*)>/gi,'<li data-indent="true"$2>')).replace(/<lilevel1([^>]*)>/gi,"<li$1>"),e=(e=(e=A.clean.html(e,A.opts.pasteDeniedTags,A.opts.pasteDeniedAttrs)).replace(/<a>(.[^<]+)<\/a>/gi,"$1")).replace(/<br> */g,"<br>");var i=A.o_doc.createElement("div");i.innerHTML=e;var a=i.querySelectorAll("li[data-indent]");for(t=0;t<a.length;t++){var s=a[t],l=s.previousElementSibling;if(l&&"LI"===l.tagName){var c=l.querySelector(":scope > ul, :scope > ol");c||(c=document.createElement("ul"),l.appendChild(c)),c.appendChild(s)}else s.removeAttribute("data-indent")}return A.html.cleanBlankSpaces(i),e=i.innerHTML}(e))),A.opts.pastePlain&&(e=function N(e){var t,n=null,r=A.doc.createElement("div");r.innerHTML=e;var o=r.querySelectorAll("p, div, h1, h2, h3, h4, h5, h6, pre, blockquote");for(t=0;t<o.length;t++)(n=o[t]).innerText&&(n.outerHTML="<".concat(A.html.defaultTag()||"DIV",">").concat(n.innerText,"</").concat(A.html.defaultTag()||"DIV",">"));for(t=(o=r.querySelectorAll("*:not(".concat("p, div, h1, h2, h3, h4, h5, h6, pre, blockquote, ul, ol, li, table, tbody, thead, tr, td, br, img".split(",").join("):not("),")"))).length-1;0<=t;t--)(n=o[t]).outerHTML=n.innerHTML;return function i(e){for(var t=A.node.contents(e),n=0;n<t.length;n++)t[n].nodeType!==Node.TEXT_NODE&&t[n].nodeType!==Node.ELEMENT_NODE?t[n].parentNode.removeChild(t[n]):i(t[n])}(r),r.innerHTML}(e));var d=A.events.chainTrigger("paste.afterCleanup",e);if(A.$el[0].removeAttribute("plainpaste",!0),"string"==typeof d&&(e=d),""!==e){var f=A.o_doc.createElement("div");0<=(f.innerHTML=e).indexOf("<body>")?(A.html.cleanBlankSpaces(f),A.spaces.normalize(f,!0)):A.spaces.normalize(f);var p=f.getElementsByTagName("span");for(r=p.length-1;0<=r;r--){var h=p[r];0===h.attributes.length&&(h.outerHTML=h.innerHTML)}if(!0===A.opts.linkAlwaysBlank){var u=f.getElementsByTagName("a");for(r=u.length-1;0<=r;r--){var g=u[r];g.getAttribute("target")||g.setAttribute("target","_blank")}}var C=A.selection.element(),m=!1;if(C&&k(C).parentsUntil(A.el,"ul, ol").length&&(m=!0),m){var v=f.children;1===v.length&&0<=["OL","UL"].indexOf(v[0].tagName)&&(v[0].outerHTML=v[0].innerHTML)}if(!s){var b=f.getElementsByTagName("br");for(r=b.length-1;0<=r;r--){var L=b[r];A.node.isBlock(L.previousSibling)&&L.parentNode.removeChild(L)}}if(A.opts.enter===V.ENTER_BR)for(r=(o=f.querySelectorAll("p, div")).length-1;0<=r;r--)0===(i=o[r]).attributes.length&&(i.outerHTML=i.innerHTML+(i.nextSibling&&!A.node.isEmpty(i)?"<br>":""));else if(A.opts.enter===V.ENTER_DIV)for(r=(o=f.getElementsByTagName("p")).length-1;0<=r;r--)0===(i=o[r]).attributes.length&&(i.outerHTML="<div>".concat(i.innerHTML,"</div>"));else A.opts.enter===V.ENTER_P&&1===f.childNodes.length&&"P"===f.childNodes[0].tagName&&0===f.childNodes[0].attributes.length&&(f.childNodes[0].outerHTML=f.childNodes[0].innerHTML);if(f.children&&0<f.children.length)if(A.opts.trackChangesEnabled)for(var E=0;E<f.children.length;E++)f.children[E].setAttribute("id","isPasted");else f.children[0].setAttribute("id","isPasted");e=(e=f.innerHTML).replace(/\n/g,""),l&&(e=function T(e){var t,n=A.o_doc.createElement("div");n.innerHTML=e;var r=n.querySelectorAll("*:empty:not(td):not(th):not(tr):not(iframe):not(svg):not(".concat(V.VOID_ELEMENTS.join("):not("),"):not(").concat(A.opts.htmlAllowedEmptyTags.join("):not("),")"));for(;r.length;){for(t=0;t<r.length;t++)r[t].parentNode.removeChild(r[t]);r=n.querySelectorAll("*:empty:not(td):not(th):not(tr):not(iframe):not(svg):not(".concat(V.VOID_ELEMENTS.join("):not("),"):not(").concat(A.opts.htmlAllowedEmptyTags.join("):not("),")"))}return n.innerHTML}(e)),A.html.insert(e,!0)}!function M(){A.events.trigger("paste.after")}(),A.undo.saveStep(w),w=null,A.undo.saveStep()}function p(e){for(var t=e.length-1;0<=t;t--)e[t].attributes&&e[t].attributes.length&&e.splice(t,1);return e}function H(e){var t,n=A.o_doc.createElement("div");n.innerHTML=e;for(var r=p(Array.prototype.slice.call(n.querySelectorAll(":scope > div:not([style]), td > div:not([style]), th > div:not([style]), li > div:not([style])")));r.length;){var o=r[r.length-1];if(A.html.defaultTag()&&"div"!==A.html.defaultTag())o.querySelector(A.html.blockTagsQuery())?o.outerHTML=o.innerHTML:o.outerHTML="<".concat(A.html.defaultTag(),">").concat(o.innerHTML,"</").concat(A.html.defaultTag(),">");else{var i=o.querySelectorAll("*");!i.length||"BR"!==i[i.length-1].tagName&&0===o.innerText.length?o.outerHTML=o.innerHTML+(o.nextSibling?"<br>":""):!i.length||"BR"!==i[i.length-1].tagName||i[i.length-1].nextSibling?o.outerHTML=o.innerHTML+(o.nextSibling?"<br>":""):o.outerHTML=o.innerHTML}r=p(Array.prototype.slice.call(n.querySelectorAll(":scope > div:not([style]), td > div:not([style]), th > div:not([style]), li > div:not([style])")))}for(r=p(Array.prototype.slice.call(n.querySelectorAll("div:not([style])")));r.length;){for(t=0;t<r.length;t++){var a=r[t],s=a.innerHTML.replace(/\u0009/gi,"").trim();a.outerHTML=s}r=p(Array.prototype.slice.call(n.querySelectorAll("div:not([style])")))}return n.innerHTML}function h(){A.el.removeEventListener("copy",e),A.el.removeEventListener("cut",e),A.el.removeEventListener("paste",t)}return{_init:function u(){A.el.addEventListener("copy",e),A.el.addEventListener("cut",e),A.el.addEventListener("paste",t,{capture:!0}),A.events.on("drop",o),A.browser.msie&&A.browser.version<11&&(A.events.on("mouseup",function(e){2===e.button&&(setTimeout(function(){r=!1},50),r=!0)},!0),A.events.on("beforepaste",t)),A.events.on("destroy",h)},cleanEmptyTagsAndDivs:H,getRtfClipboard:function g(){return s},saveCopiedText:n,clean:i}}
vendor: 5,072 bytes, line 679
679,Object.assign(V.DEFAULTS,{shortcutsEnabled:[],shortcutsHint:!0}),V.SHORTCUTS_MAP={},V.RegisterShortcut=function(e,t,n,r,o,i){V.SHORTCUTS_MAP[(o?"^":"")+(i?"@":"")+e]={cmd:t,val:n,letter:r,shift:o,option:i},V.DEFAULTS.shortcutsEnabled.push(t)},V.RegisterShortcut(V.KEYCODE.E,"show",null,"E",!1,!1),V.RegisterShortcut(V.KEYCODE.B,"bold",null,"B",!1,!1),V.RegisterShortcut(V.KEYCODE.I,"italic",null,"I",!1,!1),V.RegisterShortcut(V.KEYCODE.U,"underline",null,"U",!1,!1),V.RegisterShortcut(V.KEYCODE.S,"strikeThrough",null,"S",!1,!1),V.RegisterShortcut(V.KEYCODE.CLOSE_SQUARE_BRACKET,"indent",null,"]",!1,!1),V.RegisterShortcut(V.KEYCODE.OPEN_SQUARE_BRACKET,"outdent",null,"[",!1,!1),V.RegisterShortcut(V.KEYCODE.Z,"undo",null,"Z",!1,!1),V.RegisterShortcut(V.KEYCODE.Z,"redo",null,"Z",!0,!1),V.RegisterShortcut(V.KEYCODE.Y,"redo",null,"Y",!1,!1),V.MODULES.shortcuts=function(s){var r=null;var l=!1;function e(e){if(!s.core.hasFocus())return!0;var t=e.which,n=-1!==navigator.userAgent.indexOf("Mac OS X")?e.metaKey:e.ctrlKey;if("keyup"===e.type&&l&&t!==V.KEYCODE.META)return l=!1;"keydown"===e.type&&(l=!1);var r=(e.shiftKey?"^":"")+(e.altKey?"@":"")+t,o=s.node.blockParent(s.selection.blocks()[0]);if(o&&"TR"==o.tagName&&o.getAttribute("contenteditable")==undefined&&(o=o.closest("table")),n&&V.SHORTCUTS_MAP[r]&&(!o||"false"!==o.getAttribute("contenteditable"))){var i=V.SHORTCUTS_MAP[r].cmd;if(i&&0<=s.opts.shortcutsEnabled.indexOf(i)){var a=V.SHORTCUTS_MAP[r].val;if(!1===s.events.trigger("shortcut",[e,i,a]))return!(l=!0);if(i&&(s.commands[i]||V.COMMANDS[i]&&V.COMMANDS[i].callback))return e.preventDefault(),e.stopPropagation(),"keydown"===e.type&&((s.commands[i]||V.COMMANDS[i].callback)(),l=!0),!1}}}return{_init:function t(){s.events.on("keydown",e,!0),s.events.on("keyup",e,!0)},get:function o(e){if(!s.opts.shortcutsHint)return null;if(!r)for(var t in r={},V.SHORTCUTS_MAP)Object.prototype.hasOwnProperty.call(V.SHORTCUTS_MAP,t)&&0<=s.opts.shortcutsEnabled.indexOf(V.SHORTCUTS_MAP[t].cmd)&&(r["".concat(V.SHORTCUTS_MAP[t].cmd,".").concat(V.SHORTCUTS_MAP[t].val||"")]={shift:V.SHORTCUTS_MAP[t].shift,option:V.SHORTCUTS_MAP[t].option,letter:V.SHORTCUTS_MAP[t].letter});var n=r[e];return n?(s.helpers.isMac()?String.fromCharCode(8984):"".concat(s.language.translate("Ctrl"),"+"))+(n.shift?s.helpers.isMac()?String.fromCharCode(8679):"".concat(s.language.translate("Shift"),"+"):"")+(n.option?s.helpers.isMac()?String.fromCharCode(8997):"".concat(s.language.translate("Alt"),"+"):"")+n.letter:null}}},V.MODULES.snapshot=function(l){function n(e){for(var t=e.parentNode.childNodes,n=0,r=null,o=0;o<t.length;o++){if(r){var i=t[o].nodeType===Node.TEXT_NODE&&""===t[o].textContent,a=r.nodeType===Node.TEXT_NODE&&t[o].nodeType===Node.TEXT_NODE,s=r.nodeType===Node.TEXT_NODE&&""===r.textContent;i||a||s||n++}if(t[o]===e)return n;r=t[o]}}function o(e){var t=[];if(!e.parentNode)return[];for(;!l.node.isElement(e);)t.push(n(e)),e=e.parentNode;return t.reverse()}function i(e,t){for(;e&&e.nodeType===Node.TEXT_NODE;){var n=e.previousSibling;n&&n.nodeType===Node.TEXT_NODE&&(t+=n.textContent.length),e=n}return t}function c(e){for(var t=l.el,n=0;n<e.length;n++)t=t.childNodes[e[n]];return t}function r(e,t){try{var n=c(t.scLoc),r=t.scOffset,o=c(t.ecLoc),i=t.ecOffset,a=l.doc.createRange();a.setStart(n,r),a.setEnd(o,i),e.addRange(a)}catch(s){}}return{get:function a(){var e,t={};if(l.events.trigger("snapshot.before"),t.html=(l.$wp?l.$el.html():l.$oel.get(0).outerHTML).replace(/ style=""/g,""),t.ranges=[],l.$wp&&l.selection.inEditor()&&l.core.hasFocus())for(var n=l.selection.ranges(),r=0;r<n.length;r++)t.ranges.push({scLoc:o((e=n[r]).startContainer),scOffset:i(e.startContainer,e.startOffset),ecLoc:o(e.endContainer),ecOffset:i(e.endContainer,e.endOffset)});return l.events.trigger("snapshot.after",[t]),t},restore:function s(e){l.$el.html()!==e.html&&(l.opts.htmlExecuteScripts?l.$el.html(e.html):l.el.innerHTML=e.html);var t=l.selection.get();l.selection.clear(),l.events.focus(!0);for(var n=0;n<e.ranges.length;n++)r(t,e.ranges[n])},equal:function d(e,t){return e.html===t.html&&(!l.core.hasFocus()||JSON.stringify(e.ranges)===JSON.stringify(t.ranges))}}},V.MODULES.undo=function(n){function e(e){var t=e.which;n.keys.ctrlKey(e)&&(t===V.KEYCODE.Z&&e.shiftKey&&e.preventDefault(),t===V.KEYCODE.Z&&e.preventDefault())}var t=null;function r(){if(n.undo_stack&&!n.undoing)for(;n.undo_stack.length>n.undo_index;)n.undo_stack.pop()}function o(){n.undo_index=0,n.undo_stack=[]}function i(){n.undo_stack=[]}return{_init:function a(){o(),n.events.on("initialized",function(){t=(n.$wp?n.$el.html():n.$oel.get(0).outerHTML).replace(/ style=""/g,"")}),n.events.on("blur",function(){n.el.querySelector(".fr-dragging")||n.undo.saveStep()}),n.events.on("keydown",e),n.events.on("destroy",i)},run:function s(){if(1<n.undo_index){n.undoing=!0;var e=n.undo_stack[--n.undo_index-1];clearTimeout(n._content_changed_timer),n.snapshot.restore(e),t=e.html,n.popups.hideAll(),n.toolbar.enable(),n.events.trigger("contentChanged"),n.events.trigger("commands.undo"),n.undoing=!1,n.selection.restore(
679)}},redo:function l(){if(n.undo_index<n.undo_stack.length){n.undoing=!0;var e=n.undo_stack[n.undo_index++];clearTimeout(n._content_changed_timer),n.snapshot.restore(e),t=e.html,n.popups.hideAll(),n.toolbar.enable(),n.events.trigger("contentChanged"),n.events.trigger("commands.redo"),n.undoing=!1}},canDo:function c(){return!(0===n.undo_stack.length||n.undo_index<=1)},canRedo:function d(){return n.undo_index!==n.undo_stack.length},dropRedo:r,reset:o,saveStep:function f(e){if(n.undo_stack&&!n.undoing&&!n.el.querySelector(".fr-marker"))if(void 0===e){if((e=n.snapshot.get())&&e.html&&n.undo_stack[n.undo_stack.length-1]&&e.html===n.undo_stack[n.undo_stack.length-1].html)return;n.undo_stack[n.undo_index-1]&&n.snapshot.equal(n.undo_stack[n.undo_index-1],e)||(r(),n.undo_stack.push(e),n.undo_index++,function o(e,t){var n=t.split("fr-selected-cell").join("");n=n.split(' class=""').join("");var r=e.split("fr-selected-cell").join("");return n===(r=r.split(' class=""').join(""))}(t,e.html)||(n.events.trigger("contentChanged"),t=e.html))}else r(),0<n.undo_index?n.undo_stack[n.undo_index-1]=e:(n.undo_stack.push(e),n.undo_index++)}}},Object.assign(V.DEFAULTS,{height:null,heightMax:null,heightMin:null,width:null}),V.MODULES.size=function(r){function e(){o(),r.opts.height&&r.$el.css("minHeight",r.opts.height-r.helpers.getPX(r.$el.css("padding-top"))-r.helpers.getPX(r.$el.css("padding-bottom")));var e=!1;if(r.opts.fullPage)for(var t=r.$el.find("span,p,div"),n=0;n<t.length;n++)if(t[n].style.height&&t[n].style.height.includes("vh")){e=!0;break}r.opts.fullPage&&e&&(r.opts.heightMin&&r.$iframe.css("minHeight",r.opts.heightMin),r.opts.heightMax&&r.$iframe.css("maxHeight",r.opts.heightMax),r.$el.css("overflow-y","auto")),r.$iframe.height(r.$el.outerHeight(!0))}function o(){r.opts.heightMin?r.$el.css("minHeight",r.opts.heightMin):r.$el.css("minHeight",""),r.opts.heightMax?(r.$wp.css("maxHeight",r.opts.heightMax),r.$wp.css("overflow","auto")):(r.$wp.css("maxHeight",""),r.$wp.css("overflow","")),r.opts.height?(r.$wp.css("height",r.opts.height),r.$wp.css("overflow","auto"),r.$el.css("minHeight",r.opts.height-r.helpers.getPX(r.$el.css("padding-top"))-r.helpers.getPX(r.$el.css("padding-bottom")))):(r.$wp.css("height",""),r.opts.heightMin||r.$el.css("minHeight",""),r.opts.heightMax||r.$wp.css("overflow","")),r.opts.width&&r.$box.width(r.opts.width)}return{_init:function t(){if(!r.$wp)return!1;o(),r.$iframe&&(r.events.on("keyup keydown",function(){setTimeout(e,0)},!0),r.events.on("commands.after html.set init initialized paste.after",e))},syncIframe:e,refresh:o}},Object.assign(V.DEFAULTS,{documentReady:!1,editorClass:null,typingTimer:500,iframe:!1,requestWithCORS:!0,requestWithCredentials:!1,requestHeaders:{},useClasses:!0,spellcheck:!0,iframeDefaultStyle:'html{margin:0px;height:auto;}body{height:auto;padding:20px;background:transparent;color:#000000;position:relative;z-index: 2;-webkit-user-select:auto;margin:0px;overflow:hidden;min-height:20px;}body:after{content:"";display:block;clear:both;}body::-moz-selection{background:#b5d6fd;color:#000;}body::selection{background:#b5d6fd;color:#000;}',iframeStyle:"",iframeStyleFiles:[],direction:"auto",zIndex:1,tabIndex:null,disableRightClick:!1,scrollableContainer:"body",keepFormatOnDelete:!1,theme:null}),V.MODULES.core=function(a){var r=a.$;function n(){if(a.$box.addClass("fr-box".concat(a.opts.editorClass?" ".concat(a.opts.editorClass):"")),a.$box.attr("role","application"),a.$wp.addClass("fr-wrapper"),a.opts.documentReady&&a.$box.addClass("fr-document"),function o(){a.opts.iframe||a.$el.addClass("fr-element fr-view"),(a.opts.height&&a.opts.height<window.innerHeight||a.opts.heightMax&&a.opts.heightMax<window.innerHeight)&&a.$el.addClass("fr-element-scroll-visible")}(),a.opts.iframe){a.$iframe.addClass("fr-iframe"),a.$el.addClass("fr-view");for(var e=0;e<a.o_doc.styleSheets.length;e++){var t=void 0;try{t=a.o_doc.styleSheets[e].cssRules}catch(i){}if(t)for(var n=0,r=t.length;n<r;n++)!t[n].selectorText||0!==t[n].selectorText.indexOf(".fr-view")&&0!==t[n].selectorText.indexOf(".fr-element")||0<t[n].style.cssText.length&&(0===t[n].selectorText.indexOf(".fr-view")?a.opts.iframeStyle+="".concat(t[n].selectorText.replace(/\.fr
vendor: 5,841 bytes, line 679
679-view/g,"body"),"{").concat(t[n].style.cssText,"}"):a.opts.iframeStyle+="".concat(t[n].selectorText.replace(/\.fr-element/g,"body"),"{").concat(t[n].style.cssText,"}"))}}"auto"!==a.opts.direction&&a.$box.removeClass("fr-ltr fr-rtl").addClass("fr-".concat(a.opts.direction)),a.$el.attr("dir",a.opts.direction),a.$wp.attr("dir",a.opts.direction),1<a.opts.zIndex&&a.$box.css("z-index",a.opts.zIndex),a.opts.theme&&a.$box.addClass("".concat(a.opts.theme,"-theme")),a.opts.tabIndex=a.opts.tabIndex||a.$oel.attr("tabIndex"),a.opts.tabIndex&&a.$el.attr("tabIndex",a.opts.tabIndex)}return{_init:function o(){if(V.INSTANCES.push(a),function e(){a.drag_support={filereader:"undefined"!=typeof FileReader,formdata:Boolean(a.win.FormData),progress:"upload"in new XMLHttpRequest}}(),a.$wp){n(),a.html.set(a._original_html),a.$el.attr("spellcheck",a.opts.spellcheck),a.helpers.isMobile()&&(a.$el.attr("autocomplete",a.opts.spellcheck?"on":"off"),a.$el.attr("autocorrect",a.opts.spellcheck?"on":"off"),a.$el.attr("autocapitalize",a.opts.spellcheck?"on":"off")),a.opts.disableRightClick&&a.events.$on(a.$el,"contextmenu",function(e){if(2===e.button)return e.preventDefault(),e.stopPropagation(),!1});try{a.doc.execCommand("styleWithCSS",!1,!1)}catch(t){}}"TEXTAREA"===a.$oel.get(0).tagName&&(a.events.on("contentChanged",function(){a.$oel.val(a.html.get())}),a.events.on("form.submit",function(){a.$oel.val(a.html.get())}),a.events.on("form.reset",function(){a.html.set(a._original_html)}),a.$oel.val(a.html.get())),a.helpers.isIOS()&&a.events.$on(a.$doc,"selectionchange",function(){a.$doc.get(0).hasFocus()||a.$win.get(0).focus()}),a.events.trigger("init"),a.opts.autofocus&&!a.opts.initOnClick&&a.$wp&&a.events.on("initialized",function(){a.events.focus(!0)})},destroy:function t(e){"TEXTAREA"===a.$oel.get(0).tagName&&a.$oel.val(e),a.$box&&a.$box.removeAttr("role"),a.$wp&&("TEXTAREA"===a.$oel.get(0).tagName?(a.$el.html(""),a.$wp.html(""),a.$box.replaceWith(a.$oel),a.$oel.show()):(a.$wp.replaceWith(e),a.$el.html(""),a.$box.removeClass("fr-view fr-ltr fr-box ".concat(a.opts.editorClass||"")),a.opts.theme&&a.$box.addClass("".concat(a.opts.theme,"-theme")))),this.$wp=null,this.$el=null,this.el=null,this.$box=null},isEmpty:function e(){return a.node.isEmpty(a.el)},getXHR:function i(e,t){var n=new XMLHttpRequest;for(var r in n.open(t,e,!0),a.opts.requestWithCredentials&&(n.withCredentials=!0),a.opts.requestHeaders)Object.prototype.hasOwnProperty.call(a.opts.requestHeaders,r)&&n.setRequestHeader(r,a.opts.requestHeaders[r]);return n},injectStyle:function s(e){if(a.opts.iframe){a.$head.find("style[data-fr-style], link[data-fr-style]").remove(),a.$head.append('<style data-fr-style="true">'.concat(e,"</style>"));for(var t=0;t<a.opts.iframeStyleFiles.length;t++){var n=r('<link data-fr-style="true" rel="stylesheet" href="'.concat(a.opts.iframeStyleFiles[t],'">'));n.get(0).addEventListener("load",a.size.syncIframe),a.$head.append(n)}}},hasFocus:function l(){return a.browser.mozilla&&a.helpers.isMobile()?a.selection.inEditor():a.node.hasFocus(a.el)||0<a.$el.find("*:focus").length},sameInstance:function c(e){if(!e)return!1;var t=e.data("instance");return!!t&&t.id===a.id}}},V.POPUP_TEMPLATES={"text.edit":"[_EDIT_]"},V.RegisterTemplate=function(e,t){V.POPUP_TEMPLATES[e]=t},V.MODULES.popups=function(h){var r,d=h.$;h.shared.popups||(h.shared.popups={});var u,g=h.shared.popups;function C(e,t){t.isVisible()||(t=h.$sc),t.is(g[e].data("container"))||(g[e].data("container",t),t.append(g[e]))}function o(e){var t;e.find(".fr-upload-progress").addClass("fr-height-set"),e.find(".fr-upload-progress").removeClass("fr-height-auto"),h.popups.get("filesManager.insert").removeClass("fr-height-auto"),e.find(".fr-files-upload-layer").hasClass("fr-active")&&(t=1),e.find(".fr-files-by-url-layer").hasClass("fr-active")&&(t=2),e.find(".fr-files-embed-layer").hasClass("fr-active")&&(t=3),e.find(".fr-upload-progress-layer").get(0).clientHeight+10<e.find(".fr-upload-progress").get(0).clientHeight&&e.find(".fr-upload-progress").addClass("fr-height-auto"),400<e[0].clientHeight&&(e[0].childNodes[4].style.height="".concat(e[0].clientHeight-(e[0].childNodes[0].clientHeight+e[0].childNodes[t].clientHeight)-80,"px"))}var i=2e3;function a(){d(this).toggleClass("fr-not-empty",!0)}function s(){var e=d(this);e.toggleClass("fr-not-empty",""!==e.val())}function m(e){return g[e]&&h.node.hasClass(g[e],"fr-active")&&h.core.sameInstance(g[e])||!1}function v(e){for(var t in g)if(Object.prototype.hasOwnProperty.call(g,t)&&m(t)&&(void 0===e||g[t].data("instance")===e))return g[t];return!1}function n(e){var t=null;if(t="string"!=typeof e?e:g[e],"filesManager.insert"===e&&h.filesManager!==undefined&&h.filesManager.isChildWindowOpen())return!1;if(t&&h.node.hasClass(t,"fr-active")&&(t.removeClass("fr-active fr-above"),h.events.trigger("popups.hide.".concat(e)),h.$tb&&(1<h.opts.zIndex?h.$tb.css("zIndex",h.opts.zIndex+1):h.$tb.css("zIndex","")),h.events.disableBlur(),t.find("input, textarea, button").each(function(){this===this.ownerDocument.activeElement&&this.blur()}),t.find("input, textarea").attr("disabled","disabled"),u))for(var n=0;n<u.length;n++)d(u[n]).removeClass("fr-btn-active-popup")}function b(e){for(var t in void 0===e&&(e=[]),g)Object.prototype.hasOwnProperty.call(g,t)&&e.indexOf(t)<0&&n(t)}function t(){h.shared.exit_flag=!0}function L(){h.shared.exit_flag=!1}function l(){return h.shared.exit_flag}function c(e,t){var n,r=function c(e,t){var n=V.POPUP_TEMPLATES[e];if(!n)return null;for(var r in"function"==typeof n&&(n=n.apply(h)),t)Object.prototype.hasOwnProperty.call(t,r)&&(n=n.replace("[_".concat(r.toUpperCase(),"_]"),t[r]));return n}(e,t),o=d(h.doc.createElement("DIV"));if(!r)return"filesManager.insert"===e?o.addClass("fr-popup fr-files-manager fr-empty"):o.addClass("fr-popup fr-empty"),(n=d("body").first()).append(o),o.data("c
679ontainer",n),g[e]=o;"filesManager.insert"===e?o.addClass("fr-popup fr-files-manager".concat(h.helpers.isMobile()?" fr-mobile":" fr-desktop").concat(h.opts.toolbarInline?" fr-inline":"")):o.addClass("fr-popup".concat(h.helpers.isMobile()?" fr-mobile":" fr-desktop").concat(h.opts.toolbarInline?" fr-inline":"")),o.html(r),h.opts.theme&&o.addClass("".concat(h.opts.theme,"-theme")),1<h.opts.zIndex&&(!h.opts.editInPopup&&h.$tb?h.$tb.css("z-index",h.opts.zIndex+2):o.css("z-index",h.opts.zIndex+2)),"auto"!==h.opts.direction&&o.removeClass("fr-ltr fr-rtl").addClass("fr-".concat(h.opts.direction)),o.find("input, textarea").attr("dir",h.opts.direction).attr("disabled","disabled"),(n=d("body").first()).append(o),o.data("container",n);var i=(g[e]=o).find(".fr-color-hex-layer");if(0<i.length){var a=h.helpers.getPX(o.find(".fr-color-set > span").css("width")),s=h.helpers.getPX(i.css("paddingLeft")),l=h.helpers.getPX(i.css("paddingRight"));i.css("width",a*h.opts.colorsStep+s+l)}return h.button.bindCommands(o,!1),o}function E(a){var s=g[a];return{_windowResize:function(){var e=s.data("instance")||h;if(!e.helpers.isMobile()&&s.isVisible()){var t=s.find(".fr-file-progress-bar-layer");if("file.insert"===a&&0<t.length&&t.hasClass("fr-active")){var n=h.$tb.find('.fr-command[data-cmd="insertFile"]');e.events.disableBlur();var r=h.button.getPosition(n),o=r.left,i=r.top;h.position.at(o,i,g[a],0),e.events.enableBlur()}else e.events.disableBlur(),e.popups.hide(a),e.events.enableBlur()}},_inputFocus:function(e){var t=s.data("instance")||h,n=d(e.currentTarget);if(n.is("input:file")&&n.closest(".fr-layer").addClass("fr-input-focus"),e.preventDefault(),e.stopPropagation(),setTimeout(function(){t.events.enableBlur()},100),t.helpers.isMobile()){var r=d(t.o_win).scrollTop();setTimeout(function(){d(t.o_win).scrollTop(r)},0)}},_inputBlur:function(e){var t=s.data("instance")||h,n=d(e.currentTarget);n.is("input:file")&&n.closest(".fr-layer").removeClass("fr-input-focus"),document.activeElement!==this&&d(this).isVisible()&&(t.events.blurActive()&&t.events.trigger("blur"),t.events.enableBlur())},_editorKeydown:function(e){var t=s.data("instance")||h;t.keys.ctrlKey(e)||e.which===V.KEYCODE.ALT||e.which===V.KEYCODE.ESC||(m(a)&&s.findVisible(".fr-back").length?t.button.exec(s.findVisible(".fr-back").first()):e.which!==V.KEYCODE.ALT&&t.popups.hide(a))},_preventFocus:function(e){var t=s.data("instance")||h,n=e.originalEvent?e.originalEvent.target||e.originalEvent.originalTarget:null;"mouseup"===e.type||d(n).is(":focus")||t.events.disableBlur(),"mouseup"!==e.type||d(n).hasClass("fr-command")||0<d(n).parents(".fr-command").length||d(n).hasClass("fr-dropdown-content")||d(n).hasClass("fr-dropdown-menu")||h.button.hideActiveDropdowns(s),(h.browser.safari||h.browser.mozilla)&&"mousedown"===e.type&&d(n).is("input[type=file]")&&t.events.disableBlur();var r="input, textarea, button, select, label, .fr-command";if(n&&!d(n).is(r)&&0===d(n).parents(r).length)return e.stopPropagation(),!1;n&&d(n).is(r)&&e.stopPropagation(),L()},_editorMouseup:function(){s.isVisible()&&l()&&0<s.findVisible("input:focus, textarea:focus, button:focus, select:focus").length&&h.events.disableBlur()},_windowMouseup:function(e){if(!h.core.sameInstance(s))return!0;var t=s.data("instance")||h;s.isVisible()&&l()&&(e.stopPropagation(),t.markers.remove(),t.popups.hide(a),L())},_windowKeydown:function(e){if(!h.core.sameInstance(s))return!0;var t=s.data("instance")||h,n=e.which;if(V.KEYCODE.ESC===n){if(t.popups.isVisible(a)&&t.opts.toolbarInline)return e.stopPropagation(),t.popups.isVisible(a)&&(s.findVisible(".fr-back").length?(t.button.exec(s.findVisible(".fr-back").first()),t.accessibility.focusPopupButton(s)):s.findVisible(".fr-dismiss").length?t.button.exec(s.findVisible(".fr-dismiss").first()):(t.popups.hide(a),t.toolbar.showInline(null,!0),t.accessibility.focusPopupButton(s))),!1;if(t.popups.isVisible(a))return s.findVisible(".fr-back").length?(t.button.exec(s.findVisible(".fr-back").first),t.accessibility.focusPopupButton(s)):s.findVisible(".fr-dismiss").length?t.button.exec(s.findVisible(".fr-dismiss").first()):(t.popups.hide(a),t.accessibility.focusPopupButton(s)),!1}},_repositionPopup:function(){if(!h.opts.height&&!h.opts.heightMax||h.opts.toolbarInline)return!0;
vendor: 10,066 bytes, line 679
679if(h.$wp&&m(a)&&s.parent().get(0)===h.$sc.get(0)){var e=s.offset().top-h.$wp.offset().top,t=h.$wp.outerHeight();h.node.hasClass(s.get(0),"fr-above")&&(e+=s.outerHeight()),t<e||e<0?s.addClass("fr-hidden"):s.removeClass("fr-hidden")}},handleWindowClick:function(e){if(!h.core.sameInstance(s))return!0;var t=s.data("instance")||h;s.isVisible()&&e.target&&(0<d(e.target).find("body").length||"BODY"===d(e.target)[0].tagName)&&(e.stopPropagation(),t.popups.hide(a))}}}function f(e,t){h.events.on("mouseup",e._editorMouseup,!0),h.$wp&&h.events.on("keydown",e._editorKeydown),h.events.on("focus",function(){g[t].removeClass("focused")}),h.events.on("blur",function(){v()&&h.markers.remove(),h.helpers.isMobile()?g[t].hasClass("focused")?(b(),g[t].removeClass("focused")):g[t].addClass("focused"):g[t].find("iframe").length||b()}),h.$wp&&!h.helpers.isMobile()&&h.events.$on(h.$wp,"scroll.popup".concat(t),e._repositionPopup),h.events.on("window.mouseup",e._windowMouseup,!0),h.events.on("window.keydown",e._windowKeydown,!0),h.opts.iframe&&window.addEventListener("click",e.handleWindowClick),g[t].data("inst".concat(h.id),!0),h.events.on("destroy",function(){h.core.sameInstance(g[t])&&(d("body").first().append(g[t]),g[t].removeClass("fr-active"))},!0)}function p(){var e=d(this).prev().children().first();e.attr("checked",!e.attr("checked"))}function e(){for(var e in g)if(Object.prototype.hasOwnProperty.call(g,e)){var t=g[e];t&&(t.html("").removeData().remove(),g[e]=null)}g=[]}return h.shared.exit_flag=!1,{_init:function y(){r=window.innerHeight,h.events.on("shared.destroy",e,!0),h.events.on("window.mousedown",t),h.events.on("window.touchmove",L),h.events.$on(d(h.o_win),"scroll",L),h.events.on("mousedown",function(e){v()&&(e.stopPropagation(),h.$el.find(".fr-marker").remove(),t(),h.events.disableBlur())})},create:function S(e,t){var n=c(e,t),r=E(e);f(r,e),h.events.$on(n,"mousedown mouseup touchstart touchend touch","*",r._preventFocus,!0),h.events.$on(n,"focus","input, textarea, button, select",r._inputFocus,!0),h.events.$on(n,"blur","input, textarea, button, select",r._inputBlur,!0);var o=n.find("input, textarea");return function i(e){for(var t=0;t<e.length;t++){var n=e[t],r=d(n);0===r.next().length&&r.attr("placeholder")&&(r.after('<label for="'.concat(r.attr("id"),'">').concat(r.attr("placeholder"),"</label>")),r.attr("placeholder",""))}}(o),h.events.$on(o,"focus",a),h.events.$on(o,"blur change",s),h.events.$on(n,"click",".fr-checkbox + label",p),h.accessibility.registerPopup(e),h.helpers.isIOS()&&h.events.$on(n,"touchend","label",function(){d("#".concat(d(this).attr("for"))).prop("checked",function(e,t){return!t})},!0),h.events.$on(d(h.o_win),"resize",r._windowResize,!0),"filesManager.insert"===e&&g["filesManager.insert"].css("zIndex",2147483641),n},get:function N(e){var t=g[e];return t&&!t.data("inst".concat(h.id))&&f(E(e),e),t},show:function T(e,t,n,r,o){if(m(e)||(v()&&0<h.$el.find(".fr-marker").length?(h.events.disableBlur(),h.selection.restore()):v()||(h.events.disableBlur(),h.events.focus(),h.events.enableBlur())),b([e]),!g[e])return!1;var i=h.button.getButtons(".fr-dropdown.fr-active");i.removeClass("fr-active").attr("aria-expanded",!1).parents(".fr-toolbar").css("zIndex","").find("> .fr-dropdown-wrapper").css("height",""),i.next().attr("aria-hidden",!0).css("overflow","").find("> .fr-dropdown-wrapper").css("height",""),g[e].data("instance",h),h.$tb&&h.$tb.data("instance",h);var a=m(e);g[e].addClass("fr-active").removeClass("fr-hidden").find("input, textarea").removeAttr("disabled");var s=g[e].data("container");if(function p(e,t){t.isVisible()||(t=h.$sc),t.contains([g[e].get(0)])||t.append(g[e])}(e,s),h.opts.toolbarInline&&s&&h.$tb&&s.get(0)===h.$tb.get(0)&&(C(e,h.$sc),n=h.$tb.offset().top-h.helpers.getPX(h.$tb.css("margin-top")),t=h.$tb.offset().left+h.$tb.outerWidth()/2,h.node.hasClass(h.$tb.get(0),"fr-above")&&n&&(n+=h.$tb.outerHeight()),r=0),s=g[e].data("container"),h.opts.iframe&&!r&&!a){var l=h.helpers.getPX(h.$wp.find(".fr-iframe").css("padding-top")),c=h.helpers.getPX(h.$wp.find(".fr-iframe").css("padding-left"));t&&(t-=h.$iframe.offset().left+c),n&&(n-=h.$iframe.offset().top+l)}s.is(h.$tb)?h.$tb.css("zIndex",(h.opts.zIndex||1)+4):g[e].css("zIndex",(h.opts.zIndex||1)+3),h.opts.toolbarBottom&&s&&h.$tb&&s.get(0)===h.$tb.get(0)&&(g[e].addClass("fr-above"),n&&(n-=g[e].outerHeight())),o&&(t-=g[e].width()/2),t+g[e].outerWidth()>h.$sc.offset().left+h.$sc.width()&&(t-=t+g[e].outerWidth()-h.$sc.offset().left-h.$sc.width()),t<h.$sc.offset().left&&"rtl"===h.opts.direction&&(t=h.$sc.offset().left),g[e].removeClass("fr-active"),h.position.at(t,n,g[e],r||0);var d=h.node.blockParent(h.selection.blocks()[0]);if(d&&"false"===d.getAttribute("contenteditable"))g[e].removeClass("fr-active");else{var f=h.selection.element().parentElement.getAttribute("contenteditable");f&&"false"===f?g[e].removeClass("fr-active"):g[e].addClass("fr-active")}a||h.accessibility.focusPopup(g[e]),h.opts.toolbarInline&&h.toolbar.hide(),h.$tb&&(u=h.$tb.find(".fr-btn-active-popup")),h.events.trigger("popups.show.".concat(e)),E(e)._repositionPopup(),L()},hide:n,onHide:function M(e,t){h.events.on("popups.hide.".concat(e),t)},hideAll:b,setContainer:C,refresh:function A(e){g[e].data("instance",h),h.events.trigger("popups.refresh.".concat(e));for(var t=g[e].find(".fr-command"),n=0;n<t.length;n++){var r=d(t[n]);0===r.parents(".fr-dropdown-menu").length&&h.button.refresh(r)}},onRefresh:function x(e,t){h.events.on("popups.refresh.".concat(e),t)},onShow:function O(e,t){h.events.on("popups.show.".concat(e),t)},isVisible:m,setFileListHeight:o,areVisible:v,setPopupDimensions:function w(e,t){t&&e.find(".fr-upload-progress-layer").get(0).clientHeight<i&&(e.find(".fr-upload-progress").addClass("fr-height-auto"),h.popups.get("filesManager.insert").addClass("fr-height-auto"),e.find(".fr-upload-progress").removeClass("fr-height-set"),i=2e3),e.get(0).clientHeight>window.innerHeight/2&&(window.innerWidth<500?e.get(0).clientHeight>.6*r&&o(e):400<e.get(0).clientHeight&&o(e),i=e.find(".fr-upload-progress-layer").get(0).clientHeight);var n=window.innerWidth;switch(!0){case n<=320:e.width(200);break;case n<=420:e.width(250);break;case n<=520:e.width(300);break;case n<=720:e.width(400);break;case 720<n:e.width(530)}}}},V.MODULES.accessibility=function(f){var p=f.$,i=!0;function l(t){for(var e=f.$el.find('[contenteditable="true"]'),n=!1,r=0;e.get(r);)p(e.get(r)).is(":focus")&&(n=!0),r++;if(t&&t.length&&!n){t.data("blur-event-set")||t.parents(".fr-popup").length||(f.events.$on(t,"blur",function(){var e=t.parents(".fr-toolbar, .fr-popup").data("instance")||f;e.events.blurActive()&&!f.core.hasFocus()&&e.events.trigger("blur"),setTimeout(function(){e.events.enableBlur()},100)},!0),t.data("blur-event-set",!0));var o=t.parents(".fr-toolbar, .fr-popup").data("instance")||f;f.browser.safari&&(f.shared.safariSelection=f.selection.get().getRangeAt(0).cloneRange()),o.events.disableBlur(),t.get(0).focus(),f.shared.$f_el=t}}function h(e,t){var n=t?"last":"first",r=s(g(e))[n]();if(r.length)return l(r),!0}function a(e){return e.is("input, textarea, select")&&t(),f.events.disableBlur(),e.get(0).focus(),!0}function u(e,t){var n=e.find("input, textarea, button, select").filter(function(){return p(this).isVisible()}).not(":disabled");if((n=t?n.last():n.first()).length)return a(n);if(f.shared.with_kb){var r=e.findVisible(".fr-active-item").first();if(r.length)return a(r);var o=e.findVisible("[tabIndex]").first();if(o.length)return a(o)}}function t(){0===f.$el.find(".fr-marker").length&&f.core.hasFocus()&&f.selection.save()}function c(){var e=f.popups.areVisible();if(e){var t=e.find(".fr-buttons");return t.find("button:focus, .fr-group span:focus").length?!h(e.data("instance").$tb):!h(t)}return!h(f.$tb)}function d(){var e=null;return f.shared.$f_el.is(".fr-dropdown.fr-active")?e=f.shared.$f_el:f.shared.$f_el.closest(".fr-dropdown-menu").prev().is(".fr-dropdown.fr-active")&&(e=f.shared.$f_el.closest(".fr-dropdown-menu").prev()),e}function s(e){for(var t=-1,n=0;n<e.length;n++)p(e[n]).hasClass("fr-open")&&(t=n);var r=e.index(f.$tb.find(".fr-more-toolbar.fr-expanded > button.fr-command").first());if(0<r&&-1!==t){var o=e.slice(r,e.length),i=(e=e.slice(0,r)).slice(0,t+1),a=e.slice(t+1,e.length);e=i;for(var s=0;s<o.length;s++)e.push(o[s]);for(var l=0;l<a.length;l++)e.push(a[l])}return e}function g(e){return e.findVisible("button:not(.fr-disabled), .fr-group span.fr-command").filter(function(e){var t=p(e).parents(".fr-more-toolbar");return 0===t.length||0<t.length&&t.hasClass("fr-expanded")})}function n(e,t,n){if(f.shared.$f_el){var r=d();r&&(f.button.click(r),f.shared.$f_el=r);var o=s(g(e)),i=o.index(f.shared.$f_el);if(0===i&&!n||i===o.length-1&&n){var a;if(t){if(e.parent().is(".fr-popup"))a=!u(e.parent().children().not(".fr-buttons"),!n);!1===a&&(f.shared.$f_el=null)}t&&!1===a||h(e,!n)}else l(p(o.get(i+(n?1:-1))));return!1}}function C(e,t){return n(e,t,!0)}function m(e,t){return n(e,t)}function v(e){if(f.shared.$f_el){var t;if(f.shared.$f_el.is(".fr-dropdown.fr-active"))return l(t=e?f.shared.$f_el.next().find(".fr-command:not(.fr-disabled)").first():f.shared.$f_el.next().find(".fr-command:not(.fr-disabled)").last()),!1;if(f.shared.$f_el.is("a.fr-command"))return(t=e?f.shared.$f_el.closest("li").nextAllVisible().first().find(".fr-command:not(.fr-disabled)").first():f.shared.$f_el.closest("li").prevAllVisible().first().find(".fr-command:not(.fr-disabled)").first()).length||(t=e?f.shared.$f_el.closest(".fr-dropdown-menu").find(".fr-command:not(.fr-disabled)").first():f.shared.$f_el.closest(".fr-dropdown-menu").find(".fr-command:not(.fr-disabled)").last()),l(t),!1}}function b(){if(f.shared.$f_el){if(f.shared.$f_el.hasClass("fr-dropdown"))f.button.click(f.shared.$f_el);else if(f.shared.$f_el.is("button.fr-back")){f.opts.toolbarInline&&(f.events.disableBlur(),f.events.focus());var e=f.popups.areVisible(f);e&&(f.shared.with_kb=!1),f.button.click(f.shared.$f_el),E(e)}else{if(f.events.disableBlur(),f.button.click(f.shared.$f_el),f.shared.$f_el.attr("data-group-name")){var t=f.$tb.find('.fr
679-more-toolbar[data-name="'.concat(f.shared.$f_el.attr("data-group-name"),'"]')),n=f.shared.$f_el;t.hasClass("fr-expanded")&&(n=t.findVisible("button:not(.fr-disabled)").first()),n&&l(n)}else if(f.shared.$f_el.attr("data-popup")){var r=f.popups.areVisible(f);r&&r.data("popup-button",f.shared.$f_el)}else if(f.shared.$f_el.attr("data-modal")){var o=f.modals.areVisible(f);o&&o.data("modal-button",f.shared.$f_el)}f.shared.$f_el=null}return!1}}function L(){f.shared.$f_el&&(f.events.disableBlur(),f.shared.$f_el.blur(),f.shared.$f_el=null),!1!==f.events.trigger("toolbar.focusEditor")&&(f.events.disableBlur(),f.$el.get(0).focus(),f.events.focus())}function o(c){c&&c.length&&(f.events.$on(c,"keydown",function(e){if(!p(e.target).is("a.fr-command, button.fr-command, .fr-group span.fr-command"))return!0;var t=c.parents(".fr-popup").data("instance")||c.data("instance")||f;if(f.shared.with_kb=!0,f.browser.safari&&f.shared.safariSelection){var n=f.shared.safariSelection,r=n.startContainer,o=n.endContainer,i=n.startOffset,a=n.endOffset,s=f.doc.createRange();s.setStart(r,i),s.setEnd(o,a),f.selection.get().addRange(s)}var l=t.accessibility.exec(e,c);return f.shared.with_kb=!1,l},!0),f.events.$on(c,"mouseenter","[tabIndex]",function(e){var t=c.parents(".fr-popup").data("instance")||c.data("instance")||f;if(!i)return e.stopPropagation(),void e.preventDefault();var n=p(e.currentTarget);t.shared.$f_el&&t.shared.$f_el.not(n)&&t.accessibility.focusEditor()},!0),f.$tb&&f.events.$on(f.$tb,"transitionend",".fr-more-toolbar",function(){f.shared.$f_el=p(document.activeElement)}))}function E(e){var t=e.data("popup-button");t&&setTimeout(function(){l(t),e.data("popup-button",null)},0)}function y(e){var t=f.popups.areVisible(e);t&&t.data("popup-button",null)}function e(e){var t=-1!==navigator.userAgent.indexOf("Mac OS X")?e.metaKey:e.ctrlKey;if(e.which!==V.KEYCODE.F10||t||e.shiftKey||!e.altKey)return!0;f.shared.with_kb=!0;var n=f.popups.areVisible(f),r=!1;return n&&(r=u(n.children().not(".fr-buttons"))),r||c(),f.shared.with_kb=!1,e.preventDefault(),e.stopPropagation(),!1}return{_init:function r(){f.$wp?f.events.on("keydown",e,!0):f.events.$on(f.$win,"keydown",e,!0),f.events.on("mousedown",function(e){y(f),f.shared.$f_el&&f.el.isSameNode(f.shared.$f_el[0])&&(f.accessibility.restoreSelection(),e.stopPropagation(),f.events.disableBlur(),f.shared.$f_el=null)},!0),f.events.on("blur",function(){f.shared.$f_el=null,y(f)},!0)},registerPopup:function S(e){var t=f.popups.get(e),n=function r(c){var d=f.popups.get(c);return{_tiKeydown:function(e){var t=d.data("instance")||f;if(!1===t.events.trigger("popup.tab",[e]))return!1;var n=e.which,r=d.find(":focus").first();if(V.KEYCODE.TAB===n){e.preventDefault();var o=d.children().not(".fr-buttons"),i=o.findVisible("input, textarea, button, select").not(".fr-no-touch input, .fr-no-touch textarea, .fr-no-touch button, .fr-no-touch select, :disabled").toArray(),a=i.indexOf(this)+(e.shiftKey?-1:1);if(0<=a&&a<i.length)return t.events.disableBlur(),p(i[a]).focus(),e.stopPropagation(),!1;var s=d.find(".fr-buttons");if(s.length&&h(s,Boolean(e.shiftKey)))return e.stopPropagation(),!1;if(u(o))return e.stopPropagation(),!1}else{if(V.KEYCODE.ENTER!==n||!e.target||"TEXTAREA"===e.target.tagName)return V.KEYCODE.ESC===n?(e.preventDefault(),e.stopPropagation(),t.accessibility.restoreSelection(),t.popups.isVisible(c)&&d.findVisible(".fr-back").length?(t.opts.toolbarInline&&(t.events.disableBlur(),t.events.focus()),t.button.exec(d.findVisible(".fr-back").first()),E(d)):t.popups.isVisible(c)&&d.findVisible(".fr-dismiss").length?t.button.exec(d.findVisible(".fr-dismiss").first()):(t.popups.hide(c),t.opts.toolbarInline&&t.toolbar.showInline(null,!0),E(d)),!1):V.KEYCODE.SPACE===n&&(r.is(".fr-submit")||r.is(".fr-dismiss"))?(e.preventDefault(),e.stopPropagation(),t.events.disableBlur(),t.button.exec(r),!0):t.keys.isBrowserAction(e)?void e.stopPropagation():r.is("input[type=text], textarea")?void e.stopPropagation():V.KEYCODE.SPACE===n&&(r.is(".fr-link-attr")||r.is("input[type=file]"))?void e.stopPropagation():(e.stopPropagation(),e.preventDefault(),!1);var l=null;0<d.findVisible(".fr-submit").length?l=d.findVisible(".fr-submit").first():d.findVisible(".fr-dismiss").length&&(l=d.findVisible(".fr-dismiss").first()),l&&(e.preventDefault(),e.stopPropagation(),t.events.disableBlur(),t.button.exec(l))}},_tiMouseenter:function(){var e=d.data("instance")||f;y(e)}}}(e);o(t.find(".fr-buttons")),f.events.$on(t,"mouseenter","tabIndex",n._tiMouseenter,!0),f.events.$on(t.children().not(".fr-buttons"),"keydown","[tabIndex]",n._tiKeydown,!0),f.popups.onHide(e,function(){(t.data("instance")||f).accessibility.restoreSelection()}),f.popups.onShow(e,function(){i=!1,setTimeout(function(){i=!0},0)})},registerToolbar:o,focusToolbarElement:l,focusToolbar:h,focusContent:u,focusPopup:function N(r){var o=r.children().not(".fr-buttons");o.data("mouseenter-event-set")||(f.events.$on(o,"mouseenter","[tabIndex]",function(e){var t=r.data("instance")||f;if(!i)return e.stopPropagation(),void e.preventDefault();var n=o.find(":focus").first();n.length&&!n.is("input, button, textarea, select")&&(t.events.disableBlur(),n.blur(),t.events.disableBlur(),t.events.focus())}),o.data("mouseenter-event-set",!0)),!u(o)&&f.shared.with_kb&&h(r.find(".fr-buttons"))},focusModal:function T(e){f.core.hasFocus()||(f.events.disableBlur(),f.events.focus()),f.accessibility.saveSelection(),f.events.disableBlur(),f.el.blur(),f.selection.clear(),f.events.disableBlur(),f.shared.with_kb?e.find(".fr-command[tabIndex], [tabIndex]").first().focus():e.find("[tabIndex]").first().focus()},focusEditor:L,focusPopupButton:E,focusModalButton:function M(e){var t=e.data("modal-button");t&&setTimeout(function(){l(t),e.data("modal-button",null)},0)},hasFocus:function A(){return null!==f.shared.$f_el},exec:function x(e,t){var n=-1!==navigator.userAgent.indexOf("Mac OS X")?e.metaKey:e.ctrlKey,r=e.which,o=!1;return r!==V.KEYCODE.TAB||n||e.shiftKey||e.altKey?r!==V.KEYCODE.ARROW_RIGHT||n||e.shiftKey||e.altKey?r!==V.KEYCODE.TAB||n||!e.shiftKey||e.altKey?r!==V.KEYCODE.ARROW_LEFT||n||e.shiftKey||e.altKey?r!==V.KEYCODE.ARROW_UP||n||e.shiftKey||e.altKey?r!==V.KEYCODE.ARROW_DOWN||n||e.shiftKey||e.altKey?r!==V.KEYCODE.ENTER&&r!==V.KEYCODE.SPACE||n||e.shiftKey||e.altKey?r!==V.KEYCODE.ESC||n||e.shiftKey||e.altKey?r!==V.KEYCODE.F10||n||e.shiftKey||!e.altKey||(o=c()):o=function i(e){if(f.shared.$f_el){var t=d();return t?(f.button.click(t),l(t)):e.parent().findVisible(".fr-back").length?(f.shared.with_kb=!1,f.opts.toolbarInline&&(f.events.disableBlur(),f.events.focus()),f.button.exec(e.parent().findVisible(".fr-back")).first(),E(e.parent())):f.shared.$f_el.is("button, .fr-group span")&&(e.parent().is(".fr
679-popup")?(f.accessibility.restoreSelection(),f.shared.$f_el=null,!1!==f.events.trigger("toolbar.esc")&&(f.popups.hide(e.parent()),f.opts.toolbarInline&&f.toolbar.showInline(null,!0),E(e.parent()))):L()),!1}}(t):o=b():o=function a(){return f.shared.$f_el&&f.shared.$f_el.is(".fr-dropdown:not(.fr-active)")?b():v(!0)}():o=function s(){return v()}():o=m(t):o=m(t,!0):o=C(t):o=C(t,!0),f.shared.$f_el||void 0!==o||(o=!0),!o&&f.keys.isBrowserAction(e)&&(o=!0),!!o||(e.preventDefault(),e.stopPropagation(),!1)},saveSelection:t,restoreSelection:function O(){f.$el.find(".fr-marker").length&&(f.events.disableBlur(),f.selection.restore(),f.events.enableBlur())}}},Object.assign(V.DEFAULTS,{tooltips:!0}),V.MODULES.tooltip=function(p){var h=p.$;function r(){p.helpers.isMobile()||p.$tooltip&&p.$tooltip.removeClass("fr-visible").css("left","-3000px").css("position","fixed")}function o(e,t){if(!p.helpers.isMobile()){var n=e.attr("id")&&e.attr("id").split("-")[0],r=e.attr("title"),o=p.opts.trackChangesEnabled,i=p.opts.showChangesEnabled;if(p.opts.toolbarContainer){for(var a=!1,s=0;s<V.INSTANCES.length;s++)if(V.INSTANCES[s].core.hasFocus()){o=V.INSTANCES[s].opts.trackChangesEnabled,i=V.INSTANCES[s].opts.showChangesEnabled,a=!0;break}a||(i=o=e.hasClass("fr-active"))}if("trackChanges"===n)r=o?"Disable Track Changes":"Enable Track Changes";else if("showChanges"===n)r=i?"Hide Changes":"Show Changes";else if(("applyAll"===n||"removeAll"===n||"applyLast"===n||"removeLast"===n)&&0===p.track_changes.getPendingChanges().length)return;if(e.data("title",r),e.data("title")){p.$tooltip||function f(){if(p.opts.tooltips&&!p.helpers.isMobile()){if(p.shared.$tooltip)p.$tooltip=p.shared.$tooltip;else{p.shared.$tooltip=h(p.doc.createElement("DIV")).addClass("fr-tooltip"),p.$tooltip=p.shared.$tooltip,p.opts.theme&&p.$tooltip.addClass("".concat(p.opts.theme,"-theme"));var e=p.$wp.closest("dialog");0<e.length?e.first().append(p.$tooltip):h(p.o_doc).find("body").first().append(p.$tooltip)}p.events.on("shared.destroy",function(){p.$tooltip.html("").removeData().remove(),p.$tooltip=null},!0)}}(),e.removeAttr("title"),p.$tooltip.text(p.language.translate(e.data("title"))),p.$tooltip.addClass("fr-visible");var l=e.offset().left+(e.outerWidth()-p.$tooltip.outerWidth())/2;l<0&&(l=0),l+p.$tooltip.outerWidth()>h(p.o_win).width()&&(l=h(p.o_win).width()-p.$tooltip.outerWidth()),void 0===t&&(t=p.opts.toolbarBottom),e.offset().top-h(window).scrollTop()+e.outerHeight()+10>=h(window).height()&&(t=!0);var c=t?e.offset().top-p.$tooltip.height():e.offset().top+e.outerHeight();p.$tooltip.css("position",""),p.$tooltip.css("left",l),p.$tooltip.css("top",Math.ceil(c));var d=p.$wp.closest("dialog");0<d.length?(p.$tooltip.css("margin-left",-d.first().offset().left),p.$tooltip.css("margin-top",-d.first().offset().top)):"static"!==h(p.o_doc).find("body").first().css("position")?(p.$tooltip.css("margin-left",-h(p.o_doc).find("body").first().offset().left),p.$tooltip.css("margin-top",-h(p.o_doc).find("body").first().offset().top)):(p.$tooltip.css("margin-left",""),p.$tooltip.css("margin-top",""))}}}return{hide:r,to:o,bind:function i(e,t,n){p.opts.tooltips&&!p.helpers.isMobile()&&(p.events.$on(e,"mouseover",t,function(e){p.node.hasClass(e.currentTarget,"fr-disabled")||p.edit.isDisabled()||o(h(e.currentTarget),n)},!0),p.events.$on(e,"mouseout ".concat(p._mousedown," ").concat(p._mouseup),t,function(){r()},!0))}}},V.TOOLBAR_VISIBLE_BUTTONS=3,V.MODULES.button=function(g){var u=g.$,a=[];(g.opts.toolbarInline||g.opts.toolbarContainer)&&(g.shared.buttons||(g.shared.buttons=[]),a=g.shared.buttons);var s=[];function l(e,t,n){for(var r=u(),o=0;o<e.length;o++){var i=u(e[o]);if(i.is(t)&&(r=r.add(i)),n&&i.is(".fr-dropdown")){var a=i.next().find(t);r=r.add(a)}}return r}function C(e,t){var n,r=u();if(!e)return r;for(n in r=(r=r.add(l(a,e,t))).add(l(s,e,t)),g.shared.popups)if(Object.prototype.hasOwnProperty.call(g.shared.popups,n)){var o=g.shared.popups[n].children().find(e);r=r.add(o)}for(n in g.shared.modals)if(Object.prototype.hasOwnProperty.call(g.shared.modals,n)){var i=g.shared.modals[n].$modal.find(e);r=r.add(i)}return r}function i(e){var t=e.next(),n=g.node.hasClass(e.get(0),"fr-active"),r=C(".fr-dropdown.fr-active").not(e),o=e.parents(".fr-toolbar, .fr-popup").data("instance")||g;o.helpers.isIOS()&&!o.el.querySelector(".fr-marker")&&(o.selection.save(),o.selection.clear(),o.selection.restore(
vendor: 5,663 bytes, line 679
679)),t.parents(".fr-more-toolbar").addClass("fr-overflow-visible");var i=0,a=0,s=t.find("> .fr-dropdown-wrapper");if(!n){var l=e.data("cmd");t.find(".fr-command").removeClass("fr-active").attr("aria-selected",!1),V.COMMANDS[l]&&V.COMMANDS[l].refreshOnShow&&V.COMMANDS[l].refreshOnShow.apply(o,[e,t]),t.css("left",e.offset().left-e.parents(".fr-btn-wrap, .fr-toolbar, .fr-buttons").offset().left-("rtl"===g.opts.direction?t.width()-e.outerWidth():0)),t.addClass("test-height"),i=t.outerHeight(),a=g.helpers.getPX(s.css("max-height")),t.removeClass("test-height"),t.css("top","").css("bottom","");var c=e.outerHeight()/10;if(!g.opts.toolbarBottom&&t.offset().top+e.outerHeight()+i<u(g.o_doc).height())t.css("top",e.position().top+e.outerHeight()-c);else{var d=0,f=e.parents(".fr-more-toolbar");0<f.length&&(d=f.first().height()),t.css("bottom",e.parents(".fr-popup, .fr-toolbar").first().height()-d-e.position().top)}}(e.addClass("fr-blink").toggleClass("fr-active"),e.hasClass("fr-options"))&&e.prev().toggleClass("fr-expanded");e.hasClass("fr-active")?(t.attr("aria-hidden",!1),e.attr("aria-expanded",!0),function h(e,t,n){n<=t&&(e.parent().css("overflow","auto"),e.parent().css("overflow-x","hidden")),e.css("height",Math.min(t,n))}(s,i,a)):(t.attr("aria-hidden",!0).css("overflow",""),e.attr("aria-expanded",!1),s.css("height","")),setTimeout(function(){e.removeClass("fr-blink")},300),t.css("margin-left",""),t.offset().left+t.outerWidth()>g.$sc.offset().left+g.$sc.width()&&t.css("margin-left",-(t.offset().left+t.outerWidth()-g.$sc.offset().left-g.$sc.width())),t.offset().left<g.$sc.offset().left&&"rtl"===g.opts.direction&&t.css("margin-left",g.$sc.offset().left),r.removeClass("fr-active").attr("aria-expanded",!1).next().attr("aria-hidden",!0).css("overflow","").find("> .fr-dropdown-wrapper").css("height",""),r.prev(".fr-expanded").removeClass("fr-expanded"),r.parents(".fr-toolbar:not(.fr-inline)").css("zIndex",""),0!==e.parents(".fr-popup").length||g.opts.toolbarInline||(g.node.hasClass(e.get(0),"fr-active")?g.$tb.css("zIndex",(g.opts.zIndex||1)+4):g.$tb.css("zIndex",""));var p=t.find("a.fr-command.fr-active").first();g.helpers.isMobile()||(p.length?(g.accessibility.focusToolbarElement(p),s.scrollTop(Math.abs(p.parents(".fr-dropdown-content").offset().top-p.offset().top)-p.offset().top)):(g.accessibility.focusToolbarElement(e),s.scrollTop(0)))}function c(e){e.addClass("fr-blink"),setTimeout(function(){e.removeClass("fr-blink")},500);for(var t=e.data("cmd"),n=[];void 0!==e.data("param".concat(n.length+1));)n.push(e.data("param".concat(n.length+1)));var r=C(".fr-dropdown.fr-active");r.length&&(r.removeClass("fr-active").attr("aria-expanded",!1).next().attr("aria-hidden",!0).css("overflow","").find("> .fr-dropdown-wrapper").css("height",""),r.prev(".fr-expanded").removeClass("fr-expanded"),r.parents(".fr-toolbar:not(.fr-inline)").css("zIndex","")),e.parents(".fr-popup, .fr-toolbar").data("instance").commands.exec(t,n)}function t(e){var t=e.parents(".fr-popup, .fr-toolbar").data("instance"),n=g.popups.get("link.insert");if(0===e.parents(".fr-popup").length&&e.data("popup")&&!e.hasClass("fr-btn-active-popup")&&(e.attr("id")==="insertLink-".concat(g.id)&&n&&n.hasClass("fr-active")||e.addClass("fr-btn-active-popup")),0!==e.parents(".fr-popup").length||e.data("popup")||t.popups.hideAll(),t.popups.areVisible()&&!t.popups.areVisible(t)){for(var r=0;r<V.INSTANCES.length;r++)V.INSTANCES[r]!==t&&V.INSTANCES[r].popups&&V.INSTANCES[r].popups.areVisible()&&V.INSTANCES[r].$el.find(".fr-marker").remove();t.popups.hideAll()}g.node.hasClass(e.get(0),"fr-dropdown")?i(e):(!function o(e){c(e)}(e),V.COMMANDS[e.data("cmd")]&&!1!==V.COMMANDS[e.data("cmd")].refreshAfterCallback&&t.button.bulkRefresh())}function d(e){t(u(e.currentTarget))}function f(e){var t=e.find(".fr-dropdown.fr-active");t.length&&(t.removeClass("fr-active").attr("aria-expanded",!1).next().attr("aria-hidden",!0).css("overflow","").find("> .fr-dropdown-wrapper").css("height",""),t.parents(".fr-toolbar:not(.fr-inline)").css("zIndex",""),t.prev().removeClass("fr-expanded"))}function p(e){e.preventDefault(),e.stopPropagation()}function h(e){if(e.stopPropagation(),!g.helpers.isMobile())return!1}function m(e){var t=1<arguments.length&&arguments[1]!==undefined?arguments[1]:{},n=2<arguments.length?arguments[2]:undefined;if(g.helpers.isMobile()&&!1===t.showOnMobile)return"";var r=t.displaySelection;"function"==typeof r&&(r=r(g));var o="";if("options"!==t.type)if(r){var i="function"==typeof t.defaultSelection?t.defaultSelection(g):t.defaultSelection;o='<span style="width:'.concat(t.displaySelectionWidth||100,'px">').concat(g.language.translate(i||t.title),"</span>")}else o=g.icon.create(t.icon||e),o+='<span class="fr-sr-only">'.concat(g.language.translate(t.title)||"","</span>");var a=t.popup?' data-popup="true"':"",s=t.modal?' data-modal="true"':"",l=g.shortcuts.get("".concat(e,"."));l=l?" (".concat(l,")"):"";var c="".concat(e,"-").concat(g.id),d="dropdown-menu-".concat(c),f='<button id="'.concat(c,'"').concat(t.more_btn?' data-group-name="'.concat(c,'" '):"",'type="button" tabIndex="-1" role="button"').concat(t.toggle?' aria-pressed="false"':"").concat("dropdown"===t.type||"options"===t.type?' aria-controls="'.concat(d,'" aria-expanded="false" aria-haspopup="true"'):"").concat(t.disabled?' aria-disabled="true"':"",' title="').concat(g.language.translate(t.title)||"").concat(l,'" class="fr-command fr-btn').concat("dropdown"===t.type||"options"==t.type?" fr-dropdown":"").concat("options"==t.type?" fr-options":"").concat("more"==t.type?" fr-more":"").concat(t.displaySelection?" fr-selection":"").concat(t.back?" fr-back":"").concat(t.disabled?" fr-
679disabled":"").concat(n?"":" fr-hidden",'" data-cmd="').concat(e,'"').concat(a).concat(s,">").concat(o,"</button>");if("dropdown"===t.type||"options"===t.type){var p='<div id="'.concat(d,'" class="fr-dropdown-menu" role="listbox" aria-labelledby="').concat(c,'" aria-hidden="true"><div class="fr-dropdown-wrapper" role="presentation"><div class="fr-dropdown-content" role="presentation">');p+=function h(e,t){var n="";if(t.html)"function"==typeof t.html?n+=t.html.call(g):n+=t.html;else{var r=t.options;for(var o in"function"==typeof r&&(r=r()),n+='<ul class="fr-dropdown-list" role="presentation">',r)if(Object.prototype.hasOwnProperty.call(r,o)){var i=g.shortcuts.get("".concat(e,".").concat(o));i=i?'<span class="fr-shortcut">'.concat(i,"</span>"):"",n+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="'.concat("options"===t.type?e.replace(/Options/g,""):e,'" data-param1="').concat(o,'" title="').concat(r[o],'">').concat(g.language.translate(r[o]),"</a></li>")}n+="</ul>"}return n}(e,t),f+=p+="</div></div></div>"}return t.hasOptions&&t.hasOptions.apply(g)&&(f='<div class="fr-btn-wrap">'.concat(f," ").concat(m(e+"Options",Object.assign({},t,{type:"options",hasOptions:!1}),n),"  </div>")),f}function e(o){var i=g.$tb&&g.$tb.data("instance")||g;if(!1===g.events.trigger("buttons.refresh"))return!0;setTimeout(function(){for(var e=i.selection.inEditor()&&i.core.hasFocus(),t=0;t<o.length;t++){var n=u(o[t]),r=n.data("cmd");0===n.parents(".fr-popup").length?e||V.COMMANDS[r]&&V.COMMANDS[r].forcedRefresh?i.button.refresh(n):g.node.hasClass(n.get(0),"fr-dropdown")||(n.removeClass("fr-active"),n.attr("aria-pressed")&&n.attr("aria-pressed",!1)):n.parents(".fr-popup").isVisible()&&i.button.refresh(n)}},0)}function n(){e(a),e(s)}function r(){a=[],s=[]}g.shared.popup_buttons||(g.shared.popup_buttons=[]),s=g.shared.popup_buttons;var o=null;function v(){clearTimeout(o),o=setTimeout(n,50)}return{_init:function b(){g.opts.toolbarInline?g.events.on("toolbar.show",n):(g.events.on("mouseup",v),g.events.on("keyup",v),g.events.on("blur",v),g.events.on("focus",v),g.events.on("contentChanged",v),g.helpers.isMobile()&&g.events.$on(g.$doc,"selectionchange",n)),g.events.on("shared.destroy",r)},build:m,buildList:function L(e,t){for(var n="",r=0;r<e.length;r++){var o=e[r],i=V.COMMANDS[o];i&&"undefined"!=typeof i.plugin&&g.opts.pluginsEnabled.indexOf(i.plugin)<0||(i?n+=m(o,i,void 0===t||0<=t.indexOf(o)):"|"===o?n+='<div class="fr-separator fr-vs" role="separator" aria-orientation="vertical"></div>':"-"===o&&(n+='<div class="fr-separator fr-hs" role="separator" aria-orientation="horizontal"></div>'))}return n},buildGroup:function E(e){var t="",n="";for(var r in e){var o=e[r];if(o.buttons){for(var i="",a="",s=0,l="left",c=V.TOOLBAR_VISIBLE_BUTTONS,d=0;d<o.buttons.length;d++){var f=o.buttons[d],p=V.COMMANDS[f];p||("|"==f?i+='<div class="fr-separator fr-vs" role="separator" aria-orientation="vertical"></div>':"-"==f&&(i+='<div class="fr-separator fr-hs" role="separator" aria-orientation="horizontal"></div>')),!p||p&&"undefined"!=typeof p.plugin&&g.opts.pluginsEnabled.indexOf(p.plugin)<0||(e[r].align!==undefined&&(l=e[r].align),e[r].buttonsVisible!==undefined&&(c=e[r].buttonsVisible),e.showMoreButtons&&c<=s?a+=m(f,p,!0):i+=m(f,p,!0),s++)}if(e.showMoreButtons&&c<s){var h=r,u=V.COMMANDS[h];u.more_btn=!0,i+=m(h,u,!0)}"trackChanges"!==r&&(t+='<div class="fr-btn-grp fr-float-'.concat(l,'">').concat(i,"</div>")),e.showMoreButtons&&0<a.length&&(n+='<div class="fr-more-toolbar" data-name="'.concat(r+"-"+g.id,'">').concat(a,"</div>"))}}return g.opts.toolbarBottom?g.helpers.isMobile()?'<div class="fr-bottom-extended">'.concat(n,"</div><div>").concat(t,"</div>"):"".concat(n,'<div class="fr-newline"></div>').concat(t):"".concat(t,'<div class="fr-newline"></div>').concat(n)},bindCommands:function y(t,e){g.events.bindClick(t,".fr-command:not(.fr-disabled)",d),g.events.$on(t,"".concat(g._mousedown," ").concat(g._mouseup," ").concat(g._move),".fr-dropdown-menu",p,!0),g.events.$on(t,"".concat(g._mousedown," ").concat(g._mouseup," ").concat(g._move),".fr-dropdown-menu .fr-dropdown-wrapper",h,!0);var n=t.get(0).ownerDocument,r="defaultView"in n?n.defaultView:n.parentWindow;function o(e){(!e||e.type===g._mouseup&&e.target!==u("html").get(0)||"keydown"===e.type&&(g.keys.isCharacter(e.which)&&!g.keys.ctrlKey(e)||e.which===V.KEYCODE.ESC))&&(f(t),g.opts.iframe&&function r(e){var t=e.find(".fr-popup.fr-active");if(t.length){t.removeClass("fr-active").attr("aria-expanded",!1).next().attr("aria-hidden",!0).css("overflow","").find("> .fr-dropdown-wrapper").css("height",""),t.parents(".fr-toolbar:not(.fr-inline)").css("zIndex",""),t.prev().removeClass("fr-expanded");var n=g.$tb.find(".fr-btn-active-popup");u(n[0]).removeClass("fr-btn-active-popup")}}(t))}g.events.$on(u(r),"".concat(g._mouseup," resize keydown"),o,!0),g.opts.iframe&&g.events.$on(g.$win,g._mou
vendor: 3,178 bytes, line 679
679seup,o,!0),g.node.hasClass(t.get(0),"fr-popup")?u.merge(s,t.find(".fr-btn").toArray()):u.merge(a,t.find(".fr-btn").toArray()),g.tooltip.bind(t,".fr-btn, .fr-title",e)},refresh:function S(e){var t,n=e.parents(".fr-popup, .fr-toolbar").data("instance")||g,r=e.data("cmd");g.node.hasClass(e.get(0),"fr-dropdown")?t=e.next():(e.removeClass("fr-active"),e.attr("aria-pressed")&&e.attr("aria-pressed",!1)),V.COMMANDS[r]&&V.COMMANDS[r].refresh?V.COMMANDS[r].refresh.apply(n,[e,t]):g.refresh[r]&&n.refresh[r](e,t)},bulkRefresh:n,exec:c,click:t,hideActiveDropdowns:f,addButtons:function N(e){for(var t=0;t<e.length;t++)a.push(e[t])},getButtons:C,getPosition:function T(e){var t=e.offset().left,n=g.opts.toolbarBottom?10:e.outerHeight()-10;return{left:t,top:e.offset().top+n}}}},V.ICON_TEMPLATES={font_awesome:'<i class="fa fa-[NAME]" aria-hidden="true"></i>',font_awesome_5:'<i class="fas fa-[FA5NAME]" aria-hidden="true"></i>',font_awesome_5r:'<i class="far fa-[FA5NAME]" aria-hidden="true"></i>',font_awesome_5l:'<i class="fal fa-[FA5NAME]" aria-hidden="true"></i>',font_awesome_5b:'<i class="fab fa-[FA5NAME]" aria-hidden="true"></i>',text:'<span style="text-align: center;">[NAME]</span>',image:"<img src=[SRC] alt=[ALT] />",svg:'<svg class="fr-svg" focusable="false" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="[PATH]"/></svg>',empty:" "},V.ICONS={bold:{NAME:"bold",SVG_KEY:"bold"},italic:{NAME:"italic",SVG_KEY:"italic"},underline:{NAME:"underline",SVG_KEY:"underline"},strikeThrough:{NAME:"strikethrough",SVG_KEY:"strikeThrough"},subscript:{NAME:"subscript",SVG_KEY:"subscript"},superscript:{NAME:"superscript",SVG_KEY:"superscript"},cancel:{NAME:"cancel",SVG_KEY:"cancel"},color:{NAME:"tint",SVG_KEY:"textColor"},outdent:{NAME:"outdent",SVG_KEY:"outdent"},indent:{NAME:"indent",SVG_KEY:"indent"},undo:{NAME:"rotate-left",FA5NAME:"undo",SVG_KEY:"undo"},redo:{NAME:"rotate-right",FA5NAME:"redo",SVG_KEY:"redo"},insert:{NAME:"insert",SVG_KEY:"insert"},insertAll:{NAME:"insertAll",SVG_KEY:"insertAll"},insertHR:{NAME:"minus",SVG_KEY:"horizontalLine"},clearFormatting:{NAME:"eraser",SVG_KEY:"clearFormatting"},selectAll:{NAME:"mouse-pointer",SVG_KEY:"selectAll"},minimize:{NAME:"minimize",SVG_KEY:"minimize"},moreText:{NAME:"ellipsis-v",SVG_KEY:"textMore"},moreParagraph:{NAME:"ellipsis-v",SVG_KEY:"paragraphMore"},moreRich:{NAME:"ellipsis-v",SVG_KEY:"insertMore"},moreMisc:{NAME:"ellipsis-v",SVG_KEY:"more"}},V.DefineIconTemplate=function(e,t){V.ICON_TEMPLATES[e]=t},V.DefineIcon=function(e,t){V.ICONS[e]=t},Object.assign(V.DEFAULTS,{iconsTemplate:"svg"}),V.MODULES.icon=function(o){return{create:function i(n){var e=null,r=V.ICONS[n];if(void 0!==r){var t=r.template||V.ICON_DEFAULT_TEMPLATE||o.opts.iconsTemplate;t&&t.apply&&(t=t.apply(o)),r.FA5NAME||(r.FA5NAME=r.NAME),"svg"!==t||r.PATH||(r.PATH=V.SVG[r.SVG_KEY]||""),t&&(t=V.ICON_TEMPLATES[t])&&(e=t.replace(/\[([a-zA-Z0-9]*)\]/g,function(e,t){return"NAME"===t?r[t]||n:r[t]}))}return e||n},getTemplate:function r(e){var t=V.ICONS[e],n=o.opts.iconsTemplate;return void 0!==t?n=t.template||V.ICON_DEFAULT_TEMPLATE||o.opts.iconsTemplate:n},getFileIcon:function n(e){var t=V.FILEICONS[e];return void 0!==t?t:e}}},V
vendor: 72,367 bytes, line 679
679.SVG={add:"M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6V13z",advancedImageEditor:"M3,17v2h6v-2H3z M3,5v2h10V5H3z M13,21v-2h8v-2h-8v-2h-2v6H13z M7,9v2H3v2h4v2h2V9H7z M21,13v-2H11v2H21z M15,9h2V7h4V5h-4  V3h-2V9z",alignCenter:"M9,18h6v-2H9V18z M6,11v2h12v-2H6z M3,6v2h18V6H3z",alignJustify:"M3,18h18v-2H3V18z M3,11v2h18v-2H3z M3,6v2h18V6H3z",alignLeft:"M3,18h6v-2H3V18z M3,11v2h12v-2H3z M3,6v2h18V6H3z",alignRight:"M15,18h6v-2h-6V18z M9,11v2h12v-2H9z M3,6v2h18V6H3z",anchors:"M16,4h-4H8C6.9,4,6,4.9,6,6v4v10l6-2.6l6,2.6V10V6C18,4.9,17.1,4,16,4z M16,17l-4-1.8L8,17v-7V6h4h4v4V17z",autoplay:"M 7.570312 0.292969 C 7.542969 0.292969 7.515625 0.292969 7.488281 0.296875 C 7.203125 0.324219 6.984375 0.539062 6.980469 0.792969 L 6.925781 3.535156 C 2.796875 3.808594 -0.0078125 6.425781 -0.0859375 10.09375 C -0.121094 11.96875 0.710938 13.6875 2.265625 14.921875 C 3.769531 16.117188 5.839844 16.796875 8.097656 16.828125 C 8.140625 16.828125 12.835938 16.898438 13.035156 16.886719 C 15.171875 16.796875 17.136719 16.128906 18.558594 15.003906 C 20.066406 13.816406 20.882812 12.226562 20.917969 10.40625 C 20.960938 8.410156 20.023438 6.605469 18.289062 5.335938 C 18.214844 5.277344 18.128906 5.230469 18.035156 5.203125 C 17.636719 5.074219 17.222656 5.199219 17 5.476562 L 15.546875 7.308594 C 15.304688 7.609375 15.363281 8.007812 15.664062 8.265625 C 16.351562 8.851562 16.707031 9.625 16.6875 10.5 C 16.652344 12.25 15.070312 13.390625 12.757812 13.535156 C 12.59375 13.539062 8.527344 13.472656 8.164062 13.464844 C 5.703125 13.429688 4.101562 12.191406 4.140625 10.3125 C 4.175781 8.570312 5.132812 7.46875 6.847656 7.199219 L 6.796875 9.738281 C 6.792969 9.992188 7 10.214844 7.285156 10.253906 C 7.3125 10.257812 7.339844 10.257812 7.367188 10.257812 C 7.503906 10.261719 7.632812 10.222656 7.738281 10.148438 L 14.039062 5.785156 C 14.171875 5.691406 14.253906 5.558594 14.253906 5.410156 C 14.257812 5.261719 14.1875 5.125 14.058594 5.027344 L 7.941406 0.414062 C 7.835938 0.335938 7.707031 0.292969 7.570312 0.292969 ",back:"M20 11L7.83 11 11.425 7.405 10.01 5.991 5.416 10.586 5.414 10.584 4 11.998 4.002 12 4 12.002 5.414 13.416 5.416 13.414 10.01 18.009 11.425 16.595 7.83 13 20 13 20 13 20 11 20 11Z",backgroundColor:"M9.91752,12.24082l7.74791-5.39017,1.17942,1.29591-6.094,7.20747L9.91752,12.24082M7.58741,12.652l4.53533,4.98327a.93412.93412,0,0,0,1.39531-.0909L20.96943,8.7314A.90827.90827,0,0,0,20.99075,7.533l-2.513-2.76116a.90827.90827,0,0,0-1.19509-.09132L7.809,11.27135A.93412.93412,0,0,0,7.58741,12.652ZM2.7939,18.52772,8.41126,19.5l1.47913-1.34617-3.02889-3.328Z",blockquote:"M10.31788,5l.93817,1.3226A12.88271,12.88271,0,0,0,8.1653,9.40125a5.54242,5.54242,0,0,0-.998,3.07866v.33733q.36089-.04773.66067-.084a4.75723,4.75723,0,0,1,.56519-.03691,2.87044,2.87044,0,0,1,2.11693.8427,2.8416,2.8416,0,0,1,.8427,2.09274,3.37183,3.37183,0,0,1-.8898,2.453A3.143,3.143,0,0,1,8.10547,19,3.40532,3.40532,0,0,1,5.375,17.7245,4.91156,4.91156,0,0,1,4.30442,14.453,9.3672,9.3672,0,0,1,5.82051,9.32933,14.75716,14.75716,0,0,1,10.31788,5Zm8.39243,0,.9369,1.3226a12.88289,12.88289,0,0,0-3.09075,3.07865,5.54241,5.54241,0,0,0-.998,3.07866v.33733q.33606-.04773.63775-.084a4.91773,4.91773,0,0,1,.58938-.03691,2.8043,2.8043,0,0,1,2.1042.83,2.89952,2.89952,0,0,1,.80578,2.10547,3.42336,3.42336,0,0,1-.86561,2.453A3.06291,3.06291,0,0,1,16.49664,19,3.47924,3.47924,0,0,1,13.742,17.7245,4.846,4.846,0,0,1,12.64721,14.453,9.25867,9.25867,0,0,1,14.17476,9.3898,15.26076,15.26076,0,0,1,18.71031,5Z",bold:"M15.25,11.8h0A3.68,3.68,0,0,0,17,9a3.93,3.93,0,0,0-3.86-4H6.65V19h7a3.74,3.74,0,0,0,3.7-3.78V15.1A3.64,3.64,0,0,0,15.25,11.8ZM8.65,7h4.2a2.09,2.09,0,0,1,2,1.3,2.09,2.09,0,0,1-1.37,2.61,2.23,2.23,0,0,1-.63.09H8.65Zm4.6,10H8.65V13h4.6a2.09,2.09,0,0,1,2,1.3,2.09,2.09,0,0,1-1.37,2.61A2.23,2.23,0,0,1,13.25,17Z",cancel:"M13.4,12l5.6,5.6L17.6,19L12,13.4L6.4,19L5,17.6l5.6-5.6L5,6.4L6.4,5l5.6,5.6L17.6,5L19,6.4L13.4,12z",cellBackground:"M16.6,12.4L7.6,3.5L6.2,4.9l2.4,2.4l-5.2,5.2c-0.6,0.6-0.6,1.5,0,2.1l5.5,5.5c0.3,0.3,0.7,0.4,1.1,0.4s0.8-0.1,1.1-0.4  l5.5-5.5C17.2,14,17.2,13,16.6,12.4z M5.2,13.5L10,8.7l4.8,4.8H5.2z M19,15c0,0-2,2.2-2,3.5c0,1.1,0.9,2,2,2s2-0.9,2-2  C21,17.2,19,15,19,15z",cellBorderColor:"M22,22H2v2h20V22z",cellOptions:"M20,5H4C2.9,5,2,5.9,2,7v10c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V7C22,5.9,21.1,5,20,5z M9.5,6.5h5V9h-5V6.5z M8,17.5H4  c-0.3,0-0.5-0.2-0.5-0.4c0,0,0,0,0,0V17v-2H8V17.5z M8,13.5H3.5v-3H8V13.5z M8,9H3.5V7c0-0.3,0.2-0.5,0.4-0.5c0,0,0,0,0,0H8V9z   M14.5,17.5h-5V15h5V17.5z M20.5,17c0,0.3-0.2,0.5-0.4,0.5c0,0,0,0,0,0H16V15h4.5V17z M20.5,13.5H16v-3h4.5V13.5z M20.5,9H16V6.5h4  c0.3,0,0.5,0.2,0.5,0.4c0,0,0,0,0,0V9z",cellStyle:"M20,19.9l0.9,3.6l-3.2-1.9l-3.3,1.9l0.8-3.6L12.3,17h3.8l1.7-3.5l1.4,3.5H23L20,19.9z M20,5H4C2.9,5,2,5.9,2,7v10  c0,1.1,0.9,2,2,2h7.5l-0.6-0.6L10,17.5H9.5V15h5.4l1.1-2.3v-2.2h4.5v3H20l0.6,1.5H22V7C22,5.9,21.1,5,20,5z M3.5,7  c0-0.3,0.2-0.5,0.4-0.5c0,0,0,0,0.1,0h4V9H3.5V7z M3.5,10.5H8v3H3.5V10.5z M4,17.5c-0.3,0-0.5-0.2-0.5-0.4c0,0,0,0,0-0.1v-2H8v2.5H4  z M14.5,9h-5V6.5h5V9z M20.5,9H16V6.5h4c0.3,0,0.5,0.2,0.5,0.4c0,0,0,0,0,0.1V9z",clearFormatting:"M11.48,10.09l-1.2-1.21L8.8,7.41,6.43,5,5.37,6.1,8.25,9,4.66,19h2l1.43-4h5.14l1.43,4h2l-.89-2.51L18.27,19l1.07-1.06L14.59,13.2ZM8.8,13l.92-2.56L12.27,13Zm.56-7.15L9.66,5h2l1.75,4.9Z",close:"M13.4,12l5.6,5.6L17.6,19L12,13.4L6.4,19L5,17.6l5.6-5.6L5,6.4L6.4,5l5.6,5.6L17.6,5L19,6.4L13.4,12z",codeView:"M9.4,16.6,4.8,12,9.4,7.4,8,6,2,12l6,6Zm5.2,0L19.2,12,14.6,7.4,16,6l6,6-6,6Z",cogs:"M18.877 12.907a6.459 6.459 0 0 0 0 -1.814l1.952 -1.526a0.468 0.468 0 0 0 0.111 -0.593l-1.851 -3.2a0.461 0.461 0 0 0 -0.407 -0.231 0.421 0.421 0 0 0 -0.157 0.028l-2.3 0.925a6.755 6.755 0 0 0 -1.563 -0.907l-0.352 -2.452a0.451 0.451 0 0 0 -0.453 -0.388h-3.7a0.451 0.451 0 0 0 -0.454 0.388L9.347 5.588A7.077 7.077 0 0 0 7.783 6.5l-2.3 -0.925a0.508 0.508 0 0 0 -0.166 -0.028 0.457 0.457 0 0 0 -0.4 0.231l-1.851 3.2a0.457 0.457 0 0 0 0.111 0.593l1.952 1.526A7.348 7.348 0 0 0 5.063 12a7.348 7.348 0 0 0 0.064 0.907L3.175 14.433a0.468 0.468 0 0 0 -0.111 0.593l1.851 3.2a0.461 0.461 0 0 0 0.407 0.231 0.421 0.421 0 0 0 0.157 -0.028l2.3 -0.925a6.74 6.74 0 0 0 1.564 0.907L9.7 20.864a0.451 0.451 0 0 0 0.454 0.388h3.7a0.451 0.451 0 0 0 0.453 -0.388l0.352 -2.452a7.093 7.093 0 0 0 1.563 -0.907l2.3 0.925a0.513 0.513 0 0 0 0.167 0.028 0.457 0.457 0 0 0 0.4 -0.231l1.851 -3.2a0.468 0.468 0 0 0 -0.111 -0.593Zm-0.09 2.029l-0.854 1.476 -2.117 -0.852 -0.673 0.508a5.426 5.426 0 0 1 -1.164 0.679l-0.795 0.323 -0.33 2.269h-1.7l-0.32 -2.269 -0.793 -0.322a5.3 5.3 0 0 1 -1.147 -0.662L8.2 15.56l-2.133 0.86 -0.854 -1.475 1.806 -1.411 -0.1 -0.847c-0.028 -0.292 -0.046 -0.5 -0.046 -0.687s0.018 -0.4 0.045 -0.672l0.106 -0.854L5.217 9.064l0.854 -1.475 2.117 0.851 0.673 -0.508a5.426 5.426 0 0 1 1.164 -0.679l0.8 -0.323 0.331 -2.269h1.7l0.321 2.269 0.792 0.322a5.3 5.3 0 0 1 1.148 0.661l0.684 0.526 2.133 -0.859 0.853 1.473 -1.8 1.421 0.1 0.847a5 5 0 0 1 0.046 0.679c0 0.193 -0.018 0.4 -0.045 0.672l-0.106 0.853ZM12 14.544A2.544 2.544 0 1 1 14.546 12 2.552 2.552 0 0 1 12 14.544Z",columns:"M20,5H4C2.9,5,2,5.9,2,7v10c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V7C22,5.9,21.1,5,20,5z M8,17.5H4c-0.3,0-0.5-0.2-0.5-0.4  c0,0,0,0,0,0V17v-2H8V17.5z M8,13.5H3.5v-3H8V13.5z M8,9H3.5V7c0-0.3,0.2-0.5,0.4-0.5c0,0,0,0,0,0H8V9z M20.5,17  c0,0.3-0.2,0.5-0.4,0.5c0,0,0,0,0,0H16V15h4.5V17z M20.5,13.5H16v-3h4.5V13.5z M20.5,9H16V6.5h4c0.3,0,0.5,0.2,0.5,0.4c0,0,0,0,0,0  V9z",edit:"M17,11.2L12.8,7L5,14.8V19h4.2L17,11.2z M7,16.8v-1.5l5.6-5.6l1.4,1.5l-5.6,5.6H7z M13.5,6.3l0.7-0.7c0.8-0.8,2.1-0.8,2.8,0  c0,0,0,0,0,0L18.4,7c0.8,0.8,0.8,2,0,2.8l-0.7,0.7L13.5,6.3z",exitFullscreen:"M5,16H8v3h2V14H5ZM8,8H5v2h5V5H8Zm6,11h2V16h3V14H14ZM16,8V5H14v5h5V8Z",fileInsert:"M 8.09375 12.75 L 5.90625 12.75 C 5.542969 12.75 5.25 12.394531 5.25 11.953125 L 5.25 6.375 L 2.851562 6.375 C 2.367188 6.375 2.121094 5.660156 2.464844 5.242188 L 6.625 0.1875 C 6.832031 -0.0585938 7.167969 -0.0585938 7.371094 0.1875 L 11.535156 5.242188 C 11.878906 5.660156 11.632812 6.375 11.148438 6.375 L 8.75 6.375 L 8.75 11.953125 C 8.75 12.394531 8.457031 12.75 8.09375 12.75 Z M 14 12.484375 L 14 16.203125 C 14 16.644531 13.707031 17 13.34375 17 L 0.65625 17 C 0.292969 17 0 16.644531 0 16.203125 L 0 12.484375 C 0 12.042969 0.292969 11.6875 0.65625 11.6875 L 4.375 11.6875 L 4.375 11.953125 C 4.375 12.980469 5.0625 13.8125 5.90625 13.8125 L 8.09375 13.8125 C 8.9375 13.8125 9.625 12.980469 9.625 11.953125 L 9.625 11.6875 L 13.34375 11.6875 C 13.707031 11.6875 14 12.042969 14 12.484375 Z M 10.609375 15.40625 C 10.609375 15.039062 10.363281 14.742188 10.0625 14.742188 C 9.761719 14.742188 9.515625 15.039062 9.515625 15.40625 C 9.515625 15.773438 9.761719 16.070312 10.0625 16.070312 C 10.363281 16.070312 10.609375 15.773438 10.609375 15.40625 Z M 12.359375 15.40625 C 12.359375 15.039062 12.113281 14.742188 11.8125 14.742188 C 11.511719 14.742188 11.265625 15.039062 11.265625 15.40625 C 11.265625 15.773438 11.511719 16.070312 11.8125 16.070312 C 12.113281 16.070312 12.359375 15.773438 12.359375 15.40625 Z M 12.359375 15.40625 ",fileManager:"M 0 5.625 L 20.996094 5.625 L 21 15.75 C 21 16.371094 20.410156 16.875 19.6875 16.875 L 1.3125 16.875 C 0.585938 16.875 0 16.371094 0 15.75 Z M 0 5.625 M 21 4.5 L 0 4.5 L 0 2.25 C 0 1.628906 0.585938 1.125 1.3125 1.125 L 6.921875 1.125 C 7.480469 1.125 8.015625 1.316406 8.40625 1.652344 L 9.800781 2.847656 C 10.195312 3.183594 10.730469 3.375 11.289062 3.375 L 19.6875 3.375 C 20.414062 3.375 21 3.878906 21 4.5 Z M 21 4.5",markdown:"M5.55006 17.75V7.35L8.96006 16.89H10.7101L14.2301 7.37V14.0729C14.3951 14.1551 14.5499 14.265 14.6875 14.4026L14.7001 14.4151V11.64C14.7001 10.8583 15.2127 10.1963 15.9201 9.97171V5H13.6801L10.0401 14.86L6.51006 5H4.00006V17.75H5.55006ZM17.2001 11.64C17.2001 11.2258 16.8643 10.89 16.4501 10.89C16.0359 10.89 15.7001 11.2258 15.7001 11.64V16.8294L13.9804 15.1097C13.6875 14.8168 13.2126 14.8168 12.9197 15.1097C12.6269 15.4026 12.6269 15.8775 12.9197 16.1703L15.9197 19.1703C16.2126 19.4632 16.6875 19.4632 16.9804 19.1703L19.9804 16.1703C20.2733 15.8775 20.2733 15.4026 19.9804 15.1097C19.6875 14.8168 19.2126 14.8168 18.9197 15.1097L17.2001 16.8294V11.64Z",fontAwesome:"M18.99018,13.98212V7.52679c-.08038-1.21875-1.33929-.683-1.33929-.683-2.933,1.39282-4.36274.61938-5.85938.15625a6.23272,6.23272,0,0,0-2.79376-.20062l-.00946.004A1.98777,1.98777,0,0,0,7.62189,5.106a.984.984,0,0,0-.17517-.05432c-.02447-.0055-.04882-.01032-.0736-.0149A.9565.9565,0,0,0,7.1908,5H6.82539a.9565.9565,0,0,0-.18232.0368c-.02472.00458-.04907.0094-.07348.01484a.985.985,0,0,0-.17523.05438,1.98585,1.98585,0,0,0-.573,3.49585v9.394A1.004,1.004,0,0,0,6.82539,19H7.1908a1.00406,1.00406,0,0,0,1.00409-1.00409V15.52234c3.64221-1.09827,5.19709.64282,7.09888.57587a5.57291,5.57291,0,0,0,3.25446-1.05805A1.2458,1.2458,0,0,0,18.99018,13.98212Z",fontFamily:"M16,19h2L13,5H11L6,19H8l1.43-4h5.14Zm-5.86-6L12,7.8,13.86,13Z",fontSize:"M20.75,19h1.5l-3-10h-1.5l-3,10h1.5L17,16.5h3Zm-3.3-4,1.05-3.5L19.55,15Zm-5.7,4h2l-5-14h-2l-5,14h2l1.43-4h5.14ZM5.89,13,7.75,7.8,9.61,13Z",fullscreen:"M7,14H5v5h5V17H7ZM5,10H7V7h3V5H5Zm12,7H14v2h5V14H17ZM14,5V7h3v3h2V5Z",help:"M11,17h2v2h-2V17z M12,5C9.8,5,8,6.8,8,9h2c0-1.1,0.9-2,2-2s2,0.9,2,2c0,2-3,1.7-3,5v1h2v-1c0-2.2,3-2.5,3-5  C16,6.8,14.2,5,12,5z",horizontalLine:"M5,12h14 M19,11H5v2h14V11z",imageAltText:"M19,7h-6v12h-2V7H5V5h6h2h6V7z",imageCaption:"M14.2,11l3.8,5H6l3-3.9l2.1,2.7L14,11H14.2z M8.5,11c0.8,0,1.5-0.7,1.5-1.5S9.3,8,8.5,8S7,8.7,7,9.5C7,10.3,7.7,11,8.5,11z   M22,6v12c0,1.1-0.9,2-2,2H4c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h16C21.1,4,22,4.9,22,6z M20,8.8V6H4v12h16V8.8z M22,22H2v2h20V22z",imageClass:"M9.5,13.4l-2.9-2.9h3.8L12.2,7l1.4,3.5h3.8l-3,2.9l0.9,3.6L12,15.1L8.8,17L9.5,13.4z M22,6v12c0,1.1-0.9,2-2,2H4  c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h16C21.1,4,22,4.9,22,6z M20,6H4v12h16V8.8V6z",imageDisplay:"M3,5h18v2H3V5z M13,9h8v2h-8V9z M13,13h8v2h-8V13z M3,17h18v2H3V17z M3,9h8v6H3V9z",imageManager:"M20,6h-7l-2-2H4C2.9,4,2,4.9,2,6v12c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V8C22,6.9,21.1,6,20,6z M20,18H4V6h6.2l2,2H20V18z   M18,16l-3.8-5H14l-2.9,3.8L9,12.1L6,16H18z M10,9.5C10,8.7,9.3,8,8.5,8S7,8.7,7,9.5S7.7,11,8.5,11S10,10.3,10,9.5z",imageSize:"M16.9,4c-0.3,0-0.5,0.2-0.8,0.3L3.3,13c-0.9,0.6-1.1,1.9-0.5,2.8l2.2,3.3c0.4,0.7,1.2,1,2,0.8c0.3,0,0.5-0.2,0.8-0.3  L20.7,11c0.9-0.6,1.1-1.9,0.5-2.8l-2.2-3.3C18.5,4.2,17.7,3.9,16.9,4L16.9,4z M16.9,9.9L18.1,9l-2-2.9L17,5.6c0.1,0,0.1-0.1,0.2-0.1  c0.2,0,0.4,0,0.5,0.2L19.9,9c0.2,0.2,0.1,0.5-0.1,0.7L7,18.4c-0.1,0-0.1,0.1-0.2,0.1c-0.2,0-0.4,0-0.5-0.2L4.1,15  c-0.2-0.2-0.1-0.5,0.1-0.7L5,13.7l2,2.9l1.2-0.8l-2-2.9L7.5,12l1.1,1.7l1.2-0.8l-1.1-1.7l1.2-0.8l2,2.9l1.2-0.8l-2-2.9l1.2-0.8  l1.1,1.7l1.2-0.8l-1.1-1.7L14.9,7L16.9,9.9z",indent:"M3,9v6l3-3L3,9z M3,19h18v-2H3V19z M3,7h18V5H3V7z M9,11h12V9H9V11z M9,15h12v-2H9V15z",inlineClass:"M9.9,13.313A1.2,1.2,0,0,1,9.968,13H6.277l1.86-5.2,1.841,5.148A1.291,1.291,0,0,1,11.212,12h.426l-2.5-7h-2l-5,14h2l1.43-4H9.9Zm2.651,6.727a2.884,2.884,0,0,1-.655-2.018v-2.71A1.309,1.309,0,0,1,13.208,14h3.113a3.039,3.039,0,0,1,2,1.092s1.728,1.818,2.964,2.928a1.383,1.383,0,0,1,.318,1.931,1.44,1.44,0,0,1-.19.215l-3.347,3.31a1.309,1.309,0,0,1-1.832.258h0a1.282,1.282,0,0,1-.258-.257l-1.71-1.728Zm2.48-3.96a.773.773,0,1,0,.008,0Z",inlineStyle:"M11.88,15h.7l.7-1.7-3-8.3h-2l-5,14h2l1.4-4Zm-4.4-2,1.9-5.2,1.9,5.2ZM15.4,21.545l3.246,1.949-.909-3.637L20.72,17H16.954l-1.429-3.506L13.837,17H10.071l2.857,2.857-.779,3.637Z",insert:"M13.889,11.611c-0.17,0.17-0.443,0.17-0.612,0l-3.189-3.187l-3.363,3.36c-0.171,0.171-0.441,0.171-0.612,0c-0.172-0.169-0.172-0.443,0-0.611l3.667-3.669c0.17-0.17,0.445-0.172,0.614,0l3.496,3.493C14.058,11.167,14.061,11.443,13.889,11.611 M18.25,10c0,4.558-3.693,8.25-8.25,8.25c-4.557,0-8.25-3.692-8.25-8.25c0-4.557,3.693-8.25,8.25-8.25C14.557,1.75,18.25,5.443,18.25,10 M17.383,10c0-4.07-3.312-7.382-7.383-7.382S2.618,5.93,2.618,10S5.93,17.381,10,17.381S17.383,14.07,17.383,10",insertEmbed:"M20.73889,15.45929a3.4768,3.4768,0,0,0-5.45965-.28662L9.5661,12.50861a3.49811,3.49811,0,0,0-.00873-1.01331l5.72174-2.66809a3.55783,3.55783,0,1,0-.84527-1.81262L8.70966,9.6839a3.50851,3.50851,0,1,0,.0111,4.63727l5.7132,2.66412a3.49763,3.49763,0,1,0,6.30493-1.526ZM18.00745,5.01056A1.49993,1.49993,0,1,1,16.39551,6.3894,1.49994,1.49994,0,0,1,18.00745,5.01056ZM5.99237,13.49536a1.49989,1.49989,0,1,1,1.61194-1.37878A1.49982,1.49982,0,0,1,5.99237,13.49536Zm11.78211,5.494a1.49993,1.49993,0,1,1,1.61193-1.37885A1.49987,1.49987,0,0,1,17.77448,18.98932Z",insertFile:"M7,3C5.9,3,5,3.9,5,5v14c0,1.1,0.9,2,2,2h10c1.1,0,2-0.9,2-2V7.6L14.4,3H7z M17,19H7V5h6v4h4V19z",insertImage:"M14.2,11l3.8,5H6l3-3.9l2.1,2.7L14,11H14.2z M8.5,11c0.8,0,1.5-0.7,1.5-1.5S9.3,8,8.5,8S7,8.7,7,9.5C7,10.3,7.7,11,8.5,11z   M22,6v12c0,1.1-0.9,2-2,2H4c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2h16C21.1,4,22,4.9,22,6z M20,8.8V6H4v12h16V8.8z",insertLink:"M11,17H7A5,5,0,0,1,7,7h4V9H7a3,3,0,0,0,0,6h4ZM17,7H13V9h4a3,3,0,0,1,0,6H13v2h4A5,5,0,0,0,17,7Zm-1,4H8v2h8Z",insertMore:"M16.5,13h-6v6h-2V13h-6V11h6V5h2v6h6Zm5,4.5A1.5,1.5,0,1,1,20,16,1.5,1.5,0,0,1,21.5,17.5Zm0-4A1.5,1.5,0,1,1,20,12,1.5,1.5,0,0,1,21.5,13.5Zm0-4A1.5,1.5,0,1,1,20,8,1.5,1.5,0,0,1,21.5,9.5Z",insertTable:"M20,5H4C2.9,5,2,5.9,2,7v2v1.5v3V15v2c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2v-2v-1.5v-3V9V7C22,5.9,21.1,5,20,5z M9.5,13.5v-3  h5v3H9.5z M14.5,15v2.5h-5V15H14.5z M9.5,9V6.5h5V9H9.5z M3.5,7c0-0.3,0.2-0.5,0.5-0.5h4V9H3.5V7z M3.5,10.5H8v3H3.5V10.5z M3.5,17  v-2H8v2.5H4C3.7,17.5,3.5,17.3,3.5,17z M20.5,17c0,0.3-0.2,0.5-0.5,0.5h-4V15h4.5V17z M20.5,13.5H16v-3h4.5V13.5z M16,9V6.5h4  c0.3,0,0.5,0.2,0.5,0.5v2H16z",insertVideo:"M15,8v8H5V8H15m2,2.5V7a1,1,0,0,0-1-1H4A1,1,0,0,0,3,7V17a1,1,0,0,0,1,1H16a1,1,0,0,0,1-1V13.5l2.29,2.29A1,1,0,0,0,21,15.08V8.91a1,1,0,0,0-1.71-.71Z",upload:"M12 6.66667a4.87654 4.87654 0 0 1 4.77525 3.92342l0.29618 1.50268 1.52794 0.10578a2.57021 2.57021 0 0 1 -0.1827 5.13478H6.5a3.49774 3.49774 0 0 1 -0.3844 -6.97454l1.06682 -0.11341L7.678 9.29387A4.86024 4.86024 0 0 1 12 6.66667m0 -2A6.871 6.871 0 0 0 5.90417 8.37 5.49773 5.49773 0 0 0 6.5 19.33333H18.41667a4.57019 4.57019 0 0 0 0.32083 -9.13A6.86567 6.86567 0 0 0 12 4.66667Zm0.99976 7.2469h1.91406L11.99976 9 9.08618 11.91357h1.91358v3H11V16h2V14h-0.00024Z",uploadFiles:"M12 6.66667a4.87654 4.87654 0 0 1 4.77525 3.92342l0.29618 1.50268 1.52794 0.10578a2.57021 2.57021 0 0 1 -0.1827 5.13478H6.5a3.49774 3.49774 0 0 1 -0.3844 -6.97454l1.06682 -0.11341L7.678 9.29387A4.86024 4.86024 0 0 1 12 6.66667m0 -2A6.871 6.871 0 0 0 5.90417 8.37 5.49773 5.49773 0 0 0 6.5 19.33333H18.41667a4.57019 4.57019 0 0 0 0.32083 -9.13A6.86567 6.86567 0 0 0 12 4.66667Zm0.99976 7.2469h1.91406L11.99976 9 9.08618 11.91357h1.91358v3H11V16h2V14h-0.00024Z",italic:"M11.76,9h2l-2.2,10h-2Zm1.68-4a1,1,0,1,0,1,1,1,1,0,0,0-1-1Z",search:"M15.5 14h-0.79l-0.28 -0.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09 -0.59 4.23 -1.57l0.27 0.28v0.79l5 4.99L20.49 19l-4.99 -5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z",lineHeight:"M6.25,7h2.5L5.25,3.5,1.75,7h2.5V17H1.75l3.5,3.5L8.75,17H6.25Zm4-2V7h12V5Zm0,14h12V17h-12Zm0-6h12V11h-12Z",linkStyles:"M19,17.9l0.9,3.6l-3.2-1.9l-3.3,1.9l0.8-3.6L11.3,15h3.8l1.7-3.5l1.4,3.5H22L19,17.9z M20,12c0,0.3-0.1,0.7-0.2,1h2.1  c0.1-0.3,0.1-0.6,0.1-1c0-2.8-2.2-5-5-5h-4v2h4C18.7,9,20,10.3,20,12z M14.8,11H8v2h3.3h2.5L14.8,11z M9.9,16.4L8.5,15H7  c-1.7,0-3-1.3-3-3s1.3-3,3-3h4V7H7c-2.8,0-5,2.2-5,5s2.2,5,5,5h3.5L9.9,16.4z",mention:"M12.4,5c-4.1,0-7.5,3.4-7.5,7.5S8.3,20,12.4,20h3.8v-1.5h-3.8c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6v1.1  c0,0.6-0.5,1.2-1.1,1.2s-1.1-0.6-1.1-1.2v-1.1c0-2.1-1.7-3.8-3.8-3.8s-3.7,1.7-3.7,3.8s1.7,3.8,3.8,3.8c1,0,2-0.4,2.7-1.1  c0.5,0.7,1.3,1.1,2.2,1.1c1.5,0,2.6-1.2,2.6-2.7v-1.1C19.9,8.4,16.6,5,12.4,5z M12.4,14.7c-1.2,0-2.3-1-2.3-2.2s1-2.3,2.3-2.3  s2.3,1,2.3,2.3S13.6,14.7,12.4,14.7z",minimize:"M5,12h14 M19,11H5v2h14V11z",more:"M13.5,17c0,0.8-0.7,1.5-1.5,1.5s-1.5-0.7-1.5-1.5s0.7-1.5,1.5-1.5S13.5,16.2,13.5,17z M13.5,12c0,0.8-0.7,1.5-1.5,1.5 s-1.5-0.7-1.5-1.5s0.7-1.5,1.5-1.5S13.5,11.2,13.5,12z M13.5,7c0,0.8-0.7,1.5-1.5,1.5S10.5,7.8,10.5,7s0.7-1.5,1.5-1.5 S13.5,6.2,13.5,7z",openLink:"M17,17H7V7h3V5H7C6,5,5,6,5,7v10c0,1,1,2,2,2h10c1,0,2-1,2-2v-3h-2V17z M14,5v2h1.6l-5.8,5.8l1.4,1.4L17,8.4V10h2V5H14z",orderedList:"M2.5,16h2v.5h-1v1h1V18h-2v1h3V15h-3Zm1-7h1V5h-2V6h1Zm-1,2H4.3L2.5,13.1V14h3V13H3.7l1.8-2.1V10h-3Zm5-5V8h14V6Zm0,12h14V16H7.5Zm0-5h14V11H7.5Z",outdent:"M3,12l3,3V9L3,12z M3,19h18v-2H3V19z M3,7h18V5H3V7z M9,11h12V9H9V11z M9,15h12v-2H9V15z",pageBreaker:"M3,9v6l3-3L3,9z M21,9H8V4h2v3h9V4h2V9z M21,20h-2v-3h-9v3H8v-5h13V20z M11,13H8v-2h3V13z M16,13h-3v-2h3V13z M21,13h-3v-2  h3V13z",paragraphFormat:"M10.15,5A4.11,4.11,0,0,0,6.08,8.18,4,4,0,0,0,10,13v6h2V7h2V19h2V7h2V5ZM8,9a2,2,0,0,1,2-2v4A2,2,0,0,1,8,9Z",paragraphMore:"M7.682,5a4.11,4.11,0,0,0-4.07,3.18,4,4,0,0,0,3.11,4.725h0l.027.005a3.766,3.766,0,0,0,.82.09v6h2V7h2V19h2V7h2V5ZM5.532,9a2,2,0,0,1,2-2v4A2,2,0,0,1,5.532,9Zm14.94,8.491a1.5,1.5,0,1,1-1.5-1.5A1.5,1.5,0,0,1,20.472,17.491Zm0-4a1.5,1.5,0,1,1-1.5-1.5A1.5,1.5,0,0,1,20.472,13.491Zm0-4a1.5,1.5,0,1,1-1.5-1.5A1.5,1.5,0,0,1,20.472,9.491Z",paragraphStyle:"M4,9c0-1.1,0.9-2,2-2v4C4.9,11,4,10.1,4,9z M16.7,20.5l3.2,1.9L19,18.8l3-2.9h-3.7l-1.4-3.5L15.3,16h-3.8l2.9,2.9l-0.9,3.6  L16.7,20.5z M10,17.4V19h1.6L10,17.4z M6.1,5c-1.9,0-3.6,1.3-4,3.2c-0.5,2.1,0.8,4.2,2.9,4.7c0,0,0,0,0,0h0.2C5.5,13,5.8,13,6,13v6  h2V7h2v7h2V7h2V5H6.1z",pdfExport:"M7,3C5.9,3,5,3.9,5,5v14c0,1.1,0.9,2,2,2h10c1.1,0,2-0.9,2-2V7.6L14.4,3H7z M17,19H7V5h6v4h4V19z M16.3,13.5  c-0.2-0.6-1.1-0.8-2.6-0.8c-0.1,0-0.1,0-0.2,0c-0.3-0.3-0.8-0.9-1-1.2c-0.2-0.2-0.3-0.3-0.4-0.6c0.2-0.7,0.2-1,0.3-1.5  c0.1-0.9,0-1.6-0.2-1.8c-0.4-0.2-0.7-0.2-0.9-0.2c-0.1,0-0.3,0.2-0.7,0.7c-0.2,0.7-0.1,1.8,0.6,2.8c-0.2,0.8-0.7,1.6-1,2.4  c-0.8,0.2-1.5,0.7-1.9,1.1c-0.7,0.7-0.9,1.1-0.7,1.6c0,0.3,0.2,0.6,0.7,0.6c0.3-0.1,0.3-0.2,0.7-0.3c0.6-0.3,1.2-1.7,1.7-2.4  c0.8-0.2,1.7-0.3,2-0.3c0.1,0,0.3,0,0.6,0c0.8,0.8,1.2,1.1,1.8,1.2c0.1,0,0.2,0,0.3,0c0.3,0,0.8-0.1,1-0.6  C16.4,14.1,16.4,13.9,16.3,13.5z M8.3,15.7c-0.1,0.1-0.2,0.1-0.2,0.1c0-0.1,0-0.3,0.6-0.8c0.2-0.2,0.6-0.3,0.9-0.7  C9,15,8.6,15.5,8.3,15.7z M11.3,9c0-0.1,0.1-0.2,0.1-0.2S11.6,9,11.5,10c0,0.1,0,0.3-0.1,0.7C11.3,10.1,11,9.5,11.3,9z M10.9,13.1  c0.2-0.6,0.6-1,0.7-1.5c0.1,0.1,0.1,0.1,0.2,0.2c0.1,0.2,0.3,0.7,0.7,0.9C12.2,12.8,11.6,13,10.9,13.1z M15.2,14.1  c-0.1,0-0.1,0-0.2,0c-0.2,0-0.7-0.2-1-0.7c1.1,0,1.6,0.2,1.6,0.6C15.5,14.1,15.4,14.1,15.2,14.1z",print:"M16.1,17c0-0.6,0.4-1,1-1c0.6,0,1,0.4,1,1s-0.4,1-1,1C16.5,18,16.1,17.6,16.1,17z M22,15v4c0,1.1-0.9,2-2,2H4  c-1.1,0-2-0.9-2-2v-4c0-1.1,0.9-2,2-2h1V5c0-1.1,0.9-2,2-2h7.4L19,7.6V13h1C21.1,13,22,13.9,22,15z M7,13h10V9h-4V5H7V13z M20,15H4  v4h16V15z",redo:"M13.6,9.4c1.7,0.3,3.2,0.9,4.6,2L21,8.5v7h-7l2.7-2.7C13,10.1,7.9,11,5.3,14.7c-0.2,0.3-0.4,0.5-0.5,0.8L3,14.6  C5.1,10.8,9.3,8.7,13.6,9.4z",removeTable:"M15,10v8H9v-8H15 M14,4H9.9l-1,1H6v2h12V5h-3L14,4z M17,8H7v10c0,1.1,0.9,2,2,2h6c1.1,0,2-0.9,2-2V8z",insertAll:"M 9.25 12 L 6.75 12 C 6.335938 12 6 11.664062 6 11.25 L 6 6 L 3.257812 6 C 2.703125 6 2.425781 5.328125 2.820312 4.933594 L 7.570312 0.179688 C 7.804688 -0.0546875 8.191406 -0.0546875 8.425781 0.179688 L 13.179688 4.933594 C 13.574219 5.328125 13.296875 6 12.742188 6 L 10 6 L 10 11.25 C 10 11.664062 9.664062 12 9.25 12 Z M 16 11.75 L 16 15.25 C 16 15.664062 15.664062 16 15.25 16 L 0.75 16 C 0.335938 16 0 15.664062 0 15.25 L 0 11.75 C 0 11.335938 0.335938 11 0.75 11 L 5 11 L 5 11.25 C 5 12.214844 5.785156 13 6.75 13 L 9.25 13 C 10.214844 13 11 12.214844 11 11.25 L 11 11 L 15.25 11 C 15.664062 11 16 11.335938 16 11.75 Z M 12.125 14.5 C 12.125 14.15625 11.84375 13.875 11.5 13.875 C 11.15625 13.875 10.875 14.15625 10.875 14.5 C 10.875 14.84375 11.15625 15.125 11.5 15.125 C 11.84375 15.125 12.125 14.84375 12.125 14.5 Z M 14.125 14.5 C 14.125 14.15625 13.84375 13.875 13.5 13.875 C 13.15625 13.875 12.875 14.15625 12.875 14.5 C 12.875 14.84375 13.15625 15.125 13.5 15.125 C 13.84375 15.125 14.125 14.84375 14.125 14.5 Z M 14.125 14.5 ",remove:"M15,10v8H9v-8H15 M14,4H9.9l-1,1H6v2h12V5h-3L14,4z M17,8H7v10c0,1.1,0.9,2,2,2h6c1.1,0,2-0.9,2-2V8z",replaceImage:"M16,5v3H4v2h12v3l4-4L16,5z M8,19v-3h12v-2H8v-3l-4,4L8,19z",row:"M20,5H4C2.9,5,2,5.9,2,7v2v1.5v3V15v2c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2v-2v-1.5v-3V9V7C22,5.9,21.1,5,20,5z M16,6.5h4  c0.3,0,0.5,0.2,0.5,0.5v2H16V6.5z M9.5,6.5h5V9h-5V6.5z M3.5,7c0-0.3,0.2-0.5,0.5-0.5h4V9H3.5V7z M8,17.5H4c-0.3,0-0.5-0.2-0.5-0.5  v-2H8V17.5z M14.5,17.5h-5V15h5V17.5z M20.5,17c0,0.3-0.2,0.5-0.5,0.5h-4V15h4.5V17z",selectAll:"M5,7h2V5C5.9,5,5,5.9,5,7z M5,11h2V9H5V11z M9,19h2v-2H9V19z M5,11h2V9H5V11z M15,5h-2v2h2V5z M17,5v2h2C19,5.9,18.1,5,17,5  z M7,19v-2H5C5,18.1,5.9,19,7,19z M5,15h2v-2H5V15z M11,5H9v2h2V5z M13,19h2v-2h-2V19z M17,11h2V9h-2V11z M17,19c1.1,0,2-0.9,2-2h-2  V19z M17,11h2V9h-2V11z M17,15h2v-2h-2V15z M13,19h2v-2h-2V19z M13,7h2V5h-2V7z M9,15h6V9H9V15z M11,11h2v2h-2V11z",smile:"M11.991,3A9,9,0,1,0,21,12,8.99557,8.99557,0,0,0,11.991,3ZM12,19a7,7,0,1,1,7-7A6.99808,6.99808,0,0,1,12,19Zm3.105-5.2h1.503a4.94542,4.94542,0,0,1-9.216,0H8.895a3.57808,3.57808,0,0,0,6.21,0ZM7.5,9.75A1.35,1.35,0,1,1,8.85,11.1,1.35,1.35,0,0,1,7.5,9.75Zm6.3,0a1.35,1.35,0,1,1,1.35,1.35A1.35,1.35,0,0,1,13.8,9.75Z",spellcheck:"M19.1,13.6l-5.6,5.6l-2.7-2.7l-1.4,1.4l4.1,4.1l7-7L19.1,13.6z M10.8,13.7l2.7,2.7l0.8-0.8L10.5,5h-2l-5,14h2l1.4-4h2.6  L10.8,13.7z M9.5,7.8l1.9,5.2H7.6L9.5,7.8z",star:"M12.1,7.7l1,2.5l0.4,0.9h1h2.4l-2.1,2l-0.6,0.6l0.2,0.9l0.6,2.3l-2.2-1.3L12,15.2l-0.8,0.5L9,17l0.5-2.5l0.1-0.8L9,13.1  l-2-2h2.5h0.9l0.4-0.8L12.1,7.7 M12.2,4L9.5,9.6H3.4L8,14.2L6.9,20l5.1-3.1l5.3,3.1l-1.5-5.8l4.8-4.6h-6.1L12.2,4L12.2,4z",strikeThrough:"M3,12.20294H21v1.5H16.63422a3.59782,3.59782,0,0,1,.34942,1.5929,3.252,3.252,0,0,1-1.31427,2.6997A5.55082,5.55082,0,0,1,12.20251,19a6.4421,6.4421,0,0,1-2.62335-.539,4.46335,4.46335,0,0,1-1.89264-1.48816,3.668,3.668,0,0,1-.67016-2.15546V14.704h.28723v-.0011h.34149v.0011H9.02v.11334a2.18275,2.18275,0,0,0,.85413,1.83069,3.69,3.69,0,0,0,2.32836.67926,3.38778,3.38778,0,0,0,2.07666-.5462,1.73346,1.73346,0,0,0,.7013-1.46655,1.69749,1.69749,0,0,0-.647-1.43439,3.00525,3.00525,0,0,0-.27491-.17725H3ZM16.34473,7.05981A4.18163,4.18163,0,0,0,14.6236,5.5462,5.627,5.627,0,0,0,12.11072,5,5.16083,5.16083,0,0,0,8.74719,6.06213,3.36315,3.36315,0,0,0,7.44006,8.76855a3.22923,3.22923,0,0,0,.3216,1.42786h2.59668c-.08338-.05365-.18537-.10577-.25269-.16064a1.60652,1.60652,0,0,1-.65283-1.30036,1.79843,1.79843,0,0,1,.68842-1.5108,3.12971,3.12971,0,0,1,1.96948-.55243,3.04779,3.04779,0,0,1,2.106.6687,2.35066,2.35066,0,0,1,.736,1.83258v.11341h2.00317V9.17346A3.90013,3.90013,0,0,0,16.34473,7.05981Z",subscript:"M10.4,12l3.6,3.6L12.6,17L9,13.4L5.4,17L4,15.6L7.6,12L4,8.4L5.4,7L9,10.6L12.6,7L14,8.4L10.4,12z M18.31234,19.674  l1.06812-1.1465c0.196-0.20141,0.37093-0.40739,0.5368-0.6088c0.15975-0.19418,0.30419-0.40046,0.432-0.617  c0.11969-0.20017,0.21776-0.41249,0.29255-0.6334c0.07103-0.21492,0.10703-0.43986,0.10662-0.66621  c0.00297-0.28137-0.04904-0.56062-0.1531-0.82206c-0.09855-0.24575-0.25264-0.46534-0.45022-0.6416  c-0.20984-0.18355-0.45523-0.32191-0.72089-0.40646c-0.63808-0.19005-1.3198-0.17443-1.94851,0.04465  c-0.28703,0.10845-0.54746,0.2772-0.76372,0.49487c-0.20881,0.20858-0.37069,0.45932-0.47483,0.73548  c-0.10002,0.26648-0.15276,0.54838-0.15585,0.833l-0.00364,0.237H17.617l0.00638-0.22692  c0.00158-0.12667,0.01966-0.25258,0.05377-0.37458c0.03337-0.10708,0.08655-0.20693,0.15679-0.29437  c0.07105-0.08037,0.15959-0.14335,0.25882-0.1841c0.22459-0.08899,0.47371-0.09417,0.7018-0.01458  c0.0822,0.03608,0.15559,0.08957,0.21509,0.15679c0.06076,0.07174,0.10745,0.15429,0.13761,0.24333  c0.03567,0.10824,0.05412,0.22141,0.05469,0.33538c-0.00111,0.08959-0.0118,0.17881-0.0319,0.26612  c-0.02913,0.10428-0.07076,0.20465-0.124,0.29893c-0.07733,0.13621-0.1654,0.26603-0.26338,0.38823  c-0.13438,0.17465-0.27767,0.34226-0.42929,0.50217l-2.15634,2.35315V21H21v-1.326H18.31234z",superscript:"M10.4,12,14,15.6,12.6,17,9,13.4,5.4,17,4,15.6,7.6,12,4,8.4,5.4,7,9,10.6,12.6,7,14,8.4Zm8.91234-3.326,1.06812-1.1465c.196-.20141.37093-.40739.5368-.6088a4.85745,4.85745,0,0,0,.432-.617,3.29,3.29,0,0,0,.29255-.6334,2.11079,2.11079,0,0,0,.10662-.66621,2.16127,2.16127,0,0,0-.1531-.82206,1.7154,1.7154,0,0,0-.45022-.6416,2.03,2.03,0,0,0-.72089-.40646,3.17085,3.17085,0,0,0-1.94851.04465,2.14555,2.14555,0,0,0-.76372.49487,2.07379,2.07379,0,0,0-.47483.73548,2.446,2.446,0,0,0-.15585.833l-.00364.237H18.617L18.62338,5.25a1.45865,1.45865,0,0,1,.05377-.37458.89552.89552,0,0,1,.15679-.29437.70083.70083,0,0,1,.25882-.1841,1.00569,1.00569,0,0,1,.7018-.01458.62014.62014,0,0,1,.21509.15679.74752.74752,0,0,1,.13761.24333,1.08893,1.08893,0,0,1,.05469.33538,1.25556,1.25556,0,0,1-.0319.26612,1.34227,1.34227,0,0,1-.124.29893,2.94367,2.94367,0,0,1-.26338.38823,6.41629,6.41629,0,0,1-.42929.50217L17.19709,8.92642V10H22V8.674Z",symbols:"M15.77493,16.98885a8.21343,8.21343,0,0,0,1.96753-2.57651,7.34824,7.34824,0,0,0,.6034-3.07618A6.09092,6.09092,0,0,0,11.99515,5a6.13347,6.13347,0,0,0-4.585,1.79187,6.417,6.417,0,0,0-1.756,4.69207,6.93955,6.93955,0,0,0,.622,2.97415,8.06587,8.06587,0,0,0,1.949,2.53076H5.41452V19h5.54114v-.04331h-.00147V16.84107a5.82825,5.82825,0,0,1-2.2052-2.2352A6.40513,6.40513,0,0,1,7.97672,11.447,4.68548,4.68548,0,0,1,9.07785,8.19191a3.73232,3.73232,0,0,1,2.9173-1.22462,3.76839,3.76839,0,0,1,2.91241,1.21489,4.482,4.482,0,0,1,1.11572,3.154,6.71141,6.71141,0,0,1-.75384,3.24732,5.83562,5.83562,0,0,1-2.22357,2.25759v2.11562H13.0444V19h5.54108V16.98885Z",tags:"M8.9749 7.47489a1.5 1.5 0 1 1 -1.5 1.5A1.5 1.5 0 0 1 8.9749 7.47489Zm3.78866 -3.12713L16.5362 8.12041l0.33565 0.33564 2.77038 2.77038a2.01988 2.01988 0 0 1 0.59 1.42 1.95518 1.95518 0 0 1 -0.5854 1.40455l0.00044 0.00043 -5.59583 5.59583 -0.00043 -0.00044a1.95518 1.95518 0 0 1 -1.40455 0.5854 1.98762 1.98762 0 0 1 -1.41 -0.58L8.45605 16.87185l-0.33564 -0.33565L4.35777 12.77357a1.99576 1.99576 0 0 1 -0.59 -1.42V9.36358l0 -3.59582a2.00579 2.00579 0 0 1 2 -2l3.59582 0h1.98995A1.98762 1.98762 0 0 1 12.76356 4.34776ZM15.46186 9.866l-0.33564 -0.33564L11.36359 5.76776H5.76776v5.59583L9.866 15.46186l2.7794 2.7794 5.5878 -5.60385 -0.001 -0.001Z",tableHeader:"M20,5H4C2.9,5,2,5.9,2,7v10c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V7C22,5.9,21.1,5,20,5z M8,17.5H4c-0.3,0-0.5-0.2-0.5-0.4  l0,0V17v-2H8V17.5z M8,13.5H3.5v-3H8V13.5z M14.5,17.5h-5V15h5V17.5z M14.5,13.5h-5v-3h5V13.5z M20.5,17c0,0.3-0.2,0.5-0.4,0.5l0,0  H16V15h4.5V17z M20.5,13.5H16v-3h4.5V13.5z M20.5,9h-4.4H16h-1.5h-5H8H7.9H3.5V7c0-0.3,0.2-0.5,0.4-0.5l0,0h4l0,0h8.2l0,0H20  c0.3,0,0.5,0.2,0.5,0.4l0,0V9z",tableFooter:"M20,19H4a2.006,2.006,0,0,1-2-2V7A2.006,2.006,0,0,1,4,5H20a2.006,2.006,0,0,1,2,2V17A2.006,2.006,0,0,1,20,19ZM8,6.5H4a.458.458,0,0,0-.5.4h0V9H8Zm0,4H3.5v3H8Zm6.5-4h-5V9h5Zm0,4h-5v3h5Zm6-3.5a.458.458,0,0,0-.4-.5H16V9h4.5Zm0,3.5H16v3h4.5Zm0,4.5H3.5v2a.458.458,0,0,0,.4.5H20a.458.458,0,0,0,.5-.4h0Z",tableStyle:"M20.0171,19.89752l.9,3.6-3.2-1.9-3.3,1.9.8-3.6-2.9-2.9h3.8l1.7-3.5,1.4,3.5h3.8ZM20,5H4A2.00591,2.00591,0,0,0,2,7V17a2.00591,2.00591,0,0,0,2,2h7.49115l-.58826-.58826L9.99115,17.5H9.5V14.9975h5.36511L16,12.66089V10.5h4.5v3h-.52783l.599,1.4975H22V7A2.00591,2.00591,0,0,0,20,5ZM3.5,7A.4724.4724,0,0,1,4,6.5H8V9H3.5Zm0,3.5H8v3H3.5Zm.5,7a.4724.4724,0,0,1-.5-.5V15H8v2.5Zm10.5-4h-5v-3h5Zm0-4.5h-5V6.5h5Zm6,0H16V6.5h4a.4724.4724,0,0,1,.5.5Z",textColor:"M15.2,13.494s-3.6,3.9-3.6,6.3a3.65,3.65,0,0,0,7.3.1v-.1C18.9,17.394,15.2,13.494,15.2,13.494Zm-1.47-1.357.669-.724L12.1,5h-2l-5,14h2l1.43-4h2.943A24.426,24.426,0,0,1,13.726,12.137ZM11.1,7.8l1.86,5.2H9.244Z",textMore:"M13.55,19h2l-5-14h-2l-5,14h2l1.4-4h5.1Zm-5.9-6,1.9-5.2,1.9,5.2Zm12.8,4.5a1.5,1.5,0,1,1-1.5-1.5A1.5,1.5,0,0,1,20.45,17.5Zm0-4a1.5,1.5,0,1,1-1.5-1.5A1.5,1.5,0,0,1,20.45,13.5Zm0-4A1.5,1.5,0,1,1,18.95,8,1.5,1.5,0,0,1,20.45,9.5Z",underline:"M19,20v2H5V20Zm-3-6.785a4,4,0,0,1-5.74,3.4A3.75,3.75,0,0,1,8,13.085V5.005H6v8.21a6,6,0,0,0,8,5.44,5.851,5.851,0,0,0,4-5.65v-8H16ZM16,5v0h2V5ZM8,5H6v0H8Z",undo:"M10.4,9.4c-1.7,0.3-3.2,0.9-4.6,2L3,8.5v7h7l-2.7-2.7c3.7-2.6,8.8-1.8,11.5,1.9c0.2,0.3,0.4,0.5,0.5,0.8l1.8-0.9  C18.9,10.8,14.7,8.7,10.4,9.4z",unlink:"M14.4,11l1.6,1.6V11H14.4z M17,7h-4v1.9h4c1.7,0,3.1,1.4,3.1,3.1c0,1.3-0.8,2.4-1.9,2.8l1.4,1.4C21,15.4,22,13.8,22,12  C22,9.2,19.8,7,17,7z M2,4.3l3.1,3.1C3.3,8.1,2,9.9,2,12c0,2.8,2.2,5,5,5h4v-1.9H7c-1.7,0-3.1-1.4-3.1-3.1c0-1.6,1.2-2.9,2.8-3.1  L8.7,11H8v2h2.7l2.3,2.3V17h1.7l4,4l1.4-1.4L3.4,2.9L2,4.3z",unorderedList:"M4,10.5c-0.8,0-1.5,0.7-1.5,1.5s0.7,1.5,1.5,1.5s1.5-0.7,1.5-1.5S4.8,10.5,4,10.5z M4,5.5C3.2,5.5,2.5,6.2,2.5,7  S3.2,8.5,4,8.5S5.5,7.8,5.5,7S4.8,5.5,4,5.5z M4,15.5c-0.8,0-1.5,0.7-1.5,1.5s0.7,1.5,1.5,1.5s1.5-0.7,1.5-1.5S4.8,15.5,4,15.5z   M7.5,6v2h14V6H7.5z M7.5,18h14v-2h-14V18z M7.5,13h14v-2h-14V13z",verticalAlignBottom:"M16,13h-3V3h-2v10H8l4,4L16,13z M3,19v2h18v-2H3z",verticalAlignMiddle:"M3,11v2h18v-2H3z M8,18h3v3h2v-3h3l-4-4L8,18z M16,6h-3V3h-2v3H8l4,4L16,6z",verticalAlignTop:"M8,11h3v10h2V11h3l-4-4L8,11z M21,5V3H3v2H21z",trackChanges:"M17.2 20H12.4599L13.9938 19.2076L14.0305 19.1886L14.0616 19.1612C14.1036 19.1242 14.1373 19.0786 14.1603 19.0275C14.1806 18.9825 14.1923 18.9342 14.1948 18.885H14.2H14.3384L14.4364 18.7874L14.7049 18.52H15.45C15.5747 18.52 15.6942 18.4705 15.7823 18.3823C15.8705 18.2942 15.92 18.1746 15.92 18.05C15.92 17.9253 15.8705 17.8058 15.7823 17.7176C15.7351 17.6704 15.6789 17.6343 15.6177 17.6109L17.33 15.9056V19.87C17.33 19.8871 17.3266 19.904 17.3201 19.9197C17.3136 19.9355 17.304 19.9499 17.2919 19.9619C17.2799 19.974 17.2655 19.9836 17.2497 19.9901C17.234 19.9966 17.2171 20 17.2 20ZM4.13 20H11.2508C11.2396 19.9629 11.2337 19.9242 11.2337 19.885C11.2337 19.8133 11.2533 19.7431 11.29 19.6819L11.2739 19.6734L11.8838 18.52H5C4.87535 18.52 4.7558 18.4705 4.66766 18.3823C4.57952 18.2942 4.53 18.1746 4.53 18.05C4.53 17.9253 4.57952 17.8058 4.66766 17.7176C4.7558 17.6295 4.87535 17.58 5 17.58H12.3809L12.3925 17.5582L12.4187 17.5284C12.4558 17.4864 12.5014 17.4527 12.5525 17.4297C12.5836 17.4156 12.6163 17.4057 12.6498 17.4001C12.6522 17.3065 12.6877 17.2166 12.7503 17.1467L13 17.37C12.9902 17.381 12.9847 17.3952 12.9847 17.41C12.9847 17.4247 12.9902 17.439 13 17.45L14.13 18.55H14.2L19.09 13.68V13.6L17.99 12.5C17.979 12.4902 17.9647 12.4847 17.95 12.4847C17.9352 12.4847 17.921 12.4902 17.91 12.5L13 17.37L12.7641 17.1322L15.1759 14.74H5C4.87535 14.74 4.7558 14.6905 4.66766 14.6023C4.57952 14.5142 4.53 14.3946 4.53 14.27C4.53 14.1453 4.57952 14.0258 4.66766 13.9376C4.7558 13.8495 4.87535 13.8 5 13.8H15.45C15.5747 13.8 15.6942 13.8495 15.7823 13.9376C15.8169 13.9722 15.8454 14.0115 15.8675 14.0541L17.33 12.6034V9.3H13.28C13.207 9.30976 13.133 9.30976 13.06 9.3C12.7697 9.22119 12.5113 9.05343 12.3212 8.82027C12.1311 8.58711 12.0187 8.30026 12 8V4H4.13C4.09552 4 4.06246 4.0137 4.03808 4.03808C4.0137 4.06246 4 4.09552 4 4.13V19.87C4 19.9045 4.0137 19.9375 4.03808 19.9619C4.06246 19.9863 4.09552 20 4.13 20ZM11.7889 20H11.8785C11.8902 19.9746 11.898 19.9475 11.9015 19.9197L11.8661 19.9866L11.8117 19.9578L13.84 18.91C13.8464 18.9044 13.8515 18.8974 13.855 18.8897C13.8585 18.8819 13.8603 18.8735 13.8603 18.865C13.8603 18.8565 13.8585 18.8481 13.855 18.8403C13.8515 18.8325 13.8464 18.8256 13.84 18.82L12.76 17.75C12.7544 17.7436 12.7474 17.7385 12.7397 17.735C12.7319 17.7315 12.7235 17.7297 12.715 17.7297C12.7065 17.7297 12.6981 17.7315 12.6903 17.735C12.6825 17.7385 12.6756 17.7436 12.67 17.75L11.57 19.83L11.5023 19.7942L11.58 19.85C11.5727 19.8602 11.5687 19.8724 11.5687 19.885C11.5687 19.8975 11.5727 19.9098 11.58 19.92L11.67 20H11.73L11.7642 19.9823L11.7889 20ZM13.1 4.65L16.6 8.15C16.6212 8.17232 16.6355 8.20028 16.6412 8.23051C16.6469 8.26075 16.6437 8.29199 16.6321 8.32048C16.6205 8.34898 16.6009 8.37352 16.5757 8.39117C16.5505 8.40882 16.5207 8.41883 16.49 8.42H13.06L12.83 8.19V4.76C12.8312 4.72925 12.8412 4.6995 12.8588 4.67429C12.8765 4.64909 12.901 4.62951 12.9295 4.6179C12.958 4.6063 12.9893 4.60315 13.0195 4.60884C13.0497 4.61453 13.0777 4.62882 13.1 4.65ZM11 6.72C11.0027 6.66089 10.9937 6.60183 10.9735 6.54621C10.9534 6.49058 10.9224 6.43948 10.8825 6.39582C10.8425 6.35216 10.7944 6.31681 10.7408 6.29179C10.6871 6.26677 10.6291 6.25257 10.57 6.25H5C4.88239 6.25773 4.77251 6.3113 4.69397 6.39918C4.61543 6.48707 4.57451 6.60226 4.58 6.72C4.57451 6.83774 4.61543 6.95293 4.69397 7.04082C4.77251 7.12871 4.88239 7.18227 5 7.19H10.6C10.714 7.1774 10.8189 7.12173 10.8933 7.03438C10.9676 6.94702 11.0058 6.83457 11 6.72ZM11.1 8.14001H5C4.87535 8.14001 4.7558 8.18953 4.66766 8.27767C4.57952 8.36582 4.53 8.48536 4.53 8.61001C4.53 8.73467 4.57952 8.85421 4.66766 8.94236C4.7558 9.0305 4.87535 9.08001 5 9.08001H11.1C11.2247 9.08001 11.3442 9.0305 11.4323 8.94236C11.5205 8.85421 11.57 8.73467 11.57 8.61001C11.57 8.48536 11.5205 8.36582 11.4323 8.27767C11.3442 8.18953 11.2247 8.14001 11.1 8.14001ZM5 11H15.45C15.5826 11 15.7098 10.9473 15.8036 10.8536C15.8973 10.7598 15.95 10.6326 15.95 10.5C15.95 10.3674 15.8973 10.2402 15.8036 10.1464C15.7098 10.0527 15.5826 10 15.45 10H5C4.86739 10 4.74021 10.0527 4.64645 10.1464C4.55268 10.2402 4.5 10.3674 4.5 10.5C4.5 10.6326 4.55268 10.7598 4.64645 10.8536C4.74021 10.9473 4.86739 11 5 11ZM5 12.86H11.1C11.2211 12.8523 11.3346 12.798 11.4166 12.7085C11.4986 12.6191 11.5428 12.5013 11.54 12.38C11.5427 12.2597 11.4982 12.1431 11.4159 12.0552C11.3337 11.9673 11.2202 11.9152 11.1 11.91H5C4.94089 11.9126 4.88286 11.9268 4.82924 11.9518C4.77562 11.9768 4.72746 12.0122 4.68752 12.0558C4.64758 12.0995 4.61664 12.1506 4.59648 12.2062C4.57631 12.2618 4.56731 12.3209 4.57 12.38C4.56451 12.5004 4.60649 12.6181 4.6869 12.7079C4.76731 12.7976 4.87974 12.8523 5 12.86ZM11.1 16.63H5C4.87535 16.63 4.7558 16.5805 4.66766 16.4923C4.57952 16.4042 4.53 16.2846 4.53 16.16C4.53 16.0353 4.57952 15.9158 4.66766 15.8276C4.7558 15.7395 4.87535 15.69 5 15.69H11.1C11.2247 15.69 11.3442 15.7395 11.4323 15.8276C11.5205 15.9158 11.57 16.0353 11.57 16.16C11.57 16.2846 11.5205 16.4042 11.4323 16.4923C11.3442 16.5805 11.2247 16.63 11.1 16.63ZM18.8503 11.592C18.7991 11.6175 18.7545 11.6544 18.72 11.7L18.26 12.14C18.2501 12.151 18.2447 12.1652 18.2447 12.18C18.2447 12.1947 18.2501 12.209 18.26 12.22L19.37 13.32C19.381 13.3298 19.3952 13.3353 19.41 13.3353C19.4247 13.3353 19.439 13.3298 19.45 13.32L19.86 12.91C19.9057 12.867 19.9421 12.8151 19.967 12.7575C19.9919 12.6998 20.0047 12.6377 20.0047 12.575C20.0047 12.5122 19.9919 12.4501 19.967 12.3925C19.9421 12.3349 19.9057 12.283 19.86 12.24L19.31 11.7C19.2755 11.6544 19.2309 11.6175 19.1797 11.592C19.1285 11.5666 19.0721 11.5533 19.015 11.5533C18.9578 11.5533 18.9014 11.5666 18.8503 11.592Z",showTrackChanges:"M17.2421 13.6048C17.2631 13.6136 17.2841 13.6226 17.305 13.6317V9.29505H13.2626C13.1897 9.30481 13.1159 9.30481 13.043 9.29505C12.7532 9.21632 12.4953 9.04872 12.3056 8.81577C12.1158 8.58283 12.0037 8.29625 11.985 7.99627V4H4.12976C4.09534 4 4.06234 4.01368 4.038 4.03804C4.01367 4.0624 4 4.09543 4 4.12988V19.8552C4 19.8896 4.01367 19.9227 4.038 19.947C4.06234 19.9714 4.09534 19.9851 4.12976 19.9851H13.4875C13.0501 19.8216 12.6281 19.6155 12.2277 19.3686C11.8529 19.1551 11.4911 18.9196 11.1442 18.6632C11.0697 18.6152 10.9982 18.5628 10.9302 18.5065H4.99812C4.87371 18.5065 4.75438 18.457 4.66641 18.3689C4.57843 18.2809 4.529 18.1614 4.529 18.0369C4.529 17.9124 4.57843 17.7929 4.66641 17.7049C4.75438 17.6168 4.87371 17.5673 4.99812 17.5673H10.4396C10.4472 17.4488 10.4756 17.3324 10.5235 17.2235C10.5939 17.017 10.6761 16.8149 10.7694 16.6182H4.99812C4.87371 16.6182 4.75438 16.5687 4.66641 16.4807C4.57843 16.3926 4.529 16.2732 4.529 16.1487C4.529 16.0241 4.57843 15.9047 4.66641 15.8166C4.75438 15.7286 4.87371 15.6791 4.99812 15.6791H11.0867C11.1576 15.6791 11.2268 15.6952 11.2895 15.7253C11.5204 15.361 11.7938 15.027 12.1033 14.73H4.99812C4.87371 14.73 4.75438 14.6805 4.66641 14.5924C4.57843 14.5044 4.529 14.385 4.529 14.2604C4.529 14.1359 4.57843 14.0164 4.66641 13.9284C4.75438 13.8403 4.87371 13.7909 4.99812 13.7909H13.4434C13.9833 13.525 14.5656 13.3516 15.166 13.2795L15.1923 13.2763H15.2189H15.4925C16.0923 13.2609 16.6886 13.3728 17.2421 13.6048ZM13.0829 4.64939L16.5764 8.14613C16.5975 8.16843 16.6118 8.19636 16.6174 8.22657C16.6231 8.25677 16.62 8.28798 16.6084 8.31645C16.5968 8.34492 16.5773 8.36944 16.5521 8.38707C16.527 8.40471 16.4973 8.41471 16.4666 8.41587H13.043L12.8134 8.18609V4.75929C12.8146 4.72857 12.8246 4.69884 12.8422 4.67366C12.8598 4.64849 12.8843 4.62893 12.9128 4.61733C12.9412 4.60573 12.9724 4.60259 13.0026 4.60827C13.0328 4.61396 13.0607 4.62824 13.0829 4.64939ZM10.9869 6.71746C10.9896 6.65841 10.9806 6.59941 10.9604 6.54383C10.9403 6.48825 10.9094 6.4372 10.8696 6.39358C10.8297 6.34997 10.7816 6.31465 10.7281 6.28965C10.6746 6.26466 10.6167 6.25047 10.5577 6.2479H4.99813C4.88074 6.25562 4.77106 6.30914 4.69267 6.39694C4.61428 6.48475 4.57343 6.59983 4.57891 6.71746C4.57343 6.83509 4.61428 6.95017 4.69267 7.03798C4.77106 7.12579 4.88074 7.1793 4.99813 7.18702H10.5876C10.7014 7.17444 10.8061 7.11882 10.8803 7.03154C10.9545 6.94427 10.9927 6.83192 10.9869 6.71746ZM11.0867 8.13614H4.99812C4.87371 8.13614 4.75438 8.18561 4.66641 8.27367C4.57843 8.36173 4.529 8.48116 4.529 8.6057C4.529 8.73023 4.57843 8.84967 4.66641 8.93773C4.75438 9.02579 4.87371 9.07526 4.99812 9.07526H11.0867C11.2111 9.07526 11.3304 9.02579 11.4184 8.93773C11.5064 8.84967 11.5558 8.73023 11.5558 8.6057C11.5558 8.48116 11.5064 8.36173 11.4184 8.27367C11.3304 8.18561 11.2111 8.13614 11.0867 8.13614ZM4.99812 10.9935H15.4285C15.5609 10.9935 15.6878 10.9408 15.7814 10.8472C15.875 10.7535 15.9276 10.6264 15.9276 10.4939C15.9276 10.3614 15.875 10.2344 15.7814 10.1407C15.6878 10.047 15.5609 9.9944 15.4285 9.9944H4.99812C4.86576 9.9944 4.73883 10.047 4.64523 10.1407C4.55164 10.2344 4.49906 10.3614 4.49906 10.4939C4.49906 10.6264 4.55164 10.7535 4.64523 10.8472C4.73883 10.9408 4.86576 10.9935 4.99812 10.9935ZM4.99812 12.8517H11.0867C11.2076 12.844 11.3208 12.7898 11.4027 12.7004C11.4845 12.611 11.5287 12.4934 11.5259 12.3722C11.5286 12.252 11.4841 12.1355 11.402 12.0477C11.3199 11.9599 11.2067 11.9078 11.0867 11.9026H4.99812C4.93912 11.9052 4.8812 11.9194 4.82769 11.9444C4.77417 11.9694 4.7261 12.0047 4.68623 12.0483C4.64637 12.0919 4.61549 12.143 4.59536 12.1985C4.57523 12.2541 4.56625 12.3131 4.56893 12.3722C4.56345 12.4925 4.60535 12.6101 4.68561 12.6998C4.76587 12.7894 4.87809 12.844 4.99812 12.8517ZM19.97 17.4974C19.5787 16.5636 19.0431 15.6971 18.383 14.9298C18.0152 14.5351 17.5679 14.2233 17.0706 14.0148C16.5732 13.8064 16.0373 13.7062 15.4984 13.7209H15.2189C14.4787 13.8098 13.7684 14.0666 13.1423 14.4717C12.5162 14.8769 11.9906 15.4196 11.6057 16.0587C11.3211 16.4677 11.0959 16.9151 10.937 17.3875C10.9006 17.464 10.8817 17.5476 10.8817 17.6323C10.8817 17.717 10.9006 17.8006 10.937 17.877C11.0642 18.0428 11.2196 18.1849 11.3961 18.2967C11.7346 18.5476 12.0879 18.7778 12.4541 18.986C13.4096 19.5767 14.497 19.92 15.6182 19.9851C16.4392 20.0504 17.2632 19.9005 18.0088 19.5501C18.7544 19.1998 19.3959 18.661 19.8702 17.9869C19.9311 17.923 19.9729 17.8432 19.9905 17.7566C20.0082 17.67 20.0011 17.5801 19.97 17.4974ZM15.9775 19.1758C14.3849 19.068 12.8507 18.5331 11.5358 17.6273C11.5788 17.5678 11.6255 17.5111 11.6756 17.4574C12.3061 16.569 13.1295 15.8359 14.0832 15.3126C13.8003 15.7406 13.6785 16.2566 13.7417 16.7681C13.7676 17.0339 13.8465 17.2918 13.9737 17.5265C14.1009 17.7613 14.2739 17.9681 14.4823 18.1348C14.6907 18.3016 14.9304 18.4248 15.1872 18.4972C15.4441 18.5696 15.7128 18.5897 15.9775 18.5564C16.305 18.4971 16.6137 18.3609 16.8785 18.159C17.1432 17.9572 17.3564 17.6954 17.5005 17.3951C17.6446 17.0949 17.7156 16.7647 17.7077 16.4317C17.6997 16.0987 17.613 15.7723 17.4547 15.4793C17.2614 15.3391 17.0533 15.2235 16.8351 15.1339C17.0715 15.226 17.2966 15.3485 17.5046 15.4993C18.0049 15.8976 18.4424 16.3691 18.8022 16.898L18.8927 17.0137L18.8927 17.0137C19.0823 17.2564 19.2729 17.5004 19.4709 17.7072C18.5404 18.6311 17.288 19.1576 15.9775 19.1758ZM16.3168 15.769C16.2085 15.8106 16.1171 15.8873 16.0574 15.9869C15.9977 16.0865 15.9731 16.2032 15.9875 16.3185C15.9949 16.3856 16.0156 16.4505 16.0483 16.5096C16.081 16.5686 16.1251 16.6206 16.178 16.6624C16.2309 16.7042 16.2916 16.7351 16.3566 16.7532C16.4216 16.7714 16.4895 16.7764 16.5564 16.7681H16.6063C16.5618 16.9495 16.4637 17.1132 16.3248 17.238C16.186 17.3627 16.0127 17.4427 15.8278 17.4674H15.6481C15.4335 17.4396 15.2337 17.3427 15.0789 17.1913C14.924 17.04 14.8226 16.8423 14.7897 16.6282C14.7628 16.3782 14.8311 16.1271 14.981 15.9253C15.1305 15.7238 15.3504 15.5861 15.5968 15.5395C15.3446 15.5862 15.12 15.7284 14.9697 15.9364C14.8191 16.1448 14.7547 16.4034 14.7897 16.6582C14.8226 16.8723 14.924 17.0699 15.0789 17.2213C15.2337 17.3727 15.4335 17.4696 15.6481 17.4974H15.8377C16.0209 17.4708 16.1919 17.39 16.3289 17.2654C16.4658 17.1408 16.5625 16.978 16.6063 16.7981C16.7293 16.7633 16.8359 16.686 16.9072 16.5799C16.9785 16.4737 17.0098 16.3457 16.9956 16.2186C16.9882 16.1515 16.9675 16.0865 16.9348 16.0275C16.9021 15.9685 16.858 15.9165 16.805 15.8747C16.7521 15.8329 16.6914 15.802 16.6264 15.7838C16.5615 15.7657 16.4936 15.7607 16.4266 15.769H16.3168Z",acceptAllChanges:"M9.36499 16.7348C9.38499 16.7547 9.41212 16.7659 9.44041 16.7659H10.9881C10.9028 16.6008 10.9289 16.3933 11.0663 16.2541L11.7266 15.585H10.1444C10.0549 15.5701 9.97363 15.5238 9.91498 15.4547C9.85639 15.3856 9.82422 15.298 9.82422 15.2074C9.82422 15.1169 9.85639 15.0292 9.91498 14.9601C9.97363 14.891 10.0549 14.8448 10.1444 14.8298H12.4879C12.5584 14.785 12.6407 14.7607 12.7257 14.7607C12.8106 14.7607 12.893 14.785 12.9635 14.8298H16.5295L18.3303 13.0091C18.4135 12.925 18.5271 12.8776 18.6456 12.8777C18.7642 12.8777 18.8777 12.9252 18.9609 13.0094L20 14.0621V8.25532H16.8001C16.7301 8.27288 16.6568 8.27288 16.5868 8.25532C16.3485 8.1935 16.1367 8.0565 15.9829 7.86478C15.8292 7.67306 15.7416 7.43688 15.7335 7.19149V4H9.44041C9.41293 4.0024 9.38718 4.01437 9.36767 4.03383C9.34816 4.05329 9.33615 4.07897 9.33375 4.10638V16.6596C9.33375 16.6878 9.34499 16.7148 9.36499 16.7348ZM10.0744 17.2979H11.4803L12.259 18.0957H5.06727C5.01734 18.0957 4.96838 18.1057 4.9232 18.1246C4.8788 18.1431 4.83798 18.1702 4.80335 18.2048C4.7333 18.2746 4.69398 18.3693 4.69398 18.468C4.69398 18.5668 4.7333 18.6615 4.80335 18.7313C4.87333 18.8011 4.96832 18.8404 5.06727 18.8404H12.9857L13.7947 19.6693L14.0836 19.9574H4.10733C4.09291 19.9591 4.07829 19.9576 4.06457 19.9528C4.05085 19.9481 4.03838 19.9403 4.02812 19.9301C4.01785 19.9198 4.01004 19.9074 4.00529 19.8937C4.00054 19.88 3.99896 19.8654 4.00067 19.8511V7.29787C4.00067 7.26966 4.01191 7.2426 4.03191 7.22265C4.05192 7.2027 4.07905 7.19149 4.10733 7.19149H8.70447V9.05319H5.06727C4.97294 9.05867 4.88453 9.10069 4.8208 9.17019C4.757 9.23973 4.72302 9.33135 4.72594 9.42553C4.72289 9.52082 4.75654 9.61364 4.82002 9.6849C4.88356 9.75613 4.97203 9.80038 5.06727 9.8085H8.70447V10.5638H5.06727C5.01968 10.5652 4.97274 10.5759 4.92932 10.5954C4.88583 10.6148 4.84664 10.6426 4.8139 10.6772C4.78122 10.7118 4.7557 10.7525 4.73877 10.7969C4.72184 10.8413 4.7139 10.8887 4.71527 10.9361C4.7139 10.9837 4.72184 11.031 4.73877 11.0754C4.74424 11.0897 4.75055 11.1037 4.75778 11.1171C4.76162 11.1243 4.76566 11.1313 4.76995 11.1382C4.78265 11.1585 4.79736 11.1776 4.8139 11.1951C4.84664 11.2297 4.88583 11.2575 4.92932 11.2769C4.95491 11.2884 4.98173 11.2968 5.0092 11.3021C5.02834 11.3058 5.04774 11.3079 5.06727 11.3085H8.70447V12.0638H5.06734C4.97782 12.0789 4.89651 12.1251 4.83792 12.1942C4.77926 12.2633 4.7471 12.351 4.7471 12.4415C4.7471 12.5321 4.77926 12.6197 4.83792 12.6888C4.89651 12.758 4.97782 12.8041 5.06734 12.8192H8.70447V13.5745H5.06734C4.97782 13.5895 4.89651 13.6357 4.83792 13.7048C4.81383 13.7332 4.79424 13.7647 4.77946 13.7983C4.7583 13.8465 4.7471 13.8988 4.7471 13.9522C4.7471 14.0427 4.77926 14.1303 4.83792 14.1994C4.89651 14.2686 4.97782 14.3147 5.06734 14.3298H8.70447V15.0744H5.06727C4.97776 15.0895 4.89651 15.1357 4.83785 15.2048C4.77926 15.2739 4.7471 15.3616 4.7471 15.4521C4.7471 15.5043 4.75778 15.5556 4.77809 15.6029C4.793 15.6376 4.81305 15.6701 4.83785 15.6994C4.89651 15.7685 4.97776 15.8147 5.06727 15.8298H8.70447V16.5851H5.06727C4.97776 16.6001 4.89651 16.6463 4.83785 16.7154C4.79489 16.7661 4.76618 16.8267 4.75387 16.8912C4.74938 16.9146 4.7471 16.9386 4.7471 16.9628C4.7471 17.0533 4.77926 17.1409 4.83785 17.21C4.89651 17.2792 4.97776 17.3253 5.06727 17.3404H9.95241C9.99552 17.3331 10.0367 17.3187 10.0744 17.2979ZM20 15.3204L18.5709 16.7659H19.8933C19.9216 16.7659 19.9487 16.7547 19.9687 16.7348C19.9887 16.7148 20 16.6878 20 16.6596V15.3204ZM14.7526 16.6264L13.7248 15.585H15.7825L14.7526 16.6264ZM14.9498 6.08721C14.9465 6.06854 14.9416 6.05023 14.9353 6.03244C14.9202 5.98939 14.897 5.94929 14.8665 5.91442C14.8145 5.85488 14.7444 5.81394 14.6669 5.79787H10.1337C10.0348 5.79787 9.93978 5.83709 9.8698 5.90693C9.79975 5.97676 9.76043 6.07146 9.76043 6.17022C9.76043 6.19463 9.76283 6.21879 9.76752 6.24239C9.77462 6.2782 9.78692 6.31268 9.80398 6.34479C9.82123 6.37716 9.8433 6.40709 9.8698 6.43348C9.93978 6.50332 10.0348 6.54257 10.1337 6.54257H14.6669C14.6811 6.54023 14.6951 6.53702 14.7088 6.53299C14.7206 6.52955 14.7322 6.52549 14.7436 6.52082C14.7624 6.51309 14.7806 6.50371 14.7979 6.4928C14.8378 6.46764 14.8722 6.43468 14.8991 6.39599C14.9259 6.35729 14.9447 6.31359 14.9543 6.26749C14.9554 6.26232 14.9563 6.25716 14.9571 6.25197C14.9579 6.24739 14.9586 6.24281 14.9591 6.23824C14.9612 6.22129 14.962 6.20424 14.9616 6.18723C14.961 6.16727 14.9588 6.14733 14.9549 6.12766C14.9539 6.11406 14.9523 6.10055 14.9498 6.08721ZM15.0189 7.29788H10.1445C10.0549 7.31291 9.97363 7.35911 9.91504 7.42823C9.85639 7.49738 9.82422 7.585 9.82422 7.67555C9.82422 7.76609 9.85639 7.85369 9.91504 7.92284C9.97363 7.99196 10.0549 8.03815 10.1445 8.05319H15.0189C15.0321 8.05241 15.0451 8.05095 15.058 8.04877C15.0745 8.04601 15.0906 8.04212 15.1064 8.03718C15.1669 8.01822 15.2219 7.98361 15.2654 7.93618C15.3291 7.86664 15.3632 7.77502 15.3602 7.68084C15.3606 7.67392 15.3608 7.66701 15.3608 7.66009C15.3609 7.65087 15.3606 7.64165 15.3599 7.63247C15.3592 7.62263 15.358 7.61279 15.3565 7.60302C15.3532 7.58188 15.3479 7.56104 15.3409 7.54072C15.3254 7.49575 15.301 7.45426 15.2693 7.41868C15.2492 7.39621 15.2265 7.37638 15.2017 7.35959C15.1872 7.34979 15.172 7.34102 15.1562 7.33339C15.1132 7.31265 15.0665 7.3006 15.0189 7.29788ZM10.1445 9.56381H18.496C18.5856 9.54877 18.6669 9.50258 18.7255 9.43346C18.7841 9.3643 18.8163 9.27671 18.8163 9.18617C18.8163 9.09562 18.7841 9.008 18.7255 8.93884C18.6669 8.86973 18.5856 8.82353 18.496 8.8085H10.1445C10.0549 8.82353 9.97363 8.86973 9.91504 8.93884C9.85639 9.008 9.82422 9.09562 9.82422 9.18617C9.82422 9.24412 9.83738 9.30087 9.86224 9.35236C9.87624 9.38132 9.89395 9.40859 9.91504 9.43346C9.97363 9.50258 10.0549 9.54877 10.1445 9.56381ZM10.1445 11.0638H15.0189C15.1084 11.0488 15.1897 11.0026 15.2483 10.9335C15.2854 10.8898 15.3118 10.8387 15.3263 10.7842C15.3347 10.7525 15.3391 10.7195 15.3391 10.6861C15.3391 10.5956 15.3069 10.508 15.2483 10.4389C15.1897 10.3697 15.1084 10.3235 15.0189 10.3085H10.1445C10.0549 10.3235 9.97363 10.3697 9.91504 10.4389C9.85639 10.508 9.82422 10.5956 9.82422 10.6861C9.82422 10.7424 9.83666 10.7976 9.8601 10.8478C9.87442 10.8785 9.89284 10.9073 9.91504 10.9335C9.97363 11.0026 10.0549 11.0488 10.1445 11.0638ZM18.496 12.5745H10.1444C10.0549 12.5594 9.97363 12.5132 9.91498 12.4441C9.85639 12.3749 9.82422 12.2873 9.82422 12.1968C9.82422 12.1062 9.85639 12.0186 9.91498 11.9495C9.97363 11.8803 10.0549 11.8342 10.1444 11.8191H18.496C18.5856 11.8342 18.6669 11.8803 18.7255 11.9495C18.7841 12.0186 18.8163 12.1062 18.8163 12.1968C18.8163 12.2873 18.7841 12.3749 18.7255 12.4441C18.6971 12.4776 18.6633 12.5058 18.6259 12.5276C18.5861 12.5507 18.5421 12.5667 18.496 12.5745ZM15.0189 14.0744H10.1444C10.0968 14.0731 10.0499 14.0624 10.0064 14.0429C9.96296 14.0234 9.92376 13.9956 9.89102 13.961C9.85834 13.9265 9.83282 13.8857 9.81589 13.8413C9.79897 13.7969 9.79102 13.7496 9.79239 13.7021C9.79102 13.6546 9.79897 13.6073 9.81589 13.5628C9.83282 13.5184 9.85834 13.4778 9.89102 13.4432C9.92376 13.4086 9.96296 13.3808 10.0064 13.3613C10.0499 13.3419 10.0968 13.3311 10.1444 13.3297H15.0189C15.0661 13.3311 15.1125 13.3419 15.1554 13.3615C15.1983 13.381 15.2368 13.4091 15.2686 13.4438C15.3005 13.4785 15.325 13.5193 15.3407 13.5637C15.3564 13.608 15.363 13.6551 15.3602 13.7021C15.3631 13.7963 15.3291 13.8879 15.2653 13.9574C15.2016 14.027 15.1132 14.0689 15.0189 14.0744ZM16.6188 4.52128L19.4133 7.30852C19.4293 7.32624 19.4401 7.34808 19.4443 7.37157C19.4485 7.39506 19.446 7.41925 19.4371 7.4414C19.4282 7.46356 19.4133 7.48278 19.394 7.4969C19.3747 7.51102 19.3518 7.51947 19.328 7.52128H16.5868L16.4054 7.34043V4.60639C16.4073 4.5826 16.4157 4.55979 16.4299 4.54056C16.444 4.52133 16.4633 4.50644 16.4855 4.49757C16.5077 4.48871 16.532 4.48624 16.5556 4.49043C16.5791 4.49462 16.601 4.50531 16.6188 4.52128ZM18.6454 13.3192L20 14.6915L14.7522 20L14.7416 19.9894L14.1123 19.3617L13.3976 18.6277L11.3817 16.5638L12.7257 15.2021L14.7522 17.2553L18.6454 13.3192Z",rejectAllChanges:"M9.54637 16.5847H8.96997V15.8295H12.786C12.8024 15.8265 12.8186 15.8223 12.8343 15.817C12.8535 15.8105 12.8719 15.8023 12.8897 15.7926C12.9315 15.7697 12.969 15.738 12.9997 15.6991C13.0268 15.6649 13.0478 15.6261 13.0621 15.5847H13.571V16.7656H9.79386C9.78396 16.7479 9.77269 16.731 9.76011 16.7151C9.70552 16.6459 9.62976 16.5998 9.54637 16.5847ZM13.4717 12.9573V13.3295H9.72523C9.6809 13.3309 9.63716 13.3416 9.59671 13.361C9.57578 13.3711 9.55595 13.3834 9.53745 13.3977C9.5201 13.411 9.50391 13.4262 9.48917 13.4429C9.45872 13.4775 9.43494 13.5182 9.41917 13.5626C9.41778 13.5664 9.41644 13.5703 9.41523 13.5742H8.96997V12.8189H12.786C12.8694 12.8039 12.9452 12.7577 12.9997 12.6886C13.0078 12.6784 13.0153 12.6677 13.0223 12.6568L13.029 12.6458L13.033 12.6389L13.0397 12.6266C13.0452 12.6157 13.0503 12.6046 13.055 12.5931C13.0576 12.5869 13.0599 12.5806 13.0621 12.5742H13.6872C13.6453 12.5965 13.607 12.6269 13.5746 12.6644C13.5059 12.7439 13.469 12.849 13.4717 12.9573ZM9.82598 14.0742H13.4758C13.4809 14.0932 13.4904 14.1108 13.5037 14.1251C13.5242 14.147 13.552 14.1593 13.581 14.1593H13.6008L13.571 14.1912V14.8295H9.72523C9.64183 14.8445 9.56614 14.8907 9.51149 14.9598C9.4845 14.994 9.46351 15.0328 9.4492 15.0741H8.96997V14.3295H9.54637C9.62976 14.3145 9.70552 14.2683 9.76011 14.1992C9.78947 14.162 9.81166 14.1195 9.82598 14.0742ZM18.9075 8.2552V12.5317H17.7846V12.323C17.7978 12.2827 17.8047 12.2399 17.8047 12.1965C17.8047 12.106 17.7747 12.0184 17.7201 11.9493C17.6655 11.8801 17.5897 11.834 17.5063 11.8189H9.72523C9.64183 11.834 9.56614 11.8801 9.51149 11.9493C9.48444 11.9835 9.46351 12.0222 9.4492 12.0636H8.96997V11.3083H9.54637C9.63425 11.3028 9.71662 11.2608 9.776 11.1913C9.80687 11.1551 9.83029 11.113 9.84527 11.0676L9.84654 11.0637H14.2667C14.3501 11.0486 14.4258 11.0024 14.4805 10.9333C14.5231 10.8794 14.5507 10.8142 14.5607 10.7452C14.5636 10.7258 14.565 10.706 14.565 10.686C14.565 10.6658 14.5635 10.6458 14.5606 10.626C14.5572 10.6026 14.5516 10.5796 14.5442 10.5573C14.5299 10.5144 14.5084 10.4741 14.4805 10.4387C14.4258 10.3696 14.3501 10.3234 14.2667 10.3083H9.72529C9.6832 10.3159 9.64299 10.3314 9.60653 10.3538C9.57081 10.3759 9.5386 10.4045 9.51155 10.4387C9.49639 10.4579 9.4831 10.4785 9.47182 10.5002C9.46133 10.5205 9.45259 10.5417 9.44568 10.5636H8.96997V9.80838H9.16873C9.25656 9.80286 9.33899 9.76085 9.39837 9.69131C9.45775 9.62177 9.48947 9.53022 9.48674 9.43601C9.48711 9.42951 9.48735 9.42302 9.48741 9.41653C9.48741 9.41049 9.48729 9.40445 9.48705 9.39848C9.49457 9.41055 9.50269 9.42218 9.51155 9.43334C9.56614 9.50249 9.64189 9.54866 9.72529 9.56372H17.5063C17.5897 9.54866 17.6655 9.50249 17.7201 9.43334C17.7747 9.36419 17.8047 9.2766 17.8047 9.18603C17.8047 9.09552 17.7747 9.00786 17.7201 8.93878C17.6655 8.86963 17.5897 8.82346 17.5063 8.8084H9.72529C9.64189 8.82346 9.56614 8.86963 9.51155 8.93878C9.4569 9.00786 9.42694 9.09552 9.42694 9.18603L9.427 9.19707L9.42754 9.20875C9.41972 9.19661 9.41123 9.18499 9.40201 9.17389C9.38478 9.15311 9.36537 9.1346 9.34427 9.11863C9.33735 9.11344 9.33026 9.1085 9.32298 9.10383C9.31855 9.10097 9.31406 9.09824 9.30951 9.09565L9.30424 9.09266L9.29659 9.08857C9.28792 9.08402 9.27906 9.07993 9.27009 9.07623C9.2616 9.07279 9.25298 9.06974 9.24431 9.06701C9.21974 9.05935 9.19439 9.05461 9.16873 9.05305H8.96997V4.10638C8.97221 4.07897 8.9834 4.05328 9.00157 4.03383C9.01975 4.01437 9.04374 4.0024 9.06935 4H14.9325V7.1914C14.9401 7.43679 15.0216 7.67296 15.1649 7.86468C15.3082 8.0564 15.5055 8.19338 15.7275 8.2552C15.7927 8.27277 15.861 8.27277 15.9262 8.2552H18.9075ZM13.571 17.2975V19.4251L13.5722 19.4615C13.5835 19.6376 13.6323 19.8068 13.7133 19.957H4.10061C4.08718 19.9587 4.07355 19.9571 4.06077 19.9524C4.04799 19.9477 4.03637 19.9399 4.02681 19.9296C4.01724 19.9194 4.00997 19.907 4.00554 19.8933C4.00111 19.8796 3.99964 19.865 4.00124 19.8506V7.29778C4.00124 7.26957 4.01171 7.24251 4.03034 7.22256C4.04898 7.20261 4.07426 7.1914 4.10061 7.1914H8.38368V9.05305H4.99497C4.90708 9.05857 4.82471 9.10052 4.76533 9.17006C4.70589 9.2396 4.67423 9.33121 4.67696 9.42536C4.67411 9.52067 4.70547 9.61346 4.76461 9.68475C4.8238 9.75598 4.90623 9.80026 4.99497 9.80838H8.38368V10.5636H4.99497C4.96682 10.5645 4.93898 10.5692 4.91199 10.5774C4.89647 10.5821 4.88124 10.588 4.86644 10.5952C4.8494 10.6034 4.83308 10.613 4.81762 10.6241C4.79627 10.6393 4.77655 10.657 4.7589 10.6771C4.72846 10.7116 4.70468 10.7523 4.68891 10.7967C4.67314 10.8411 4.66574 10.8885 4.66701 10.9359C4.66641 10.9597 4.66792 10.9834 4.67156 11.0067C4.6752 11.03 4.68102 11.053 4.68891 11.0752C4.70468 11.1196 4.72846 11.1603 4.7589 11.1949C4.7731 11.211 4.78862 11.2256 4.80524 11.2386C4.81452 11.2459 4.82417 11.2527 4.83417 11.259C4.84461 11.2655 4.85534 11.2714 4.86644 11.2767C4.9069 11.2962 4.95063 11.3069 4.99497 11.3083H8.38368V12.0636H4.99503C4.91163 12.0787 4.83587 12.1249 4.78128 12.194C4.7526 12.2303 4.7307 12.2717 4.71639 12.3159C4.70347 12.3559 4.69667 12.3983 4.69667 12.4413C4.69667 12.5318 4.72664 12.6194 4.78128 12.6886C4.809 12.7237 4.84218 12.7529 4.87906 12.7751C4.89416 12.7842 4.90993 12.7921 4.92619 12.7988C4.94833 12.8079 4.97137 12.8147 4.99503 12.8189H8.38368V13.5742H4.99503C4.95275 13.5819 4.91242 13.5975 4.87584 13.62C4.8403 13.642 4.80822 13.6705 4.78128 13.7046C4.72664 13.7737 4.69667 13.8613 4.69667 13.9519C4.69667 14.0424 4.72664 14.13 4.78128 14.1992C4.83587 14.2683 4.91163 14.3145 4.99503 14.3295H8.38368V15.0741H4.99497C4.94644 15.0829 4.90047 15.1022 4.85977 15.1304C4.83878 15.145 4.81919 15.162 4.80136 15.1811C4.79439 15.1885 4.78765 15.1964 4.78122 15.2045C4.77188 15.2163 4.76327 15.2287 4.75539 15.2416C4.74441 15.2594 4.73495 15.2781 4.727 15.2975C4.71924 15.3163 4.71293 15.3358 4.70808 15.3558C4.70407 15.3723 4.7011 15.389 4.69922 15.4061C4.69752 15.4212 4.69667 15.4364 4.69667 15.4518C4.69667 15.5423 4.72664 15.6299 4.78122 15.6991C4.83587 15.7682 4.91157 15.8144 4.99497 15.8295H8.38368V16.5847H4.99497C4.91157 16.5998 4.83587 16.6459 4.78122 16.7151C4.72664 16.7842 4.69667 16.8718 4.69667 16.9624C4.69667 17.0529 4.72664 17.1405 4.78122 17.2097C4.83587 17.2788 4.91157 17.325 4.99497 17.34H9.54637C9.58655 17.3328 9.62496 17.3183 9.66008 17.2975H13.571ZM15.7573 4.52124L18.3609 7.30839C18.3758 7.32612 18.3858 7.34796 18.3897 7.37145C18.3937 7.39493 18.3914 7.41913 18.3831 7.44128C18.3748 7.46343 18.3609 7.48266 18.3429 7.49678C18.325 7.51089 18.3036 7.51934 18.2814 7.52115H15.7275L15.5585 7.34031V4.60634C15.5602 4.58255 15.5681 4.55975 15.5813 4.54051C15.5945 4.52128 15.6125 4.50639 15.6332 4.49753C15.6539 4.48867 15.6765 4.48619 15.6984 4.49038C15.7203 4.49457 15.7407 4.50526 15.7573 4.52124ZM14.1248 5.91437C14.1732 5.97391 14.2021 6.04884 14.2071 6.1276C14.2157 6.17377 14.2155 6.22129 14.2065 6.26739C14.2045 6.27778 14.2021 6.28804 14.1992 6.29817L14.1944 6.31388C14.1847 6.34291 14.1715 6.3705 14.1551 6.39595C14.13 6.43465 14.098 6.46757 14.0608 6.49276C14.0354 6.5099 14.008 6.52328 13.9794 6.53244C13.9661 6.53672 13.9525 6.5401 13.9387 6.5425H9.71529C9.62309 6.5425 9.5346 6.50328 9.4694 6.43342C9.40413 6.36362 9.3675 6.26889 9.3675 6.17013C9.3675 6.07144 9.40413 5.97671 9.4694 5.90691C9.5346 5.83704 9.62309 5.79783 9.71529 5.79783H13.9387C13.9718 5.80516 14.0034 5.81769 14.0326 5.83484C14.0672 5.85522 14.0984 5.88204 14.1248 5.91437ZM14.2667 7.29776H9.72529C9.69606 7.30302 9.66773 7.31211 9.64092 7.3247C9.62612 7.33171 9.61175 7.33977 9.59798 7.34879C9.56565 7.36996 9.53642 7.39664 9.51155 7.42813C9.4569 7.49722 9.42694 7.58487 9.42694 7.67538C9.42694 7.70155 9.42942 7.72752 9.43434 7.75285C9.44635 7.81505 9.47273 7.87355 9.51155 7.9227C9.55292 7.9751 9.60647 8.01432 9.66628 8.03678C9.67762 8.04107 9.6892 8.04477 9.70097 8.04775C9.70898 8.04983 9.71711 8.05158 9.72529 8.05308H14.2667C14.3546 8.04756 14.437 8.00555 14.4964 7.93601C14.5558 7.86647 14.5875 7.77492 14.5847 7.68071C14.5874 7.63318 14.5813 7.58559 14.5667 7.54059C14.5522 7.4956 14.5296 7.45417 14.5 7.41859C14.4704 7.38301 14.4346 7.35398 14.3946 7.33327C14.3546 7.31256 14.3111 7.30048 14.2667 7.29776ZM4.99497 18.84H12.786C12.8783 18.84 12.9667 18.8008 13.032 18.731C13.0972 18.6611 13.1338 18.5664 13.1338 18.4677C13.1338 18.3689 13.0972 18.2742 13.032 18.2044C12.9667 18.1346 12.8783 18.0954 12.786 18.0954H4.99497C4.90277 18.0954 4.81428 18.1346 4.74908 18.2044C4.68381 18.2742 4.64718 18.3689 4.64718 18.4677C4.64718 18.5664 4.68381 18.6611 4.74908 18.731C4.81428 18.8008 4.90277 18.84 4.99497 18.84ZM17.5858 12.7444H19.5733H19.623C19.7249 12.7499 19.821 12.7971 19.8913 12.8764C19.9616 12.9556 20.0007 13.0607 20.0006 13.17V13.8295C20.0007 13.8458 19.9976 13.862 19.9914 13.8769C19.9853 13.8918 19.9764 13.9052 19.9652 13.9163C19.9539 13.9273 19.9407 13.9357 19.9262 13.9409C19.9118 13.9461 19.8965 13.948 19.8814 13.9465H13.7797C13.7507 13.9465 13.7229 13.9342 13.7024 13.9123C13.6819 13.8903 13.6704 13.8606 13.6704 13.8295V13.17C13.6677 13.0617 13.7046 12.9566 13.7733 12.8771C13.842 12.7976 13.9371 12.75 14.0381 12.7444H16.0256V12.5104C16.0352 12.439 16.0687 12.3737 16.1199 12.3268C16.1711 12.2798 16.2365 12.2544 16.3039 12.2551H17.2976C17.3667 12.2517 17.4345 12.276 17.4878 12.3232C17.541 12.3704 17.576 12.4371 17.5858 12.5104V12.7444ZM14.0679 19.4251V14.1912H19.5037V19.4251C19.4935 19.585 19.4256 19.7344 19.3143 19.8416C19.203 19.9488 19.0571 20.0055 18.9075 19.9996H14.6642C14.5146 20.0055 14.3687 19.9488 14.2574 19.8416C14.1461 19.7344 14.0781 19.585 14.0679 19.4251ZM15.5983 15.1593H15.2505C15.0969 15.1593 14.9723 15.2926 14.9723 15.4572V18.7336C14.9723 18.8981 15.0969 19.0315 15.2505 19.0315H15.5983C15.752 19.0315 15.8766 18.8981 15.8766 18.7336V15.4572C15.8766 15.2926 15.752 15.1593 15.5983 15.1593ZM16.9598 15.1593H16.612C16.4583 15.1593 16.3337 15.2926 16.3337 15.4572V18.7336C16.3337 18.8981 16.4583 19.0315 16.612 19.0315H16.9598C17.1135 19.0315 17.238 18.8981 17.238 18.7336V15.4572C17.238 15.2926 17.1135 15.1593 16.9598 15.1593ZM17.9635 15.1593H18.3113C18.465 15.1593 18.5895 15.2926 18.5895 15.4572V18.7336C18.5895 18.8981 18.465 19.0315 18.3113 19.0315H17.9635C17.8098 19.0315 17.6852 18.8981 17.6852 18.7336V15.4572C17.6852 15.2926 17.8098 15.1593 17.9635 15.1593Z",acceptSingleChange:"M17.2 20H15.6628L17.33 18.3091V19.87C17.33 19.8871 17.3266 19.904 17.3201 19.9197C17.3136 19.9355 17.304 19.9499 17.2919 19.9619C17.2799 19.974 17.2655 19.9836 17.2497 19.9901C17.234 19.9966 17.2171 20 17.2 20ZM4.13 20H14.4978L14.1823 19.6791L13.5135 18.9904L13.5123 18.9891L13.0529 18.52H5C4.87537 18.52 4.75586 18.4705 4.66766 18.3823C4.57953 18.2942 4.53003 18.1747 4.53003 18.05C4.53003 17.9253 4.57953 17.8058 4.66766 17.7177C4.75586 17.6295 4.87537 17.58 5 17.58H12.1323L11.6235 17.0604L11.6231 16.48L12.8831 15.19L13.4765 15.1896L15.0807 16.8276L17.33 14.5413V9.3H13.28C13.207 9.30976 13.133 9.30976 13.06 9.3C12.7697 9.22119 12.5113 9.05343 12.3212 8.82027C12.1311 8.58711 12.0187 8.30026 12 8V4H4.13C4.09552 4 4.06246 4.0137 4.03808 4.03808C4.0137 4.06246 4 4.09552 4 4.13V19.87C4 19.9045 4.0137 19.9375 4.03808 19.9619C4.06246 19.9863 4.09552 20 4.13 20ZM13.1 4.65L16.6 8.15C16.6212 8.17232 16.6355 8.20028 16.6412 8.23051C16.6469 8.26075 16.6437 8.29199 16.6321 8.32048C16.6205 8.34898 16.6009 8.37352 16.5757 8.39117C16.5505 8.40882 16.5208 8.41883 16.49 8.42H13.06L12.83 8.19V4.76C12.8312 4.72925 12.8412 4.6995 12.8588 4.67429C12.8765 4.64909 12.901 4.62951 12.9295 4.6179C12.958 4.6063 12.9893 4.60315 13.0195 4.60884C13.0497 4.61453 13.0777 4.62882 13.1 4.65ZM11 6.72C11.0027 6.66089 10.9937 6.60184 10.9735 6.5462C10.9534 6.49057 10.9224 6.43948 10.8825 6.39581C10.8425 6.35217 10.7944 6.3168 10.7408 6.29178C10.6871 6.26678 10.6292 6.25256 10.57 6.25H5C4.88239 6.25772 4.77252 6.31131 4.69397 6.39917C4.61542 6.48706 4.57452 6.60226 4.58002 6.72C4.57452 6.83774 4.61542 6.95294 4.69397 7.04083C4.77252 7.12869 4.88239 7.18228 5 7.19H10.6C10.7141 7.1774 10.8189 7.12173 10.8933 7.03436C10.9677 6.94702 11.0058 6.83456 11 6.72ZM11.1 8.14001H5C4.87537 8.14001 4.75586 8.18954 4.66766 8.27768C4.57953 8.36581 4.53003 8.48535 4.53003 8.61002C4.53003 8.73468 4.57953 8.85422 4.66766 8.94235C4.71558 8.99023 4.77277 9.02673 4.83496 9.05008C4.86932 9.06296 4.90521 9.07184 4.94189 9.07642C4.96106 9.0788 4.98047 9.08002 5 9.08002H11.1C11.2247 9.08002 11.3442 9.03049 11.4324 8.94235C11.5205 8.85422 11.57 8.73468 11.57 8.61002C11.57 8.48535 11.5205 8.36581 11.4324 8.27768C11.3442 8.18954 11.2247 8.14001 11.1 8.14001ZM5 11H15.45C15.5826 11 15.7098 10.9473 15.8035 10.8535C15.8973 10.7598 15.95 10.6326 15.95 10.5C15.95 10.3674 15.8973 10.2402 15.8035 10.1465C15.7098 10.0527 15.5826 10 15.45 10H5C4.86737 10 4.74023 10.0527 4.64642 10.1465C4.55267 10.2402 4.5 10.3674 4.5 10.5C4.5 10.6326 4.55267 10.7598 4.64642 10.8535C4.74023 10.9473 4.86737 11 5 11ZM5 12.86H11.1C11.2211 12.8523 11.3346 12.798 11.4166 12.7085C11.4986 12.6191 11.5428 12.5013 11.54 12.38C11.5427 12.2597 11.4982 12.1431 11.416 12.0552C11.3337 11.9673 11.2203 11.9152 11.1 11.91H5C4.94086 11.9126 4.88287 11.9268 4.82922 11.9518C4.77563 11.9768 4.72748 12.0122 4.6875 12.0558C4.65833 12.0878 4.63391 12.1237 4.61505 12.1624C4.60809 12.1767 4.60193 12.1913 4.5965 12.2062C4.58264 12.2443 4.5741 12.2841 4.57092 12.3243C4.56946 12.3428 4.56915 12.3614 4.57001 12.38C4.56451 12.5004 4.60651 12.6181 4.68689 12.7079C4.76733 12.7976 4.87976 12.8523 5 12.86ZM15.45 14.74H5C4.87537 14.74 4.75586 14.6905 4.66766 14.6023C4.57953 14.5142 4.53003 14.3947 4.53003 14.27C4.53003 14.1453 4.57953 14.0258 4.66766 13.9377C4.75586 13.8495 4.87537 13.8 5 13.8H15.45C15.5747 13.8 15.6942 13.8495 15.7823 13.9377C15.8705 14.0258 15.92 14.1453 15.92 14.27C15.92 14.3947 15.8705 14.5142 15.7823 14.6023C15.6942 14.6905 15.5747 14.74 15.45 14.74ZM11.1 16.63H5C4.87537 16.63 4.75586 16.5805 4.66766 16.4923C4.57953 16.4042 4.53003 16.2846 4.53003 16.16C4.53003 16.0353 4.57953 15.9158 4.66766 15.8276C4.75586 15.7395 4.87537 15.69 5 15.69H11.1C11.2247 15.69 11.3442 15.7395 11.4324 15.8276C11.5205 15.9158 11.57 16.0353 11.57 16.16C11.57 16.2846 11.5205 16.4042 11.4324 16.4923C11.3442 16.5805 11.2247 16.63 11.1 16.63ZM18.73 13.71L20 15.01L15.08 20L15.07 19.99L14.48 19.39L13.81 18.7L11.92 16.77L13.18 15.48L15.08 17.42L18.73 13.71Z",rejectSingleChange:"M17.0495 11.5C17.1461 11.5 17.241 11.5173 17.33 11.5501V9.3H13.28C13.207 9.30976 13.133 9.30976 13.06 9.3C12.7697 9.22119 12.5113 9.05343 12.3212 8.82027C12.1311 8.58711 12.0187 8.30026 12 8V4H4.13C4.09552 4 4.06246 4.0137 4.03808 4.03808C4.0137 4.06246 4 4.09552 4 4.13V19.87C4 19.9045 4.0137 19.9375 4.03808 19.9619C4.06246 19.9863 4.09552 20 4.13 20H13.2305C13.1075 19.8287 13.0338 19.6249 13.0205 19.4112L13.0195 19.3956V18.52H5C4.87537 18.52 4.75586 18.4705 4.66772 18.3823C4.57959 18.2942 4.53003 18.1747 4.53003 18.05C4.53003 18.0119 4.53467 17.9742 4.54358 17.9378C4.56396 17.8552 4.60657 17.7788 4.66772 17.7177C4.75586 17.6295 4.87537 17.58 5 17.58H13.0195V14.74H5C4.87537 14.74 4.75586 14.6905 4.66772 14.6023C4.57959 14.5142 4.53003 14.3947 4.53003 14.27C4.53003 14.1453 4.57959 14.0258 4.66772 13.9377C4.75586 13.8495 4.87537 13.8 5 13.8H12.8393C12.6229 13.6377 12.4998 13.3897 12.4998 13.1032C12.4997 12.8414 12.6008 12.5847 12.7513 12.3911C12.9 12.1998 13.1561 12 13.4994 12L15.2519 12C15.2928 11.8972 15.3589 11.7915 15.4649 11.6992C15.6135 11.5698 15.8041 11.499 16.0011 11.5H17.0495ZM13.1 4.65L16.6 8.15C16.6211 8.17232 16.6354 8.20028 16.6411 8.23051C16.6468 8.26075 16.6437 8.29199 16.6321 8.32048C16.6204 8.34898 16.6009 8.37352 16.5757 8.39117C16.5505 8.40882 16.5207 8.41883 16.49 8.42H13.06L12.83 8.19V4.76C12.8311 4.72925 12.8411 4.6995 12.8588 4.67429C12.8764 4.64909 12.901 4.62951 12.9295 4.6179C12.958 4.6063 12.9892 4.60315 13.0194 4.60884C13.0497 4.61453 13.0776 4.62882 13.1 4.65ZM11 6.72C11.0027 6.66089 10.9937 6.60184 10.9735 6.5462C10.9716 6.5408 10.9695 6.53543 10.9673 6.53012C10.9626 6.51852 10.9575 6.50717 10.9518 6.49603C10.9406 6.47391 10.9275 6.45273 10.9127 6.43274C10.9033 6.41992 10.8932 6.40759 10.8824 6.39581C10.8425 6.35217 10.7943 6.3168 10.7407 6.29178C10.6871 6.26678 10.629 6.25256 10.5699 6.25H5C4.88232 6.25772 4.77246 6.31131 4.69397 6.39917C4.61536 6.48706 4.57446 6.60226 4.57996 6.72C4.57715 6.7811 4.58679 6.84152 4.60767 6.8978C4.61523 6.91803 4.62415 6.93771 4.63452 6.9567C4.65088 6.98669 4.67078 7.01495 4.69397 7.04083C4.77246 7.12869 4.88232 7.18228 5 7.19H10.6C10.714 7.1774 10.8188 7.12173 10.8932 7.03436C10.922 7.00049 10.9454 6.96283 10.9629 6.92273C10.9725 6.9006 10.9805 6.87775 10.9865 6.8544C10.9933 6.82791 10.9977 6.80075 10.9995 6.77325C11.0001 6.76453 11.0004 6.75574 11.0005 6.74695C11.0006 6.73798 11.0005 6.729 11 6.72ZM11.1 8.14001H5C4.97534 8.14001 4.95081 8.14194 4.92676 8.14575C4.89587 8.15063 4.8656 8.15857 4.83643 8.1694C4.77368 8.19272 4.71606 8.2294 4.66772 8.27768C4.57959 8.36581 4.53003 8.48535 4.53003 8.61002C4.53003 8.73468 4.57959 8.85422 4.66772 8.94235C4.75586 9.03049 4.87537 9.08002 5 9.08002H11.1C11.2247 9.08002 11.3442 9.03049 11.4324 8.94235C11.4617 8.91306 11.4867 8.88028 11.5071 8.845C11.5349 8.79691 11.554 8.74414 11.5634 8.68915C11.5677 8.66318 11.5701 8.63672 11.5701 8.61002C11.5701 8.48535 11.5205 8.36581 11.4324 8.27768C11.3929 8.23831 11.3474 8.20663 11.2979 8.18365C11.2365 8.15518 11.1689 8.14001 11.1 8.14001ZM5 11H15.45C15.5826 11 15.7098 10.9473 15.8036 10.8535C15.8973 10.7598 15.95 10.6326 15.95 10.5C15.95 10.3674 15.8973 10.2402 15.8036 10.1465C15.7098 10.0527 15.5826 10 15.45 10H5C4.86743 10 4.74023 10.0527 4.64648 10.1465C4.55273 10.2402 4.5 10.3674 4.5 10.5C4.5 10.6326 4.55273 10.7598 4.64648 10.8535C4.74023 10.9473 4.86743 11 5 11ZM5 12.86H11.1C11.2211 12.8523 11.3346 12.798 11.4166 12.7085C11.4987 12.6191 11.5428 12.5013 11.54 12.38C11.5427 12.2597 11.4982 12.1431 11.4159 12.0552C11.3336 11.9673 11.2202 11.9152 11.1 11.91H5C4.94092 11.9126 4.88281 11.9268 4.82922 11.9518C4.77563 11.9768 4.72742 12.0122 4.6875 12.0558C4.64758 12.0995 4.6167 12.1506 4.59644 12.2062C4.58899 12.2266 4.58313 12.2475 4.57874 12.2687C4.57129 12.3052 4.56824 12.3426 4.56995 12.38C4.56445 12.5004 4.60645 12.6181 4.68689 12.7079C4.76733 12.7976 4.87976 12.8523 5 12.86ZM11.1 16.63H5C4.87537 16.63 4.75586 16.5805 4.66772 16.4923C4.57959 16.4042 4.53003 16.2846 4.53003 16.16C4.53003 16.0353 4.57959 15.9158 4.66772 15.8276C4.75586 15.7395 4.87537 15.69 5 15.69H11.1C11.2247 15.69 11.3442 15.7395 11.4324 15.8276C11.5205 15.9158 11.5701 16.0353 11.5701 16.16C11.5701 16.2846 11.5205 16.4042 11.4324 16.4923C11.3442 16.5805 11.2247 16.63 11.1 16.63ZM19.59 12.53H17.36V12.3C17.3574 12.2195 17.3236 12.1432 17.2657 12.0872C17.2078 12.0313 17.1305 12 17.05 12H16C15.9242 11.9994 15.8509 12.0265 15.7938 12.0762C15.7367 12.126 15.6997 12.1949 15.69 12.27V12.5H13.44C13.3768 12.4994 13.3142 12.5125 13.2565 12.5382C13.1988 12.564 13.1473 12.6019 13.1055 12.6493C13.0638 12.6968 13.0327 12.7526 13.0145 12.8132C12.9963 12.8737 12.9913 12.9374 13 13V13.67C13 13.6871 13.0033 13.704 13.0099 13.7198C13.0164 13.7355 13.026 13.7499 13.038 13.7619C13.0501 13.774 13.0644 13.7836 13.0802 13.7901C13.096 13.7966 13.1129 13.8 13.13 13.8H19.84C19.8611 13.8054 19.8834 13.8054 19.9045 13.8C19.9257 13.7946 19.9452 13.7839 19.9611 13.7689C19.9771 13.754 19.989 13.7352 19.9958 13.7144C20.0026 13.6937 20.004 13.6715 20 13.65V13C20.0028 12.8866 19.9617 12.7765 19.8853 12.6927C19.809 12.6088 19.7031 12.5577 19.59 12.55V12.53ZM13.52 14V19.38C13.5303 19.5454 13.6054 19.7 13.7289 19.8105C13.8525 19.9209 14.0145 19.9782 14.18 19.97H18.84C19.0055 19.9782 19.1676 19.9209 19.2911 19.8105C19.4146 19.7 19.4897 19.5454 19.5 19.38V14H13.52ZM15.52 18.67C15.52 18.7522 15.4874 18.8311 15.4292 18.8892C15.3711 18.9473 15.2922 18.98 15.21 18.98H14.83C14.7478 18.98 14.669 18.9473 14.6108 18.8892C14.5527 18.8311 14.52 18.7522 14.52 18.67V15.33C14.52 15.2893 14.528 15.249 14.5436 15.2114C14.5592 15.1738 14.582 15.1396 14.6108 15.1108C14.6396 15.082 14.6738 15.0592 14.7114 15.0436C14.749 15.028 14.7893 15.02 14.83 15.02H15.21C15.2507 15.02 15.291 15.028 15.3287 15.0436C15.3663 15.0592 15.4004 15.082 15.4292 15.1108C15.458 15.1396 15.4808 15.1738 15.4964 15.2114C15.512 15.249 15.52 15.2893 15.52 15.33V18.67ZM17.01 18.67C17.01 18.7522 16.9774 18.8311 16.9192 18.8892C16.8611 18.9473 16.7822 18.98 16.7 18.98H16.32C16.2798 18.98 16.2399 18.9719 16.2029 18.9562C16.1658 18.9405 16.1323 18.9176 16.1043 18.8886C16.0763 18.8597 16.0544 18.8254 16.0399 18.7879C16.0254 18.7503 16.0187 18.7102 16.02 18.67V15.33C16.0187 15.2898 16.0254 15.2497 16.0399 15.2121C16.0544 15.1746 16.0763 15.1403 16.1043 15.1114C16.1323 15.0824 16.1658 15.0595 16.2029 15.0438C16.2399 15.0281 16.2798 15.02 16.32 15.02H16.7C16.7407 15.02 16.781 15.028 16.8187 15.0436C16.8563 15.0592 16.8904 15.082 16.9192 15.1108C16.948 15.1396 16.9708 15.1738 16.9864 15.2114C17.002 15.249 17.01 15.2893 17.01 15.33V18.67ZM18.51 18.67C18.51 18.7107 18.502 18.751 18.4864 18.7886C18.4708 18.8262 18.448 18.8604 18.4192 18.8892C18.3904 18.918 18.3563 18.9408 18.3187 18.9564C18.281 18.972 18.2407 18.98 18.2 18.98H17.82C17.7378 18.98 17.659 18.9473 17.6008 18.8892C17.5427 18.8311 17.51 18.7522 17.51 18.67V15.33C17.51 15.2893 17.518 15.249 17.5336 15.2114C17.5492 15.1738 17.572 15.1396 17.6008 15.1108C17.6296 15.082 17.6638 15.0592 17.7014 15.0436C17.739 15.028 17.7793 15.02 17.82 15.02H18.2C18.2407 15.02 18.281 15.028 18.3187 15.0436C18.3563 15.0592 18.3904 15.082 18.4192 15.1108C18.448 15.1396 18.4708 15.1738 18.4864 15.2114C18.502 15.249 18.51 15.2893 18.51 15.33V18.67Z"},
679V
vendor: 100,814 bytes, line 679
679.FILEICONS={docIcon:{extension:".doc",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 9.617188 46.875 C 13.234375 46.875 16.160156 43.929688 16.160156 40.292969 C 16.160156 36.695312 13.234375 33.75 9.617188 33.75 L 7.402344 33.75 C 6.820312 33.75 6.371094 34.199219 6.371094 34.78125 L 6.371094 45.84375 C 6.371094 46.335938 6.714844 46.757812 7.191406 46.855469 L 7.402344 46.875 Z M 9.617188 44.792969 L 8.453125 44.792969 L 8.453125 35.832031 L 9.617188 35.832031 C 12.089844 35.832031 14.078125 37.835938 14.078125 40.292969 C 14.078125 42.789062 12.089844 44.773438 9.617188 44.792969 Z M 24.816406 46.875 C 26.539062 46.875 28.191406 46.085938 29.296875 44.867188 C 30.460938 43.648438 31.191406 41.980469 31.191406 40.125 C 31.191406 38.269531 30.460938 36.617188 29.296875 35.382812 C 28.191406 34.144531 26.539062 33.375 24.816406 33.375 C 23.015625 33.375 21.367188 34.144531 20.222656 35.382812 C 19.058594 36.617188 18.367188 38.269531 18.367188 40.125 C 18.367188 41.980469 19.058594 43.648438 20.222656 44.867188 C 21.367188 46.085938 23.015625 46.875 24.816406 46.875 Z M 24.816406 44.738281 C 23.617188 44.738281 22.566406 44.230469 21.777344 43.386719 C 20.992188 42.582031 20.503906 41.398438 20.503906 40.125 C 20.503906 38.851562 20.992188 37.667969 21.777344 36.84375 C 22.566406 36 23.617188 35.511719 24.816406 35.511719 C 25.941406 35.511719 26.992188 36 27.777344 36.84375 C 28.546875 37.667969 29.054688 38.851562 29.054688 40.125 C 29.054688 41.398438 28.546875 42.582031 27.777344 43.386719 C 26.992188 44.230469 25.941406 44.738281 24.816406 44.738281 Z M 39.996094 46.875 C 41.648438 46.875 43.148438 46.332031 44.328125 45.414062 C 44.777344 45.054688 44.851562 44.382812 44.515625 43.914062 C 44.140625 43.460938 43.445312 43.386719 43.015625 43.707031 C 42.171875 44.382812 41.160156 44.738281 39.996094 44.738281 C 38.703125 44.738281 37.503906 44.210938 36.621094 43.386719 C 35.777344 42.5625 35.253906 41.398438 35.253906 40.125 C 35.253906 38.851562 35.777344 37.726562 36.621094 36.863281 C 37.503906 36.039062 38.703125 35.511719 39.996094 35.511719 C 41.160156 35.511719 42.191406 35.867188 43.015625 36.542969 C 43.445312 36.882812 44.140625 36.804688 44.515625 36.335938 C 44.851562 35.867188 44.777344 35.210938 44.328125 34.835938 C 43.148438 33.917969 41.648438 33.375 39.996094 33.375 C 36.246094 33.394531 33.132812 36.414062 33.117188 40.125 C 33.132812 43.855469 36.246094 46.875 39.996094 46.875 Z M 39.996094 46.875 "/>\n      </g>'},gifIcon:{extension:".gif",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 17.394531 46.875 C 18.988281 46.875 20.46875 46.332031 21.648438 45.414062 C 21.835938 45.28125 21.949219 45.132812 22.003906 44.960938 L 22.003906 44.945312 C 22.023438 44.90625 22.023438 44.886719 22.042969 44.851562 C 22.0625 44.738281 22.097656 44.664062 22.097656 44.53125 L 22.097656 40.386719 C 22.097656 39.789062 21.613281 39.335938 21.011719 39.335938 L 17.28125 39.335938 C 16.699219 39.335938 16.210938 39.789062 16.210938 40.386719 C 16.210938 40.96875 16.699219 41.457031 17.28125 41.457031 L 19.960938 41.457031 L 19.960938 44.023438 C 19.210938 44.457031 18.332031 44.738281 17.394531 44.738281 C 16.042969 44.738281 14.863281 44.230469 14.019531 43.367188 C 13.136719 42.523438 12.613281 41.382812 12.613281 40.144531 C 12.613281 38.867188 13.136719 37.726562 14.019531 36.882812 C 14.863281 36.019531 16.042969 35.511719 17.394531 35.511719 C 18.519531 35.511719 19.550781 35.90625 20.355469 36.523438 C 20.824219 36.898438 21.519531 36.804688 21.875 36.355469 C 22.230469 35.886719 22.15625 35.195312 21.667969 34.835938 C 20.503906 33.917969 18.988281 33.375 17.394531 33.375 C 13.585938 33.375 10.472656 36.375 10.472656 40.144531 C 10.472656 43.894531 13.585938 46.875 17.394531 46.875 Z M 26.945312 46.875 C 27.507812 46.875 27.996094 46.425781 27.996094 45.84375 L 27.996094 34.78125 C 27.996094 34.199219 27.507812 33.75 26.945312 33.75 C 26.363281 33.75 25.914062 34.199219 25.914062 34.78125 L 25.914062 45.84375 C 25.914062 46.425781 26.363281 46.875 26.945312 46.875 Z M 33.066406 46.875 C 33.648438 46.875 34.117188 46.40625 34.117188 45.84375 L 34.117188 41.34375 L 38.488281 41.34375 C 39.050781 41.34375 39.519531 40.875 39.519531 40.292969 C 39.519531 39.75 39.050781 39.261719 38.488281 39.261719 L 34.117188 39.261719 L 34.117188 35.832031 L 39.199219 35.832031 C 39.742188 35.832031 40.230469 35.363281 40.230469 34.78125 C 40.230469 34.21875 39.742188 33.75 39.199219 33.75 L 33.066406 33.75 C 32.488281 33.75 32.035156 34.21875 32.035156 34.78125 L 32.035156 45.84375 C 32.035156 46.40625 32.488281 46.875 33.066406 46.875 Z M 33.066406 46.875 "/>\n      </g>'},jpegIcon:{extension:".jpeg",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 9 43.75 C 11.140625 43.75 12.890625 42.015625 12.890625 39.875 L 12.890625 33.671875 C 12.890625 33.1875 12.5 32.8125 12.03125 32.8125 C 11.546875 32.8125 11.15625 33.1875 11.15625 33.671875 L 11.15625 39.875 C 11.15625 41.046875 10.1875 42.015625 9 42.015625 C 8.046875 42.015625 7.234375 41.390625 6.953125 40.53125 C 6.8125 40.078125 6.328125 39.828125 5.859375 39.984375 C 5.421875 40.109375 5.15625 40.59375 5.3125 41.0625 C 5.8125 42.625 7.28125 43.75 9 43.75 Z M 15.640625 43.75 C 16.125 43.75 16.515625 43.359375 16.515625 42.890625 L 16.515625 39.5 L 18.4375 39.5 C 20.296875 39.5 21.796875 38 21.796875 36.171875 C 21.796875 34.3125 20.296875 32.8125 18.4375 32.8125 L 15.640625 32.8125 C 15.171875 32.8125 14.78125 33.1875 14.78125 33.671875 L 14.78125 42.890625 C 14.78125 43.359375 15.171875 43.75 15.640625 43.75 Z M 18.4375 37.765625 L 16.515625 37.765625 L 16.515625 34.546875 L 18.4375 34.546875 C 19.34375 34.546875 20.046875 35.265625 20.0625 36.171875 C 20.046875 37.046875 19.34375 37.765625 18.4375 37.765625 Z M 29.234375 43.75 C 29.6875 43.75 30.09375 43.359375 30.09375 42.890625 C 30.09375 42.40625 29.6875 42.015625 29.234375 42.015625 L 25 42.015625 L 25 39.140625 L 28.640625 39.140625 C 29.109375 39.140625 29.5 38.75 29.5 38.265625 C 29.5 37.8125 29.109375 37.40625 28.640625 37.40625 L 25 37.40625 L 25 34.546875 L 29.234375 34.546875 C 29.6875 34.546875 30.09375 34.15625 30.09375 33.671875 C 30.09375 33.1875 29.6875 32.8125 29.234375 32.8125 L 24.125 32.8125 C 23.640625 32.8125 23.265625 33.1875 23.265625 33.671875 L 23.265625 42.890625 C 23.265625 43.359375 23.640625 43.75 24.125 43.75 C 24.125 43.75 24.140625 43.734375 24.140625 43.734375 C 24.140625 43.734375 24.140625 43.75 24.171875 43.75 Z M 37.1875 43.75 C 38.515625 43.75 39.75 43.296875 40.734375 42.53125 C 40.890625 42.421875 40.984375 42.296875 41.03125 42.15625 L 41.03125 42.140625 C 41.046875 42.109375 41.046875 42.09375 41.0625 42.0625 C 41.078125 41.96875 41.109375 41.90625 41.109375 41.796875 L 41.109375 38.34375 C 41.109375 37.914062 40.8125 37.578125 40.410156 37.492188 L 40.203125 37.46875 L 37.09375 37.46875 C 36.609375 37.46875 36.203125 37.84375 36.203125 38.34375 C 36.203125 38.828125 36.609375 39.234375 37.09375 39.234375 L 39.328125 39.234375 L 39.328125 41.375 C 38.703125 41.734375 37.96875 41.96875 37.1875 41.96875 C 36.0625 41.96875 35.078125 41.546875 34.375 40.828125 C 33.640625 40.125 33.203125 39.171875 33.203125 38.140625 C 33.203125 37.078125 33.640625 36.125 34.375 35.421875 C 35.078125 34.703125 36.0625 34.28125 37.1875 34.28125 C 38.125 34.28125 38.984375 34.609375 39.65625 35.125 C 40.046875 35.4375 40.625 35.359375 40.921875 34.984375 C 41.21875 34.59375 41.15625 34.015625 40.75 33.71875 C 39.78125 32.953125 38.515625 32.5 37.1875 32.5 C 34.015625 32.5 31.421875 35 31.421875 38.140625 C 31.421875 41.265625 34.015625 43.75 37.1875 43.75 Z M 37.1875 43.75 "/>\n      </g>'},logIcon:{extension:".log",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 13.542969 46.875 C 14.085938 46.875 14.574219 46.40625 14.574219 45.84375 C 14.574219 45.261719 14.085938 44.792969 13.542969 44.792969 L 8.460938 44.792969 L 8.460938 34.78125 C 8.460938 34.21875 7.992188 33.75 7.410156 33.75 C 6.828125 33.75 6.378906 34.21875 6.378906 34.78125 L 6.378906 45.84375 C 6.378906 46.40625 6.828125 46.875 7.410156 46.875 Z M 21.742188 46.875 C 23.46875 46.875 25.117188 46.085938 26.222656 44.867188 C 27.386719 43.648438 28.117188 41.980469 28.117188 40.125 C 28.117188 38.269531 27.386719 36.617188 26.222656 35.382812 C 25.117188 34.144531 23.46875 33.375 21.742188 33.375 C 19.941406 33.375 18.292969 34.144531 17.148438 35.382812 C 15.984375 36.617188 15.292969 38.269531 15.292969 40.125 C 15.292969 41.980469 15.984375 43.648438 17.148438 44.867188 C 18.292969 46.085938 19.941406 46.875 21.742188 46.875 Z M 21.742188 44.738281 C 20.542969 44.738281 19.492188 44.230469 18.703125 43.386719 C 17.917969 42.582031 17.429688 41.398438 17.429688 40.125 C 17.429688 38.851562 17.917969 37.667969 18.703125 36.84375 C 19.492188 36 20.542969 35.511719 21.742188 35.511719 C 22.867188 35.511719 23.917969 36 24.703125 36.84375 C 25.472656 37.667969 25.980469 38.851562 25.980469 40.125 C 25.980469 41.398438 25.472656 42.582031 24.703125 43.386719 C 23.917969 44.230469 22.867188 44.738281 21.742188 44.738281 Z M 37.300781 46.875 C 38.894531 46.875 40.375 46.332031 41.558594 45.414062 C 41.746094 45.28125 41.855469 45.132812 41.914062 44.960938 L 41.914062 44.945312 L 41.949219 44.851562 C 41.96875 44.738281 42.007812 44.664062 42.007812 44.53125 L 42.007812 40.386719 C 42.007812 39.789062 41.519531 39.335938 40.917969 39.335938 L 37.1875 39.335938 C 36.605469 39.335938 36.121094 39.789062 36.121094 40.386719 C 36.121094 40.96875 36.605469 41.457031 37.1875 41.457031 L 39.871094 41.457031 L 39.871094 44.023438 C 39.121094 44.457031 38.238281 44.738281 37.300781 44.738281 C 35.949219 44.738281 34.769531 44.230469 33.925781 43.367188 C 33.042969 42.523438 32.519531 41.382812 32.519531 40.144531 C 32.519531 38.867188 33.042969 37.726562 33.925781 36.882812 C 34.769531 36.019531 35.949219 35.511719 37.300781 35.511719 C 38.425781 35.511719 39.457031 35.90625 40.261719 36.523438 C 40.730469 36.898438 41.425781 36.804688 41.78125 36.355469 C 42.136719 35.886719 42.0625 35.195312 41.574219 34.835938 C 40.414062 33.917969 38.894531 33.375 37.300781 33.375 C 33.496094 33.375 30.382812 36.375 30.382812 40.144531 C 30.382812 43.894531 33.496094 46.875 37.300781 46.875 Z M 37.300781 46.875 "/>\n      </g>'},movIcon:{extension:".mov",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 15.472656 46.875 C 16.035156 46.875 16.523438 46.40625 16.523438 45.84375 L 16.523438 34.78125 C 16.523438 34.289062 16.152344 33.882812 15.679688 33.777344 L 15.472656 33.75 L 15.453125 33.75 C 15.117188 33.75 14.816406 33.898438 14.609375 34.179688 L 10.878906 39.355469 L 7.148438 34.179688 C 6.960938 33.898438 6.625 33.75 6.324219 33.75 L 6.265625 33.75 C 5.703125 33.75 5.234375 34.21875 5.234375 34.78125 L 5.234375 45.84375 C 5.234375 46.40625 5.703125 46.875 6.265625 46.875 C 6.847656 46.875 7.316406 46.40625 7.316406 45.84375 L 7.316406 37.949219 L 10 41.699219 C 10.203125 41.980469 10.523438 42.132812 10.859375 42.132812 L 10.898438 42.132812 C 11.234375 42.132812 11.535156 41.980469 11.742188 41.699219 L 14.441406 37.949219 L 14.441406 45.84375 C 14.441406 46.40625 14.890625 46.875 15.472656 46.875 Z M 25.460938 46.875 C 27.1875 46.875 28.835938 46.085938 29.941406 44.867188 C 31.105469 43.648438 31.835938 41.980469 31.835938 40.125 C 31.835938 38.269531 31.105469 36.617188 29.941406 35.382812 C 28.835938 34.144531 27.1875 33.375 25.460938 33.375 C 23.660156 33.375 22.011719 34.144531 20.867188 35.382812 C 19.703125 36.617188 19.011719 38.269531 19.011719 40.125 C 19.011719 41.980469 19.703125 43.648438 20.867188 44.867188 C 22.011719 46.085938 23.660156 46.875 25.460938 46.875 Z M 25.460938 44.738281 C 24.261719 44.738281 23.210938 44.230469 22.421875 43.386719 C 21.636719 42.582031 21.148438 41.398438 21.148438 40.125 C 21.148438 38.851562 21.636719 37.667969 22.421875 36.84375 C 23.210938 36 24.261719 35.511719 25.460938 35.511719 C 26.585938 35.511719 27.636719 36 28.421875 36.84375 C 29.191406 37.667969 29.699219 38.851562 29.699219 40.125 C 29.699219 41.398438 29.191406 42.582031 28.421875 43.386719 C 27.636719 44.230469 26.585938 44.738281 25.460938 44.738281 Z M 38.683594 46.855469 L 38.71875 46.855469 C 38.777344 46.835938 38.8125 46.820312 38.871094 46.820312 C 38.886719 46.800781 38.886719 46.800781 38.90625 46.800781 C 38.964844 46.78125 39.019531 46.726562 39.058594 46.707031 L 39.09375 46.6875 L 39.207031 46.59375 C 39.226562 46.574219 39.226562 46.574219 39.246094 46.539062 L 39.339844 46.425781 C 39.355469 46.425781 39.355469 46.425781 39.355469 46.40625 C 39.394531 46.367188 39.414062 46.292969 39.433594 46.257812 L 44.0625 35.304688 C 44.269531 34.800781 44.027344 34.179688 43.5 33.976562 C 42.996094 33.75 42.375 33.992188 42.152344 34.519531 L 38.496094 43.199219 L 34.839844 34.519531 C 34.613281 33.992188 34.011719 33.75 33.507812 33.976562 C 32.964844 34.179688 32.71875 34.800781 32.945312 35.304688 L 37.539062 46.257812 C 37.574219 46.292969 37.613281 46.367188 37.632812 46.40625 C 37.632812 46.425781 37.652344 46.425781 37.652344 46.425781 C 37.667969 46.460938 37.707031 46.5 37.746094 46.539062 C 37.746094 46.574219 37.761719 46.574219 37.761719 46.59375 C 37.820312 46.632812 37.855469 46.648438 37.894531 46.6875 L 37.914062 46.6875 C 37.96875 46.726562 38.042969 46.78125 38.082031 46.800781 L 38.101562 46.800781 C 38.101562 46.800781 38.121094 46.800781 38.121094 46.820312 C 38.15625 46.820312 38.230469 46.835938 38.269531 46.855469 L 38.308594 46.855469 L 38.402344 46.871094 L 38.496094 46.875 C 38.550781 46.875 38.605469 46.875 38.683594 46.855469 Z M 38.683594 46.855469 "/>\n      </g>'},ogvIcon:{extension:".ogv",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 11.511719 46.875 C 13.238281 46.875 14.886719 46.085938 15.996094 44.867188 C 17.15625 43.648438 17.886719 41.980469 17.886719 40.125 C 17.886719 38.269531 17.15625 36.617188 15.996094 35.382812 C 14.886719 34.144531 13.238281 33.375 11.511719 33.375 C 9.714844 33.375 8.0625 34.144531 6.917969 35.382812 C 5.757812 36.617188 5.0625 38.269531 5.0625 40.125 C 5.0625 41.980469 5.757812 43.648438 6.917969 44.867188 C 8.0625 46.085938 9.714844 46.875 11.511719 46.875 Z M 11.511719 44.738281 C 10.3125 44.738281 9.261719 44.230469 8.476562 43.386719 C 7.6875 42.582031 7.199219 41.398438 7.199219 40.125 C 7.199219 38.851562 7.6875 37.667969 8.476562 36.84375 C 9.261719 36 10.3125 35.511719 11.511719 35.511719 C 12.636719 35.511719 13.6875 36 14.476562 36.84375 C 15.246094 37.667969 15.75 38.851562 15.75 40.125 C 15.75 41.398438 15.246094 42.582031 14.476562 43.386719 C 13.6875 44.230469 12.636719 44.738281 11.511719 44.738281 Z M 27.25 46.875 C 28.84375 46.875 30.324219 46.332031 31.507812 45.414062 C 31.695312 45.28125 31.804688 45.132812 31.863281 44.960938 L 31.863281 44.945312 C 31.882812 44.90625 31.882812 44.886719 31.898438 44.851562 C 31.917969 44.738281 31.957031 44.664062 31.957031 44.53125 L 31.957031 40.386719 C 31.957031 39.789062 31.46875 39.335938 30.867188 39.335938 L 27.136719 39.335938 C 26.554688 39.335938 26.070312 39.789062 26.070312 40.386719 C 26.070312 40.96875 26.554688 41.457031 27.136719 41.457031 L 29.820312 41.457031 L 29.820312 44.023438 C 29.070312 44.457031 28.1875 44.738281 27.25 44.738281 C 25.898438 44.738281 24.71875 44.230469 23.875 43.367188 C 22.992188 42.523438 22.46875 41.382812 22.46875 40.144531 C 22.46875 38.867188 22.992188 37.726562 23.875 36.882812 C 24.71875 36.019531 25.898438 35.511719 27.25 35.511719 C 28.375 35.511719 29.40625 35.90625 30.210938 36.523438 C 30.679688 36.898438 31.375 36.804688 31.730469 36.355469 C 32.085938 35.886719 32.011719 35.195312 31.523438 34.835938 C 30.363281 33.917969 28.84375 33.375 27.25 33.375 C 23.445312 33.375 20.332031 36.375 20.332031 40.144531 C 20.332031 43.894531 23.445312 46.875 27.25 46.875 Z M 40.191406 46.855469 L 40.230469 46.855469 C 40.285156 46.835938 40.324219 46.820312 40.378906 46.820312 C 40.398438 46.800781 40.398438 46.800781 40.417969 46.800781 C 40.472656 46.78125 40.53125 46.726562 40.566406 46.707031 C 40.605469 46.6875 40.605469 46.6875 40.605469 46.6875 L 40.71875 46.59375 C 40.738281 46.574219 40.738281 46.574219 40.753906 46.539062 L 40.847656 46.425781 C 40.867188 46.425781 40.867188 46.425781 40.867188 46.40625 C 40.90625 46.367188 40.925781 46.292969 40.941406 46.257812 L 45.574219 35.304688 C 45.78125 34.800781 45.535156 34.179688 45.011719 33.976562 C 44.503906 33.75 43.886719 33.992188 43.660156 34.519531 L 40.003906 43.199219 L 36.347656 34.519531 C 36.125 33.992188 35.523438 33.75 35.019531 33.976562 C 34.472656 34.179688 34.230469 34.800781 34.457031 35.304688 L 39.050781 46.257812 C 39.085938 46.292969 39.125 46.367188 39.144531 46.40625 C 39.144531 46.425781 39.160156 46.425781 39.160156 46.425781 C 39.179688 46.460938 39.21875 46.5 39.253906 46.539062 C 39.253906 46.574219 39.273438 46.574219 39.273438 46.59375 C 39.332031 46.632812 39.367188 46.648438 39.40625 46.6875 L 39.425781 46.6875 C 39.480469 46.726562 39.554688 46.78125 39.59375 46.800781 L 39.613281 46.800781 C 39.613281 46.800781 39.628906 46.800781 39.628906 46.820312 C 39.667969 46.820312 39.742188 46.835938 39.78125 46.855469 L 39.816406 46.855469 L 39.910156 46.871094 L 40.003906 46.875 C 40.0625 46.875 40.117188 46.875 40.191406 46.855469 Z M 40.191406 46.855469 "/>\n      </g>'},pngIcon:{extension:".png",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 7.523438 46.875 C 8.105469 46.875 8.574219 46.40625 8.574219 45.84375 L 8.574219 41.773438 L 10.878906 41.773438 C 13.109375 41.773438 14.910156 39.976562 14.910156 37.78125 C 14.910156 35.550781 13.109375 33.75 10.878906 33.75 L 7.523438 33.75 C 6.960938 33.75 6.492188 34.199219 6.492188 34.78125 L 6.492188 45.84375 C 6.492188 46.40625 6.960938 46.875 7.523438 46.875 Z M 10.878906 39.695312 L 8.574219 39.695312 L 8.574219 35.832031 L 10.878906 35.832031 C 11.964844 35.832031 12.808594 36.695312 12.828125 37.78125 C 12.808594 38.832031 11.964844 39.695312 10.878906 39.695312 Z M 26.75 46.875 C 27.3125 46.875 27.78125 46.40625 27.78125 45.84375 L 27.78125 34.949219 C 27.78125 34.40625 27.3125 33.9375 26.75 33.9375 C 26.1875 33.9375 25.738281 34.40625 25.738281 34.949219 L 25.738281 42.675781 L 19.679688 34.292969 C 19.363281 33.84375 18.722656 33.75 18.253906 34.070312 C 17.972656 34.273438 17.824219 34.613281 17.84375 34.929688 L 17.84375 45.84375 C 17.84375 46.40625 18.292969 46.875 18.875 46.875 C 19.417969 46.875 19.886719 46.40625 19.886719 45.84375 L 19.886719 38.0625 L 25.886719 46.386719 C 25.90625 46.425781 25.941406 46.460938 25.980469 46.5 C 26.167969 46.726562 26.449219 46.875 26.75 46.875 Z M 38.082031 46.875 C 39.675781 46.875 41.15625 46.332031 42.339844 45.414062 C 42.527344 45.28125 42.636719 45.132812 42.695312 44.960938 L 42.695312 44.945312 C 42.714844 44.90625 42.714844 44.886719 42.730469 44.851562 C 42.75 44.738281 42.789062 44.664062 42.789062 44.53125 L 42.789062 40.386719 C 42.789062 39.789062 42.300781 39.335938 41.699219 39.335938 L 37.96875 39.335938 C 37.386719 39.335938 36.902344 39.789062 36.902344 40.386719 C 36.902344 40.96875 37.386719 41.457031 37.96875 41.457031 L 40.652344 41.457031 L 40.652344 44.023438 C 39.902344 44.457031 39.019531 44.738281 38.082031 44.738281 C 36.730469 44.738281 35.550781 44.230469 34.707031 43.367188 C 33.824219 42.523438 33.300781 41.382812 33.300781 40.144531 C 33.300781 38.867188 33.824219 37.726562 34.707031 36.882812 C 35.550781 36.019531 36.730469 35.511719 38.082031 35.511719 C 39.207031 35.511719 40.238281 35.90625 41.042969 36.523438 C 41.511719 36.898438 42.207031 36.804688 42.5625 36.355469 C 42.917969 35.886719 42.84375 35.195312 42.355469 34.835938 C 41.195312 33.917969 39.675781 33.375 38.082031 33.375 C 34.277344 33.375 31.164062 36.375 31.164062 40.144531 C 31.164062 43.894531 34.277344 46.875 38.082031 46.875 Z M 38.082031 46.875 "/>\n      </g>'},txtIcon:{extension:".txt",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 12.847656 46.875 C 13.429688 46.875 13.878906 46.425781 13.878906 45.84375 L 13.878906 35.832031 L 16.859375 35.832031 C 17.421875 35.832031 17.890625 35.34375 17.890625 34.78125 C 17.890625 34.199219 17.421875 33.75 16.859375 33.75 L 8.855469 33.75 C 8.273438 33.75 7.824219 34.199219 7.824219 34.78125 C 7.824219 35.34375 8.273438 35.832031 8.855469 35.832031 L 11.816406 35.832031 L 11.816406 45.84375 C 11.816406 46.425781 12.285156 46.875 12.847656 46.875 Z M 29.019531 46.875 C 29.222656 46.875 29.429688 46.800781 29.617188 46.667969 C 30.085938 46.351562 30.160156 45.695312 29.84375 45.242188 L 26.28125 40.367188 L 29.84375 35.53125 C 30.160156 35.0625 30.085938 34.425781 29.617188 34.105469 C 29.148438 33.75 28.53125 33.84375 28.175781 34.332031 L 25.023438 38.644531 L 21.855469 34.332031 C 21.535156 33.84375 20.878906 33.75 20.429688 34.105469 C 19.960938 34.425781 19.867188 35.0625 20.1875 35.53125 L 23.75 40.367188 L 20.1875 45.242188 C 19.867188 45.695312 19.960938 46.351562 20.429688 46.667969 C 20.597656 46.800781 20.804688 46.875 21.03125 46.875 C 21.347656 46.875 21.648438 46.707031 21.855469 46.445312 L 25.023438 42.113281 L 28.175781 46.445312 C 28.378906 46.707031 28.679688 46.875 29.019531 46.875 Z M 37.464844 46.875 C 38.042969 46.875 38.496094 46.425781 38.496094 45.84375 L 38.496094 35.832031 L 41.476562 35.832031 C 42.039062 35.832031 42.507812 35.34375 42.507812 34.78125 C 42.507812 34.199219 42.039062 33.75 41.476562 33.75 L 33.46875 33.75 C 32.886719 33.75 32.4375 34.199219 32.4375 34.78125 C 32.4375 35.34375 32.886719 35.832031 33.46875 35.832031 L 36.433594 35.832031 L 36.433594 45.84375 C 36.433594 46.425781 36.902344 46.875 37.464844 46.875 Z M 37.464844 46.875 "/>\n      </g>'},webmIcon:{extension:".webm",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 7.195312 43.734375 L 7.242188 43.734375 C 7.273438 43.71875 7.304688 43.703125 7.367188 43.703125 C 7.367188 43.6875 7.382812 43.6875 7.382812 43.6875 L 7.398438 43.6875 C 7.429688 43.671875 7.476562 43.625 7.523438 43.59375 L 7.554688 43.59375 C 7.585938 43.5625 7.617188 43.53125 7.648438 43.515625 C 7.648438 43.5 7.664062 43.5 7.664062 43.46875 L 7.757812 43.375 C 7.757812 43.375 7.757812 43.359375 7.773438 43.359375 C 7.789062 43.328125 7.820312 43.265625 7.835938 43.21875 L 9.882812 38.375 L 11.929688 43.21875 C 11.945312 43.265625 11.960938 43.328125 11.992188 43.359375 C 11.992188 43.359375 11.992188 43.375 12.023438 43.375 L 12.085938 43.46875 C 12.101562 43.5 12.101562 43.5 12.117188 43.515625 C 12.148438 43.53125 12.179688 43.5625 12.226562 43.59375 L 12.242188 43.59375 C 12.273438 43.625 12.320312 43.671875 12.382812 43.6875 C 12.398438 43.6875 12.398438 43.6875 12.414062 43.703125 C 12.445312 43.703125 12.476562 43.71875 12.523438 43.734375 L 12.570312 43.734375 L 12.640625 43.746094 L 12.710938 43.75 C 12.773438 43.75 12.820312 43.75 12.867188 43.734375 L 12.898438 43.734375 C 12.945312 43.71875 12.992188 43.703125 13.023438 43.703125 C 13.023438 43.6875 13.039062 43.6875 13.039062 43.6875 L 13.054688 43.6875 C 13.117188 43.671875 13.148438 43.625 13.195312 43.59375 L 13.210938 43.59375 C 13.242188 43.5625 13.289062 43.53125 13.320312 43.515625 C 13.320312 43.5 13.335938 43.5 13.335938 43.46875 C 13.367188 43.4375 13.398438 43.40625 13.414062 43.375 C 13.414062 43.375 13.429688 43.359375 13.429688 43.359375 C 13.460938 43.328125 13.492188 43.265625 13.507812 43.21875 L 17.335938 34.109375 C 17.523438 33.6875 17.320312 33.171875 16.898438 33 C 16.445312 32.8125 15.945312 33.015625 15.757812 33.453125 L 12.710938 40.6875 L 10.695312 35.890625 C 10.539062 35.546875 10.210938 35.359375 9.882812 35.359375 C 9.539062 35.359375 9.210938 35.546875 9.070312 35.890625 L 7.054688 40.6875 L 3.992188 33.453125 C 3.820312 33.015625 3.304688 32.8125 2.882812 33 C 2.429688 33.171875 2.242188 33.6875 2.414062 34.109375 L 6.257812 43.21875 C 6.289062 43.265625 6.304688 43.328125 6.335938 43.359375 L 6.335938 43.375 C 6.367188 43.40625 6.382812 43.4375 6.414062 43.46875 C 6.429688 43.5 6.429688 43.5 6.445312 43.515625 C 6.492188 43.53125 6.507812 43.5625 6.554688 43.59375 L 6.570312 43.59375 C 6.601562 43.625 6.664062 43.671875 6.710938 43.6875 C 6.726562 43.6875 6.726562 43.6875 6.742188 43.703125 C 6.773438 43.703125 6.804688 43.71875 6.851562 43.734375 L 6.898438 43.734375 L 6.976562 43.746094 L 7.054688 43.75 C 7.101562 43.75 7.148438 43.75 7.195312 43.734375 Z M 25.179688 43.75 C 25.632812 43.75 26.039062 43.359375 26.039062 42.890625 C 26.039062 42.40625 25.632812 42.015625 25.179688 42.015625 L 20.945312 42.015625 L 20.945312 39.140625 L 24.585938 39.140625 C 25.054688 39.140625 25.445312 38.75 25.445312 38.265625 C 25.445312 37.8125 25.054688 37.40625 24.585938 37.40625 L 20.945312 37.40625 L 20.945312 34.546875 L 25.179688 34.546875 C 25.632812 34.546875 26.039062 34.15625 26.039062 33.671875 C 26.039062 33.1875 25.632812 32.8125 25.179688 32.8125 L 20.070312 32.8125 C 19.585938 32.8125 19.210938 33.1875 19.210938 33.671875 L 19.210938 42.890625 C 19.210938 43.359375 19.585938 43.75 20.070312 43.75 C 20.070312 43.75 20.085938 43.734375 20.085938 43.734375 C 20.085938 43.734375 20.085938 43.75 20.117188 43.75 Z M 31.539062 43.75 C 33.382812 43.75 34.882812 42.25 34.882812 40.390625 C 34.882812 39.203125 34.242188 38.15625 33.304688 37.5625 C 33.679688 37.0625 33.898438 36.453125 33.898438 35.78125 C 33.898438 34.140625 32.570312 32.8125 30.929688 32.8125 L 28.710938 32.8125 C 28.242188 32.8125 27.851562 33.1875 27.851562 33.671875 L 27.851562 42.890625 C 27.851562 43.359375 28.242188 43.75 28.710938 43.75 L 28.757812 43.734375 C 28.757812 43.734375 28.757812 43.75 28.773438 43.75 Z M 30.929688 37.046875 L 29.585938 37.046875 L 29.585938 34.546875 L 30.929688 34.546875 C 31.617188 34.546875 32.164062 35.09375 32.164062 35.78125 C 32.164062 36.46875 31.617188 37.046875 30.929688 37.046875 Z M 31.539062 42.015625 L 29.585938 42.015625 L 29.585938 38.78125 L 31.539062 38.78125 C 32.429688 38.796875 33.148438 39.5 33.148438 40.390625 C 33.148438 41.296875 32.429688 42 31.539062 42.015625 Z M 45.664062 43.75 C 46.132812 43.75 46.539062 43.359375 46.539062 42.890625 L 46.539062 33.671875 C 46.539062 33.269531 46.242188 32.9375 45.859375 32.839844 L 45.664062 32.8125 L 45.648438 32.8125 C 45.367188 32.8125 45.117188 32.9375 44.945312 33.171875 L 41.835938 37.484375 L 38.726562 33.171875 C 38.570312 32.9375 38.289062 32.8125 38.039062 32.8125 L 37.992188 32.8125 C 37.523438 32.8125 37.132812 33.203125 37.132812 33.671875 L 37.132812 42.890625 C 37.132812 43.359375 37.523438 43.75 37.992188 43.75 C 38.476562 43.75 38.867188 43.359375 38.867188 42.890625 L 38.867188 36.3125 L 41.101562 39.4375 C 41.273438 39.671875 41.539062 39.796875 41.820312 39.796875 L 41.851562 39.796875 C 42.132812 39.796875 42.382812 39.671875 42.554688 39.4375 L 44.804688 36.3125 L 44.804688 42.890625 C 44.804688 43.359375 45.179688 43.75 45.664062 43.75 Z M 45.664062 43.75 "/>\n      </g>'},webpIcon:{extension:".webp",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 9.234375 43.734375 L 9.28125 43.734375 C 9.3125 43.71875 9.34375 43.703125 9.40625 43.703125 L 9.414062 43.6875 C 9.421875 43.6875 9.421875 43.6875 9.4375 43.6875 C 9.46875 43.671875 9.515625 43.625 9.5625 43.59375 L 9.59375 43.59375 C 9.625 43.5625 9.65625 43.53125 9.6875 43.515625 C 9.6875 43.5 9.703125 43.5 9.703125 43.46875 L 9.796875 43.375 C 9.796875 43.375 9.796875 43.359375 9.8125 43.359375 C 9.828125 43.328125 9.859375 43.265625 9.875 43.21875 L 11.921875 38.375 L 13.96875 43.21875 C 13.984375 43.265625 14 43.328125 14.03125 43.359375 C 14.03125 43.359375 14.03125 43.375 14.0625 43.375 L 14.125 43.46875 C 14.140625 43.5 14.140625 43.5 14.15625 43.515625 L 14.203125 43.546875 L 14.265625 43.59375 C 14.265625 43.59375 14.265625 43.59375 14.28125 43.59375 C 14.3125 43.625 14.359375 43.671875 14.421875 43.6875 C 14.4375 43.6875 14.4375 43.6875 14.453125 43.703125 C 14.484375 43.703125 14.515625 43.71875 14.5625 43.734375 L 14.609375 43.734375 L 14.679688 43.746094 L 14.75 43.75 C 14.8125 43.75 14.859375 43.75 14.90625 43.734375 L 14.9375 43.734375 C 14.984375 43.71875 15.03125 43.703125 15.0625 43.703125 C 15.0625 43.6875 15.078125 43.6875 15.078125 43.6875 L 15.09375 43.6875 C 15.15625 43.671875 15.1875 43.625 15.234375 43.59375 L 15.25 43.59375 C 15.28125 43.5625 15.328125 43.53125 15.359375 43.515625 C 15.359375 43.5 15.375 43.5 15.375 43.46875 C 15.40625 43.4375 15.4375 43.40625 15.453125 43.375 L 15.46875 43.359375 C 15.5 43.328125 15.53125 43.265625 15.546875 43.21875 L 19.375 34.109375 C 19.5625 33.6875 19.359375 33.171875 18.9375 33 C 18.484375 32.8125 17.984375 33.015625 17.796875 33.453125 L 14.75 40.6875 L 12.734375 35.890625 C 12.578125 35.546875 12.25 35.359375 11.921875 35.359375 C 11.578125 35.359375 11.25 35.546875 11.109375 35.890625 L 9.09375 40.6875 L 6.03125 33.453125 C 5.859375 33.015625 5.34375 32.8125 4.921875 33 C 4.46875 33.171875 4.28125 33.6875 4.453125 34.109375 L 8.296875 43.21875 C 8.328125 43.265625 8.34375 43.328125 8.375 43.359375 L 8.375 43.375 C 8.40625 43.40625 8.421875 43.4375 8.453125 43.46875 C 8.46875 43.5 8.46875 43.5 8.484375 43.515625 L 8.539062 43.546875 L 8.59375 43.59375 C 8.59375 43.59375 8.59375 43.59375 8.609375 43.59375 C 8.640625 43.625 8.703125 43.671875 8.75 43.6875 C 8.765625 43.6875 8.765625 43.6875 8.78125 43.703125 C 8.8125 43.703125 8.84375 43.71875 8.890625 43.734375 L 8.9375 43.734375 L 9.015625 43.746094 L 9.09375 43.75 C 9.140625 43.75 9.1875 43.75 9.234375 43.734375 Z M 27.21875 43.75 C 27.671875 43.75 28.078125 43.359375 28.078125 42.890625 C 28.078125 42.40625 27.671875 42.015625 27.21875 42.015625 L 22.984375 42.015625 L 22.984375 39.140625 L 26.625 39.140625 C 27.09375 39.140625 27.484375 38.75 27.484375 38.265625 C 27.484375 37.8125 27.09375 37.40625 26.625 37.40625 L 22.984375 37.40625 L 22.984375 34.546875 L 27.21875 34.546875 C 27.671875 34.546875 28.078125 34.15625 28.078125 33.671875 C 28.078125 33.1875 27.671875 32.8125 27.21875 32.8125 L 22.109375 32.8125 C 21.625 32.8125 21.25 33.1875 21.25 33.671875 L 21.25 42.890625 C 21.25 43.359375 21.625 43.75 22.109375 43.75 L 22.125 43.734375 C 22.125 43.734375 22.125 43.75 22.15625 43.75 Z M 33.578125 43.75 C 35.421875 43.75 36.921875 42.25 36.921875 40.390625 C 36.921875 39.203125 36.28125 38.15625 35.34375 37.5625 C 35.71875 37.0625 35.9375 36.453125 35.9375 35.78125 C 35.9375 34.140625 34.609375 32.8125 32.96875 32.8125 L 30.75 32.8125 C 30.28125 32.8125 29.890625 33.1875 29.890625 33.671875 L 29.890625 42.890625 C 29.890625 43.359375 30.28125 43.75 30.75 43.75 C 30.765625 43.75 30.765625 43.734375 30.796875 43.734375 C 30.796875 43.734375 30.796875 43.75 30.8125 43.75 Z M 32.96875 37.046875 L 31.625 37.046875 L 31.625 34.546875 L 32.96875 34.546875 C 33.65625 34.546875 34.203125 35.09375 34.203125 35.78125 C 34.203125 36.46875 33.65625 37.046875 32.96875 37.046875 Z M 33.578125 42.015625 L 31.625 42.015625 L 31.625 38.78125 L 33.578125 38.78125 C 34.46875 38.796875 35.1875 39.5 35.1875 40.390625 C 35.1875 41.296875 34.46875 42 33.578125 42.015625 Z M 40.03125 43.75 C 40.515625 43.75 40.90625 43.359375 40.90625 42.890625 L 40.90625 39.5 L 42.828125 39.5 C 44.6875 39.5 46.1875 38 46.1875 36.171875 C 46.1875 34.3125 44.6875 32.8125 42.828125 32.8125 L 40.03125 32.8125 C 39.5625 32.8125 39.171875 33.1875 39.171875 33.671875 L 39.171875 42.890625 C 39.171875 43.359375 39.5625 43.75 40.03125 43.75 Z M 42.828125 37.765625 L 40.90625 37.765625 L 40.90625 34.546875 L 42.828125 34.546875 C 43.734375 34.546875 44.4375 35.265625 44.453125 36.171875 C 44.4375 37.046875 43.734375 37.765625 42.828125 37.765625 Z M 42.828125 37.765625 "/>\n      </g>'},wmvIcon:{extension:".wmv",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 8.484375 43.734375 L 8.53125 43.734375 C 8.5625 43.71875 8.59375 43.703125 8.65625 43.703125 L 8.664062 43.6875 C 8.671875 43.6875 8.671875 43.6875 8.6875 43.6875 C 8.71875 43.671875 8.765625 43.625 8.8125 43.59375 L 8.84375 43.59375 C 8.875 43.5625 8.90625 43.53125 8.9375 43.515625 C 8.9375 43.5 8.953125 43.5 8.953125 43.46875 L 9.046875 43.375 C 9.046875 43.375 9.046875 43.359375 9.0625 43.359375 C 9.078125 43.328125 9.109375 43.265625 9.125 43.21875 L 11.171875 38.375 L 13.21875 43.21875 C 13.234375 43.265625 13.25 43.328125 13.28125 43.359375 C 13.28125 43.359375 13.28125 43.375 13.3125 43.375 L 13.375 43.46875 C 13.390625 43.5 13.390625 43.5 13.40625 43.515625 L 13.453125 43.546875 L 13.515625 43.59375 C 13.515625 43.59375 13.515625 43.59375 13.53125 43.59375 C 13.5625 43.625 13.609375 43.671875 13.671875 43.6875 C 13.6875 43.6875 13.6875 43.6875 13.703125 43.703125 C 13.734375 43.703125 13.765625 43.71875 13.8125 43.734375 L 13.859375 43.734375 L 13.929688 43.746094 L 14 43.75 C 14.0625 43.75 14.109375 43.75 14.15625 43.734375 L 14.1875 43.734375 C 14.234375 43.71875 14.28125 43.703125 14.3125 43.703125 C 14.3125 43.6875 14.328125 43.6875 14.328125 43.6875 L 14.34375 43.6875 C 14.40625 43.671875 14.4375 43.625 14.484375 43.59375 L 14.5 43.59375 C 14.53125 43.5625 14.578125 43.53125 14.609375 43.515625 C 14.609375 43.5 14.625 43.5 14.625 43.46875 C 14.65625 43.4375 14.6875 43.40625 14.703125 43.375 L 14.71875 43.359375 C 14.75 43.328125 14.78125 43.265625 14.796875 43.21875 L 18.625 34.109375 C 18.8125 33.6875 18.609375 33.171875 18.1875 33 C 17.734375 32.8125 17.234375 33.015625 17.046875 33.453125 L 14 40.6875 L 11.984375 35.890625 C 11.828125 35.546875 11.5 35.359375 11.171875 35.359375 C 10.828125 35.359375 10.5 35.546875 10.359375 35.890625 L 8.34375 40.6875 L 5.28125 33.453125 C 5.109375 33.015625 4.59375 32.8125 4.171875 33 C 3.71875 33.171875 3.53125 33.6875 3.703125 34.109375 L 7.546875 43.21875 C 7.578125 43.265625 7.59375 43.328125 7.625 43.359375 L 7.625 43.375 C 7.65625 43.40625 7.671875 43.4375 7.703125 43.46875 C 7.71875 43.5 7.71875 43.5 7.734375 43.515625 L 7.789062 43.546875 L 7.84375 43.59375 C 7.84375 43.59375 7.84375 43.59375 7.859375 43.59375 C 7.890625 43.625 7.953125 43.671875 8 43.6875 C 8.015625 43.6875 8.015625 43.6875 8.03125 43.703125 C 8.0625 43.703125 8.09375 43.71875 8.140625 43.734375 L 8.1875 43.734375 L 8.265625 43.746094 L 8.34375 43.75 C 8.390625 43.75 8.4375 43.75 8.484375 43.734375 Z M 29.03125 43.75 C 29.5 43.75 29.90625 43.359375 29.90625 42.890625 L 29.90625 33.671875 C 29.90625 33.269531 29.609375 32.9375 29.226562 32.839844 L 29.03125 32.8125 L 29.015625 32.8125 C 28.734375 32.8125 28.484375 32.9375 28.3125 33.171875 L 25.203125 37.484375 L 22.09375 33.171875 C 21.9375 32.9375 21.65625 32.8125 21.40625 32.8125 L 21.359375 32.8125 C 20.890625 32.8125 20.5 33.203125 20.5 33.671875 L 20.5 42.890625 C 20.5 43.359375 20.890625 43.75 21.359375 43.75 C 21.84375 43.75 22.234375 43.359375 22.234375 42.890625 L 22.234375 36.3125 L 24.46875 39.4375 C 24.640625 39.671875 24.90625 39.796875 25.1875 39.796875 L 25.21875 39.796875 C 25.5 39.796875 25.75 39.671875 25.921875 39.4375 L 28.171875 36.3125 L 28.171875 42.890625 C 28.171875 43.359375 28.546875 43.75 29.03125 43.75 Z M 37.015625 43.734375 L 37.0625 43.734375 C 37.09375 43.71875 37.125 43.703125 37.1875 43.703125 L 37.195312 43.6875 C 37.203125 43.6875 37.203125 43.6875 37.21875 43.6875 C 37.25 43.671875 37.296875 43.625 37.34375 43.59375 L 37.375 43.59375 C 37.40625 43.5625 37.4375 43.53125 37.46875 43.515625 C 37.46875 43.5 37.484375 43.5 37.484375 43.46875 L 37.578125 43.375 C 37.578125 43.375 37.578125 43.359375 37.59375 43.359375 C 37.609375 43.328125 37.640625 43.265625 37.65625 43.21875 L 39.703125 38.375 L 41.75 43.21875 C 41.765625 43.265625 41.78125 43.328125 41.8125 43.359375 C 41.8125 43.359375 41.8125 43.375 41.84375 43.375 L 41.90625 43.46875 C 41.921875 43.5 41.921875 43.5 41.9375 43.515625 L 41.984375 43.546875 L 42.046875 43.59375 C 42.046875 43.59375 42.046875 43.59375 42.0625 43.59375 C 42.09375 43.625 42.140625 43.671875 42.203125 43.6875 C 42.21875 43.6875 42.21875 43.6875 42.234375 43.703125 C 42.265625 43.703125 42.296875 43.71875 42.34375 43.734375 L 42.390625 43.734375 L 42.460938 43.746094 L 42.53125 43.75 C 42.59375 43.75 42.640625 43.75 42.6875 43.734375 L 42.71875 43.734375 C 42.765625 43.71875 42.8125 43.703125 42.84375 43.703125 C 42.84375 43.6875 42.859375 43.6875 42.859375 43.6875 L 42.875 43.6875 C 42.9375 43.671875 42.96875 43.625 43.015625 43.59375 L 43.03125 43.59375 C 43.0625 43.5625 43.109375 43.53125 43.140625 43.515625 C 43.140625 43.5 43.15625 43.5 43.15625 43.46875 C 43.1875 43.4375 43.21875 43.40625 43.234375 43.375 L 43.25 43.359375 C 43.28125 43.328125 43.3125 43.265625 43.328125 43.21875 L 47.15625 34.109375 C 47.34375 33.6875 47.140625 33.171875 46.71875 33 C 46.265625 32.8125 45.765625 33.015625 45.578125 33.453125 L 42.53125 40.6875 L 40.515625 35.890625 C 40.359375 35.546875 40.03125 35.359375 39.703125 35.359375 C 39.359375 35.359375 39.03125 35.546875 38.890625 35.890625 L 36.875 40.6875 L 33.8125 33.453125 C 33.640625 33.015625 33.125 32.8125 32.703125 33 C 32.25 33.171875 32.0625 33.6875 32.234375 34.109375 L 36.078125 43.21875 C 36.109375 43.265625 36.125 43.328125 36.15625 43.359375 L 36.15625 43.375 C 36.1875 43.40625 36.203125 43.4375 36.234375 43.46875 C 36.25 43.5 36.25 43.5 36.265625 43.515625 L 36.320312 43.546875 L 36.375 43.59375 C 36.375 43.59375 36.375 43.59375 36.390625 43.59375 C 36.421875 43.625 36.484375 43.671875 36.53125 43.6875 C 36.546875 43.6875 36.546875 43.6875 36.5625 43.703125 C 36.59375 43.703125 36.625 43.71875 36.671875 43.734375 L 36.71875 43.734375 L 36.796875 43.746094 L 36.875 43.75 C 36.921875 43.75 36.96875 43.75 37.015625 43.734375 Z M 37.015625 43.734375 "/>\n      </g>'},xlsIcon:{extension:".xls",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 17.21875 46.875 C 17.425781 46.875 17.632812 46.800781 17.820312 46.667969 C 18.289062 46.351562 18.363281 45.695312 18.042969 45.242188 L 14.480469 40.367188 L 18.042969 35.53125 C 18.363281 35.0625 18.289062 34.425781 17.820312 34.105469 C 17.351562 33.75 16.730469 33.84375 16.375 34.332031 L 13.226562 38.644531 L 10.054688 34.332031 C 9.738281 33.84375 9.082031 33.75 8.632812 34.105469 C 8.164062 34.425781 8.070312 35.0625 8.386719 35.53125 L 11.949219 40.367188 L 8.386719 45.242188 C 8.070312 45.695312 8.164062 46.351562 8.632812 46.667969 C 8.800781 46.800781 9.007812 46.875 9.230469 46.875 C 9.550781 46.875 9.851562 46.707031 10.054688 46.445312 L 13.226562 42.113281 L 16.375 46.445312 C 16.582031 46.707031 16.882812 46.875 17.21875 46.875 Z M 29.351562 46.875 C 29.894531 46.875 30.382812 46.40625 30.382812 45.84375 C 30.382812 45.261719 29.894531 44.792969 29.351562 44.792969 L 24.269531 44.792969 L 24.269531 34.78125 C 24.269531 34.21875 23.800781 33.75 23.21875 33.75 C 22.636719 33.75 22.1875 34.21875 22.1875 34.78125 L 22.1875 45.84375 C 22.1875 46.335938 22.53125 46.757812 23.007812 46.855469 L 23.222656 46.875 Z M 37.28125 46.855469 C 38.613281 46.855469 39.832031 46.460938 40.75 45.789062 C 41.6875 45.113281 42.363281 44.082031 42.363281 42.882812 C 42.363281 42.300781 42.195312 41.738281 41.914062 41.289062 C 41.480469 40.59375 40.804688 40.105469 40.039062 39.730469 C 39.289062 39.375 38.40625 39.132812 37.449219 38.945312 L 37.414062 38.945312 C 36.398438 38.757812 35.554688 38.457031 35.070312 38.117188 C 34.824219 37.949219 34.65625 37.78125 34.5625 37.632812 C 34.46875 37.480469 34.429688 37.332031 34.429688 37.105469 C 34.429688 36.710938 34.636719 36.300781 35.144531 35.925781 C 35.648438 35.550781 36.398438 35.289062 37.242188 35.289062 C 38.386719 35.289062 39.304688 35.851562 40.261719 36.488281 C 40.710938 36.789062 41.3125 36.65625 41.59375 36.207031 C 41.894531 35.773438 41.761719 35.175781 41.332031 34.875 C 40.375 34.257812 39.042969 33.375 37.242188 33.375 C 36.023438 33.375 34.882812 33.730469 34 34.367188 C 33.136719 35.007812 32.5 35.980469 32.5 37.105469 C 32.5 37.667969 32.648438 38.195312 32.929688 38.644531 C 33.34375 39.300781 33.960938 39.769531 34.675781 40.105469 C 35.386719 40.445312 36.210938 40.667969 37.09375 40.835938 L 37.132812 40.835938 C 38.238281 41.042969 39.15625 41.363281 39.699219 41.71875 C 39.980469 41.90625 40.148438 42.09375 40.261719 42.28125 C 40.375 42.46875 40.429688 42.636719 40.429688 42.882812 C 40.429688 43.351562 40.1875 43.820312 39.625 44.230469 C 39.0625 44.644531 38.21875 44.925781 37.28125 44.925781 C 35.949219 44.945312 34.523438 44.15625 33.699219 43.480469 C 33.289062 43.144531 32.667969 43.199219 32.332031 43.613281 C 32.011719 44.023438 32.070312 44.644531 32.480469 44.980469 C 33.550781 45.824219 35.257812 46.835938 37.28125 46.855469 Z M 37.28125 46.855469 "/>\n      </g>'},xlsxIcon:{extension:".xlsx",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 13.070312 43.75 C 13.242188 43.75 13.414062 43.6875 13.570312 43.578125 C 13.960938 43.3125 14.023438 42.765625 13.757812 42.390625 L 10.789062 38.328125 L 13.757812 34.296875 C 14.023438 33.90625 13.960938 33.375 13.570312 33.109375 C 13.179688 32.8125 12.664062 32.890625 12.367188 33.296875 L 9.742188 36.890625 L 7.101562 33.296875 C 6.835938 32.890625 6.289062 32.8125 5.914062 33.109375 C 5.523438 33.375 5.445312 33.90625 5.710938 34.296875 L 8.679688 38.328125 L 5.710938 42.390625 C 5.445312 42.765625 5.523438 43.3125 5.914062 43.578125 C 6.054688 43.6875 6.226562 43.75 6.414062 43.75 C 6.679688 43.75 6.929688 43.609375 7.101562 43.390625 L 9.742188 39.78125 L 12.367188 43.390625 C 12.539062 43.609375 12.789062 43.75 13.070312 43.75 Z M 23.179688 43.75 C 23.632812 43.75 24.039062 43.359375 24.039062 42.890625 C 24.039062 42.40625 23.632812 42.015625 23.179688 42.015625 L 18.945312 42.015625 L 18.945312 33.671875 C 18.945312 33.203125 18.554688 32.8125 18.070312 32.8125 C 17.585938 32.8125 17.210938 33.203125 17.210938 33.671875 L 17.210938 42.890625 C 17.210938 43.359375 17.585938 43.75 18.070312 43.75 Z M 29.789062 43.734375 C 30.898438 43.734375 31.914062 43.40625 32.679688 42.84375 C 33.460938 42.28125 34.023438 41.421875 34.023438 40.421875 C 34.023438 39.9375 33.882812 39.46875 33.648438 39.09375 C 33.289062 38.515625 32.726562 38.109375 32.085938 37.796875 C 31.460938 37.5 30.726562 37.296875 29.929688 37.140625 L 29.898438 37.140625 C 29.054688 36.984375 28.351562 36.734375 27.945312 36.453125 C 27.742188 36.3125 27.601562 36.171875 27.523438 36.046875 C 27.445312 35.921875 27.414062 35.796875 27.414062 35.609375 C 27.414062 35.28125 27.585938 34.9375 28.007812 34.625 C 28.429688 34.3125 29.054688 34.09375 29.757812 34.09375 C 30.710938 34.09375 31.476562 34.5625 32.273438 35.09375 C 32.648438 35.34375 33.148438 35.234375 33.382812 34.859375 C 33.632812 34.5 33.523438 34 33.164062 33.75 C 32.367188 33.234375 31.257812 32.5 29.757812 32.5 C 28.742188 32.5 27.789062 32.796875 27.054688 33.328125 C 26.335938 33.859375 25.804688 34.671875 25.804688 35.609375 C 25.804688 36.078125 25.929688 36.515625 26.164062 36.890625 C 26.507812 37.4375 27.023438 37.828125 27.617188 38.109375 C 28.210938 38.390625 28.898438 38.578125 29.632812 38.71875 L 29.664062 38.71875 C 30.585938 38.890625 31.351562 39.15625 31.804688 39.453125 C 32.039062 39.609375 32.179688 39.765625 32.273438 39.921875 C 32.367188 40.078125 32.414062 40.21875 32.414062 40.421875 C 32.414062 40.8125 32.210938 41.203125 31.742188 41.546875 C 31.273438 41.890625 30.570312 42.125 29.789062 42.125 C 28.679688 42.140625 27.492188 41.484375 26.804688 40.921875 C 26.460938 40.640625 25.945312 40.6875 25.664062 41.03125 C 25.398438 41.375 25.445312 41.890625 25.789062 42.171875 C 26.679688 42.875 28.101562 43.71875 29.789062 43.734375 Z M 43.179688 43.75 C 43.351562 43.75 43.523438 43.6875 43.679688 43.578125 C 44.070312 43.3125 44.132812 42.765625 43.867188 42.390625 L 40.898438 38.328125 L 43.867188 34.296875 C 44.132812 33.90625 44.070312 33.375 43.679688 33.109375 C 43.289062 32.8125 42.773438 32.890625 42.476562 33.296875 L 39.851562 36.890625 L 37.210938 33.296875 C 36.945312 32.890625 36.398438 32.8125 36.023438 33.109375 C 35.632812 33.375 35.554688 33.90625 35.820312 34.296875 L 38.789062 38.328125 L 35.820312 42.390625 C 35.554688 42.765625 35.632812 43.3125 36.023438 43.578125 C 36.164062 43.6875 36.335938 43.75 36.523438 43.75 C 36.789062 43.75 37.039062 43.609375 37.210938 43.390625 L 39.851562 39.78125 L 42.476562 43.390625 C 42.648438 43.609375 42.898438 43.75 43.179688 43.75 Z M 43.179688 43.75 "/>\n      </g>'},zipIcon:{extension:".zip",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 20.175781 46.875 C 20.855469 46.875 21.402344 46.351562 21.402344 45.671875 C 21.402344 44.992188 20.855469 44.445312 20.175781 44.445312 L 13.132812 44.445312 L 21.183594 33.488281 L 21.183594 33.445312 C 21.203125 33.421875 21.226562 33.378906 21.25 33.335938 C 21.269531 33.3125 21.269531 33.289062 21.292969 33.269531 C 21.3125 33.203125 21.3125 33.179688 21.335938 33.136719 C 21.335938 33.09375 21.378906 33.070312 21.378906 33.007812 C 21.378906 32.984375 21.378906 32.960938 21.402344 32.917969 L 21.402344 32.679688 C 21.402344 32.632812 21.402344 32.613281 21.378906 32.546875 C 21.378906 32.503906 21.378906 32.480469 21.335938 32.4375 C 21.335938 32.414062 21.3125 32.371094 21.3125 32.304688 C 21.292969 32.285156 21.269531 32.242188 21.269531 32.21875 C 21.25 32.195312 21.226562 32.152344 21.203125 32.109375 C 21.183594 32.066406 21.160156 32.042969 21.117188 32.023438 C 21.09375 32 21.074219 31.957031 21.050781 31.933594 C 21.03125 31.914062 21.007812 31.867188 20.964844 31.847656 C 20.941406 31.824219 20.941406 31.804688 20.898438 31.78125 L 20.875 31.78125 C 20.832031 31.757812 20.8125 31.738281 20.765625 31.714844 C 20.746094 31.695312 20.722656 31.648438 20.65625 31.648438 L 20.570312 31.605469 L 20.4375 31.585938 C 20.417969 31.585938 20.375 31.5625 20.351562 31.5625 L 10.75 31.5625 C 10.070312 31.5625 9.546875 32.085938 9.546875 32.765625 C 9.546875 33.421875 10.070312 33.992188 10.75 33.992188 L 17.8125 33.992188 L 9.785156 44.972656 L 9.765625 44.972656 C 9.742188 45.015625 9.71875 45.058594 9.699219 45.082031 C 9.699219 45.101562 9.675781 45.148438 9.632812 45.167969 C 9.632812 45.210938 9.609375 45.257812 9.609375 45.277344 C 9.589844 45.320312 9.589844 45.367188 9.566406 45.386719 L 9.566406 45.496094 C 9.546875 45.539062 9.546875 45.585938 9.546875 45.648438 L 9.546875 45.738281 C 9.546875 45.78125 9.566406 45.824219 9.566406 45.890625 C 9.566406 45.933594 9.589844 45.957031 9.589844 45.976562 L 9.632812 46.109375 C 9.632812 46.152344 9.675781 46.175781 9.699219 46.21875 C 9.699219 46.242188 9.71875 46.261719 9.742188 46.328125 C 9.765625 46.351562 9.785156 46.394531 9.808594 46.414062 C 9.828125 46.4375 9.851562 46.460938 9.894531 46.480469 L 9.9375 46.542969 L 9.984375 46.589844 C 10.003906 46.613281 10.027344 46.632812 10.046875 46.632812 L 10.046875 46.65625 C 10.070312 46.679688 10.09375 46.679688 10.136719 46.699219 C 10.179688 46.722656 10.222656 46.742188 10.246094 46.742188 C 10.265625 46.789062 10.289062 46.789062 10.3125 46.808594 C 10.375 46.808594 10.421875 46.832031 10.464844 46.832031 C 10.484375 46.851562 10.507812 46.851562 10.53125 46.851562 L 10.648438 46.871094 Z M 26.214844 46.875 C 26.871094 46.875 27.4375 46.351562 27.4375 45.671875 L 27.4375 32.765625 C 27.4375 32.085938 26.871094 31.5625 26.214844 31.5625 C 25.535156 31.5625 25.011719 32.085938 25.011719 32.765625 L 25.011719 45.671875 C 25.011719 46.351562 25.535156 46.875 26.214844 46.875 Z M 32.734375 46.875 C 33.410156 46.875 33.957031 46.328125 33.957031 45.671875 L 33.957031 40.925781 L 36.648438 40.925781 C 39.25 40.925781 41.351562 38.824219 41.351562 36.265625 C 41.351562 33.664062 39.25 31.5625 36.648438 31.5625 L 32.734375 31.5625 C 32.078125 31.5625 31.53125 32.085938 31.53125 32.765625 L 31.53125 45.671875 C 31.53125 46.328125 32.078125 46.875 32.734375 46.875 Z M 36.648438 38.496094 L 33.957031 38.496094 L 33.957031 33.992188 L 36.648438 33.992188 C 37.917969 33.992188 38.902344 34.996094 38.921875 36.265625 C 38.902344 37.492188 37.917969 38.496094 36.648438 38.496094 Z M 36.648438 38.496094 "/>\n      </g>'},docxIcon:{extension:".docx",path:'<g id="surface9" clip-path="url(#clip1)">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      </g>\n      </defs>\n      <g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <use xlink:href="#surface9" mask="url(#mask0)"/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 7.789062 43.75 C 9.589844 43.75 10.988281 43.269531 11.984375 42.304688 C 12.980469 41.339844 13.476562 39.984375 13.476562 38.234375 C 13.476562 36.496094 12.980469 35.144531 11.984375 34.179688 C 10.988281 33.214844 9.589844 32.734375 7.789062 32.734375 L 4.695312 32.734375 C 4.394531 32.734375 4.15625 32.816406 3.984375 32.984375 C 3.8125 33.152344 3.726562 33.386719 3.726562 33.6875 L 3.726562 42.796875 C 3.726562 43.097656 3.8125 43.332031 3.984375 43.5 C 4.15625 43.667969 4.394531 43.75 4.695312 43.75 Z M 7.664062 42.109375 L 5.742188 42.109375 L 5.742188 34.375 L 7.664062 34.375 C 10.195312 34.375 11.460938 35.660156 11.460938 38.234375 C 11.460938 40.816406 10.195312 42.109375 7.664062 42.109375 Z M 20.414062 43.890625 C 21.476562 43.890625 22.402344 43.660156 23.1875 43.203125 C 23.972656 42.746094 24.582031 42.089844 25.007812 41.234375 C 25.433594 40.378906 25.648438 39.378906 25.648438 38.234375 C 25.648438 37.089844 25.4375 36.089844 25.015625 35.242188 C 24.59375 34.394531 23.988281 33.738281 23.203125 33.28125 C 22.417969 32.824219 21.488281 32.59375 20.414062 32.59375 C 19.339844 32.59375 18.410156 32.824219 17.617188 33.28125 C 16.824219 33.738281 16.21875 34.394531 15.796875 35.242188 C 15.375 36.089844 15.164062 37.089844 15.164062 38.234375 C 15.164062 39.378906 15.378906 40.378906 15.804688 41.234375 C 16.230469 42.089844 16.839844 42.746094 17.625 43.203125 C 18.410156 43.660156 19.339844 43.890625 20.414062 43.890625 Z M 20.414062 42.28125 C 19.394531 42.28125 18.597656 41.933594 18.03125 41.234375 C 17.464844 40.535156 17.179688 39.535156 17.179688 38.234375 C 17.179688 36.933594 17.464844 35.933594 18.03125 35.242188 C 18.597656 34.550781 19.394531 34.203125 20.414062 34.203125 C 21.425781 34.203125 22.214844 34.550781 22.78125 35.242188 C 23.347656 35.933594 23.632812 36.933594 23.632812 38.234375 C 23.632812 39.535156 23.347656 40.535156 22.78125 41.234375 C 22.214844 41.933594 21.425781 42.28125 20.414062 42.28125 Z M 32.601562 43.890625 C 33.289062 43.890625 33.933594 43.789062 34.539062 43.585938 C 35.144531 43.382812 35.679688 43.089844 36.148438 42.703125 C 36.285156 42.597656 36.378906 42.488281 36.429688 42.367188 C 36.480469 42.246094 36.507812 42.109375 36.507812 41.953125 C 36.507812 41.722656 36.445312 41.53125 36.320312 41.375 C 36.195312 41.21875 36.042969 41.140625 35.867188 41.140625 C 35.753906 41.140625 35.644531 41.160156 35.539062 41.203125 C 35.433594 41.246094 35.332031 41.296875 35.226562 41.359375 C 34.746094 41.683594 34.316406 41.910156 33.9375 42.046875 C 33.558594 42.183594 33.144531 42.25 32.695312 42.25 C 31.613281 42.25 30.792969 41.910156 30.234375 41.234375 C 29.675781 40.558594 29.398438 39.558594 29.398438 38.234375 C 29.398438 36.921875 29.675781 35.925781 30.234375 35.25 C 30.792969 34.574219 31.613281 34.234375 32.695312 34.234375 C 33.164062 34.234375 33.589844 34.300781 33.976562 34.429688 C 34.363281 34.558594 34.777344 34.792969 35.226562 35.125 C 35.445312 35.269531 35.660156 35.34375 35.867188 35.34375 C 36.042969 35.34375 36.195312 35.265625 36.320312 35.109375 C 36.445312 34.953125 36.507812 34.761719 36.507812 34.53125 C 36.507812 34.363281 36.480469 34.222656 36.429688 34.109375 C 36.378906 33.996094 36.285156 33.886719 36.148438 33.78125 C 35.679688 33.394531 35.144531 33.101562 34.539062 32.898438 C 33.933594 32.695312 33.289062 32.59375 32.601562 32.59375 C 31.539062 32.59375 30.609375 32.824219 29.8125 33.28125 C 29.015625 33.738281 28.402344 34.394531 27.976562 35.242188 C 27.550781 36.089844 27.335938 37.089844 27.335938 38.234375 C 27.335938 39.378906 27.550781 40.378906 27.976562 41.234375 C 28.402344 42.089844 29.015625 42.746094 29.8125 43.203125 C 30.609375 43.660156 31.539062 43.890625 32.601562 43.890625 Z M 46.132812 43.84375 C 46.382812 43.84375 46.605469 43.75 46.796875 43.5625 C 46.988281 43.375 47.085938 43.15625 47.085938 42.90625 C 47.085938 42.707031 47.003906 42.511719 46.835938 42.3125 L 43.445312 38.15625 L 46.710938 34.171875 C 46.867188 34.003906 46.945312 33.808594 46.945312 33.578125 C 46.945312 33.328125 46.847656 33.113281 46.65625 32.929688 C 46.464844 32.746094 46.242188 32.65625 45.992188 32.65625 C 45.730469 32.65625 45.507812 32.769531 45.320312 33 L 42.273438 36.765625 L 39.226562 33 C 39.027344 32.769531 38.800781 32.65625 38.539062 32.65625 C 38.289062 32.65625 38.070312 32.746094 37.882812 32.929688 C 37.695312 33.113281 37.601562 33.328125 37.601562 33.578125 C 37.601562 33.808594 37.679688 34.003906 37.835938 34.171875 L 41.101562 38.15625 L 37.695312 42.3125 C 37.539062 42.5 37.460938 42.699219 37.460938 42.90625 C 37.460938 43.15625 37.558594 43.371094 37.75 43.554688 C 37.941406 43.738281 38.164062 43.828125 38.414062 43.828125 C 38.675781 43.828125 38.898438 43.71875 39.085938 43.5 L 42.273438 39.5625 L 45.445312 43.5 C 45.644531 43.730469 45.871094 43.84375 46.132812 43.84375 Z M 46.132812 43.84375 "/>\n      </g>'},jpgIcon:{extension:".jpg",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <use xlink:href="#surface9" mask="url(#mask0)"/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 8.789062 47.007812 L 9.488281 46.960938 C 12.214844 46.757812 13.578125 45.277344 13.578125 42.523438 L 13.578125 32.742188 C 13.578125 32.320312 13.453125 31.980469 13.195312 31.726562 C 12.941406 31.472656 12.59375 31.34375 12.15625 31.34375 C 11.734375 31.34375 11.394531 31.472656 11.140625 31.726562 C 10.886719 31.980469 10.757812 32.320312 10.757812 32.742188 L 10.757812 42.523438 C 10.757812 43.238281 10.605469 43.769531 10.296875 44.117188 C 9.992188 44.46875 9.539062 44.660156 8.941406 44.6875 L 8.242188 44.730469 C 7.847656 44.761719 7.558594 44.867188 7.378906 45.046875 C 7.195312 45.230469 7.105469 45.496094 7.105469 45.847656 C 7.105469 46.664062 7.667969 47.050781 8.789062 47.007812 Z M 18.304688 47.007812 C 18.742188 47.007812 19.089844 46.878906 19.34375 46.625 C 19.597656 46.367188 19.726562 46.023438 19.726562 45.585938 L 19.726562 40.882812 L 23.640625 40.882812 C 25.289062 40.882812 26.574219 40.464844 27.492188 39.632812 C 28.410156 38.804688 28.871094 37.644531 28.871094 36.15625 C 28.871094 34.667969 28.410156 33.511719 27.492188 32.6875 C 26.574219 31.863281 25.289062 31.453125 23.640625 31.453125 L 18.261719 31.453125 C 17.839844 31.453125 17.507812 31.570312 17.265625 31.804688 C 17.023438 32.035156 16.90625 32.363281 16.90625 32.789062 L 16.90625 45.585938 C 16.90625 46.023438 17.03125 46.367188 17.289062 46.625 C 17.542969 46.878906 17.882812 47.007812 18.304688 47.007812 Z M 23.292969 38.714844 L 19.726562 38.714844 L 19.726562 33.640625 L 23.292969 33.640625 C 25.230469 33.640625 26.203125 34.488281 26.203125 36.179688 C 26.203125 37.871094 25.230469 38.714844 23.292969 38.714844 Z M 38.605469 47.070312 C 39.320312 47.070312 40.0625 47.011719 40.835938 46.898438 C 41.609375 46.78125 42.285156 46.621094 42.871094 46.414062 C 43.410156 46.242188 43.765625 46.015625 43.941406 45.738281 C 44.117188 45.460938 44.203125 44.988281 44.203125 44.316406 L 44.203125 39.613281 C 44.203125 39.292969 44.101562 39.03125 43.898438 38.835938 C 43.695312 38.640625 43.425781 38.539062 43.089844 38.539062 L 39.21875 38.539062 C 38.867188 38.539062 38.59375 38.628906 38.398438 38.804688 C 38.199219 38.976562 38.101562 39.226562 38.101562 39.546875 C 38.101562 39.867188 38.199219 40.117188 38.398438 40.289062 C 38.59375 40.464844 38.867188 40.554688 39.21875 40.554688 L 41.6875 40.554688 L 41.6875 44.425781 C 40.699219 44.703125 39.707031 44.839844 38.714844 44.839844 C 35.390625 44.839844 33.726562 42.945312 33.726562 39.152344 C 33.726562 37.300781 34.132812 35.90625 34.941406 34.964844 C 35.75 34.023438 36.949219 33.554688 38.539062 33.554688 C 39.238281 33.554688 39.867188 33.644531 40.421875 33.828125 C 40.972656 34.007812 41.574219 34.324219 42.214844 34.777344 C 42.390625 34.894531 42.542969 34.980469 42.671875 35.03125 C 42.804688 35.082031 42.949219 35.105469 43.109375 35.105469 C 43.359375 35.105469 43.570312 34.996094 43.746094 34.777344 C 43.921875 34.558594 44.007812 34.289062 44.007812 33.96875 C 44.007812 33.75 43.96875 33.558594 43.886719 33.398438 C 43.808594 33.238281 43.679688 33.078125 43.503906 32.917969 C 42.191406 31.808594 40.507812 31.257812 38.453125 31.257812 C 36.90625 31.257812 35.5625 31.574219 34.425781 32.207031 C 33.289062 32.84375 32.410156 33.753906 31.789062 34.941406 C 31.171875 36.128906 30.859375 37.535156 30.859375 39.152344 C 30.859375 40.800781 31.171875 42.21875 31.789062 43.40625 C 32.410156 44.597656 33.304688 45.503906 34.46875 46.132812 C 35.636719 46.757812 37.015625 47.070312 38.605469 47.070312 Z M 38.605469 47.070312 "/>\n      </g>'},mp3Icon:{extension:".mp3",path:'<g id="surface9" clip-path="url(#clip1)">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 43.828125 43.710938 C 43.605469 44.28125 43.273438 44.804688 42.84375 45.265625 C 42.40625 45.730469 41.867188 46.113281 41.242188 46.398438 C 40.597656 46.699219 39.851562 46.855469 39.027344 46.855469 C 38.328125 46.855469 37.703125 46.757812 37.160156 46.570312 C 36.609375 46.378906 36.160156 46.136719 35.769531 45.839844 C 35.386719 45.550781 35.050781 45.210938 34.796875 44.832031 C 34.570312 44.507812 34.394531 44.195312 34.265625 43.890625 C 34.140625 43.59375 34.054688 43.335938 33.996094 43.101562 C 33.792969 42.261719 34.304688 41.417969 35.140625 41.210938 C 35.980469 41.007812 36.828125 41.519531 37.03125 42.355469 C 37.039062 42.390625 37.066406 42.488281 37.144531 42.671875 C 37.191406 42.777344 37.265625 42.914062 37.371094 43.0625 C 37.4375 43.160156 37.53125 43.257812 37.65625 43.351562 C 37.792969 43.453125 37.972656 43.542969 38.195312 43.625 C 38.332031 43.667969 38.59375 43.730469 39.027344 43.730469 C 39.390625 43.730469 39.695312 43.675781 39.925781 43.566406 C 40.1875 43.445312 40.398438 43.300781 40.558594 43.132812 C 40.71875 42.957031 40.839844 42.773438 40.914062 42.578125 C 40.996094 42.371094 41.03125 42.195312 41.03125 42.023438 C 41.03125 41.789062 41 41.585938 40.921875 41.398438 C 40.871094 41.257812 40.785156 41.148438 40.660156 41.039062 C 40.515625 40.910156 40.296875 40.792969 40.011719 40.699219 C 39.6875 40.59375 39.253906 40.539062 38.738281 40.535156 C 37.882812 40.527344 37.1875 39.832031 37.1875 38.972656 L 37.1875 38.832031 C 37.1875 37.984375 37.859375 37.292969 38.699219 37.265625 C 39.070312 37.257812 39.398438 37.195312 39.679688 37.101562 C 39.921875 37.011719 40.121094 36.902344 40.273438 36.773438 C 40.40625 36.652344 40.507812 36.519531 40.582031 36.359375 C 40.652344 36.210938 40.6875 36.027344 40.6875 35.8125 C 40.6875 35.523438 40.644531 35.289062 40.574219 35.125 C 40.5 34.96875 40.414062 34.847656 40.304688 34.757812 C 40.1875 34.660156 40.042969 34.582031 39.867188 34.53125 C 39.402344 34.386719 38.878906 34.398438 38.480469 34.542969 C 38.289062 34.617188 38.121094 34.714844 37.976562 34.84375 C 37.820312 34.984375 37.695312 35.148438 37.59375 35.339844 C 37.484375 35.550781 37.40625 35.773438 37.367188 36.039062 C 37.230469 36.890625 36.429688 37.472656 35.574219 37.335938 C 34.722656 37.195312 34.140625 36.398438 34.28125 35.542969 C 34.378906 34.9375 34.5625 34.378906 34.835938 33.871094 C 35.109375 33.355469 35.464844 32.898438 35.890625 32.519531 C 36.320312 32.132812 36.824219 31.828125 37.382812 31.617188 C 38.433594 31.226562 39.667969 31.199219 40.78125 31.539062 C 41.351562 31.714844 41.863281 31.992188 42.308594 32.355469 C 42.777344 32.753906 43.148438 33.242188 43.414062 33.824219 C 43.679688 34.402344 43.8125 35.070312 43.8125 35.8125 C 43.8125 36.476562 43.679688 37.097656 43.421875 37.660156 C 43.25 38.046875 43.023438 38.394531 42.746094 38.707031 C 43.242188 39.148438 43.609375 39.671875 43.835938 40.261719 C 44.046875 40.804688 44.15625 41.398438 44.15625 42.023438 C 44.15625 42.578125 44.046875 43.148438 43.828125 43.710938 Z M 31.445312 38.492188 C 31.148438 39.140625 30.734375 39.703125 30.199219 40.164062 C 29.6875 40.605469 29.078125 40.957031 28.390625 41.199219 C 27.71875 41.4375 26.976562 41.5625 26.191406 41.5625 L 25 41.5625 L 25 45 C 25 45.859375 24.296875 46.5625 23.4375 46.5625 C 22.578125 46.5625 21.875 45.859375 21.875 45 L 21.875 32.8125 C 21.875 31.945312 22.578125 31.25 23.4375 31.25 L 26.191406 31.25 C 27.890625 31.25 29.257812 31.667969 30.253906 32.5 C 31.339844 33.398438 31.886719 34.714844 31.886719 36.40625 C 31.886719 37.148438 31.738281 37.851562 31.445312 38.492188 Z M 18.730469 45.210938 C 18.730469 46.070312 18.03125 46.773438 17.167969 46.773438 C 16.300781 46.773438 15.605469 46.070312 15.605469 45.210938 L 15.605469 39.28125 L 14.015625 43.140625 C 14.007812 43.164062 13.996094 43.191406 13.984375 43.214844 C 13.71875 43.777344 13.15625 44.117188 12.566406 44.117188 L 12.53125 44.117188 C 11.9375 44.117188 11.375 43.777344 11.109375 43.214844 L 11.082031 43.160156 L 9.339844 39.101562 L 9.339844 45.210938 C 9.339844 46.070312 8.640625 46.773438 7.777344 46.773438 C 6.910156 46.773438 6.214844 46.070312 6.214844 45.210938 L 6.214844 32.824219 C 6.214844 31.960938 6.910156 31.261719 7.777344 31.261719 L 7.835938 31.261719 C 8.472656 31.261719 9.046875 31.617188 9.335938 32.1875 L 12.527344 39.09375 L 15.59375 32.207031 C 15.894531 31.617188 16.46875 31.261719 17.105469 31.261719 L 17.167969 31.261719 C 18.03125 31.261719 18.730469 31.960938 18.730469 32.824219 Z M 41.382812 28.125 L 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.136719 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.136719 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 41.382812 28.125 "/>\n      </g>\n      </defs>\n      <g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <use xlink:href="#surface9" mask="url(#mask0)"/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 28.257812 34.902344 C 27.835938 34.550781 27.140625 34.375 26.191406 34.375 L 25 34.375 L 25 38.4375 L 26.191406 38.4375 C 26.621094 38.4375 27.007812 38.375 27.34375 38.253906 C 27.667969 38.140625 27.929688 37.992188 28.148438 37.804688 C 28.34375 37.632812 28.492188 37.4375 28.601562 37.195312 C 28.710938 36.964844 28.757812 36.703125 28.757812 36.40625 C 28.757812 35.324219 28.382812 35.003906 28.257812 34.902344 "/>\n      <path style="fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(99.607843%,99.607843%,99.607843%);stroke-opacity:1;stroke-miterlimit:4;" d="M 11.34125 13.57875 C 11.345 13.5925 11.3525 13.62375 11.36375 13.67375 C 11.3775 13.7225 11.3975 13.78125 11.42625 13.85 C 11.45375 13.9175 11.49375 13.9875 11.54625 14.0625 C 11.5975 14.13875 11.66625 14.20875 11.75 14.27125 C 11.83375 14.33625 11.9375 14.38875 12.0575 14.43125 C 12.1775 14.4725 12.32 14.49375 12.4875 14.49375 C 12.67875 14.49375 12.845 14.46125 12.9875 14.39375 C 13.13 14.32875 13.24875 14.245 13.34375 14.1425 C 13.43875 14.0425 13.51125 13.93 13.55875 13.8075 C 13.6075 13.6825 13.63125 13.56375 13.63125 13.4475 C 13.63125 13.31125 13.6075 13.1825 13.5625 13.065 C 13.515 12.9475 13.4425 12.845 13.3425 12.7575 C 13.2425 12.67 13.115 12.6 12.96 12.55 C 12.805 12.49875 12.6175 12.4725 12.4 12.4725 L 12.4 12.42625 C 12.57 12.42 12.72375 12.3925 12.8625 12.34375 C 13.0025 12.29625 13.11875 12.2275 13.21625 12.14375 C 13.31375 12.05875 13.3875 11.96 13.44125 11.845 C 13.4925 11.7275 13.52 11.60125 13.52 11.46 C 13.52 11.29375 13.4925 11.1525 13.43875 11.0325 C 13.38375 10.91375 13.31125 10.81625 13.21875 10.74 C 13.1275 10.66375 13.0225 10.6075 12.90375 10.5725 C 12.78625 10.535 12.66375 10.5175 12.5375 10.5175 C 12.395 10.5175 12.26125 10.54 12.14 10.58625 C 12.0175 10.6325 11.91 10.69625 11.81875 10.77875 C 11.72625 10.8625 11.64875 10.96 11.5875 11.07375 C 11.5275 11.18875 11.48625 11.315 11.4625 11.45375 M 7.5 14.4 L 7.5 10.5 L 8.3825 10.5 C 8.8075 10.5 9.13375 10.595 9.3625 10.78375 C 9.59 10.975 9.7025 11.2625 9.7025 11.65 C 9.7025 11.81625 9.6725 11.97125 9.6075 12.11125 C 9.5425 12.2525 9.4525 12.37375 9.335 12.475 C 9.21875 12.5775 9.0775 12.65625 8.9175 12.71375 C 8.75625 12.77125 8.5775 12.8 8.3825 12.8 L 7.6 12.8 M 2.4875 14.4675 L 2.4875 10.50375 L 2.5075 10.50375 C 2.5225 10.50375 2.53375 10.5125 2.5425 10.52625 L 3.9925 13.58625 C 3.99875 13.5975 4.005 13.6075 4.00875 13.6175 M 4.02125 13.6175 C 4.02625 13.6075 4.03125 13.5975 4.0375 13.58625 L 5.44 10.52625 C 5.4475 10.5125 5.45875 10.50375 5.4725 10.50375 L 5.4925 10.50375 L 5.4925 14.4675 " transform="matrix(3.125,0,0,3.125,0,0)"/>\n      </g>'},mp4Icon:{extension:".mp4",path:'<g id="surface6" clip-path="url(#clip1)">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 36.898438 40.625 L 40.625 35.480469 L 40.625 40.625 Z M 28.761719 36.40625 C 28.761719 36.703125 28.707031 36.964844 28.605469 37.195312 C 28.496094 37.433594 28.347656 37.632812 28.148438 37.804688 C 27.929688 37.992188 27.667969 38.144531 27.34375 38.257812 C 27.003906 38.375 26.621094 38.4375 26.191406 38.4375 L 25 38.4375 L 25 34.375 L 26.191406 34.375 C 27.140625 34.375 27.835938 34.554688 28.253906 34.902344 C 28.378906 35.007812 28.761719 35.324219 28.761719 36.40625 Z M 44.6875 43.75 L 43.75 43.75 L 43.75 45.3125 C 43.75 46.175781 43.050781 46.875 42.1875 46.875 C 41.324219 46.875 40.625 46.175781 40.625 45.3125 L 40.625 43.75 L 34.066406 43.75 C 33.199219 43.75 32.503906 43.050781 32.503906 42.1875 L 32.503906 41.875 C 32.503906 41.546875 32.605469 41.226562 32.800781 40.957031 L 39.363281 31.898438 C 39.660156 31.492188 40.128906 31.25 40.628906 31.25 L 42.1875 31.25 C 43.050781 31.25 43.75 31.949219 43.75 32.8125 L 43.75 40.625 L 44.6875 40.625 C 45.550781 40.625 46.25 41.324219 46.25 42.1875 C 46.25 43.050781 45.550781 43.75 44.6875 43.75 Z M 31.445312 38.492188 C 31.148438 39.140625 30.730469 39.703125 30.195312 40.167969 C 29.6875 40.605469 29.082031 40.957031 28.390625 41.203125 C 27.71875 41.441406 26.976562 41.5625 26.191406 41.5625 L 25 41.5625 L 25 45 C 25 45.863281 24.300781 46.5625 23.4375 46.5625 C 22.578125 46.5625 21.875 45.863281 21.875 45 L 21.875 32.8125 C 21.875 31.949219 22.578125 31.25 23.4375 31.25 L 26.191406 31.25 C 27.890625 31.25 29.257812 31.671875 30.253906 32.5 C 31.339844 33.398438 31.886719 34.714844 31.886719 36.40625 C 31.886719 37.148438 31.738281 37.851562 31.445312 38.492188 Z M 18.730469 45.210938 C 18.730469 46.070312 18.027344 46.773438 17.167969 46.773438 C 16.300781 46.773438 15.605469 46.070312 15.605469 45.210938 L 15.605469 39.6875 L 14.035156 43.105469 C 14.019531 43.144531 14.003906 43.179688 13.984375 43.214844 C 13.71875 43.78125 13.15625 44.117188 12.566406 44.117188 L 12.53125 44.117188 C 11.941406 44.117188 11.378906 43.78125 11.113281 43.214844 C 11.097656 43.183594 11.078125 43.152344 11.066406 43.125 L 9.339844 39.484375 L 9.339844 45.210938 C 9.339844 46.070312 8.640625 46.773438 7.777344 46.773438 C 6.910156 46.773438 6.214844 46.070312 6.214844 45.210938 L 6.214844 32.824219 C 6.214844 31.960938 6.910156 31.261719 7.777344 31.261719 L 7.835938 31.261719 C 8.472656 31.261719 9.046875 31.617188 9.335938 32.191406 L 9.355469 32.226562 L 12.523438 38.90625 L 15.578125 32.242188 C 15.585938 32.226562 15.597656 32.210938 15.605469 32.191406 C 15.894531 31.617188 16.46875 31.261719 17.105469 31.261719 L 17.164062 31.261719 C 18.027344 31.261719 18.726562 31.960938 18.726562 32.824219 L 18.726562 45.210938 Z M 41.382812 28.125 L 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 41.382812 28.125 "/>\n      </g>\n      </defs>\n      <g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <use xlink:href="#surface6" mask="url(#mask0)"/>\n      <path style="fill:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(99.607843%,99.607843%,99.607843%);stroke-opacity:1;stroke-miterlimit:4;" d="M 14.3 13.5 L 10.90125 13.5 L 10.90125 13.4 L 13.00125 10.5 L 13.5 10.5 L 13.5 14.5 M 7.5 14.4 L 7.5 10.5 L 8.3825 10.5 C 8.8075 10.5 9.13375 10.595 9.3625 10.78375 C 9.59 10.975 9.7025 11.2625 9.7025 11.65 C 9.7025 11.81625 9.6725 11.97125 9.6075 12.11125 C 9.5425 12.2525 9.4525 12.37375 9.335 12.47625 C 9.21875 12.5775 9.0775 12.65625 8.9175 12.71375 C 8.75625 12.77125 8.5775 12.8 8.3825 12.8 L 7.6 12.8 M 2.4875 14.4675 L 2.4875 10.50375 L 2.5075 10.50375 C 2.5225 10.50375 2.53375 10.5125 2.5425 10.52625 L 3.9925 13.58625 C 3.99875 13.5975 4.005 13.6075 4.00875 13.6175 M 4.02125 13.6175 C 4.02625 13.6075 4.03125 13.5975 4.0375 13.58625 L 5.44 10.52625 C 5.4475 10.5125 5.45875 10.50375 5.4725 10.50375 L 5.4925 10.50375 L 5.4925 14.4675 " transform="matrix(3.125,0,0,3.125,0,0)"/>\n      </g>'},oggIcon:{extension:".ogg",path:'<g id="surface9" clip-path="url(#clip1)">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.621094 28.125 C 3.859375 28.125 0 31.984375 0 36.742188 L 0 41.378906 C 0 46.140625 3.859375 50 8.621094 50 L 41.378906 50 C 46.140625 50 50 46.140625 50 41.382812 L 50 36.746094 C 50 31.984375 46.140625 28.125 41.382812 28.125 Z M 8.621094 28.125 "/>\n      </g>\n      </defs>\n      <g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.578125 25 L 39.421875 25 C 41.53125 25 43.527344 25.492188 45.3125 26.367188 L 45.3125 15.367188 C 45.3125 13.90625 44.976562 13.097656 43.984375 12.109375 C 42.996094 11.121094 35.105469 3.226562 34.503906 2.628906 C 33.90625 2.027344 33.070312 1.5625 31.617188 1.5625 L 6.5625 1.5625 C 5.527344 1.5625 4.6875 2.402344 4.6875 3.4375 L 4.6875 26.367188 C 6.476562 25.492188 8.472656 25 10.578125 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.710938 L 42.164062 12.5 L 34.515625 12.5 C 34.464844 12.46875 34.414062 12.425781 34.375 12.390625 Z M 6.25 25.722656 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.25 13.980469 32.496094 15.210938 33.742188 15.539062 C 33.902344 15.59375 34.074219 15.625 34.257812 15.625 L 43.75 15.625 L 43.75 25.722656 C 44.859375 26.105469 45.910156 26.625 46.875 27.269531 L 46.875 15.363281 C 46.875 13.511719 46.375 12.289062 45.089844 11.003906 L 35.609375 1.523438 C 34.582031 0.496094 33.273438 0 31.617188 0 L 6.5625 0 C 4.667969 0 3.125 1.542969 3.125 3.4375 L 3.125 27.269531 C 4.089844 26.625 5.140625 26.105469 6.25 25.722656 Z M 6.25 25.722656 "/>\n      <use xlink:href="#surface9" mask="url(#mask0)"/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);
vendor: 2,573 bytes, line 679
679fill-opacity:1;" d="M 8.976562 47.070312 C 10.464844 47.070312 11.757812 46.75 12.859375 46.109375 C 13.960938 45.46875 14.808594 44.550781 15.40625 43.351562 C 16.003906 42.15625 16.304688 40.757812 16.304688 39.152344 C 16.304688 37.550781 16.007812 36.152344 15.417969 34.964844 C 14.828125 33.777344 13.980469 32.859375 12.882812 32.21875 C 11.78125 31.578125 10.480469 31.257812 8.976562 31.257812 C 7.472656 31.257812 6.167969 31.578125 5.0625 32.21875 C 3.953125 32.859375 3.101562 33.777344 2.511719 34.964844 C 1.921875 36.152344 1.625 37.550781 1.625 39.152344 C 1.625 40.757812 1.925781 42.15625 2.523438 43.351562 C 3.121094 44.550781 3.972656 45.46875 5.070312 46.109375 C 6.171875 46.75 7.472656 47.070312 8.976562 47.070312 Z M 8.976562 44.820312 C 7.546875 44.820312 6.433594 44.332031 5.640625 43.351562 C 4.847656 42.375 4.449219 40.976562 4.449219 39.152344 C 4.449219 37.332031 4.847656 35.933594 5.640625 34.964844 C 6.433594 33.996094 7.546875 33.507812 8.976562 33.507812 C 10.390625 33.507812 11.496094 33.996094 12.289062 34.964844 C 13.085938 35.933594 13.484375 37.332031 13.484375 39.152344 C 13.484375 40.976562 13.085938 42.375 12.289062 43.351562 C 11.496094 44.332031 10.390625 44.820312 8.976562 44.820312 Z M 26.410156 47.070312 C 27.125 47.070312 27.871094 47.011719 28.640625 46.898438 C 29.414062 46.78125 30.09375 46.621094 30.675781 46.414062 C 31.214844 46.242188 31.574219 46.015625 31.75 45.738281 C 31.921875 45.460938 32.011719 44.988281 32.011719 44.316406 L 32.011719 39.613281 C 32.011719 39.292969 31.910156 39.03125 31.703125 38.835938 C 31.5 38.640625 31.230469 38.539062 30.894531 38.539062 L 27.023438 38.539062 C 26.671875 38.539062 26.398438 38.628906 26.203125 38.804688 C 26.007812 38.976562 25.90625 39.226562 25.90625 39.546875 C 25.90625 39.867188 26.007812 40.117188 26.203125 40.289062 C 26.398438 40.464844 26.671875 40.554688 27.023438 40.554688 L 29.496094 40.554688 L 29.496094 44.425781 C 28.503906 44.703125 27.511719 44.839844 26.519531 44.839844 C 23.195312 44.839844 21.53125 42.945312 21.53125 39.152344 C 21.53125 37.300781 21.9375 35.90625 22.746094 34.964844 C 23.554688 34.023438 24.753906 33.554688 26.34375 33.554688 C 27.046875 33.554688 27.671875 33.644531 28.226562 33.828125 C 28.78125 34.007812 29.378906 34.324219 30.019531 34.777344 C 30.195312 34.894531 30.347656 34.980469 30.480469 35.03125 C 30.609375 35.082031 30.757812 35.105469 30.917969 35.105469 C 31.164062 35.105469 31.375 34.996094 31.550781 34.777344 C 31.726562 34.558594 31.8125 34.289062 31.8125 33.96875 C 31.8125 33.75 3
vendor: 7,442 bytes, line 679
6791.773438 33.558594 31.695312 33.398438 C 31.613281 33.238281 31.484375 33.078125 31.3125 32.917969 C 30 31.808594 28.3125 31.257812 26.257812 31.257812 C 24.710938 31.257812 23.371094 31.574219 22.234375 32.207031 C 21.09375 32.84375 20.214844 33.753906 19.597656 34.941406 C 18.976562 36.128906 18.667969 37.535156 18.667969 39.152344 C 18.667969 40.800781 18.976562 42.21875 19.597656 43.40625 C 20.214844 44.597656 21.109375 45.503906 22.277344 46.132812 C 23.441406 46.757812 24.820312 47.070312 26.410156 47.070312 Z M 42.445312 47.070312 C 43.160156 47.070312 43.902344 47.011719 44.675781 46.898438 C 45.449219 46.78125 46.128906 46.621094 46.710938 46.414062 C 47.25 46.242188 47.609375 46.015625 47.78125 45.738281 C 47.957031 45.460938 48.046875 44.988281 48.046875 44.316406 L 48.046875 39.613281 C 48.046875 39.292969 47.941406 39.03125 47.738281 38.835938 C 47.535156 38.640625 47.265625 38.539062 46.929688 38.539062 L 43.058594 38.539062 C 42.707031 38.539062 42.433594 38.628906 42.238281 38.804688 C 42.039062 38.976562 41.941406 39.226562 41.941406 39.546875 C 41.941406 39.867188 42.039062 40.117188 42.238281 40.289062 C 42.433594 40.464844 42.707031 40.554688 43.058594 40.554688 L 45.53125 40.554688 L 45.53125 44.425781 C 44.539062 44.703125 43.546875 44.839844 42.554688 44.839844 C 39.230469 44.839844 37.566406 42.945312 37.566406 39.152344 C 37.566406 37.300781 37.972656 35.90625 38.78125 34.964844 C 39.589844 34.023438 40.789062 33.554688 42.378906 33.554688 C 43.078125 33.554688 43.707031 33.644531 44.261719 33.828125 C 44.816406 34.007812 45.414062 34.324219 46.054688 34.777344 C 46.230469 34.894531 46.382812 34.980469 46.515625 35.03125 C 46.644531 35.082031 46.792969 35.105469 46.953125 35.105469 C 47.199219 35.105469 47.410156 34.996094 47.585938 34.777344 C 47.761719 34.558594 47.847656 34.289062 47.847656 33.96875 C 47.847656 33.75 47.808594 33.558594 47.726562 33.398438 C 47.648438 33.238281 47.519531 33.078125 47.34375 32.917969 C 46.03125 31.808594 44.347656 31.257812 42.292969 31.257812 C 40.746094 31.257812 39.40625 31.574219 38.265625 32.207031 C 37.128906 32.84375 36.25 33.753906 35.632812 34.941406 C 35.011719 36.128906 34.703125 37.535156 34.703125 39.152344 C 34.703125 40.800781 35.011719 42.21875 35.632812 43.40625 C 36.25 44.597656 37.144531 45.503906 38.3125 46.132812 C 39.476562 46.757812 40.855469 47.070312 42.445312 47.070312 Z M 42.445312 47.070312 "/>\n      </g>'},pdfIcon:{extension:".pdf",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(99.607843%,99.607843%,99.607843%);fill-opacity:1;" d="M 10.59375 25 L 39.4375 25 C 41.476562 25.003906 43.484375 25.472656 45.3125 26.375 L 45.3125 15.375 C 45.347656 14.191406 44.867188 13.054688 44 12.25 L 34.625 2.875 C 33.875 2.003906 32.773438 1.523438 31.625 1.5625 L 6.625 1.5625 C 5.589844 1.5625 4.75 2.402344 4.75 3.4375 L 4.75 26.375 C 6.566406 25.480469 8.566406 25.007812 10.59375 25 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 34.375 4.71875 L 42.15625 12.5 L 34.53125 12.5 C 34.480469 12.511719 34.425781 12.511719 34.375 12.5 Z M 6.25 25.71875 L 6.25 3.4375 C 6.25 3.265625 6.390625 3.125 6.5625 3.125 L 31.25 3.125 L 31.25 12.5 C 31.300781 13.980469 32.316406 15.253906 33.75 15.625 C 33.957031 15.675781 34.167969 15.675781 34.375 15.625 L 43.75 15.625 L 43.75 25.71875 C 44.859375 26.09375 45.910156 26.621094 46.875 27.28125 L 46.875 15.375 C 46.964844 13.722656 46.3125 12.117188 45.09375 11 L 35.71875 1.625 C 34.648438 0.523438 33.160156 -0.0664062 31.625 0 L 6.625 0 C 5.703125 -0.015625 4.8125 0.339844 4.152344 0.984375 C 3.496094 1.632812 3.125 2.515625 3.125 3.4375 L 3.125 27.28125 C 4.09375 26.625 5.144531 26.101562 6.25 25.71875 Z M 6.25 25.71875 "/>\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 8.625 28.125 C 6.335938 28.117188 4.136719 29.023438 2.515625 30.640625 C 0.898438 32.261719 -0.0078125 34.460938 0 36.75 L 0 41.375 C 0 46.136719 3.863281 50 8.625 50 L 41.375 50 C 46.132812 49.984375 49.984375 46.132812 50 41.375 L 50 36.75 C 50 31.988281 46.136719 28.125 41.375 28.125 Z M 8.625 28.125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 14.40625 41.78125 L 12.09375 41.78125 L 12.09375 45.84375 C 12.003906 46.351562 11.5625 46.726562 11.046875 46.726562 C 10.53125 46.726562 10.089844 46.351562 10 45.84375 L 10 34.78125 C 10 34.210938 10.460938 33.75 11.03125 33.75 L 14.40625 33.75 C 15.925781 33.617188 17.390625 34.351562 18.191406 35.648438 C 18.992188 36.945312 18.992188 38.585938 18.191406 39.882812 C 17.390625 41.179688 15.925781 41.914062 14.40625 41.78125 Z M 12.09375 39.6875 L 14.40625 39.6875 C 15.152344 39.78125 15.882812 39.4375 16.289062 38.804688 C 16.691406 38.171875 16.691406 37.359375 16.289062 36.726562 C 15.882812 36.09375 15.152344 35.75 14.40625 35.84375 L 12.09375 35.84375 Z M 12.09375 39.6875 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 20.3125 45.84375 L 20.3125 34.78125 C 20.3125 34.210938 20.773438 33.75 21.34375 33.75 L 23.5625 33.75 C 27.1875 33.75 30.125 36.6875 30.125 40.3125 C 30.125 43.9375 27.1875 46.875 23.5625 46.875 L 21.34375 46.875 C 20.773438 46.875 20.3125 46.414062 20.3125 45.84375 Z M 22.40625 44.78125 L 23.5625 44.78125 C 26.03125 44.78125 28.03125 42.78125 28.03125 40.3125 C 28.03125 37.84375 26.03125 35.84375 23.5625 35.84375 L 22.40625 35.84375 Z M 22.40625 44.78125 "/>\n      <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 33.1875 45.84375 L 33.1875 34.78125 C 33.183594 34.476562 33.3125 34.1875 33.542969 33.992188 C 33.769531 33.792969 34.074219 33.703125 34.375 33.75 L 40.625 33.75 C 41.132812 33.839844 41.507812 34.28125 41.507812 34.796875 C 41.507812 35.3125 41.132812 35.753906 40.625 35.84375 L 35.25 35.84375 L 35.25 39.28125 L 39.625 39.28125 C 40.195312 39.28125 40.65625 39.742188 40.65625 40.3125 C 40.65625 40.882812 40.195312 41.34375 39.625 41.34375 L 35.25 41.34375 L 35.25 45.84375 C 35.257812 46.359375 34.882812 46.796875 34.375 46.875 C 34.074219 46.921875 33.769531 46.832031 33.542969 46.632812 C 33.3125 46.4375 33.183594 46.148438 33.1875 45.84375 Z M 33.1875 45.84375 "/>\n      </g>'},defaultIcon:{extension:".default",path:'<g id="surface1">\n      <path style=" stroke:none;fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 3.117188 44.777344 C 1.394531 44.777344 0 43.386719 0 41.671875 L 0 3.484375 C 0 1.769531 1.394531 0.378906 3.117188 0.378906 L 25.792969 0.378906 C 27.164062 0.304688 28.5 0.808594 29.480469 1.765625 L 37.980469 10.230469 C 39.144531 11.242188 39.769531 12.730469 39.683594 14.265625 L 39.683594 41.671875 C 39.683594 43.386719 38.289062 44.777344 36.5625 44.777344 Z M 25.511719 3.203125 L 3.117188 3.203125 C 2.960938 3.203125 2.832031 3.328125 2.832031 3.484375 L 2.832031 41.671875 C 2.832031 41.828125 2.960938 41.957031 3.117188 41.957031 L 36.5625 41.957031 C 36.679688 41.949219 36.785156 41.867188 36.820312 41.757812 L 36.820312 14.492188 L 28.34375 14.492188 C 28.160156 14.539062 27.964844 14.539062 27.777344 14.492188 C 26.480469 14.15625 25.554688 13.007812 25.511719 11.671875 Z M 28.34375 4.640625 L 28.34375 11.671875 C 28.390625 11.683594 28.441406 11.683594 28.488281 11.671875 L 35.402344 11.671875 Z M 28.34375 4.640625 "/>\n      </g>'}},
vendor: 1,430 bytes, line 679
679V.MODULES.modals=function(l){var a=l.$;l.shared.modals||(l.shared.modals={});var o,c=l.shared.modals;function e(){for(var e in c)if(Object.prototype.hasOwnProperty.call(c,e)){var t=c[e];t&&t.$modal&&t.$modal.removeData().remove()}o&&o.removeData().remove(),c={}}function s(e,t){if(c[e]){var n=c[e].$modal,r=n.data("instance")||l;r.events.enableBlur(),n.hide(),o.hide(),a(r.o_doc).find("body").first().removeClass("fr-prevent-scroll fr-mobile"),n.removeClass("fr-active"),t||(r.accessibility.restoreSelection(),r.events.trigger("modals.hide"))}}function n(e){var t;if("string"==typeof e){if(!c[e])return;t=c[e].$modal}else t=e;return t&&l.node.hasClass(t,"fr-active")&&l.core.sameInstance(t)||!1}return{_init:function t(){l.events.on("shared.destroy",e,!0)},get:function r(e){return c[e]},create:function d(n,e,t){if(e='<div class="fr-modal-head-line">'.concat(e,"</div>"),l.shared.$overlay||(l.shared.$overlay=a(l.doc.createElement("DIV")).addClass("fr-overlay"),a("body").first().append(l.shared.$overlay)),o=l.shared.$overlay,l.opts.theme&&o.addClass("".concat(l.opts.theme,"-theme")),!c[n]){var r=function i(e,t){var n='<div tabIndex="-1" class="fr-modal'.concat(l.opts.theme?" ".concat(l.opts.theme,"-theme"):"",'"><div class="fr-modal-wrapper">'),r='<button title="'.concat(l.language.translate("Cancel"),'" class="fr-command fr-btn fr-modal-close"><svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24">
679<path d="').concat(V.SVG.close,'"/></svg></button>');n+='<div class="fr-modal-head">'.concat(e).concat(r,"</div>"),n+='<div tabIndex="-1" class="fr-modal-body">'.concat(t,"</div>"),n+="</div></div>";var o=a(l.doc.createElement("DIV"));return o.html(n),o.find("> .fr-modal")}(e,t);c[n]={$modal:r,$head:r.find(".fr-modal-head"),$body:r.find(".fr-modal-body")},l.helpers.isMobile()||r.addClass("fr-desktop"),a("body").first().append(r),l.events.$on(r,"click",".fr-modal-close",function(){s(n)},!0),c[n].$body.css("margin-top",c[n].$head.outerHeight()),l.events.$on(r,"keydown",function(e){var t=e.which;return t===V.KEYCODE.ESC?(s(n),l.accessibility.focusModalButton(r),!1):!(!a(e.currentTarget).is("input[type=text], textarea")&&t!==V.KEYCODE.ARROW_UP&&t!==V.KEYCODE.ARROW_DOWN&&!l.keys.isBrowserAction(e)&&(e.preventDefault(),e.stopPropagation(),1))},!0),s(n,!0)}return c[n]},show:function i(e){if(c[e]){var t=c[e].$modal;t.data("instance",l),t.show(),o.show(),a(l.o_doc).find("body").first().addClass("fr-prevent-scroll"),l.helpers.isMobile()&&a(l.o_doc).find("body").first().addClass("fr-mobile"),t.addClass("fr-active"),l.accessibility.focusModal(t)}},hide:s,resize:function f(e){if(c[e]){var t=c[e],n=t.$modal,r=t.$body,o=l.o_win.innerHeight,i=n.find(".fr-modal-wrapper"),a=o-i.outerHeight(!0)+(i.height()-(r.outerHeight(!0)-r.height())),s="auto";a<r.get(0).scrollHeight&&(s=a),r.height(s)}},isVisible:n,areVisible:function p(e){for(var t in c)if(Object.prototype.hasOwnProperty.call(c,t)&&n(t)&&(void 0===e||c[t].$modal.data("instance")===e))return c[t].$modal;return!1}}},V.MODULES.position=function(L){var E=L.$;function o(){var e=L.selection.ranges(0),t=e.getBoundingClientRect();if(0===t.top&&0===t.left&&0===t.width||0===t.height){var n=!1,r=L.opts.toolbarInline&&e.startContainer&&e.startContainer.firstChild&&"BR"===e.startContainer.firstChild.tagName;0===L.$el.find(".fr-marker").length&&(r?E(e.startContainer.firstChild).after(V.MARKERS):L.selection.save(),n=!0);var o=L.$el.find(".fr-marker").first();o.css("display","inline"),o.css("line-height","");var i=o.offset(),a=o.outerHeight();o.css("display","none"),o.css("line-height",0),(t={}).left=i&&i.left,t.width=0,t.height=a,t.top=i&&i.top-(L.helpers.isMobile()&&!L.helpers.isIOS()||L.opts.iframe?0:L.helpers.scrollTop()),o&&0<o.length&&(t.top-=E(o.get(0).parentNode).height()),t.right=1,t.bottom=1,t.ok=!0,n&&(r?L.$el.find(".fr-marker").remove():L.selection.restore())}return t}function i(e,t,n,r){var o=n.data("container");if(!o||"BODY"===o.get(0).tagName&&"static"===o.css("position")||(e&&(e-=o.offset().left),t&&(t-=o.offset().top),"BODY"!==o.get(0).tagName?(e&&(e+=o.get(0).scrollLeft),t&&(t+=o.get(0).scrollTop)):"absolute"===o.css("position")&&(e&&(e+=o.position().left),t&&(t+=o.position().top))),L.opts.iframe&&o&&L.$tb&&o.get(0)!==L.$tb.get(0)){var i=L.helpers.getPX(L.$wp.find(".fr-iframe").css("padding-top")),a=L.helpers.getPX(L.$wp.find(".fr-iframe").css("padding-left"));e&&(e+=L.$iframe.offset().left+a),t&&(t+=L.$iframe.offset().top+i)}var s=function l(e,t){var n=e.outerWidth(!0);return t+n>L.$sc.get(0).clientWidth-10&&(t=L.$sc.get(0).clientWidth-n-10),t<0&&(t=10),t}(n,e);e&&n.css("left",s),t&&n.css("top",function c(e,t,n){var r=e.outerHeight(!0);if(!L.helpers.isMobile()&&L.$tb&&e.parent().get(0)!==L.$tb.get(0)){var o=e.parent().offset().top,i=t-r-(n||0);e.parent().get(0)===L.$sc.get(0)&&(o-=e.parent().position().top);var a=L.$sc.get(0).clientHeight;o+t+r>L.$sc.offset().top+a&&0<e.parent().offset().top+i&&0<i?i>L.$wp.scrollTop()&&(t=i,e.addClass("fr-above")):e.removeClass("fr-above")}return t}(n,t,r))}function a(e){var n=E(e),t=n.is(".fr-sticky-on"),r=n.data("sticky-top"),o=n.data("sticky-scheduled");if(void 0===r){n.data("sticky-top",0);var i=E('<div class="fr-sticky-dummy" style="height: '.concat(n.outerHeight(),'px;"></div>'));L.$box.prepend(i)}else L.$box.find(".fr-sticky-dummy").css("height",n.outerHeight());if(L.core.hasFocus()||0<L.$tb.findVisible("input:focus").length){var a=L.helpers.scrollTop(),s=Math.min(Math.max(a-L.$tb.parent().offset().top,0),L.$tb.parent().outerHeight()-n.outerHeight());if(s!==r&&s!==o&&(clearTimeout(n.data("sticky-timeout")),n.data("sticky-scheduled",s),n.outerHeight()<a-L.$tb.parent().offset().top&&n.addClass("fr-opacity-0"),n.data("sticky-timeout",setTimeout(function(){var e=L.helpers.scrollTop(),t=Math.min(Math.max(e-L.$tb.parent().offset().top,0),L.$tb.parent().outerHeight()-n.outerHeight());0<t&&"BODY"===L.$tb.parent().get(0).tagName&&(t+=L.$tb.parent().position().top),t!==r&&(n.css("top",Math.max(t,0)),n.data("sticky-top",t),n.data("sticky-scheduled",t)),n.removeClass("fr-opacity-0")},100))),!t){var l=L.$tb.parent(),c=l.get(0).offsetWidth-l.get(0).clientWidth;n.css("top","0"),n.width(l.width()-c),n.addClass("fr-sticky-on"),L.$box.addClass("fr-sticky-box")}}else clearTimeout(E(e).css("sticky-timeout")),n.css("top","0"),n.css("position",""),n.css("width",""),n.data("sticky-top",0),n.removeClass("fr-sticky-on"),L.$box.removeClass("fr-sticky-box")}function t(e){if(e.offsetWidth){var t=E(e),n=t.outerHeight(),r=t.data("sticky-position"),o=E("body"===L.opts.scrollableContainer?L.o_win:L.opts.scrollableContainer).outerHeight(),i=0,a=0;"body"!==L.opts.scrollableContainer&&(i=L.$sc.offset().top,a=E(L.o_win).outerHeight()-i-o);var s="body"===L.opts.scrollableContainer?L.helpers.scrollTop():i,l=t.is(".fr-sticky-on");t.data("sticky-parent")||t.data("sticky-parent",t.parent());var c=t.data("sticky-parent"),d=c.offset().top,f=c.outerHeight();if(t.data("sticky-offset")?L.$box.find(".fr-sticky-dummy").css("height","".concat(n,"px")):(t.data("sticky-offset",!0),t.after('<div class="fr-sticky-dummy" style="height: '.concat(n,'px;"></div>'))),!r){var p="auto"!==t.css("top")||"auto"!==t.css("bottom");p||t.css("position","fixed"),r={top:L.node.hasClass(t.get(0),"fr-top"),bottom:L.node.hasClass(t.get(0),"fr-bottom")},p||t.css("position",""),t.data("sticky-position",r),t.data("top",L.node.hasClass(t.get(0),"fr-top")?t.css("top"):"auto"),t.data("bottom",L.node.hasClass(t.get(0),"fr-bottom")?t.css("bottom"):"auto")}var h=L.helpers.getPX(t.data("top")),u=L.helpers.getPX(t.data("bottom")),g=r.top&&function v(){return d<s+h&&s+h<=d+f-n}()&&(L.helpers.isInViewPort(L.$sc.get(0))||"body"===L.opts.scrollableContainer),C=r.bottom&&function b(){return d+n<s+o-u&&s+o-u<d+f}();if(g||C){var m=c.get(0).offsetWidth-c.get(0).clientWidth;t.css("width","".concat(c.get(0).getBoundingClientRect().width-m,"px")),l||(t.addClass("fr-sticky-on"),t.removeClass("fr-sticky-off"),t.css("top")&&("auto"!==t.data("top")?t.css("top",L.helpers.getPX(t.data("top"))+i):t.data("top","auto")),t.css("bottom")&&("auto"!==t.data("bottom")?t.css("bottom",L.helpers.getPX(t.data("bottom"))+a):t.css("bottom","auto")))}else L.node.hasClass(t.get(0),"fr-sticky-off")||(t.css("width",""),t.removeClass("fr-sticky-on"),t.addClass("fr-sticky-off"),t.css("top")&&"auto"!==t.data("top")&&r.top&&t.css("top",0),t.css("bottom")&&"auto"!==t.data("bottom")&&r.bottom&&t.css("bottom",0))}}function s(){if(L.helpers.requestAnimationFrame()(s),!1!==L.events.trigger("position.refresh"))for(var e=0;e<L._stickyElements.length;e++)if(L.opts.toolbarBottom){var t=L.$tb.parent(),n=t.get(0).offsetWidth-t.get(0).clientWidth,r=E(L._stickyElements[e]);r.width(t.width()-n),r.addClass("fr-sticky-on"),L.$box.addClass("fr-sticky-box")}else a(L._stickyElements[e])}function n(){if(L._stickyElements)for(var e=0;e<L._stickyElements.length;e++)t(L._stickyElements[e])}return{_init:function r(){!function e(){L._stickyElements=[],L.helpers.isIOS()?(s(),L.events.$on(E(L.o_win),"scroll",function(){if(L.core.hasFocus())for(var e=0;e<L._stickyElements.length;e++){var t=E(L._stickyElements[e]),n=t.parent(),r=L.helpers.scrollTop();
vendor: 1,830 bytes, line 679
679t.outerHeight()<r-n.offset().top&&(L.opts.toolbarBottom&&L.helpers.isIOS()||(t.addClass("fr-opacity-0"),t.data("sticky-top",-1),t.data("sticky-scheduled",-1)))}},!0)):("body"!==L.opts.scrollableContainer&&L.events.$on(E(L.opts.scrollableContainer),"scroll",n,!0),L.events.$on(E(L.o_win),"scroll",n,!0),L.events.$on(E(L.o_win),"resize",n,!0),L.events.on("initialized",n),L.events.on("focus",n),L.events.$on(E(L.o_win),"resize","textarea",n,!0)),L.events.on("destroy",function(){L._stickyElements=[]})}()},forSelection:function l(e){var t=o();if(t.top!=undefined){e.css({top:0,left:0});var n=t.top+t.height,r=t.left+t.width/2-e.get(0).offsetWidth/2+L.helpers.scrollLeft();L.opts.iframe||(n+=L.helpers.scrollTop()),i(r,n,e,t.height)}},addSticky:function c(e){e.addClass("fr-sticky"),L.helpers.isIOS()&&!L.opts.toolbarBottom&&e.addClass("fr-sticky-ios"),e.removeClass("fr-sticky"),L._stickyElements.push(e.get(0))},refresh:n,at:i,getBoundingRect:o}},V.MODULES.refresh=function(l){var c=l.$;function i(e,t){e.toggleClass("fr-disabled",t).attr("aria-disabled",t)}function e(e){var t=l.$tb.find('.fr-more-toolbar[data-name="'.concat(e.attr("data-group-name"),'"]')),n=function s(e,t){var n=0,r=t.find("> .fr-command, > .fr-btn-wrap");r.each(function(e,t){n+=c(t).outerWidth()});var o,i=l.helpers.getPX(c(r[0]).css("margin-left")),a=l.helpers.getPX(c(r[0]).css("margin-right"));o="rtl"===l.opts.direction?l.$tb.outerWidth()-e.offset().left+l.$tb.offset().left-(n+e.outerWidth()+r.length*(i+a))/2:e.offset().left-l.$tb.offset().left-(n-e.outerWidth()+r.length*(i+a))/2;o+n+r.length*(i+a)>l.$tb.outerWidth()&&(o-=(n+r.length*(i+a)-e.outerWidth())/2);o<0&&(o=0);return o}(e,t);"rtl"===l.opts.direction?t.css("padding-right",n):t.css("padding-left",n)}return{undo:function t(e){i(e,!l.undo.canDo())},redo:function n(e){i(e,!l.undo.canRedo())}
vendor: 5,309 bytes, line 679
679,outdent:function a(e){if(l.node.hasClass(e.get(0),"fr-no-refresh"))return!1;if(c("button#markdown-".concat(l.id,".fr-active")).length)return!1;for(var t=l.selection.blocks(),n=0;n<t.length;n++){var r="rtl"===l.opts.direction||"rtl"===c(t[n]).css("direction")?"margin-right":"margin-left",o=t[0].parentElement;if(["HTML","P","DIV","UL","OL","LI","TR","BLOCKQUOTE","BODY"].indexOf(o.parentNode.tagName)<0)return i(e,!0),!0;if(t[0].previousSibling&&"none"==o.parentNode.style.listStyleType)return i(e,!0),!0;if("LI"===t[n].tagName||"LI"===t[n].parentNode.tagName)return i(e,!1),!0;if(0<l.helpers.getPX(c(t[n]).css(r)))return i(e,!1),!0}i(e,!0)},indent:function o(e){if(l.node.hasClass(e.get(0),"fr-no-refresh"))return!1;if(c("button#markdown-".concat(l.id,".fr-active")).length)return!1;for(var t=l.selection.blocks(),n=0;n<t.length;n++){for(var r=t[n].previousSibling;r&&r.nodeType===Node.TEXT_NODE&&0===r.textContent.length;)r=r.previousSibling;if("LI"!==t[n].tagName||r)return i(e,!1),!0;i(e,!0)}},moreText:e,moreParagraph:e,moreMisc:e,moreRich:e}},Object.assign(V.DEFAULTS,{attribution:!0,toolbarBottom:!1,toolbarButtons:null,toolbarButtonsXS:null,toolbarButtonsSM:null,toolbarButtonsMD:null,toolbarContainer:null,toolbarInline:!1,toolbarSticky:!0,toolbarStickyOffset:0,toolbarVisibleWithoutSelection:!1}),V.TOOLBAR_BUTTONS={moreText:{buttons:["bold","italic","underline","strikeThrough","subscript","superscript","fontFamily","fontSize","textColor","backgroundColor","inlineClass","inlineStyle","clearFormatting"]},moreParagraph:{buttons:["alignLeft","alignCenter","formatOLSimple","alignRight","alignJustify","formatOL","formatUL","paragraphFormat","paragraphStyle","lineHeight","outdent","indent","quote"]},moreRich:{buttons:["trackChanges","markdown","insertLink","insertFiles","insertImage","insertVideo","insertTable","emoticons","fontAwesome","specialCharacters","embedly","insertFile","insertHR"],buttonsVisible:4},moreMisc:{buttons:["undo","redo","fullscreen","print","getPDF","spellChecker","selectAll","html","help"],align:"right",buttonsVisible:2},trackChanges:{buttons:["showChanges","applyAll","removeAll","applyLast","removeLast"],buttonsVisible:0}},V.TOOLBAR_BUTTONS_MD=null,(V.TOOLBAR_BUTTONS_SM={}).moreText=Object.assign({},V.TOOLBAR_BUTTONS.moreText,{buttonsVisible:2}),V.TOOLBAR_BUTTONS_SM.moreParagraph=Object.assign({},V.TOOLBAR_BUTTONS.moreParagraph,{buttonsVisible:2}),V.TOOLBAR_BUTTONS_SM.moreRich=Object.assign({},V.TOOLBAR_BUTTONS.moreRich,{buttonsVisible:2}),V.TOOLBAR_BUTTONS_SM.moreMisc=Object.assign({},V.TOOLBAR_BUTTONS.moreMisc,{buttonsVisible:2}),V.TOOLBAR_BUTTONS_SM.trackChanges=Object.assign({},V.TOOLBAR_BUTTONS.trackChanges,{buttonsVisible:0}),(V.TOOLBAR_BUTTONS_XS={}).moreText=Object.assign({},V.TOOLBAR_BUTTONS.moreText,{buttonsVisible:0}),V.TOOLBAR_BUTTONS_XS.moreParagraph=Object.assign({},V.TOOLBAR_BUTTONS.moreParagraph,{buttonsVisible:0}),V.TOOLBAR_BUTTONS_XS.moreRich=Object.assign({},V.TOOLBAR_BUTTONS.moreRich,{buttonsVisible:0}),V.TOOLBAR_BUTTONS_XS.moreMisc=Object.assign({},V.TOOLBAR_BUTTONS.moreMisc,{buttonsVisible:2}),V.TOOLBAR_BUTTONS_XS.trackChanges=Object.assign({},V.TOOLBAR_BUTTONS.trackChanges,{buttonsVisible:0}),V.POWERED_BY='<a id="fr-logo" href="https://froala.com/wysiwyg-editor" target="_blank" title="Froala WYSIWYG HTML Editor"><span>Powered by</span><svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 822.8 355.33"><defs><style>.fr-logo{fill:#b1b2b7;}</style></defs><title>Froala</title><path class="fr-logo" d="M123.58,78.65A16.16,16.16,0,0,0,111.13,73H16.6C7.6,73,0,80.78,0,89.94V128.3a16.45,16.45,0,0,0,32.9,0V104.14h78.5A15.63,15.63,0,0,0,126.87,91.2,15.14,15.14,0,0,0,123.58,78.65Z"/><path class="fr-logo" d="M103.54,170a16.05,16.05,0,0,0-11.44-4.85H15.79A15.81,15.81,0,0,0,0,180.93v88.69a16.88,16.88,0,0,0,5,11.92,16,16,0,0,0,11.35,4.7h.17a16.45,16.45,0,0,0,16.41-16.6v-73.4H92.2A15.61,15.61,0,0,0,107.89,181,15.1,15.1,0,0,0,103.54,170Z"/><path class="fr-logo" d="M233,144.17c-5.29-6.22-16-7.52-24.14-7.52-16.68,0-28.72,7.71-36.5,23.47v-5.67a16.15,16.15,0,1,0-32.3,0v115.5a16.15,16.15,0,1,0,32.3,0v-38.7c0-19.09,3.5-63.5,35.9-63.5a44.73,44.73,0,0,1,5.95.27h.12c12.79,1.2,20.06-2.73,21.6-11.69C236.76,151.48,235.78,147.39,233,144.17Z"/><path class="fr-logo" d="M371.83,157c-13.93-13.11-32.9-20.33-53.43-20.33S279,143.86,265.12,157c-14.67,13.88-22.42,32.82-22.42,54.77,0,21.68,8,41.28,22.4,55.2,13.92,13.41,32.85,20.8,53.3,20.8s39.44-7.38,53.44-20.79c14.55-13.94,22.56-33.54,22.56-55.21S386.39,170.67,371.83,157Zm-9.73,54.77c0,25.84-18.38,44.6-43.7,44.6s-43.7-18.76-43.7-44.6c0-25.15,18.38-43.4,43.7-43.4S362.1,186.59,362.1,211.74Z"/><path class="fr-logo" d="M552.7,138.14a16.17,16.17,0,0,0-16,16.3v1C526.41,143.85,509,136.64,490,136.64c-19.83,0-38.19,7.24-51.69,20.4C424,171,416.4,190,416.4,212c0,21.61,7.78,41.16,21.9,55,13.56,13.33,31.92,20.67,51.7,20.67,18.83,0,36.29-7.41,46.7-19.37v1.57a16.15,16.15,0,1,0,32.3,0V154.44A16.32,16.32,0,0,0,552.7,138.14Zm-16.3,73.6c0,30.44-22.81,44.3-44,44.3-24.57,0-43.1-19-43.1-44.3s18.13-43.4,43.1-43.4C513.73,168.34,536.4,183.55,536.4,211.74Z"/><path class="fr-logo" d="M623.5,61.94a16.17,16.17,0,0,0-16,16.3v191.7a16.15,16.15,0,1,0,32.3,0V78.24A16.32,16.32,0,0,0,623.5,61.94Z"/><path class="fr-logo" d="M806.5,138.14a16.17,16.17,0,0,0-16,16.3v1c-10.29-11.
67963-27.74-18.84-46.7-18.84-19.83,0-38.19,7.24-51.69,20.4-14.33,14-21.91,33-21.91,55,0,21.61,7.78,41.16,21.9,55,13.56,13.33,31.92,20.67,51.7,20.67,18.83,0,36.29-7.41,46.7-19.37v1.57a16.15,16.15,0,1,0,32.3,0V154.44A16.32,16.32,0,0,0,806.5,138.14Zm-16.3,73.6c0,30.44-22.81,44.3-44,44.3-24.57,0-43.1-19-43.1-44.3s18.13-43.4,43.1-43.4C767.53,168.34,790.2,183.55,790.2,211.74Z"/></svg></a>',V.MODULES.toolbar=function(E){var y,S=E.$,t=[];function e(e){var n={};if(Array.isArray(e)){if(!Array.isArray(e[0])){for(var t=[],r=[],o=0;o<e.length;o++)"|"===e[o]||"-"===e[o]?(0<r.length&&t.push(r),r=[]):r.push(e[o]);0<r.length&&t.push(r),e=t}e.forEach(function(e,t){n["group".concat(t+1)]={buttons:e}}),n.showMoreButtons=!1}else"object"!==M(e)||Array.isArray(e)||((n=e).showMoreButtons=!0);return n}function N(){var e=E.helpers.screenSize();return t[y=e]}function T(){for(var e=E.$tb.find(".fr-more-toolbar"),t=0;t<e.length;t++){var c=S(e[t]);c.hasClass("fr-expanded")?function(){var n=E.helpers.getPX(c.css("padding-left")),e=c.find("> .fr-command, > .fr-btn-wrap"),t=S(e[0]),r=E.helpers.getPX(t.css("margin-left")),o=E.helpers.getPX(t.css("margin-right")),i=E.helpers.getPX(t.css("margin-top")),a=E.helpers.getPX(t.css("margin-bottom"));if(e.each(function(e,t){n+=S(t).outerWidth()+r+o}),E.$tb.outerWidth()<n){var s=Math.floor(n/E.$tb.outerWidth());n+=s*(n/c[0].childElementCount),s=Math.ceil(n/E.$tb.outerWidth());var l=(E.helpers.getPX(t.css("height"))+i+a)*s;c.css("height",l)}}():c.css("height","")}!E.helpers.isMobile()&&E.opts.toolbarBottom?E.$tb.find(".fr-toolbar .fr-more-toolbar").removeClass("position-relative"):E.$tb.find(".fr-toolbar .fr-more-toolbar").addClass("position-relative")}function o(){if(0==E.$tb.find("[data-name='trackChanges-".concat(E.id,"']")).length&&-1<E.opts.pluginsEnabled.indexOf("track_changes")){E.$tb.append(S('<div class="fr-more-toolbar"></div>').data("name","trackChanges-".concat(E.id)));for(var e=0,t=["showChanges","applyAll","removeAll","applyLast","removeLast"];e<t.length;e++){var n=t[e],r=V.COMMANDS[n];if(r){r.more_btn=!0;var o=S(E.button.build(n,r,!0));E.button.addButtons(o),E.$tb.find("[data-name='trackChanges-".concat(E.id,"']")).append(o)}}}if(y!==E.helpers.screenSize()){var i=N(),a=S(),s=S();for(var l in E.$tb.find(".fr-btn-grp > .fr-command, .fr-more-toolbar > .fr-command, .fr-btn-grp > .fr-btn-wrap > .fr-command, .fr-more-toolbar > .fr-btn-wrap > .fr-command").addClass("fr-hidden"),function L(){for(var t=E.$tb.find(".fr-btn-grp, .fr-more-toolbar"),r=function r(e){var n=S(t[e]);n.children().each(function(e,t){n.before(t)}),n.remove()},e=0;e<t.length;e++)r(e)}(),i){var c=i[l];if(c.buttons&&("trackChanges"!==l||-1!==E.opts.pluginsEnabled.indexOf("track_changes"))){var d=void 0,f=0,p=3,h=void 0;"trackChanges"!==l&&(h=S('<div class="fr-btn-grp fr-float-'.concat(i[l].align?i[l].align:"left",'"></div>'))),i.showMoreButtons&&(d=S('<div class="fr-more-toolbar"></div>').data("name","".concat(l,"-").concat(E.id)),"trackChanges"!==l&&"moreRich"!==l||!E.opts.trackChangesEnabled||d.addClass("fr-expanded"));for(var u=0;u<c.buttons.length;u++){c.buttonsVisible!==undefined&&(p=c.buttonsVisible);var g=E.$tb.find('> .fr-command[data-cmd="'+c.buttons[u]+'"], > div.fr-btn-wrap > .fr-command[data-cmd="'+c.buttons[u]+'"]'),C=null;E.node.hasClass(g.next().get(0),"fr-dropdown-menu")&&(C=g.next()),E.node.hasClass(g.next().get(0),"fr-options")&&(g.removeClass("fr-hidden"),g.next().removeClass("fr-hidden"),g=g.parent()),g.removeClass("fr-hidden"),i.showMoreButtons&&p<=f?(d.append(g),C&&d.append(C)):(h.append(g),C&&h.append(C)),f++}if(i.showMoreButtons&&p<f){var m=E.$tb.find('.fr-command[data-cmd="'.concat(l,'"]'));if(0<m.length)m.removeClass("fr-hidden fr-open");else{var v=l,b=V.COMMANDS[v];b&&(b.more_btn=!0,m=S(E.button.build(v,b,!0)),E.button.addButtons(m))}h&&h.append(m)}h&&a.push(h),i.showMoreButtons&&s.push(d)}}E.opts.toolbarBottom?(E.$tb.append(s),E.$tb.find(".fr-newline").remove(),E.$tb.append('<div class="fr-newline"></div>'),E.$tb.append(a)):(E.$tb.append(a),E.$tb.find(".fr-newline").remove(),E.$tb.append('<div class="fr-newline"></div>'),E.$tb.append(s)),E.$tb.removeClass("fr-toolbar-open"),E.$box.removeClass("fr-toolbar-open"),E.events.trigger("codeView.toggle")}T()}function n(e,t){setTimeout(function(){if((!e||e.which!=V.KEYCODE.ESC)&&E.selection.inEditor()&&E.core.hasFocus()&&!E.popups.areVisible()&&"false"!=S(E.selection.blocks()[0]).closest("table").attr("contenteditable")&&(E.opts.toolbarVisibleWithoutSelection||!E.selection.isCollapsed()&&!E.keys.isIME()||t)){if(E.$tb.data("instance",E),!1===E.events.trigger("toolbar.show",[e]))return;E.$tb.show(),E.opts.toolbarContainer||E.position.forSelection(E.$tb),1<E.opts.zIndex?E.$tb.css("z-index",E.opts.zIndex+1):E.$tb.css("z-index",null)}},0)}function i(e){return(!e||"blur"!==e.type||document.activeElement!==E.el)&&(!(!e||"keydown"!==e.type||!E.keys.ctrlKey(e))||(!!E.button.getButtons(".fr-dropdown.fr-active").next().find(E.o_doc.activeElement).length||(E.helpers.isMobile()&&E.opts.toolbarInline&&(E.$tb.find(".fr-expanded").toggleClass("fr-expanded"),E.$tb.find(".fr-open").removeClass("fr-open"),E.$tb.removeClass("fr-toolbar-open"),T()),void(!1!==E.events.trigger("toolbar.hide")&&E.$tb.hide()))))}t[V.XS]=e(E.opts.toolbarButtonsXS||E.opts.toolbarButtons||V.TOOLBAR_BUTTONS_XS||V.TOOLBAR_BUTTONS||[]),t[V.SM]=e(E.opts.toolbarButtonsSM||E.opts.toolbarButtons||V.TOOLBAR_BUTTONS_SM||V.TOOLBAR_BUTTONS||[]),t[V.MD]=e(E.opts.toolbarButtonsMD||E.opts.toolbarButtons||V.TOOLBAR_BUTTONS_MD||V.TOOLBAR_BUTTONS||[]),t[V.LG]=e(E.opts.toolbarButtons||V.TOOLBAR_BUTTONS||[]);var r=null;function a(e){clearTimeout(r),e&&e.which===V.KEYCODE.ESC||(r=setTimeout(n,E.opts.typingTimer))}function s(){E.events.on("window.mousedown",i),E.events.on("keydown",i),E.events.on("blur",i),E.events.$on(E.$tb,"transitionend",".fr-more-toolbar",function(){E.position.forSelection(E.$tb)}),E.helpers.isMobile()||E.events.on("window.mouseup",n),E.helpers.isMobile()?E.helpers.isIOS()||(E.events.on("window.touchend",n),E.browser.mozilla&&setInterval(n,200)):E.events.on("window.keyup",a),E.events.on("keydown",function(e){e&&e.which===V.KEYCODE.ESC&&E.events.trigger("toolbar.esc")}),E.events.on("keydown",function(e){if(e.which===V.KEYCODE.ALT)return e.stopPropagation(),!1},!0),E.events.$on(E.$wp,"scroll.toolbar",n),E.events.on("commands.after",n),E.helpers.isMobile()&&(E.events.$on(E.$doc,"selectionchange",a),E.events.$on(E.$doc,"orientationchange",n))}
vendor: 5,051 bytes, line 679
679function l(){E.$tb.html("").removeData().remove(),E.$tb=null,E.$second_tb&&(E.$second_tb.html("").removeData().remove(),E.$second_tb=null)}function c(){E.$box.removeClass("fr-top fr-bottom fr-inline fr-basic"),E.$box.find(".fr-sticky-dummy").remove()}function d(){E.opts.theme&&E.$tb.addClass("".concat(E.opts.theme,"-theme")),1<E.opts.zIndex&&E.$tb.css("z-index",E.opts.zIndex+1),"auto"!==E.opts.direction&&E.$tb.removeClass("fr-ltr fr-rtl").addClass("fr-".concat(E.opts.direction)),E.helpers.isMobile()?E.$tb.addClass("fr-mobile"):E.$tb.addClass("fr-desktop"),E.opts.toolbarContainer?(E.opts.toolbarInline&&(s(),i()),E.opts.toolbarBottom?E.$tb.addClass("fr-bottom"):E.$tb.addClass("fr-top")):function e(){E.opts.toolbarInline?(E.$sc.append(E.$tb),E.$tb.data("container",E.$sc),E.$tb.addClass("fr-inline"),s(),E.opts.toolbarBottom=!1):(E.opts.toolbarBottom?(E.$box.append(E.$tb),E.$tb.addClass("fr-bottom"),E.$box.addClass("fr-bottom")):(E.opts.toolbarBottom=!1,E.$box.prepend(E.$tb),E.$tb.addClass("fr-top"),E.$box.addClass("fr-top")),E.$tb.addClass("fr-basic"),E.opts.toolbarSticky&&(E.opts.toolbarStickyOffset&&(E.opts.toolbarBottom?E.$tb.css("bottom",E.opts.toolbarStickyOffset):E.$tb.css("top",E.opts.toolbarStickyOffset)),E.position.addSticky(E.$tb)))}(),function t(){var e=E.button.buildGroup(N());E.$tb.append(e),T(),E.button.bindCommands(E.$tb)}(),function r(){E.events.$on(S(E.o_win),"resize",o),E.events.$on(S(E.o_win),"orientationchange",o),E.opts.toolbarButtons&&-1<JSON.stringify(E.opts.toolbarButtons).indexOf("trackChanges")&&o();var e=E.$tb.find(".fr-more-toolbar[data-name=trackChanges-".concat(E.id,"]")),t=0!==e.length&&e.hasClass("fr-expanded");if(E.opts.trackChangesEnabled&&!t){var n=E.$tb.find(".fr-command.fr-btn[data-cmd=trackChanges");e.addClass("fr-expanded"),n.toggleClass("fr-open"),E.toolbar.enable()}}(),E.accessibility.registerToolbar(E.$tb),E.events.$on(E.$tb,"".concat(E._mousedown," ").concat(E._mouseup),function(e){var t=e.originalEvent?e.originalEvent.target||e.originalEvent.originalTarget:null;if(t&&"INPUT"!==t.tagName&&!E.edit.isDisabled())return e.stopPropagation(),e.preventDefault(),!1},!0),E.helpers.isMobile()&&E.events.$on(E.$tb,"click",function(){E.popups.areVisible().length||E.id!==E.shared.selected_editor&&E.shared.selected_editor||E.$el.focus()}),E.events.$on(E.$tb,"transitionend",".fr-more-toolbar",function(){E.$box.hasClass("fr-fullscreen")&&(E.opts.height=E.o_win.innerHeight-(E.opts.toolbarInline?0:E.$tb.outerHeight()+(E.$second_tb?E.$second_tb.outerHeight():0)),E.size.refresh())})}var f=!1;return{_init:function p(){if(E.$sc=S(E.opts.scrollableContainer).first(),!E.$wp)return!1;E.opts.toolbarInline||E.opts.toolbarBottom||(E.$second_tb=S(E.doc.createElement("div")).attr("class","fr-second-toolbar"),E.$box.append(E.$second_tb),(!1!==E.ul||E.opts.attribution)&&E.$second_tb.prepend(V.POWERED_BY)),E.opts.toolbarContainer?(E.shared.$tb?(E.$tb=E.shared.$tb,E.opts.toolbarInline&&s()):(E.shared.$tb=S(E.doc.createElement("DIV")),E.shared.$tb.addClass("fr-toolbar"),E.$tb=E.shared.$tb,S(E.opts.toolbarContainer).append(E.$tb),d(),E.$tb.data("instance",E)),E.opts.toolbarInline?E.$box.addClass("fr-inline"):E.$box.addClass("fr-basic"),E.events.on("focus",function(){E.$tb.data("instance",E)},!0),E.opts.toolbarInline=!1):E.opts.toolbarInline?(E.$box.addClass("fr-inline"),E.shared.$tb?(E.$tb=E.shared.$tb,s()):(E.shared.$tb=S(E.doc.createElement("DIV")),E.shared.$tb.addClass("fr-toolbar"),E.$tb=E.shared.$tb,d())):(E.$box.addClass("fr-basic"),E.$tb=S(E.doc.createElement("DIV")),E.$tb.addClass("fr-toolbar"),d(),E.$tb.data("instance",E)),E.events.on("destroy",c,!0),E.events.on(E.opts.toolbarInline||E.opts.toolbarContainer?"shared.destroy":"destroy",l,!0),E.events.on("edit.on",function(){E.$tb.removeClass("fr-disabled").removeAttr("aria-disabled")}),E.events.on("edit.off",function(){E.$tb.addClass("fr-disabled").attr("aria-disabled",!0)}),function e(){E.events.on("shortcut",function(e,t,n){var r;if(t&&!n?r=E.$tb.find('.fr-command[data-cmd="'.concat(t,'"]')):t&&n&&(r=E.$tb.find('.fr-command[data-cmd="'.concat(t,'"][data-param1="').concat(n,'"]'))),r.length&&(e.preventDefault(),e.stopPropagation(),r.parents(".fr-toolbar").data("instance",E),"keydown"===e.type))return E.button.exec(r),!1})}()},hide:i,show:function h(){if(!1===E.events.trigger("toolbar.show"))return!1;E.$tb.show()},showInline:n,disable:function u(){!f&&E.$tb&&(E.$tb.find(".fr-btn-grp > .fr-command, .fr-more-toolbar > .fr-command, .fr-btn-wrap > .fr-command").addClass("fr-disabled fr-no-refresh").attr("aria-disabled",!0),f=!0)},enable:function g(){f&&E.$tb&&(E.$tb.find(".fr-btn-grp > .fr-command, .fr-more-toolbar > .fr-command, .fr-btn-wrap > .fr-command").removeClass("fr-disabled fr-no-refresh").attr("aria-disabled",!1),f=!1),E.button.bulkRefresh()},setMoreToolbarsHeight:T}};var c=["scroll","wheel","touchmove","touchstart","touchend"],d=["webkit","moz","ms","o"],f=["transitionend"],o=document.createElement("div").style,i=["Webkit","Moz","ms","O","css","style"],s={visibility:"hidden",display:"block"}
vendor: 10,138 bytes, line 679
679,r=["focus","blur","click"],a={},l=function l(e,t){return{altKey:e.altKey,bubbles:e.bubbles,cancelable:e.cancelable,changedTouches:e.changedTouches,ctrlKey:e.ctrlKey,detail:e.detail,eventPhase:e.eventPhase,metaKey:e.metaKey,pageX:e.pageX,pageY:e.pageY,shiftKey:e.shiftKey,view:e.view,"char":e["char"],key:e.key,keyCode:e.keyCode,button:e.button,buttons:e.buttons,clientX:e.clientX,clientY:e.clientY,offsetX:e.offsetX,offsetY:e.offsetY,pointerId:e.pointerId,pointerType:e.pointerType,screenX:e.screenX,screenY:e.screenY,targetTouches:e.targetTouches,toElement:e.toElement,touches:e.touches,type:e.type,which:e.which,target:e.target,currentTarget:t,originalEvent:e,stopPropagation:function(){e.stopPropagation()},stopImmediatePropagation:function(){e.stopImmediatePropagation()},preventDefault:function(){-1===c.indexOf(e.type)&&e.preventDefault()}}},p=function p(e){return e.ownerDocument&&e.ownerDocument.body&&e.ownerDocument.body.contains(e)||"#document"===e.nodeName||"HTML"===e.nodeName||e===window},h=function h(n,r){return function(e){var t=e.target;if(r)for(r=g(r);t&&t!==this;)Element.prototype.matches.call(t,g(r))&&n.call(t,l(e,t)),t=t.parentNode;else p(t)&&n.call(t,l(e,t))}},u=function u(e,t){return new v(e,t)},g=function g(e){return e&&"string"==typeof e?e.replace(/^\s*>/g,":scope >").replace(/,\s*>/g,", :scope >"):e},C=function C(e){return"function"==typeof e&&"number"!=typeof e.nodeType},m=u;u.fn=u.prototype={constructor:u,length:0,contains:function(e){if(!e)return!1;if(Array.isArray(e)){for(var t=0;t<e.length;t++)if(this.contains(e[t])&&this!=e[t])return!0;return!1}for(var n=0;n<this.length;n++)for(var r=e;r;){if(r==this[n]||r[0]&&r[0].isEqualNode(this[n]))return!0;r=r.parentNode}return!1},findVisible:function(e){for(var t=this.find(e),n=t.length-1;0<=n;n--)m(t[n]).isVisible()||t.splice(n,1);return t},formatParams:function(t){var e="".concat(Object.keys(t).map(function(e){return"".concat(e,"=").concat(encodeURIComponent(t[e]))}).join("&"));return e||""},ajax:function(t){var n=new XMLHttpRequest,e=this.formatParams(t.data);for(var r in"GET"===t.method.toUpperCase()&&(t.url=e?t.url+"?"+e:t.url),n.open(t.method,t.url,!0),t.withCredentials&&(n.withCredentials=!0),t.crossDomain&&n.setRequestHeader("Access-Control-Allow-Origin","*"),t.headers)Object.prototype.hasOwnProperty.call(t.headers,r)&&n.setRequestHeader(r,t.headers[r]);Object.prototype.hasOwnProperty.call(t.headers,"Content-Type")||("json"===t.dataType?n.setRequestHeader("Content-Type","application/json"):n.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8")),n.onload=function(){if(200==n.status){var e=n.responseText;"json"===t.dataType&&(e=JSON.parse(e)),t.done(e,n.status,n)}else t.fail(n)},n.send(e)},prevAll:function(){var e=m();if(!this[0])return e;for(var t=this[0];t&&t.previousSibling;)t=t.previousSibling,e.push(t);return e},index:function(e){return e?"string"==typeof e?[].indexOf.call(m(e),this[0]):[].indexOf.call(this,e.length?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},isVisible:function(){return!!this[0]&&!!(this[0].offsetWidth||this[0].offsetHeight||this[0].getClientRects().length)},toArray:function(){return[].slice.call(this)},get:function(e){return null==e?[].slice.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=u.merge(this.constructor(),e);return t.prevObject=this,t},wrapAll:function(e){var t;return this[0]&&(C(e)&&(e=e.call(this[0])),t=u(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){if("string"==typeof e){for(var t=e.split(" "),n=0;n<t.length&&0===t[n].trim().length;)n++;if(n<t.length&&(m(e).length&&t[n].trim()===m(e)[0].tagName&&(e=document.createElement(t[n].trim())),n++),"string"!=typeof e)for(var r=m(e);n<t.length;n++){t[n]=t[n].trim();var o=t[n].split("=");r.attr(o[0],o[1].replace('"',""))}}for(;this[0].firstChild&&this[0].firstChild!==e&&"string"!=typeof e;)e.appendChild(this[0].firstChild)},wrap:function(t){var n=C(t);return this.each(function(e){m(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(){return this.parent().each(function(){this.nodeName&&this.nodeName.toLowerCase()===name.toLowerCase()||u(this).replaceWith(this.childNodes)})},grep:function(e,t,n){for(var r=[],o=0,i=e.length,a=!n;o<i;o++)!t(e[o],o)!==a&&r.push(e[o]);return r},map:function(n){return this.pushStack(u.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack([].slice.apply(this,arguments))},each:function(e){if(this.length)for(var t=0;t<this.length&&!1!==e.call(this[t],t,this[t]);t++);return this},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},empty:function(){for(var e=0;e<this.length;e++)this[e].innerHTML=""},contents:function(){for(var e=m(),t=0;t<this.length;t++)for(var n=this[t].childNodes,r=0;r<n.length;r++)e.push(n[r]);return e},attr:function(e,t){if("object"===M(e)){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&null!==e[n]&&this.attr(n,e[n]);return this}if(void 0===t)return 0===this.length||!this[0].getAttribute&&"checked"!==e?undefined:"checked"===e?this[0].checked:"tagName"===e?this[0].tagName:this[0].getAttribute(e);if("checked"===e)for(var r=0;r<this.length;r++)this[r].checked=t;else if("tagName"===e)for(var o=0;o<this.length;o++)this[o].tagName=t;else for(var i=0;i<this.length;i++)this[i].setAttribute(e,t);return this},removeAttr:function(e){for(var t=0;t<this.length;t++)this[t].removeAttribute&&this[t].removeAttribute(e);return this},hide:function(){return this.css("display","none"),this},show:function(){return this.css("display","block"),this},focus:function(){return this.length&&this[0].focus(),this},blur:function(){return this.length&&this[0].blur(),this},data:function(e,t){if(void 0!==t){for(var n=0;n<this.length;n++)"object"!==M(this[n]["data-"+e]=t)&&"function"!=typeof t&&this[n].setAttribute&&this[n].setAttribute("data-"+e,t);return this}if(void 0!==t)return this.attr("data-"+e,t);if(0===this.length)return undefined;for(var r=0;r<this.length;r++){var o=this[r]["data-"+e];if(null==o&&this[r].getAttribute&&(o=this[r].getAttribute("data-"+e)),void 0!==o&&null!=o)return o}return undefined},removeData:function(e){for(var t=0;t<this.length;t++)this[t].removeAttribute&&this[t].removeAttribute("data-"+e),this[t]["data-"+e]=null;return this},getCorrectStyleName:function(e){if(!a[e]){var t;e in o&&(t=e);for(var n=e[0].toUpperCase()+e.slice(1),r=i.length;r--;)(e=i[r]+n)in o&&(t=e);a[e]=t}return a[e]},css:function(e,t){if(void 0!==t){if(0===this.length)return this;("string"!=typeof t||""===t.trim()||isNaN(t))&&"number"!=typeof t||!/(margin)|(padding)|(height)|(width)|(top)|(left)|(right)|(bottom)/gi.test(e)||/(line-height)/gi.test(e)||(t+="px");for(var n=0;n<this.length;n++)e=m(this).getCorrectStyleName(e),this[n].style[e]=t;return this}if("string"==typeof e){if(0===this.length)return undefined;var r=this[0].ownerDocument||document,o=r.defaultView||r.parentWindow;return e=m(this).getCorrectStyleName(e),o.getComputedStyle(this[0])[e]}for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&this.css(i,e[i]);return this},toggleClass:function(e,t){if(1<e.split(" ").length){for(var n=e.split(" "),r=0;r<n.length;r++)this.toggleClass(n[r],t);return this}for(var o=0;o<this.length;o++)void 0===t?this[o].classList.contains(e)?this[o].classList.remove(e):this[o].classList.add(e):t?this[o].classList.contains(e)||this[o].classList.add(e):this[o].classList.contains(e)&&this[o].classList.remove(e);return this},addClass:function(e){if(0===e.length)return this;if(1<e.split(" ").length){for(var t=e.split(" "),n=0;n<t.length;n++)this.addClass(t[n]);return this}for(var r=0;r<this.length;r++)this[r].classList.add(e);return this},removeClass:function(e){if(1<e.split(" ").length){for(var t=e.split(" "),n=0;n<t.length;n++)t[n]=t[n].trim(),t[n].length&&this.removeClass(t[n]);return this}for(var r=0;r<this.length;r++)e.length&&this[r].classList.remove(e);return this},getClass:function(e){return e.getAttribute&&e.getAttribute("class")||""},stripAndCollapse:function(e){return(e.match(/[^\x20\t\r\n\f]+/g)||[]).join(" ")},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&-1<(" "+m(this).stripAndCollapse(m(this).getClass(n))+" ").indexOf(t))return!0;return!1},scrollTop:function(e){if(void 0===e)return 0===this.length?undefined:this[0]===document?document.documentElement.scrollTop:this[0].scrollTop;for(var t=0;t<this.length;t++)this[t]===document?window.scrollTo(document.documentElement.scrollLeft,e):this[t].scrollTop=e},scrollLeft:function(e){if(void 0===e)return 0===this.length?undefined:this[0]===document?document.documentElement.scrollLeft:this[0].scrollLeft;for(var t=0;t<this.length;t++)this[t]===document?window.scrollTo(e,document.documentElement.scrollTop):this[t].scrollLeft=e},on:function(e,t,n){if(1<e.split(" ").length){for(var r=e.split(" "),o=0;o<r.length;o++)if(-1!==f.indexOf(e))for(var i=0;i<d.length;i++)this.on(d[i]+e[0].toUpperCase()+e.slice(1),t,n);else this.on(r[o],t,n);return this}n="function"==typeof t?h(t,null):h(n,t);for(var a=0;a<this.length;a++){var s=m(this[a]);s.data("events")||s.data("events",[]),s.data("events").push([e,n]);var l=e.split(".");l=l[0],0<=c.indexOf(l)?s.get(0).addEventListener(l,n,{passive:!0}):s.get(0).addEventListener(l,n)}},off:function(e){if(1<e.split(" ").length){for(var t=e.split(" "),n=0;n<t.length;n++)this.off(t[n]);return this}for(var r=0;r<this.length;r++){var o=m(this[r]);if(o.data("events")){var i=e.split(".");i=i[0];for(var a=o.data("events")||[],s=a.length-1;0<=s;s--){var l=a[s];l[0]==e&&(o.get(0).removeEventListener(i,l[1]),a.splice(s,1))}}}},trigger:function(e){for(var t=0;t<this.length;t++){var n=void 0;"function"==typeof Event?n=0<=e.search(/^mouse/g)?new MouseEvent(e,{view:window,cancelable:!0,bubbles:!0}):new Event(e):0<=e.search(/^mouse/g)?(n=document.createEvent("MouseEvents")).initMouseEvent(e,!0,!0,window,0,0,0,0,0,!1,!1,
vendor: 10,294 bytes, line 679
679!1,!1,0,null):(n=document.createEvent("Event")).initEvent(e,!0,!0),0<=r.indexOf(e)&&"function"==typeof this[t][e]?this[t][e]():this[t].dispatchEvent(n)}},triggerHandler:function(){},val:function(e){if(void 0===e)return this[0].value;for(var t=0;t<this.length;t++)this[t].value=e;return this},siblings:function(){return m(this[0]).parent().children().not(this)},find:function(e){var t=m();if("string"!=typeof e){for(var n=0;n<e.length;n++)for(var r=0;r<this.length;r++)if(this[r]!==e[n]&&m(this[r]).contains(e[n])){t.push(e[n]);break}return t}var o=function o(e){return"object"===("undefined"==typeof HTMLElement?"undefined":M(HTMLElement))?e instanceof HTMLElement:e&&"object"===M(e)&&null!==e&&1===e.nodeType&&"string"==typeof e.nodeName};e=g(e);for(var i=0;i<this.length;i++)if(this[i].querySelectorAll){var a=[];if(e&&"string"==typeof e)try{a=this[i].querySelectorAll(e)}catch(l){a=this[i].children}else o(e)&&(a=[e]);for(var s=0;s<a.length;s++)t.push(a[s])}return t},children:function(){for(var e=m(),t=0;t<this.length;t++)for(var n=this[t].children,r=0;r<n.length;r++)e.push(n[r]);return e},not:function(e){if("string"==typeof e)for(var t=this.length-1;0<=t;t--)Element.prototype.matches.call(this[t],e)&&this.splice(t,1);else if(e instanceof u){for(var n=this.length-1;0<=n;n--)for(var r=0;r<e.length;r++)if(this[n]===e[r]){this.splice(n,1);break}}else for(var o=this.length-1;0<=o;o--)this[o]===e[0]&&this.splice(o,1);return this},add:function(e){for(var t=0;t<e.length;t++)this.push(e[t]);return this},closest:function(e){for(var t=0;t<this.length;t++){var n=Element.prototype.closest.call(this[t],e);if(n)return m(n)}return m()},html:function(e){if(void 0===e)return 0===this.length?undefined:this[0].innerHTML;if("string"==typeof e)for(var t=0;t<this.length;t++){this[t].innerHTML=e;for(var n=this[t].children,r=this[t].ownerDocument||document,o=0;o<n.length;o++)if("SCRIPT"===n[o].tagName){var i=r.createElement("script");i.innerHTML=n[o].innerHTML,n[o].hasAttribute("async")&&i.setAttribute("async",""),i.src=n[o].src,n[o].hasAttribute("defer")&&i.setAttribute("defer",""),r.head.appendChild(i).parentNode.removeChild(i)}}else{this[0].innerHTML="",this.append(e[0]);var a=this[0].ownerDocument||document;if("SCRIPT"===e[0].tagName){var s=a.createElement("script");s.innerHTML=e[0].innerHTML,a.head.appendChild(s).parentNode.removeChild(s)}}return this},text:function(e){if(!e)return this.length?this[0].textContent:"";for(var t=0;t<this.length;t++)this[t].textContent=e},after:function e(t){if(t)if("string"==typeof t)for(var n=0;n<this.length;n++){var e=this[n];if(e.nodeType!=Node.ELEMENT_NODE){var r=e.ownerDocument.createElement("SPAN");m(e).after(r),m(r).after(t).remove()}else e.insertAdjacentHTML("afterend",t)}else{var o=this[0];if(o.nextSibling)if(t instanceof u)for(var i=0;i<t.length;i++)o.nextSibling.parentNode.insertBefore(t[i],o.nextSibling);else o.nextSibling.parentNode.insertBefore(t,o.nextSibling);else m(o.parentNode).append(t)}return this},clone:function(e){for(var t=m(),n=0;n<this.length;n++)t.push(this[n].cloneNode(e));return t},replaceWith:function(e){if("string"==typeof e)for(var t=0;t<this.length;t++)this[t].parentNode&&(this[t].outerHTML=e);else if(e&&e.length)for(var n=0;n<this.length;n++)this.replaceWith(e[n]);else this.after(e).remove()},insertBefore:function(e){return m(e).before(this[0]),this},before:function e(t){if(t instanceof u){for(var n=0;n<t.length;n++)this.before(t[n]);return this}if(t)if("string"==typeof t)for(var r=0;r<this.length;r++){var e=this[r];if(e.nodeType!=Node.ELEMENT_NODE){var o=e.ownerDocument.createElement("SPAN");m(e).before(o),m(o).before(t).remove()}else e.parentNode&&e.insertAdjacentHTML("beforebegin",t)}else{var i=this[0];if(i.parentNode)if(t instanceof u)for(var a=0;a<t.length;a++)i.parentNode.insertBefore(t[a],i);else i.parentNode.insertBefore(t,i)}return this},append:function(e){if(0==this.length)return this;if("string"==typeof e)for(var t=0;t<this.length;t++){var n=this[t],r=n.ownerDocument.createElement("SPAN");m(n).append(r),m(r).after(e).remove()}else if(e instanceof u||Array.isArray(e))for(var o=0;o<e.length;o++)this.append(e[o]);else"function"!=typeof e&&this[0].appendChild(e);return this},prepend:function(e){if(0==this.length)return this;if("string"==typeof e)for(var t=0;t<this.length;t++){var n=this[t],r=n.ownerDocument.createElement("SPAN");m(n).prepend(r),m(r).before(e).remove()}else if(e instanceof u)for(var o=0;o<e.length;o++)this.prepend(e[o]);else{var i=this[0];i.firstChild?i.firstChild?i.insertBefore(e,i.firstChild):i.appendChild(e):m(i).append(e)}return this},remove:function(){for(var e=0;e<this.length;e++)this[e].parentNode&&this[e].parentNode.removeChild(this[e]);return this},prev:function(){return this.length&&this[0].previousElementSibling?m(this[0].previousElementSibling):m()},next:function(){return this.length&&this[0].nextElementSibling?m(this[0].nextElementSibling):m()},nextAllVisible:function(){return this.next()},prevAllVisible:function(){return this.prev()},outerHeight:function(e){if(0===this.length)return undefined;var t=this[0];if(t===t.window)return t.innerHeight;var n={},r=this.isVisible();if(!r)for(var o in s)n[o]=t.style[o],t.style[o]=s[o];var i=t.offsetHeight;if(e&&(i+=parseInt(m(t).css("marginTop"))+parseInt(m(t).css("marginBottom"))),!r)for(var a in s)t.style[a]=n[a];return i},outerWidth:function(e){if(0===this.length)return undefined;var t=this[0];if(t===t.window)return t.outerWidth;var n={},r=this.isVisible();if(!r)for(var o in s)n[o]=t.style[o],t.style[o]=s[o];var i=t.offsetWidth;if(e&&(i+=parseInt(m(t).css("marginLeft"))+parseInt(m(t).css("marginRight"))),!r)for(var a in s)t.style[a]=n[a];return i},width:function(e){if(e===undefined){if(this[0]instanceof HTMLDocument)return this[0].body.offsetWidth;if(this[0])return this[0].offsetWidth}else this[0].style.width=e+"px"},height:function(e){var t=this[0];if(e===undefined){if(t instanceof HTMLDocument){var n=t.documentElement;return Math.max(t.body.scrollHeight,n.scrollHeight,t.body.offsetHeight,n.offsetHeight,n.clientHeight)}return t.offsetHeight}t.style.height=e+"px"},is:function(e){return 0!==this.length&&("string"==typeof e&&this[0].matches?this[0].matches(e):e instanceof u?this[0]==e[0]:this[0]==e)},parent:function(){return 0===this.length?m():m(this[0].parentNode)},_matches:function(e,t){var n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return e&&!t?n:n.call(e,t)},parents:function(e){for(var t=m(),n=0;n<this.length;n++)for(var r=this[n].parentNode;r&&r!=document&&this._matches(r);)e?this._matches(r,e)&&t.push(r):t.push(r),r=r.parentNode;return t},parentsUntil:function(e,t){var n=m();e instanceof u&&0<e.length&&(e=e[0]);for(var r=0;r<this.length;r++)for(var o=this[r].parentNode;o&&o!=document&&o!=e&&this[r]!=e&&("string"!=typeof e||!Element.prototype.matches.call(o,e));)t?Element.prototype.matches.call(o,t)&&n.push(o):n.push(o),o=o.parentNode;return n},insertAfter:function(e){var t=e.parent()[0];t&&t.insertBefore(this[0],e[0].nextElementSibling)},filter:function(e){var t=m();if("function"==typeof e)for(var n=0;n<this.length;n++)e.call(this[n],this[n])&&t.push(this[n]);else if("string"==typeof e)for(var r=0;r<this.length;r++)this[r].matches(e)&&t.push(this[r]);return t},offset:function(){if(0===this.length)return undefined;var e=this[0].getBoundingClientRect(),t=this[0].ownerDocument.defaultView;return{top:e.top+t.pageYOffset,left:e.left+t.pageXOffset}},position:function(){return{left:this[0].offsetLeft,top:this[0].offsetTop}},push:[].push,splice:[].splice},u.extend=function(e){e=e||{};for(var t=1;t<arguments.length;t++)if(arguments[t])for(var n in arguments[t])Object.prototype.hasOwnProperty.call(arguments[t],n)&&(e[n]=arguments[t][n]);return e},u.merge=function(e,t){for(var n=+t.length,r=0,o=e.length;r<n;r++)e[o++]=t[r];return e.length=o,e},u.map=function(e,t,n){var r,o,i=0,a=[];if(Array.isArray(e))for(r=e.length;i<r;i++)null!=(o=t(e[i],i,n))&&a.push(o);else for(i in e)null!=(o=t(e[i],i,n))&&a.push(o);return[].concat.apply([],a)};var v=function v(e,t){if(!e)return this;if("string"==typeof e&&"<"===e[0]){var n=document.createElement("DIV");return n.innerHTML=e,m(n.firstElementChild)}if(t=t instanceof u?t[0]:t,"string"!=typeof e)return e instanceof u?e:(this[0]=e,this.length=1,this);e=g(e);for(var r=(t||document).querySelectorAll(e),o=0;o<r.length;o++)this[o]=r[o];return this.length=r.length,this};v.prototype=u.prototype;var b=V;function L(){this.doc=this.$el.get(0).ownerDocument,this.win="defaultView"in this.doc?this.doc.defaultView:this.doc.parentWindow,this.$doc=u(this.doc),this.$win=u(this.win),this.opts.pluginsEnabled||(this.opts.pluginsEnabled=Object.keys(b.PLUGINS)),this.opts.initOnClick?(this.load(b.MODULES),this.$el.on("touchstart.init",function(){u(this).data("touched",!0)}),this.$el.on("touchmove.init",function(){u(this).removeData("touched")}),this.$el.on("mousedown.init touchend.init dragenter.init focus.init",function r(e){if("false"!==this.$el.attr("contentEditable")||!this.opts.initOnClick){if("touchend"===e.type&&!this.$el.data("touched"))return!0;if(1===e.which||!e.which){this.$el.off("mousedown.init touchstart.init touchmove.init touchend.init dragenter.init focus.init"),this.load(b.MODULES),this.load(b.PLUGINS);var t=e.originalEvent&&e.originalEvent.originalTarget;if(t&&"IMG"===t.tagName&&u(t).trigger("mousedown"),"undefined"==typeof this.ul&&this.destroy(),"touchend"===e.type&&this.image&&e.originalEvent&&e.originalEvent.target&&u(e.originalEvent.target).is("img")){var n=this;setTimeout(function(){n.image.edit(u(e.originalEvent.target))},100)}this.ready=!0,this.events.trigger("initialized")}}}.bind(this)),this.events.trigger("initializationDelayed")):(this.load(b.MODULES),this.load(b.PLUGINS),u(this.o_win).scrollTop(this.c_scroll),"undefined"==typeof this.ul&&this.destroy(),this.ready=!0,this.events.trigger("initialized"))}return b.Bootstrap=function(e,t,n){this.id=++b.ID,this.$=u;var r={};"function"==typeof t&&(n=t,t={}),n&&(t.events||(t.events={}),t.events.initialized=n),t&&t.documentReady&&(r.toolbarButtons=[["fullscreen","undo","redo","getPDF","print"],["bold","italic","underline","textColor","backgroundColor","clearFormatting"],["alignLeft","alignCenter","alignRight","alignJustify"],["formatO
679L","formatUL","indent","outdent"],["paragraphFormat"],["fontFamily"],["fontSize"],["insertLink","insertImage","quote"]],r.paragraphFormatSelection=!0,r.fontFamilySelection=!0,r.fontSizeSelection=!0,r.placeholderText="",r.quickInsertEnabled=!1,r.charCounterCount=!1),this.opts=Object.assign({},Object.assign({},b.DEFAULTS,r,"object"===M(t)&&t));var o=JSON.stringify(this.opts);b.OPTS_MAPPING[o]=b.OPTS_MAPPING[o]||this.id,this.sid=b.OPTS_MAPPING[o],b.SHARED[this.sid]=b.SHARED[this.sid]||{},this.shared=b.SHARED[this.sid],this.shared.count=(this.shared.count||0)+1,this.$oel=u(e),this.$oel.data("froala.editor",this),this.o_doc=e.ownerDocument,this.o_win="defaultView"in this.o_doc?this.o_doc.defaultView:this.o_doc.parentWindow,this.c_scroll=u(this.o_win).scrollTop(),this._init()},b.Bootstrap.prototype._init=function(){var e=this.$oel.get(0).tagName;this.$oel.closest("label").length;var t=function(){"TEXTAREA"!==e&&(this._original_html=this._original_html||this.$oel.html()),this.$box=this.$box||this.$oel,this.opts.fullPage&&(this.opts.iframe=!0),this.opts.iframe?(this.$iframe=u('<iframe src="about:blank" frameBorder="0">'),this.$wp=u("<div></div>"),this.$box.html(this.$wp),this.$wp.append(this.$iframe),this.$iframe.get(0).contentWindow.document.open(),this.$iframe.get(0).contentWindow.document.write("<!DOCTYPE html>"),this.$iframe.get(0).contentWindow.document.write("<html><head></head><body></body></html>"),this.$iframe.get(0).contentWindow.document.close(),this.iframe_document=this.$iframe.get(0).contentWindow.document,this.$el=u(this.iframe_document.querySelector("body")),this.el=this.$el.get(0),this.$head=u(this.iframe_document.querySelector("head")),this.$html=u(this.iframe_document.querySelector("html"))):(this.$el=u(this.o_doc.createElement("DIV")),this.el=this.$el.get(0),this.$wp=u(this.o_doc.createElement("DIV")).append(this.$el),this.$box.html(this.$wp)),setTimeout(L.bind(this),0)}.bind(this),n=function(){this.$box=u("<div>"),this.$oel.before(this.$box).hide(),this._original_html=this.$oel.val();var e=this;this.$oel.parents("form").on("submit.".concat(this.id),function(){e.events.trigger("form.submit")}),this.$oel.parents("form").on("reset.".concat(this.id),function(){e.events.trigger("form.reset")}),t()}.bind(this),r=function(){this.$el=this.$oel,this.el=this.$el.get(0),this.$el.attr("contenteditable",!0).css("outline","none").css("display","inline-block"),this.opts.multiLine=!1,this.opts.toolbarInline=!1,setTimeout(L.bind(this),0)}.bind(this),o=function(){this.$el=this.$oel,this.el=this.$el.get(0),this.opts.toolbarInline=!1,setTimeout(L.bind(this),0)}.bind(this),i=function(){this.$el=this.$oel,this.el=this.$el.get(0),this.opts.toolbarInline=!1,this.$oel.on("click.popup",function(e){e.preventDefault()}),setTimeout(L.bind(this),0)}.bind(this);this.opts.editInPopup?i():"TEXTAREA"===e?n():"A"===e?r():"IMG"===e?o():"BUTTON"===e||"INPUT"===e?(this.opts.editInPopup=!0,this.opts.toolbarInline=!1,i()):t()},b.Bootstrap.prototype.load=function(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t)){if(this[t])continue;if(b.PLUGINS[t]&&this.opts.pluginsEnabled.indexOf(t)<0)continue;if(this[t]=new e[t](this),this[t]._init&&(this[t]._init(),this.opts.initOnClick&&"core"===t))return!1}},b.Bootstrap.prototype.destroy=function(){this.destrying=!0,this.shared.count--,this.events&&this.events.$off();var e=this.html&&this.html.get();if(this.opts.iframe&&(this.events.disableBlur(),this.win.focus(),this.events.enableBlur()),this.events&&(this.events.trigger("destroy",[],!0),this.events.trigger("shared.destroy",[],!0)),0===this.shared.count){for(var t in this.shared)Object.prototype.hasOwnProperty.call(this.shared,t)&&(this.shared[t]=null,b.SHARED[this.sid][t]=null);delete b.SHARED[this.sid]}this.$oel.parents("form").off(".".concat(this.id)),this.$oel.off("click.popup"),this.$oel.removeData("froala.editor"),this.$oel.off("froalaEditor"),this.core&&this.core.destroy(e),b.INSTANCES.splice(b.INSTANCES.indexOf(this),1)},V});
680},{}],9:[function(require,module,exports){
681/*!
682 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
683 * License https://froala.com/wysiwyg-editor/terms/
684 * Copyright 2014-2023 Froala Labs
685 */
686
687!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(n.FroalaEditor)}(this,function(i){"use strict";(i=i&&i.hasOwnProperty("default")?i["default"]:i).PLUGINS.align=function(a){var l=a.$;
vendor: 4,146 bytes, lines 687-695
687return{apply:function r(n){var t=a.selection.element();if(l(t).parents(".fr-img-caption").length)l(t).css("text-align",n);else{a.selection.save(),a.html.wrap(!0,!0,!0,!0),a.selection.restore();for(var e=a.selection.blocks(),i=0;i<e.length;i++)l(e[i]).css("text-align",n).removeClass("fr-temp-div"),""===l(e[i]).attr("class")&&l(e[i]).removeAttr("class"),""===l(e[i]).attr("style")&&l(e[i]).removeAttr("style");a.selection.save(),a.html.unwrap(),a.selection.restore()}},refresh:function i(n){var t=a.selection.blocks();if(t.length){var e=a.helpers.getAlignment(l(t[0]));n.find("> *").first().replaceWith(a.icon.create("align-".concat(e)))}},refreshOnShow:function o(n,t){var e=a.selection.blocks();if(e.length){var i=a.helpers.getAlignment(l(e[0]));t.find('a.fr-command[data-param1="'.concat(i,'"]')).addClass("fr-active").attr("aria-selected",!0)}},refreshForToolbar:function s(n){var t=a.selection.blocks();if(t.length){var e=a.helpers.getAlignment(l(t[0]));e=e.charAt(0).toUpperCase()+e.slice(1),"align".concat(e)===n.attr("data-cmd")&&n.addClass("fr-active")}}}},i.DefineIcon("align",{NAME:"align-left",SVG_KEY:"alignLeft"}),i.DefineIcon("align-left",{NAME:"align-left",SVG_KEY:"alignLeft"}),i.DefineIcon("align-right",{NAME:"align-right",SVG_KEY:"alignRight"}),i.DefineIcon("align-center",{NAME:"align-center",SVG_KEY:"alignCenter"}),i.DefineIcon("align-justify",{NAME:"align-justify",SVG_KEY:"alignJustify"}),i.RegisterCommand("align",{type:"dropdown",title:"Align",options:{left:"Align Left",center:"Align Center",right:"Align Right",justify:"Align Justify"},html:function(){var n='<ul class="fr-dropdown-list" role="presentation">',t=i.COMMANDS.align.options;for(var e in t)t.hasOwnProperty(e)&&(n+='<li role="presentation"><a class="fr-command fr-title" tabIndex="-1" role="option" data-cmd="align"data-param1="\n        '.concat(e,'" title="').concat(this.language.translate(t[e]),'">').concat(this.icon.create("align-".concat(e)),'<span class="fr-sr-only">\n        ').concat(this.language.translate(t[e]),"</span></a></li>"));return n+="</ul>"},callback:function(n,t){this.align.apply(t)},refresh:function(n){this.align.refresh(n)},refreshOnShow:function(n,t){this.align.refreshOnShow(n,t)},plugin:"align"}),i.RegisterCommand("alignLeft",{type:"button",icon:"align-left",title:"Align Left",callback:function(){this.align.apply("left")},refresh:function(n){this.align.refreshForToolbar(n)},plugin:"align"}),i.RegisterCommand("alignRight",{type:"button",icon:"align-right",title:"Align Right",callback:function(){this.align.apply("right")},refresh:function(n){this.align.refreshForToolbar(n)},plugin:"align"}),i.RegisterCommand("alignCenter",{type:"button",icon:"align-center",title:"Align Center",callback:function(){this.align.apply("center")},refresh:function(n){this.align.refreshForToolbar(n)},plugin:"align"}),i.RegisterCommand("alignJustify",{type:"button",icon:"align-justify",title:"Align Justify",callback:function(){this.align.apply("justify")},refresh:function(n){this.align.refreshForToolbar(n)},plugin:"align"})});
688},{"froala-editor":8}],10:[function(require,module,exports){
689/*!
690 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
691 * License https://froala.com/wysiwyg-editor/terms/
692 * Copyright 2014-2023 Froala Labs
693 */
694
695!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],e):e(t.FroalaEditor)}(this,function(t){"use strict";(t=t&&t.hasOwnProperty("default")?t["default"]:t).PLUGINS.codeBeautifier=function(){var t,e,n,i,Q={};function y(i,t){var e={"@page":!0,"@font-face":!0,"@keyframes":!0,"@media":!0,"@supports":!0,"@document":!0},n={"@media":!0,"@supports":!0,"@document":!0};t=t||{},i=(i=i||"").replace(/\r\n|[\r\u2028\u2029]/g,"\n");var r=t.indent_size||4,s=t.indent_char||" ",a=t.selector_separator_newline===undefined||t.selector_separator_newline,_=t.end_with_newline!==undefined&&t.end_with_newline,o=t.newline_between_rules===undefined||t.newline_between_rules,c=t.eol?t.eol:"\n";"string"==typeof r&&(r=parseInt(r,10)),t.indent_with_tabs&&(s="\t",r=1),c=c.replace(/\\r/,"\r").replace(/\\n
vendor: 5,222 bytes, line 695
695/,"\n");var l,h=/^\s+$/,u=-1,p=0;function d(){return(l=i.charAt(++u))||""}function f(t){var e,n=u;return t&&E(),e=i.charAt(u+1)||"",u=n-1,d(),e}function T(t){for(var e=u;d();)if("\\"===l)d();else{if(-1!==t.indexOf(l))break;if("\n"===l)break}return i.substring(e,u+1)}function E(){for(var t="";h.test(f());)d(),t+=l;return t}function g(){var t="";for(l&&h.test(l)&&(t=l);h.test(d());)t+=l;return t}function x(t){var e=u;for(t="/"===f(),d();d();){if(!t&&"*"===l&&"/"===f()){d();break}if(t&&"\n"===l)return i.substring(e,u)}return i.substring(e,u)+l}function w(t){return i.substring(u-t.length,u).toLowerCase()===t}function K(){for(var t=0,e=u+1;e<i.length;e++){var n=i.charAt(e);if("{"===n)return!0;if("("===n)t+=1;else if(")"===n){if(0===t)return!1;t-=1}else if(" "===n||"}"===n)return!1}return!1}var R=i.match(/^[\t ]*/)[0],m=new Array(r+1).join(s),b=0,v=0;for(var S,A,k,y={"{":function(t){y.singleSpace(),O.push(t),y.newLine()},"}":function(t){y.newLine(),O.push(t),y.newLine()},_lastCharWhitespace:function(){return h.test(O[O.length-1])},newLine:function(t){O.length&&(t||"\n"===O[O.length-1]||y.trim(),O.push("\n"),R&&O.push(R))},singleSpace:function(){O.length&&!y._lastCharWhitespace()&&O.push(" ")},preserveSingleSpace:function(){S&&y.singleSpace()},trim:function(){for(;y._lastCharWhitespace();)O.pop()}},O=[],N=!1,D=!1,C=!1,L="",I="";;){var V=g();S=""!==V;var P=-1!==V.indexOf("\n");if(I=L,!(L=l))break;if("/"===l&&"*"===f()){var B=0===b;(P||B)&&y.newLine(),O.push(x()),y.newLine(),B&&y.newLine(!0)}else if("/"===l&&"/"===f())P||"{"===I||y.trim(),y.singleSpace(),O.push(x()),y.newLine();else if("@"===l){y.preserveSingleSpace(),O.push(l);var j=(void 0,A=u,k=T(": , {}()[]/='\""),u=A-1,d(),k);j.match(/[ :]$/)&&(d(),j=T(": ").replace(/\s$/,""),O.push(j),y.singleSpace()),(j=j.replace(/\s$/,""))in e&&(v+=1,j in n&&(C=!0))}else"#"===l&&"{"===f()?(y.preserveSingleSpace(),O.push(T("}"))):"{"===l?"}"===f(!0)?(E(),d(),y.singleSpace(),O.push("{}"),y.newLine(),o&&0===b&&y.newLine(!0)):(b++,R+=m,y["{"](l),N=C?(C=!1,v<b):v<=b):"}"===l?(b--,R=R.slice(0,-r),y["}"](l),D=N=!1,v&&v--,o&&0===b&&y.newLine(!0)):":"===l?(E(),!N&&!C||w("&")||K()?":"===f()?(d(),O.push("::")):O.push(":"):(D=!0,O.push(":"),y.singleSpace())):'"'===l||"'"===l?(y.preserveSingleSpace(),O.push(T(l))):" "===l?(D=!1,O.push(l),y.newLine()):"("===l?w("url")?(O.push(l),E(),d()&&(")"!==l&&'"'!==l&&"'"!==l?O.push(T(")")):u--)):(p++,y.preserveSingleSpace(),O.push(l),E()):")"===l?(O.push(l),p--):","===l?(O.push(l),E(),a&&!D&&p<1?y.newLine():y.singleSpace()):("]"===l||("["===l?y.preserveSingleSpace():"="===l?(E(),l="="):y.preserveSingleSpace()),O.push(l))}var M="";return R&&(M+=R),M+=O.join("").replace(/[\r\n\t ]+$/,""),_&&(M+="\n"),"\n"!=c&&(M=M.replace(/[\n]/g,c)),M}function Y(t,e){for(var n=0;n<e.length;n+=1)if(e[n]===t)return!0;return!1}function H(t){return t.replace(/^\s+|\s+$/g,"")}function O(t,e){return new r(t,e).beautify()}t=Q,e="\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u
69519c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",n=new RegExp("[".concat(e,"]")),i=new RegExp("[".concat(e," ").concat("\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u0620-\u0649\u0672-\u06d3\u06e7-\u06e8\u06fb-\u06fc\u0730-\u074a\u0800-\u0814\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0840-\u0857\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962-\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09d7\u09df-\u09e0\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5f-\u0b60\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2-\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d46-\u0d48\u0d57\u0d62-\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e34-\u0e3a\u0e40-\u0e45\u0e50-\u0e59\u0eb4-\u0eb9\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f41-\u0f47\u0f71-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1029\u1040-\u1049\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u170e-\u1710\u1720-\u1730\u1740-\u1750\u1772\u1773\u1780-\u17b2\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1920-\u192b\u1930-\u193b\u1951-\u196d\u19b0-\u19c0\u19c8-\u19c9\u19d0-\u19d9\u1a00-\u1a15\u1a20-\u1a53\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b46-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1bb0-\u1bb9\u1be6-\u1bf3\u1c00-\u1c22\u1c40-\u1c49\u1c5b-\u1c7d\u1cd0-\u1cd2\u1d00-\u1dbe\u1e01-\u1f15\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2d81-\u2d96\u2de0-\u2dff\u3021-\u3028\u3099\u309a\ua640-\ua66d\ua674-\ua67d\ua69f\ua6f0-\ua6f1\ua7f8-\ua800\ua806\ua80b\ua823-\ua827\ua880-\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8f3-\ua8f7\ua900-\ua909\ua926-\ua92d\ua930-\ua945\ua980-\ua983\ua9b3-\ua9c0\uaa00-\uaa27\uaa40-\uaa41\uaa4c-\uaa4d\uaa50-\uaa59\uaa7b\uaae0-\uaae9\uaaf2-\uaaf3\uabc0-\uabe1\uabec\uabed\uabf0-\uabf9\ufb20-\ufb28\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f","]")),t.newline=/[\n\r\u2028\u2029]/,t.lineBreak=new RegExp("\r\n|".concat(t.newline.source)),t.allLineBreaks=new RegExp(t.lineBreak.source,"g"),t.isIdentifierStart=function(t){return t<65?36===t||64===t:t<91||(t<97?95===t:t<123||170<=t&&n.test(String.fromCharCode(t)))},t.isIdentifierChar=function(t){return t<48?36===t:t<58||!(t<65)&&(t<91||(t<97?95===t:t<123||170<=t&&i.test(String.fromCharCode(t))))};var Z={BlockStatement:"BlockStatement",Statement:"Statement",ObjectLiteral
vendor: 12,651 bytes, line 695
695:"ObjectLiteral",ArrayLiteral:"ArrayLiteral",ForInitializer:"ForInitializer",Conditional:"Conditional",Expression:"Expression"};function r(i,t){var c,r,s,l,a,_,o,h,u,e,n,p,d,f=[],T="";function E(t,e){var n=0;return t&&(n=t.indentation_level,!c.just_added_newline()&&t.line_indent_level>n&&(n=t.line_indent_level)),{mode:e,parent:t,last_text:t?t.last_text:"",last_word:t?t.last_word:"",declaration_statement:!1,declaration_assignment:!1,multiline_frame:!1,if_block:!1,else_block:!1,do_block:!1,do_while:!1,in_case_statement:!1,in_case:!1,case_body:!1,indentation_level:n,line_indent_level:t?t.line_indent_level:n,start_line_index:c.get_line_number(),ternary_depth:0}}for(p={TK_START_EXPR:function L(){O();var t=Z.Expression;if("["===l.text){if("TK_WORD"===a||")"===h.last_text)return"TK_RESERVED"===a&&Y(h.last_text,s.line_starters)&&(c.space_before_token=!0),v(t),m(),b(),void(d.space_in_paren&&(c.space_before_token=!0));t=Z.ArrayLiteral,S(h.mode)&&("["!==h.last_text&&(","!==h.last_text||"]"!==_&&"}"!==_)||d.keep_array_indentation||K())}else"TK_RESERVED"===a&&"for"===h.last_text?t=Z.ForInitializer:"TK_RESERVED"===a&&Y(h.last_text,["if","while"])&&(t=Z.Conditional);" "===h.last_text||"TK_START_BLOCK"===a?K():"TK_END_EXPR"===a||"TK_START_EXPR"===a||"TK_END_BLOCK"===a||"."===h.last_text?w(l.wanted_newline):"TK_RESERVED"===a&&"("===l.text||"TK_WORD"===a||"TK_OPERATOR"===a?"TK_RESERVED"===a&&("function"===h.last_word||"typeof"===h.last_word)||"*"===h.last_text&&"function"===_?d.space_after_anon_function&&(c.space_before_token=!0):"TK_RESERVED"!==a||!Y(h.last_text,s.line_starters)&&"catch"!==h.last_text||d.space_before_conditional&&(c.space_before_token=!0):c.space_before_token=!0;"("===l.text&&"TK_RESERVED"===a&&"await"===h.last_word&&(c.space_before_token=!0);"("===l.text&&("TK_EQUALS"!==a&&"TK_OPERATOR"!==a||y()||w());v(t),m(),d.space_in_paren&&(c.space_before_token=!0);b()},TK_END_EXPR:function I(){for(;h.mode===Z.Statement;)k();h.multiline_frame&&w("]"===l.text&&S(h.mode)&&!d.keep_array_indentation);d.space_in_paren&&("TK_START_EXPR"!==a||d.space_in_empty_paren?c.space_before_token=!0:(c.trim(),c.space_before_token=!1));"]"===l.text&&d.keep_array_indentation?(m(),k()):(k(),m());c.remove_redundant_indentation(u),h.do_while&&u.mode===Z.Conditional&&(u.mode=Z.Expression,h.do_block=!1,h.do_while=!1)},TK_START_BLOCK:function V(){var t=D(1),e=D(2);e&&(":"===e.text&&Y(t.type,["TK_STRING","TK_WORD","TK_RESERVED"])||Y(t.text,["get","set"])&&Y(e.type,["TK_WORD","TK_RESERVED"]))?Y(_,["class","interface"])?v(Z.BlockStatement):v(Z.ObjectLiteral):v(Z.BlockStatement);var n=!t.comments_before.length&&"}"===t.text&&"function"===h.last_word&&"TK_END_EXPR"===a;"expand"===d.brace_style||"none"===d.brace_style&&l.wanted_newline?"TK_OPERATOR"!==a&&(n||"TK_EQUALS"===a||"TK_RESERVED"===a&&N(h.last_text)&&"else"!==h.last_text)?c.space_before_token=!0:K(!1,!0):"TK_OPERATOR"!==a&&"TK_START_EXPR"!==a?"TK_START_BLOCK"===a?K():c.space_before_token=!0:S(u.mode)&&","===h.last_text&&("}"===_?c.space_before_token=!0:K());m(),b()},TK_END_BLOCK:function P(){for(;h.mode===Z.Statement;)k();var t="TK_START_BLOCK"===a;"expand"===d.brace_style?t||K():t||(S(h.mode)&&d.keep_array_indentation?(d.keep_array_indentation=!1,K(),d.keep_array_indentation=!0):K());k(),m()},TK_WORD:C,TK_RESERVED:C,TK_SEMICOLON:function B(){O()&&(c.space_before_token=!1);for(;h.mode===Z.Statement&&!h.if_block&&!h.do_block;)k();m()},TK_STRING:function j(){O()?c.space_before_token=!0:"TK_RESERVED"===a||"TK_WORD"===a?c.space_before_token=!0:"TK_COMMA"===a||"TK_START_EXPR"===a||"TK_EQUALS"===a||"TK_OPERATOR"===a?y()||w():K();m()},TK_EQUALS:function M(){O();h.declaration_statement&&(h.declaration_assignment=!0);c.space_before_token=!0,m(),c.space_before_token=!0},TK_OPERATOR:function U(){O();if("TK_RESERVED"===a&&N(h.last_text))return c.space_before_token=!0,void m();if("*"===l.text&&"TK_DOT"===a)return void m();if(":"===l.text&&h.in_case)return h.case_body=!0,b(),m(),K(),void(h.in_case=!1);if("::"===l.text)return void m();"TK_OPERATOR"===a&&w();var t=!0,e=!0;Y(l.text,["--","++","!","~"])||Y(l.text,["-","+"])&&(Y(a,["TK_START_BLOCK","TK_START_EXPR","TK_EQUALS","TK_OPERATOR"])||Y(h.last_text,s.line_starters)||","===h.last_text)?(e=t=!1,!l.wanted_newline||"--"!==l.text&&"++"!==l.text||K(!1,!0)," "===h.last_text&&A(h.mode)&&(t=!0),"TK_RESERVED"===a?t=!0:"TK_END_EXPR"===a?t=!("]"===h.last_text&&("--"===l.text||"++"===l.text)):"TK_OPERATOR"===a&&(t=Y(l.text,["--","-","++","+"])&&Y(h.last_text,["--","-","++","+"]),Y(l.text,["+","-"])&&Y(h.last_text,["--","++"])&&(e=!0)),h.mode!==Z.BlockStatement&&h.mode!==Z.Statement||"{"!==h.last_text&&" "!==h.last_text||K()):":"===l.text?0===h.ternary_depth?t=!1:h.ternary_depth-=1:"?"===l.text?h.ternary_depth+=1:"*"===l.text&&"TK_RESERVED"===a&&"function"===h.last_text&&(e=t=!1);c.space_before_token=c.space_before_token||t,m(),c.space_before_token=e},TK_COMMA:function W(){if(h.declaration_statement)return A(h.parent.mode)&&(h.declaration_assignment=!1),m(),void(h.declaration_assignment?K(h.declaration_assignment=!1,!0):(c.space_before_token=!0,d.comma_first&&w()));m(),h.mode===Z.ObjectLiteral||h.mode===Z.Statement&&h.parent.mode===Z.ObjectLiteral?(h.mode===Z.Statement&&k(),K()):(c.space_before_token=!0,d.comma_first&&w())},TK_BLOCK_COMMENT:function z(){if(c.raw)return c.add_raw_token(l),void(l.directives&&"end"===l.directives.preserve&&(d.test_output_raw||(c.raw=!1)));if(l.directives)return K(!1,!0),m(),"start"===l.directives.preserve&&(c.raw=!0),void K(!1,!0);if(!Q.newline.test(l.text)&&!l.wanted_newline)return c.space_before_token=!0,m(),void(c.space_before_token=!0);var t,e=function a(t){var e;t=t.replace(/\x0d/g,"");var n=[];e=t.indexOf("\n");for(;-1!==e;)n.push(t.substring(0,e)),t=t.substring(e+1),e=t.indexOf("\n");t.length&&n.push(t);return n}(l.text),n=!1,i=!1,r=l.whitespace_before,s=r.length;K(!1,!0),1<e.length&&(!function _(t,e){for(var n=0;n<t.length;n++){var i=H(t[n]);if(i.charAt(0)!==e)return!1}return!0}(e.slice(1),"*")?function o(t,e){for(var n,i=0,r=t.length;i<r;i++)if((n=t[i])&&0!==n.indexOf(e))return!1;return!0}(e.slice(1),r)&&(i=!0):n=!0);for(m(e[0]),t=1;t<e.length;t++)K(!1,!0),n?m(" ".concat(e[t].replace(/^\s+/g,""))):i&&e[t].length>s?m(e[t].substring(s)):c.add_token(e[t]);K(!1,!0)},TK_COMMENT:function G(){l.wanted_newline?K(!1,!0):c.trim(!0);c.space_before_token=!0,m(),K(!1,!0)},TK_DOT:function X(){O();"TK_RESERVED"===a&&N(h.last_text)?c.space_before_token=!0:w(")"===h.last_text&&d.break_chained_methods);m()},TK_UNKNOWN:function F(){m(),"\n"===l.text[l.text.length-1]&&K()},TK_EOF:function $(){for(;h.mode===Z.Statement;)k()}},d={},(t=t||{}).braces_on_own_line!==undefined&&(d.brace_style=t.braces_on_own_line?"expand":"collapse"),d.brace_style=t.brace_style?t.brace_style:d.brace_style?d.brace_style:"collapse","expand-strict"===d.brace_style&&(d.brace_style="expand"),d.indent_size=t.indent_size?parseInt(t.indent_size,10):4,d.indent_char=t.indent_char?t.indent_char:" ",d.eol=t.eol?t.eol:"\n",d.preserve_newlines=t.preserve_newlines===undefined||t.preserve_newlines,d.break_chained_methods=t.break_chained_methods!==undefined&&t.break_chained_methods,d.max_preserve_newlines=t.max_preserve_newlines===undefined?0:parseInt(t.max_preserve_newlines,10),d.space_in_paren=t.space_in_paren!==undefined&&t.space_in_paren,d.space_in_empty_paren=t.space_in_empty_paren!==undefined&&t.space_in_empty_paren,d.jslint_happy=t.jslint_happy!==undefined&&t.jslint_happy,d.space_after_anon_function=t.space_after_anon_function!==undefined&&t.space_after_anon_function,d.keep_array_indentation=t.keep_array_indentation!==undefined&&t.keep_array_indentation,d.space_before_conditional=t.space_before_conditional===undefined||t.space_before_conditional,d.unescape_strings=t.unescape_strings!==undefined&&t.unescape_strings,d.wrap_line_length=t.wrap_line_length===undefined?0:parseInt(t.wrap_line_length,10),d.e4x=t.e4x!==undefined&&t.e4x,d.end_with_newline=t.end_with_newline!==undefined&&t.end_with_newline,d.comma_first=t.comma_first!==undefined&&t.comma_first,d.test_output_raw=t.test_output_raw!==undefined&&t.test_output_raw,d.jslint_happy&&(d.space_after_anon_function=!0),t.indent_with_tabs&&(d.indent_char="\t",d.indent_size=1),d.eol=d.eol.replace(/\\r/,"\r").replace(/\\n/,"\n"),o="";0<d.indent_size;)o+=d.indent_char,d.indent_size-=1;var g=0;if(i&&i.length){for(;" "===i.charAt(g)||"\t"===i.charAt(g);)T+=i.charAt(g),g+=1;i=i.substring(g)}function x(t){var e=t.newlines;if(d.keep_array_indentation&&S(h.mode))for(var n=0;n<e;n+=1)K(0<n);else if(d.max_preserve_newlines&&e>d.max_preserve_newlines&&(e=d.max_preserve_newlines),d.preserve_newlines&&1<t.newlines){K();for(var i=1;i<e;i+=1)K(!0)}p[(l=t).type]()}function w(t){if(t=t!==undefined&&t,!c.just_added_newline())if(d.preserve_newlines&&l.wanted_newline||t)K(!1,!0);else if(d.wrap_line_length){c.current_line.get_character_count()+l.text.length+(c.space_before_token?1:0)>=d.wrap_line_length&&K(!1,!0)}}function K(t,e){if(!e&&" "!==h.last_text&&","!==h.last_text&&"="!==h.last_text&&"TK_OPERATOR"!==a)for(;h.mode===Z.Statement&&!h.if_block&&!h.do_block;)k();c.add_new_line(t)&&(h.multiline_frame=!0)}function R(){c.just_added_newline()&&(d.keep_array_indentation&&S(h.mode)&&l.wanted_newline?(c.current_line.push(l.whitespace_before),c.space_before_token=!1):c.set_indent(h.indentation_level)&&(h.line_indent_level=h.indentation_level))}function m(t){c.raw?c.add_raw_token(l):(d.comma_first&&"TK_COMMA"===a&&c.just_added_newline()&&","===c.previous_line.last()&&(c.previous_line.pop(),R(),c.add_token(","),c.space_before_token=!0),t=t||l.text,R(),c.add_token(t))}function b(){h.indentation_level+=1}function v(t){u=h?(e.push(h),h):E(null,t),h=E(u,t)}function S(t){return t===Z.ArrayLiteral}function A(t){return Y(t,[Z.Expression,Z.ForInitializer,Z.Conditional])}function k(){0<e.length&&(u=h,h=e.pop(),u.mode===Z.Statement&&c.remove_redundant_indentation(u))}function y(){return h.parent.mode===Z.ObjectLiteral&&h.mode===Z.Statement&&(":"===h.last_text&&0===h.ternary_depth||"TK_RESERVED"===a&&Y(h.last_text,["get","set"]))}function O(){return!!("TK_RESERVED"===a&&Y(h.last_text,["const","let","const"])&&"TK_WORD"===l.type||"TK_RESERVED"===a&&"do"===h.last_text||"TK_RESERVED"===a&&"return"===h.last_text&&!l.wanted_newline||"TK_RESERVED"===a&&"else"===h.last_text&&("TK_RESERVED"!==l.type||"if"!==l.text)||"TK_END_EXPR"===a&&(u.mode===Z.ForInitializer||u.mode===Z.Conditional)||"TK_WORD"===a&&h.mode===Z.BlockStatement&&!h.in_case&&"--"!==l.text&&"++"!==l.text&&"function"!==_&&"TK_WORD"!==l.type&&"TK_RESERVED"!==l.type||h.mode===Z.ObjectLiteral&&(":"===h.last_text&&0===h.ternary_depth||"TK_RESERVED"===a&&Y(h.last_text,["get","set"])))&&(v(Z.Statement),b(),"TK_RESERVED"===a&&Y(h.last_text,["const","let","const"])&&"TK_WORD"===l.type&&(h.declaration_statement=!0),y()||w("TK_RESERVED"===l.type&&Y(l.text,["do","for","if","while"])),!0)}function N(t){return Y(t,["case","return","do","if","throw","else"])}function D(t){var e=r+(t||0);return e<0||e>=f.length?null:f[e]}function C(){("TK_RESERVED"===l.type&&h.mode!==Z.ObjectLiteral&&Y(l.text,["set","get"])&&(l.type="TK_WORD"),"TK_RESERVED"===l.type&&h.mode===Z.ObjectLiteral)&&(":"===D(1).text&&(l.type="TK_WORD"));if(O()||!l.wanted_newline||A(h.mode)||"TK_OPERATOR"===a&&"--"!==h.last_text&&"++"!==h.last_text||"TK_EQUALS"===a||!d.preserve_newlines&&"TK_RESERVED"===a&&Y(h.last_text,["const","let","const","set","get"])||K(),h.do_block&&!h.do_while){if("TK_RESERVED"===l.type&&"while"===l.text)return c.space_before_token=!0,m(),c.space_before_token=!0,void(h.do_while=!0);K(),h.do_block=!1}if(h.if_block)if(h.else_block||"TK_RESERVED"!==l.type||"else"!==l.text){for(;h.mode===Z.Statement;)k();h.if_block=!1,h.else_block=!1}else h.else_block=!0;if("TK_RESERVED"===l.type&&("case"===l.text||"default"===l.text&&h.in_case_statement))return K(),(h.case_body||d.jslint_happy)&&(!function t(){0<h.indentation_level&&(!h.parent||h.indentation_level>h.parent.indentation_level)&&(h.indentation_level-=1)}(),h.case_body=!1),m(),h.in_case=!0,void(h.in_case_statement=!0);if("TK_RESERVED"===l.type&&"function"===l.text&&((Y(h.last_text,["}"," "])||c.just_added_newline()&&!Y(h.last_text,["[","{",":","=",","]))&&(c.just_added_blankline()||l.comments_before.length||(K(),K(!0))),"TK_RESERVED"===a||"TK_WORD"===a?"TK_RESERVED"===a&&Y(h.last_text,["get","set","new","return","export","async"])?c.space_before_token=!0:"TK_RESERVED"===a&&"default"===h.last_text&&"export"===_?c.space_before_token=!0:K():"TK_OPERATOR"===a||"="===h.last_text?c.space_before_token=!0:(h.multiline_frame||!A(h.mode)&&!S(h.mode))&&K()),"TK_COMMA"!==a&&"TK_START_EXPR"!==a&&"TK_EQUALS"!==a&&"TK_OPE
695RATOR"!==a||y()||w(),"TK_RESERVED"===l.type&&Y(l.text,["function","get","set"]))return m(),void(h.last_word=l.text);(n="NONE","TK_END_BLOCK"===a?"TK_RESERVED"===l.type&&Y(l.text,["else","catch","finally"])?"expand"===d.brace_style||"end-expand"===d.brace_style||"none"===d.brace_style&&l.wanted_newline?n="NEWLINE":(n="SPACE",c.space_before_token=!0):n="NEWLINE":"TK_SEMICOLON"===a&&h.mode===Z.BlockStatement?n="NEWLINE":"TK_SEMICOLON"===a&&A(h.mode)?n="SPACE":"TK_STRING"===a?n="NEWLINE":"TK_RESERVED"===a||"TK_WORD"===a||"*"===h.last_text&&"function"===_?n="SPACE":"TK_START_BLOCK"===a?n="NEWLINE":"TK_END_EXPR"===a&&(c.space_before_token=!0,n="NEWLINE"),"TK_RESERVED"===l.type&&Y(l.text,s.line_starters)&&")"!==h.last_text&&(n="else"===h.last_text||"export"===h.last_text?"SPACE":"NEWLINE"),"TK_RESERVED"===l.type&&Y(l.text,["else","catch","finally"]))?"TK_END_BLOCK"!==a||"expand"===d.brace_style||"end-expand"===d.brace_style||"none"===d.brace_style&&l.wanted_newline?K():(c.trim(!0),"}"!==c.current_line.last()&&K(),c.space_before_token=!0):"NEWLINE"===n?"TK_RESERVED"===a&&N(h.last_text)?c.space_before_token=!0:"TK_END_EXPR"!==a?"TK_START_EXPR"===a&&"TK_RESERVED"===l.type&&Y(l.text,["const","let","const"])||":"===h.last_text||("TK_RESERVED"===l.type&&"if"===l.text&&"else"===h.last_text?c.space_before_token=!0:K()):"TK_RESERVED"===l.type&&Y(l.text,s.line_starters)&&")"!==h.last_text&&K():h.multiline_frame&&S(h.mode)&&","===h.last_text&&"}"===_?K():"SPACE"===n&&(c.space_before_token=!0);m(),h.last_word=l.text,"TK_RESERVED"===l.type&&"do"===l.text&&(h.do_block=!0),"TK_RESERVED"===l.type&&"if"===l.text&&(h.if_block=!0)}a="TK_START_BLOCK",_="",(c=new q(o,T)).raw=d.test_output_raw,e=[],v(Z.BlockStatement),this.beautify=function(){var t,e;for(s=new tt(i,d,o),f=s.tokenize(),r=0;t=D();){for(var n=0;n<t.comments_before.length;n++)x(t.comments_before[n]);x(t),_=h.last_text,a=t.type,h.last_text=t.text,r+=1}return e=c.get_code(),d.end_with_newline&&(e+="\n"),"\n"!=d.eol&&(e=e.replace(/[\n]/g,d.eol)),e}}function s(e){var n=0,i=-1,r=[],s=!0;this.set_indent=function(t){n=e.baseIndentLength+t*e.indent_length,i=t},this.get_character_count=function(){return n},this.is_empty=function(){return s},this.last=function(){return this._empty?null:r[r.length-1]},this.push=function(t){r.push(t),n+=t.length,s=!1},this.pop=function(){var t=null;return s||(t=r.pop(),n-=t.length,s=0===r.length),t},this.remove_indent=function(){0<i&&(i-=1,n-=e.indent_length)},this.trim=function(){for(;" "===this.last();)r.pop(),n-=1;s=0===r.length},this.toString=function(){var t="";return this._empty||(0<=i&&(t=e.indent_cache[i]),t+=r.join("")),t}}function q(e,n){n=n||"",this.indent_cache=[n],this.baseIndentLength=n.length,this.indent_length=e.length,this.raw=!1;var i=[];this.baseIndentString=n,this.indent_string=e,this.previous_line=null,this.current_line=null,this.space_before_token=!1,this.add_outputline=function(){this.previous_line=this.current_line,this.current_line=new s(this),i.push(this.current_line)},this.add_outputline(),this.get_line_number=function(){return i.length},this.add_new_line=function(t){return(1!==this.get_line_number()||!this.just_added_newline())&&(!(!t&&this.just_added_newline())&&(this.raw||this.add_outputline(),!0))},this.get_code=function(){return i.join("\n").replace(/[\r\n\t ]+$/,"")},this.set_indent=function(t){if(1<i.length){for(;t>=this.indent_cache.length;)this.indent_cache.push(this.indent_cache[this.indent_cache.length-1]+this.indent_string);return this.current_line.set_indent(t),!0}return this.current_line.set_indent(0),!1},this.add_raw_token=function(t){for(var e=0;e<t.newlines;e++)this.add_outputline();this.current_line.push(t.whitespace_before),this.current_line.push(t.text),this.space_before_token=!1},this.add_token=function(t){this.add_space_before_token(),this.current_line.push(t)},this.add_space_before_token=function(){this.space_before_token&&!this.just_added_newline()&&this.current_line.push(" "),this.space_before_token=!1},this.remove_redundant_indentation=function(t){if(!t.multiline_frame&&t.mode!==Z.ForInitializer&&t.mode!==Z.Conditional)for(var e=t.start_line_index,n=i.length;e<n;)i[e].remove_indent(),e++},this.trim=function(t){for(t=t!==undefined&&t,this.current_line.trim(e,n);t&&1<i.length&&this.current_line.is_empty();)i.pop(),this.current_line=i[i.length-1],this.current_line.trim();this.previous_line=1<i.length?i[i.length-2]:null},this.just_added_newline=function(){return this.current_line.is_empty()},this.just_added_blankline=function(){return!!this.just_added_newline()&&(1===i.length||i[i.length-2].is_empty())}}var J=function J(t,e,n,i,r,s){this.type=t,this.text=e,this.comments_before=[],this.newlines=n||0,this.wanted_newline=0<n,this.whitespace_before=i||"",this.parent=null,this.directives=null};function tt(k,y,t){var O="\n\r\t ".split(""),N=/[0-9]/,D=/[01234567]/,C=/[0123456789abcdefABCDEF]/,L="+ - * / % & ++ -- = += -= *= /= %= == === != !== > < >= <= >> << >>> >>>= >>= <<= && &= | || ! ~ , : ? ^ ^= |= :: =>".split(" ");
vendor: 5,111 bytes, line 695
695this.line_starters="continue,try,throw,return,const,let,const,if,switch,case,default,for,while,break,function,import,export".split(",");var I,V,P,B,j,M,U=this.line_starters.concat(["do","in","else","get","set","new","catch","finally","typeof","yield","async","await"]),W=/([\s\S]*?)((?:\*\/)|$)/g,z=/([^\n\r\u2028\u2029]*)/g,G=/\/\* beautify( \w+[:]\w+)+ \*\//g,X=/ (\w+)[:](\w+)/g,F=/([\s\S]*?)((?:\/\*\sbeautify\signore:end\s\*\/)|$)/g,$=/((<\?php|<\?=)[\s\S]*?\?>)|(<%[\s\S]*?%>)/g;function a(){var t,e,n=[];if(I=0,V="",M<=j)return["","TK_EOF"];e=B.length?B[B.length-1]:new J("TK_START_BLOCK","{");var i=k.charAt(j);for(j+=1;Y(i,O);){if(Q.newline.test(i)?"\n"===i&&"\r"===k.charAt(j-2)||(I+=1,n=[]):n.push(i),M<=j)return["","TK_EOF"];i=k.charAt(j),j+=1}if(n.length&&(V=n.join("")),N.test(i)){var r=!0,s=!0,a=N;for("0"===i&&j<M&&/[Xxo]/.test(k.charAt(j))?(s=r=!1,i+=k.charAt(j),j+=1,a=/[o]/.test(k.charAt(j))?D:C):(i="",j-=1);j<M&&a.test(k.charAt(j));)i+=k.charAt(j),j+=1,r&&j<M&&"."===k.charAt(j)&&(i+=k.charAt(j),j+=1,r=!1),s&&j<M&&/[Ee]/.test(k.charAt(j))&&(i+=k.charAt(j),(j+=1)<M&&/[+-]/.test(k.charAt(j))&&(i+=k.charAt(j),j+=1),r=s=!1);return[i,"TK_WORD"]}if(Q.isIdentifierStart(k.charCodeAt(j-1))){if(j<M)for(;Q.isIdentifierChar(k.charCodeAt(j))&&(i+=k.charAt(j),(j+=1)!==M););return"TK_DOT"===e.type||"TK_RESERVED"===e.type&&Y(e.text,["set","get"])||!Y(i,U)?[i,"TK_WORD"]:"in"===i?[i,"TK_OPERATOR"]:[i,"TK_RESERVED"]}if("("===i||"["===i)return[i,"TK_START_EXPR"];if(")"===i||"]"===i)return[i,"TK_END_EXPR"];if("{"===i)return[i,"TK_START_BLOCK"];if("}"===i)return[i,"TK_END_BLOCK"];if(" "===i)return[i,"TK_SEMICOLON"];if("/"===i){var _="";if("*"===k.charAt(j)){j+=1,W.lastIndex=j;var o=W.exec(k);_="/*".concat(o[0]),j+=o[0].length;var c=function S(t){if(!t.match(G))return null;var e={};X.lastIndex=0;for(var n=X.exec(t);n;)e[n[1]]=n[2],n=X.exec(t);return e}(_);return c&&"start"===c.ignore&&(F.lastIndex=j,_+=(o=F.exec(k))[0],j+=o[0].length),[_=_.replace(Q.lineBreak,"\n"),"TK_BLOCK_COMMENT",c]}if("/"===k.charAt(j)){j+=1,z.lastIndex=j;var l=z.exec(k);return _="//".concat(l[0]),j+=l[0].length,[_,"TK_COMMENT"]}}if("`"===i||"'"===i||'"'===i||("/"===i||y.e4x&&"<"===i&&k.slice(j-1).match(/^<([-a-zA-Z:0-9_.]+|{[^{}]*}|!\[CDATA\[[\s\S]*?\]\])(\s+[-a-zA-Z:0-9_.]+\s*=\s*('[^']*'|"[^"]*"|{.*?}))*\s*(\/?)\s*>/))&&("TK_RESERVED"===e.type&&Y(e.text,["return","case","throw","else","do","typeof","yield"])||"TK_END_EXPR"===e.type&&")"===e.text&&e.parent&&"TK_RESERVED"===e.parent.type&&Y(e.parent.text,["if","while","for"])||Y(e.type,["TK_COMMENT","TK_START_EXPR","TK_START_BLOCK","TK_END_BLOCK","TK_OPERATOR","TK_EQUALS","TK_EOF","TK_SEMICOLON","TK_COMMA"]))){var h=i,u=!1,p=!1;if(t=i,"/"===h)for(var d=!1;j<M&&(u||d||k.charAt(j)!==h)&&!Q.newline.test(k.charAt(j));)t+=k.charAt(j),u?u=!1:(u="\\"===k.charAt(j),"["===k.charAt(j)?d=!0:"]"===k.charAt(j)&&(d=!1)),j+=1;else if(y.e4x&&"<"===h){var f=/<(\/?)([-a-zA-Z:0-9_.]+|{[^{}]*}|!\[CDATA\[[\s\S]*?\]\])(\s+[-a-zA-Z:0-9_.]+\s*=\s*('[^']*'|"[^"]*"|{.*?}))*\s*(\/?)\s*>/g,T=k.slice(j-1),E=f.exec(T);if(E&&0===E.index){for(var g=E[2],x=0;E;){var w=!!E[1],K=E[2],R=!!E[E.length-1]||"![CDATA["===K.slice(0,8);if(K!==g||R||(w?--x:++x),x<=0)break;E=f.exec(T)}var m=E?E.index+E[0].length:T.length;return T=T.slice(0,m),j+=m-1,[T=T.replace(Q.lineBreak,"\n"),"TK_STRING"]}}else for(;j<M&&(u||k.charAt(j)!==h&&("`"===h||!Q.newline.test(k.charAt(j))));)(u||"`"===h)&&Q.newline.test(k.charAt(j))?("\r"===k.charAt(j)&&"\n"===k.charAt(j+1)&&(j+=1),t+="\n"):t+=k.charAt(j),u=u?("x"!==k.charAt(j)&&"u"!==k.charAt(j)||(p=!0),!1):"\\"===k.charAt(j),j+=1;if(p&&y.unescape_strings&&(t=function A(t){var e,n=!1,i="",r=0,s="",a=0;for(;n||r<t.length;)if(e=t.charAt(r),r++,n){if(n=!1,"x"===e)s=t.substr(r,2),r+=2;else{if("u"!==e){i+="\\".concat(e);continue}s=t.substr(r,4),r+=4}if(!s.match(/^[0123456789abcdefABCDEF]+$/))return t;if(0<=(a=parseInt(s,16))&&a<32){i+="x"===e?"\\x".concat(s):"\\u".concat(s);continue}if(34===a||39===a||92===a)i+="\\".concat(String.fromCharCode(a));else{if("x"===e&&126<a&&a<=255)return t;i+=String.fromCharCode(a)}}else"\\"===e?n=!0:i+=e;return i}(t)),j<M&&k.charAt(j)===h&&(t+=h,j+=1,"/"===h))for(;j<M&&Q.isIdentifierStart(k.charCodeAt(j));)t+=k.charAt(j),j+=1;return[t,"TK_STRING"]}if("#"===i){if(0===B.length&&"!"===k.charAt(j)){for(t=i;j<M&&"\n"!==i;)t+=i=k.charAt(j),j+=1;return["".concat(H(t),"\n"),"TK_UNKNOWN"]}var b="#";if(j<M&&N.test(k.charAt(j))){for(;b+=i=k.charAt(j),(j+=1)<M&&"#"!==i&&"="!==i;);return"#"===i||("["===k.charAt(j)&&"]"===k.charAt(j+1)?(b+="[]",j+=2):"{"===k.charAt(j)&&"}"===k.charAt(j+1)&&(b+="{}",j+=2)),[b,"TK_WORD"]}}if("<"===i&&("?"===k.charAt(j)||"%"===k.charAt(j))){$.lastIndex=j-1;var v=$.exec(k);if(v)return i=v[0],j+=i.length-1,[i=i.replace(Q.lineBreak,"\n"),"TK_STRING"]}if("<"===i&&"\x3c!--"===k.substring(j-1,j+3)){for(j+=3,i="\x3c!--";!Q.newline.test(k.charAt(j))&&j<M;)i+=k.charAt(j),j++;return P=!0,[i,"TK_COMMENT"]}if("-"===i&&P&&"--\x3e"===k.substring(j-1,j+2))return P=!1,j+=2,["--\x3e","TK_COMMENT"];if("."===i)return[i,"TK_DOT"];if(Y(i,L)){for(;j<M&&Y(i+k.charAt(j),L)&&(i+=k.charAt(j),!(M<=(j+=1))););
vendor: 8,083 bytes, line 695
695return","===i?[i,"TK_COMMA"]:"="===i?[i,"TK_EQUALS"]:[i,"TK_OPERATOR"]}return[i,"TK_UNKNOWN"]}this.tokenize=function(){var t,e,n;M=k.length,j=0,P=!1,B=[];for(var i=null,r=[],s=[];!e||"TK_EOF"!==e.type;){for(n=a(),t=new J(n[1],n[0],I,V);"TK_COMMENT"===t.type||"TK_BLOCK_COMMENT"===t.type||"TK_UNKNOWN"===t.type;)"TK_BLOCK_COMMENT"===t.type&&(t.directives=n[2]),s.push(t),n=a(),t=new J(n[1],n[0],I,V);s.length&&(t.comments_before=s,s=[]),"TK_START_BLOCK"===t.type||"TK_START_EXPR"===t.type?(t.parent=e,r.push(i),i=t):("TK_END_BLOCK"===t.type||"TK_END_EXPR"===t.type)&&i&&("]"===t.text&&"["===i.text||")"===t.text&&"("===i.text||"}"===t.text&&"{"===i.text)&&(t.parent=i.parent,i=r.pop()),B.push(t),e=t}return B}}return{run:function N(t,e){function a(t){return t.replace(/\s+$/g,"")}var n,i,r,T,s,_,E,o,c,g,x,w,l,h;for((e=e||{}).wrap_line_length!==undefined&&0!==parseInt(e.wrap_line_length,10)||e.max_char===undefined||0===parseInt(e.max_char,10)||(e.wrap_line_length=e.max_char),i=e.indent_inner_html!==undefined&&e.indent_inner_html,r=e.indent_size===undefined?4:parseInt(e.indent_size,10),T=e.indent_char===undefined?" ":e.indent_char,_=e.brace_style===undefined?"collapse":e.brace_style,s=0===parseInt(e.wrap_line_length,10)?32786:parseInt(e.wrap_line_length||250,10),E=e.unformatted||["a","span","img","bdo","em","strong","dfn","code","samp","kbd","const","cite","abbr","acronym","q","sub","sup","tt","i","b","big","small","u","s","strike","font","ins","del","address","pre"],o=e.preserve_newlines===undefined||e.preserve_newlines,c=o?isNaN(parseInt(e.max_preserve_newlines,10))?32786:parseInt(e.max_preserve_newlines,10):0,g=e.indent_handlebars!==undefined&&e.indent_handlebars,x=e.wrap_attributes===undefined?"auto":e.wrap_attributes,w=e.wrap_attributes_indent_size===undefined?r:parseInt(e.wrap_attributes_indent_size,10)||r,l=e.end_with_newline!==undefined&&e.end_with_newline,h=Array.isArray(e.extra_liners)?e.extra_liners.concat():"string"==typeof e.extra_liners?e.extra_liners.split(","):"head,body,/html".split(","),e.indent_with_tabs&&(T="\t",r=1),(n=new function k(){return this.pos=0,this.token="",this.current_mode="CONTENT",this.tags={parent:"parent1",parentcount:1,parent1:""},this.tag_type="",this.token_text=this.last_token=this.last_text=this.token_type="",this.newlines=0,this.indent_content=i,this.Utils={whitespace:"\n\r\t ".split(""),single_token:"br,input,link,meta,source,!doctype,basefont,base,area,hr,wbr,param,img,isindex,embed".split(","),extra_liners:h,in_array:function(t,e){for(var n=0;n<e.length;n++)if(t===e[n])return!0;return!1}},this.is_whitespace=function(t){for(;0<t.length;t++)if(!this.Utils.in_array(t.charAt(0),this.Utils.whitespace))return!1;return!0},this.traverse_whitespace=function(){var t="";if(t=this.input.charAt(this.pos),this.Utils.in_array(t,this.Utils.whitespace)){for(this.newlines=0;this.Utils.in_array(t,this.Utils.whitespace);)o&&"\n"===t&&this.newlines<=c&&(this.newlines+=1),this.pos++,t=this.input.charAt(this.pos);return!0}return!1},this.space_or_wrap=function(t){this.line_char_count>=this.wrap_line_length?(this.print_newline(!1,t),this.print_indentation(t)):(this.line_char_count++,t.push(" "))},this.get_content=function(){for(var t="",e=[];"<"!=this.input.charAt(this.pos);){if(this.pos>=this.input.length)return e.length?e.join(""):["","TK_EOF"];if(this.traverse_whitespace())this.space_or_wrap(e);else{if(g){var n=this.input.substr(this.pos,3);if("{{#"===n||"{{/"===n)break;if("{{!"===n)return[this.get_tag(),"TK_TAG_HANDLEBARS_COMMENT"];if("{{"===this.input.substr(this.pos,2)&&"{{else}}"===this.get_tag(!0))break}t=this.input.charAt(this.pos),this.pos++,this.line_char_count++,e.push(t)}}return e.length?e.join(""):""},this.get_contents_to=function(t){if(this.pos===this.input.length)return["","TK_EOF"];var e="",n=new RegExp("</".concat(t,"\\s*>"),"igm");n.lastIndex=this.pos;var i=n.exec(this.input),r=i?i.index:this.input.length;return this.pos<r&&(e=this.input.substring(this.pos,r),this.pos=r),e},this.record_tag=function(t){this.tags["".concat(t,"count")]?this.tags["".concat(t,"count")]++:this.tags["".concat(t,"count")]=1,this.tags[t+this.tags["".concat(t,"count")]]=this.indent_level,this.tags[t+this.tags["".concat(t,"count")]+"parent"]=this.tags.parent,this.tags.parent=t+this.tags["".concat(t,"count")]},this.retrieve_tag=function(t){if(this.tags["".concat(t,"count")]){for(var e=this.tags.parent;e&&t+this.tags["".concat(t,"count")]!==e;)e=this.tags["".concat(e,"parent")];e&&(this.indent_level=this.tags[t+this.tags["".concat(t,"count")]],this.tags.parent=this.tags[e+"parent"]),delete this.tags[t+this.tags["".concat(t,"count")]+"parent"],delete this.tags[t+this.tags["".concat(t,"count")]],1===this.tags["".concat(t,"count")]?delete this.tags["".concat(t,"count")]:this.tags["".concat(t,"count")]--}},this.indent_to_tag=function(t){if(this.tags["".concat(t,"count")]){for(var e=this.tags.parent;e&&t+this.tags["".concat(t,"count")]!==e;)e=this.tags["".concat(e,"parent")];e&&(this.indent_level=this.tags[t+this.tags["".concat(t,"count")]])}},this.get_tag=function(t){var e,n,i="",r=[],s="",a=!1,_=!0,o=this.pos,c=this.line_char_count;t=t!==undefined&&t;do{if(this.pos>=this.input.length)return t&&(this.pos=o,this.line_char_count=c),r.length?r.join(""):["","TK_EOF"];if(i=this.input.charAt(this.pos),this.pos++,this.Utils.in_array(i,this.Utils.whitespace))a=!0;else{if("'"!==i&&'"'!==i||(i+=this.get_unformatted(i),a=!0),"="===i&&(a=!1),r.length&&"="!=r[r.length-1]&&">"!=i&&a){if(this.space_or_wrap(r),a=!1,!_&&"force"===x&&"/"!=i){this.print_newline(!0,r),this.print_indentation(r);for(var l=0;l<w;l++)r.push(T)}for(var h=0;h<r.length;h++)if(" "===r[h]){_=!1;break}}if(g&&"<"===n&&i+this.input.charAt(this.pos)==="{{"&&(i+=this.get_unformatted("}}"),r.length&&" "!=r[r.length-1]&&"<"!=r[r.length-1]&&(i=" ".concat(i)),a=!0),"<"!==i||n||(e=this.pos-1,n="<"),g&&!n&&2<=r.length&&"{"===r[r.length-1]&&"{"===r[r.length-2]&&(e="#"===i||"/"===i||"!"===i?this.pos-3:this.pos-2,n="{"),this.line_char_count++,r.push(i),r[1]&&("!"===r[1]||"?"===r[1]||"%"===r[1])){r=[this.get_comment(e)];break}if(g&&r[1]&&"{"===r[1]&&r[2]&&"!"===r[2]){r=[this.get_comment(e)];break}if(g&&"{"===n&&2<r.length&&"}"===r[r.length-2]&&"}"===r[r.length-1])break}}while(">"!=i);var u,p,d=r.join("");u=-1!=d.indexOf(" ")?d.indexOf(" "):"{"===d[0]?d.indexOf("}"):d.indexOf(">"),p="<"!==d[0]&&g?"#"===d[2]?3:2:1;var f=d.substring(p,u).toLowerCase();return"/"===d.charAt(d.length-2)||this.Utils.in_array(f,this.Utils.single_token)?t||(this.tag_type="SINGLE"):g&&"{"===d[0]&&"else"===f?t||(this.indent_to_tag("if"),this.tag_type="HANDLEBARS_ELSE",this.indent_content=!0,this.traverse_whitespace()):this.is_unformatted(f,E)?(s=this.get_unformatted("</".concat(f,">"),d),r.push(s),this.pos,this.tag_type="SINGLE"):"script"===f&&(-1===d.search("type")||-1<d.search("type")&&-1<d.search(/\b(text|application)\/(x-)?(javascript|ecmascript|jscript|livescript)/))?t||(this.record_tag(f),this.tag_type="SCRIPT"):"style"===f&&(-1===d.search("type")||-1<d.search("type")&&-1<d.search("text/css"))?t||(this.record_tag(f),this.tag_type="STYLE"):"!"===f.charAt(0)?t||(this.tag_type="SINGLE",this.traverse_whitespace()):t||("/"===f.charAt(0)?(this.retrieve_tag(f.substring(1)),this.tag_type="END"):(this.record_tag(f),"html"!=f.toLowerCase()&&(this.indent_content=!0),this.tag_type="START"),this.traverse_whitespace()&&this.space_or_wrap(r),this.Utils.in_array(f,this.Utils.extra_liners)&&(this.print_newline(!1,this.output),this.output.length&&"\n"!=this.output[this.output.length-2]&&this.print_newline(!0,this.output))),t&&(this.pos=o,this.line_char_count=c),r.join("")},this.get_comment=function(t){var e="",n=">",i=!1;this.pos=t;var r=this.input.charAt(this.pos);for(this.pos++;this.pos<=this.input.length&&((e+=r)[e.length-1]!==n[n.length-1]||-1==e.indexOf(n));)!i&&e.length<10&&(0===e.indexOf("<![if")?(n="<![endif]>",i=!0):0===e.indexOf("<![cdata[")?(n="]]>",i=!0):0===e.indexOf("<![")?(n="]>",i=!0):0===e.indexOf("\x3c!--")?(n="--\x3e",i=!0):0===e.indexOf("{{!")?(n="}}",i=!0):0===e.indexOf("<?")?(n="?>",i=!0):0===e.indexOf("<%")&&(n="%>
695",i=!0)),r=this.input.charAt(this.pos),this.pos++;return e},this.get_unformatted=function(t,e){if(e&&-1!=e.toLowerCase().indexOf(t))return"";var n="",i="",r=0,s=!0;do{if(this.pos>=this.input.length)return i;if(n=this.input.charAt(this.pos),this.pos++,this.Utils.in_array(n,this.Utils.whitespace)){if(!s){this.line_char_count--;continue}if("\n"===n||"\r"===n){i+="\n",this.line_char_count=0;continue}}i+=n,this.line_char_count++,s=!0,g&&"{"===n&&i.length&&"{"===i[i.length-2]&&(r=(i+=this.get_unformatted("}}")).length)}while(-1===i.toLowerCase().indexOf(t,r));return i},this.get_token=function(){var t;if("TK_TAG_SCRIPT"!==this.last_token&&"TK_TAG_STYLE"!==this.last_token)return"CONTENT"===this.current_mode?"string"!=typeof(t=this.get_content())?t:[t,"TK_CONTENT"]:"TAG"===this.current_mode?"string"!=typeof(t=this.get_tag())?t:[t,"TK_TAG_".concat(this.tag_type)]:void 0;var e=this.last_token.substr(7);return"string"!=typeof(t=this.get_contents_to(e))?t:[t,"TK_".concat(e)]},this.get_full_indent=function(t){return(t=this.indent_level+t||0)<1?"":new Array(t+1).join(this.indent_string)},this.is_unformatted=function(t,e){if(!this.Utils.in_array(t,e))return!1;if("a"!=t.toLowerCase()||!this.Utils.in_array("a",e))return!0;var n=(this.get_tag(!0)||"").match(/^\s*<\s*\/?([a-z]*)\s*[^>]*>\s*$/);return!(n&&!this.Utils.in_array(n,e))},this.printer=function(t,e,n,i,r){this.input=t||"",this.output=[],this.indent_character=e,this.indent_string="",this.indent_size=n,this.brace_style=r,this.indent_level=0,this.wrap_line_length=i;for(var s=this.line_char_count=0;s<this.indent_size;s++)this.indent_string+=this.indent_character;this.print_newline=function(t,e){this.line_char_count=0,e&&e.length&&(t||"\n"!=e[e.length-1])&&("\n"!=e[e.length-1]&&(e[e.length-1]=a(e[e.length-1])),e.push("\n"))},this.print_indentation=function(t){for(var e=0;e<this.indent_level;e++)t.push(this.indent_string),this.line_char_count+=this.indent_string.length},this.print_token=function(t){this.is_whitespace(t)&&!this.output.length||((t||""!==t)&&this.output.length&&"\n"===this.output[this.output.length-1]&&(this.print_indentation(this.output),t=function e(t){return t.replace(/^\s+/g,"")}(t)),this.print_token_raw(t))},this.print_token_raw=function(t){0<this.newlines&&(t=a(t)),t&&""!==t&&(1<t.length&&"\n"===t[t.length-1]?(this.output.push(t.slice(0,-1)),this.print_newline(!1,this.output)):this.output.push(t));for(var e=0;e<this.newlines;e++)this.print_newline(0<e,this.output);this.newlines=0},this.indent=function(){this.indent_level++},this.unindent=function(){0<this.indent_level&&this.indent_level--}},this}).printer(t,T,r,s,_);;){var u=n.get_token();if(n.token_text=u[0],n.token_type=u[1],"TK_EOF"===n.token_type)break;switch(n.token_type){case"TK_TAG_START":n.print_newline(!1,n.output),n.print_token(n.token_text),n.indent_content&&(n.indent(),n.indent_content=!1),n.current_mode="CONTENT";break;case"TK_TAG_STYLE":case"TK_TAG_SCRIPT":n.print_newline(!1,n.output),n.print_token(n.token_text),n.current_mode="CONTENT";break;case"TK_TAG_END":if("TK_CONTENT"===n.last_token&&""===n.last_text){var p=n.token_text.match(/\w+/)[0],d=null;n.output.length&&(d=n.output[n.output.length-1].match(/(?:<|{{#)\/?\s*(\w+)/)),(null===d||d[1]!=p&&!n.Utils.in_array(d[1],E))&&n.print_newline(!1,n.output)}n.print_token(n.token_text),n.current_mode="CONTENT";break;case"TK_TAG_SINGLE":var f=n.token_text.match(/^\s*<([a-z-]+)/i);f&&n.Utils.in_array(f[1],E)||n.print_newline(!1,n.output),n.print_token(n.token_text),n.current_mode="CONTENT";break;case"TK_TAG_HANDLEBARS_ELSE":n.print_token(n.token_text),n.indent_content&&(n.indent(),n.indent_content=!1),n.current_mode="CONTENT";break;case"TK_TAG_HANDLEBARS_COMMENT":case"TK_CONTENT":n.print_token(n.token_text),n.current_mode="TAG";break;case"TK_STYLE":case"TK_SCRIPT":if(""!==n.token_text){n.print_newline(!1,n.output);var K=n.token_text,R=void 0,m=1;"TK_SCRIPT"===n.token_type?R=O:"TK_STYLE"===n.token_type&&(R=y),"keep"===e.indent_scripts?m=0:"separate"===e.indent_scripts&&(m=-n.indent_level);var b=n.get_full_indent(m);if(R)K=R(K.replace(/^\s*/,b),e);else{var v=K.match(/^\s*/)[0].match(/[^\n\r]*$/)[0].split(n.indent_string).length-1,S=n.get_full_indent(m-v);K=K.replace(/^\s*/,b).replace(/\r\n|\r|\n/g,"\n"+S).replace(/\s+$/,"")}K&&(n.print_token_raw(K),n.print_newline(!0,n.output))}n.current_mode="TAG";break;default:""!==n.token_text&&n.print_token(n.token_text)}n.last_token=n.token_type,n.last_text=n.token_text}var A=n.output.join("").replace(/[\r\n\t ]+$/,"");return l&&(A+="\n"),A}}}});
696},{"froala-editor":8}],11:[function(require,module,exports){
697/*!
698 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
699 * License https://froala.com/wysiwyg-editor/terms/
700 * Copyright 2014-2023 Froala Labs
701 */
702
703!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(e){"use strict";e=e&&e.hasOwnProperty("default")?e["default"]:e,Object.assign(e.DEFAULTS,{codeMirror:window.CodeMirror,codeMirrorOptions:{lineNumbers:!0,tabMode:"indent",indentWithTabs:!0,lineWrapping:!0,mode:"text/html",tabSize:2},codeBeautifierOptions:{end_with_newline:!0,indent_inner_html:!0,extra_liners:["p","h1","h2","h3","h4","h5","h6","blockquote","pre","ul","ol","table","dl"],brace_style:"expand",indent_char:"\t",indent_size:1,wrap_line_length:0},codeViewKeepActiveButtons:["fullscreen"]}),e.PLUGINS.codeView=function(c){var d,f,h=c.$,p=function p(){return c.$box.hasClass("fr-code-view")};function u(){return f?f.getValue():d.val()}function g(){p()&&(f&&f.setSize(null,c.opts.height?c.opts.height:"auto"),c.opts.heightMin||c.opts.height?(c.$box.find(".CodeMirror-scroll, .CodeMirror-gutters").css("min-height",c.opts.heightMin||c.opts.height),d.css("height",c.opts.height)):c.$box.find(".CodeMirror-scroll, .CodeMirror-gutters").css("min-height",""))}var m,b=!1;function v(){p()&&c.events.trigger("blur")}function w(){p()&&b&&c.events.trigger("focus")}function o(e){d||(!function l(){d=h('<textarea class="fr-code" tabIndex="-1">'),c.$wp.append(d),d.attr("dir",c.opts.direction),c.$box.hasClass("fr-basic")||(m=h('<a data-cmd="html" title="Code View" class="fr-command fr-btn html-switch'.concat(c.helpers.isMobile()?"":" fr-desktop",'" role="button" tabIndex="-1"><i class="fa fa-code"></i></button>')),c.$box.append(m),c.events.bindClick(c.$box,"a.html-switch",function(){c.events.trigger("commands.before",["html"]),M(!1),c.events.trigger("commands.after",["html"])}));var e=function e(){return!p()};c.events.on("buttons.refresh",e),c.events.on("copy",e,!0),c.events.on("cut",e,!0),c.events.on("paste",e,!0),c.events.on("destroy",x,!0),c.events.on("html.set",function(){p()&&M(!0)}),c.events.on("codeView.update",g),c.events.on("codeView.toggle",function(){c.$box.hasClass("fr-code-view")&&M()}),c.events.on("form.submit",function(){p()&&(c.html.set(u()),c.events.trigger("contentChanged",[],!0))},!0)}(),!f&&c.opts.codeMirror?((f=c.opts.codeMirror.fromTextArea(d.get(0),c.opts.codeMirrorOptions)).on("blur",v),f.on("focus",w)):(c.events.$on(d,"keydown keyup change input",function(){c.opts.height?this.removeAttribute("rows"):(this.rows=1,0===this.value.length?this.style.height="auto":this.style.height="".concat(this.scrollHeight,"px"))}),c.events.$on(d,"blur",v),c.events.$on(d,"focus",w))),c.undo.saveStep(),c.html.cleanEmptyTags(),c.html.cleanWhiteTags(!0),c.core.hasFocus()&&(c.core.isEmpty()||(c.selection.save(),c.$el.find('.fr
703-marker[data-type="true"]').first().replaceWith('<span class="fr-tmp fr-sm">F</span>'),c.$el.find('.fr-marker[data-type="false"]').last().replaceWith('<span class="fr-tmp fr-em">F</span>')));var t=c.html.get(!1,!0);c.$el.find("span.fr-tmp").remove(),c.$box.toggleClass("fr-code-view",!0);var r,o,n=!1;if(c.core.hasFocus()&&(n=!0,c.events.disableBlur(),c.$el.blur()),t=(t=t.replace(/<span class="fr-tmp fr-sm">F<\/span>/,"FROALA-SM")).replace(/<span class="fr-tmp fr-em">F<\/span>/,"FROALA-EM"),c.codeBeautifier&&!t.includes("fr-embedly")&&(t=c.codeBeautifier.run(t,c.opts.codeBeautifierOptions)),f){r=t.indexOf("FROALA-SM"),(o=t.indexOf("FROALA-EM"))<r?r=o:o-=9;var s=(t=t.replace(/FROALA-SM/g,"").replace(/FROALA-EM/g,"")).substring(0,r).length-t.substring(0,r).replace(/\n/g,"").length,i=t.substring(0,o).length-t.substring(0,o).replace(/\n/g,"").length;r=t.substring(0,r).length-t.substring(0,t.substring(0,r).lastIndexOf("\n")+1).length,o=t.substring(0,o).length-t.substring(0,t.substring(0,o).lastIndexOf("\n")+1).length,f.setSize(null,c.opts.height?c.opts.height:"auto"),c.opts.heightMin&&c.$box.find(".CodeMirror-scroll").css("min-height",c.opts.heightMin),f.setValue(t),b=!n,f.focus(),b=!0,f.setSelection({line:s,ch:r},{line:i,ch:o}),f.refresh(),f.clearHistory()}else{r=t.indexOf("FROALA-SM"),o=t.indexOf("FROALA-EM")-9,c.opts.heightMin&&d.css("min-height",c.opts.heightMin),c.opts.height&&d.css("height",c.opts.height),c.opts.heightMax&&d.css("max-height",c.opts.height||c.opts.heightMax),d.val(t.replace(/FROALA-SM/g,"").replace(/FROALA-EM/g,"")).trigger("change");var a=h(c.o_doc).scrollTop();b=!n,d.focus(),b=!0,d.get(0).setSelectionRange(r,o),h(c.o_doc).scrollTop(a)}c.$tb.find(".fr-btn-grp > .fr-command, .fr-more-toolbar > .fr-command, .fr-btn-grp > .fr-btn-wrap > .fr-command, .fr-more-toolbar > .fr-btn-wrap > .fr-command").not(e).filter(function(){return c.opts.codeViewKeepActiveButtons.indexOf(h(this).data("cmd"))<0}).addClass("fr-disabled").attr("aria-disabled",!0),e.addClass("fr-active").attr("aria-pressed",!0),!c.helpers.isMobile()&&c.opts.toolbarInline&&c.toolbar.hide()}function M(e){void 0===e&&(e=!p());var t=c.$tb.find('.fr-command[data-cmd="html"]');e?(c.popups.hideAll(),o(t)):(c.$box.toggleClass("fr-code-view",!1),function r(e){var t=u();c.html.set(t),c.$el.blur(),c.$tb.find(".fr-btn-grp > .fr-command, .fr-more-toolbar > .fr-command, .fr-btn-grp > .fr-btn-wrap > .fr-command, .fr-more-toolbar > .fr-btn-wrap > .fr-command").not(e).removeClass("fr-disabled").attr("aria-disabled",!1),e.removeClass("fr-active").attr("aria-pressed",!1),c.selection.setAtStart(c.el),c.selection.restore(),c.placeholder.refresh(),c.undo.saveStep()}(t),c.events.trigger("codeView.update"))}function x(){p()&&M(!1),f&&f.toTextArea(),d.val("").removeData().remove(),d=null,m&&(m.remove(),m=null)}return{_init:function e(){if(c.events.on("focus",function(){c.opts.toolbarContainer&&function t(){var e=c.$tb.find('.fr-command[data-cmd="html"]');p()?(c.$tb.find(".fr-btn-grp > .fr-command, .fr-more-toolbar > .fr-command").not(e).filter(function(){return c.opts.codeViewKeepActiveButtons.indexOf(h(this).data("cmd"))<0}).addClass("fr-disabled").attr("aria-disabled",!1),e.addClass("fr-active").attr("aria-pressed",!1)):(c.$tb.find(".fr-btn-grp > .fr-command, .fr-more-toolbar > .fr-command").not(e).removeClass("fr-disabled").attr("aria-disabled",!1),e.removeClass("fr-active").attr("aria-pressed",!1))}()}),!c.$wp)return!1},toggle:M,isActive:p,get:u}},e.RegisterCommand("html",{title:"Code View",undo:!1,focus:!1,forcedRefresh:!0,toggle:!0,callback:function(){this.codeView.toggle()},plugin:"codeView"}),e.DefineIcon("html",{NAME:"code",SVG_KEY:"codeView"})});
704},{"froala-editor":8}],12:[function(require,module,exports){
705/*!
706 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
707 * License https://froala.com/wysiwyg-editor/terms/
708 * Copyright 2014-2023 Froala Labs
709 */
710
711!function(o,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(o.FroalaEditor)}(this,function(k){"use strict";k=k&&k.hasOwnProperty("default")?k["default"]:k,Object.assign(k.POPUP_TEMPLATES,{"textColor.picker":"[_BUTTONS_][_TEXT_COLORS_][_CUSTOM_COLOR_]","backgroundColor.picker":"[_BUTTONS_][_BACKGROUND_COLORS_][_CUSTOM_COLOR_]"}),Object.assign(k.DEFAULTS,{colorsText:["#61BD6D","#1ABC9C","#54ACD2","#2C82C9","#9365B8","#475577","#CCCCCC","#41A85F","#00A885","#3D8EB9","#2969B0","#553982","#28324E","#000000","#F7DA64","#FBA026","#EB6B56","#E25041","#A38F84","#EFEFEF","#FFFFFF","#FAC51C","#F37934","#D14841","#B8312F","#7C706B","#D1D5D8","REMOVE"],colorsBackgroun
vendor: 4,554 bytes, line 711
711d:["#61BD6D","#1ABC9C","#54ACD2","#2C82C9","#9365B8","#475577","#CCCCCC","#41A85F","#00A885","#3D8EB9","#2969B0","#553982","#28324E","#000000","#F7DA64","#FBA026","#EB6B56","#E25041","#A38F84","#EFEFEF","#FFFFFF","#FAC51C","#F37934","#D14841","#B8312F","#7C706B","#D1D5D8","REMOVE"],colorsStep:7,colorsHEXInput:!0,colorsButtons:["colorsBack","|","-"]}),k.PLUGINS.colors=function(g){var E=g.$,l='<div class="fr-color-hex-layer fr-active fr-layer" id="fr-color-hex-layer- \n  '.concat(g.id,'"><div class="fr-input-line"><input maxlength="7" id="[ID]"\n  type="text" placeholder="').concat(g.language.translate("HEX Color"),'" \n  tabIndex="1" aria-required="true"></div><div class="fr-action-buttons"><button \n  type="button" class="fr-command fr-submit" data-cmd="[COMMAND]" tabIndex="2" role="button">\n  ').concat(g.language.translate("OK"),"</button></div></div>");function s(o){for(var t="text"===o?g.opts.colorsText:g.opts.colorsBackground,r='<div class="fr-color-set fr-'.concat(o,'-color fr-selected-set">'),e=0;e<t.length;e++)0!==e&&e%g.opts.colorsStep==0&&(r+="<br>"),"REMOVE"!==t[e]?r+='<span class="fr-command fr-select-color" style="background:'.concat(t[e],';" \n        tabIndex="-1" aria-selected="false" role="button" data-cmd="apply').concat(o,'Color" \n        data-param1="').concat(t[e],'"><span class="fr-sr-only"> ').concat(g.language.translate("Color")).concat(t[e]," \n        &nbsp;&nbsp;&nbsp;</span></span>"):r+='<span class="fr-command fr-select-color" data-cmd="apply'.concat(o,'Color"\n         tabIndex="-1" role="button" data-param1="REMOVE" \n         title="').concat(g.language.translate("Clear Formatting"),'">').concat(g.icon.create("remove"),' \n        <span class="fr-sr-only"> ').concat(g.language.translate("Clear Formatting")," </span></span>");return"".concat(r,"</div>")}function i(o){var t,r=g.popups.get("".concat(o,"Color.picker")),e=E(g.selection.element());t="background"===o?"background-color":"color";var c=r.find(".fr-".concat(o,"-color .fr-select-color"));for(c.find(".fr-selected-color").remove(),c.removeClass("fr-active-item"),c.not('[data-param1="REMOVE"]').attr("aria-selected",!1);e.get(0)!==g.el;){if("transparent"!==e.css(t)&&"rgba(0, 0, 0, 0)"!==e.css(t)){var a=r.find(".fr-".concat(o,'-color .fr-select-color[data-param1="').concat(g.helpers.RGBToHex(e.css(t)),'"]'));a.append('<span class="fr-selected-color" aria-hidden="true">\uf00c</span>'),a.addClass("fr-active-item").attr("aria-selected",!0);break}e=e.parent()}!function n(o){var t=g.popups.get("".concat(o,"Color.picker")),r=t.find(".fr-".concat(o,"-color .fr-active-item")).attr("data-param1"),e=t.find(".fr-color-hex-layer input");r||(r="");e.length&&E(e.val(r).input).trigger("change")}(o)}function e(o){"REMOVE"!==o?g.format.applyStyle("background-color",g.helpers.HEXtoRGB(o)):g.format.removeStyle("background-color"),g.popups.hide("backgroundColor.picker")}function c(o){"REMOVE"!==o?g.format.applyStyle("color",g.helpers.HEXtoRGB(o)):g.format.removeStyle("color"),g.popups.hide("textColor.picker")}return{showColorsPopup:function p(o){var t=g.$tb.find('.fr-command[data-cmd="'.concat(o,'"]')),r=g.popups.get("".concat(o,".picker"));if(r||(r=function n(o){var t="";g.opts.toolbarInline&&0<g.opts.colorsButtons.length&&(t+='<div class="fr-buttons fr-colors-buttons fr-tabs">\n        '.concat(g.button.buildList(g.opts.colorsButtons),"\n        </div>"));var r,e="";r="textColor"===o?(g.opts.colorsHEXInput&&(e=l.replace(/\[ID\]/g,"fr-color-hex-layer-text-".concat(g.id)).replace(/\[COMMAND\]/g,"customTextColor")),{buttons:t,text_colors:s("text"),custom_color:e}):(g.opts.colorsHEXInput&&(e=l.replace(/\[ID\]/g,"fr-color-hex-layer-background-".concat(g.id)).replace(/\[COMMAND\]/g,"customBackgroundColor")),{buttons:t,background_colors:s("background"),custom_color:e});var c=g.popups.create("".concat(o,".picker"),r);return function a(C,b){g.events.on("popup.tab",function(o){var t=E(o.currentTarget);if(!g.popups.isVisible(b)||!t.is("span"))return!0;var r=o.which,e=!0;if(k.KEYCODE.TAB===r){var c=C.find(".fr-buttons");e=!g.accessibility.focusToolbar(c,!!o.shiftKey)}else if(k.KEYCODE.ARROW_UP===r||k.KEYCODE.ARROW_DOWN===r||k.KEYCODE.ARROW_LEFT===r||k.KEYCODE.ARROW_RIGHT===r){if(t.is("span.fr-select-color")){var a=t.parent().find("span.fr-select-color"),n=a.index(t),l=g.opts.colorsStep,s=Math.floor(a.length/l),i=n%l,p=Math.floor(n/l),u=p*l+i,d=s*l;k.KEYCODE.ARROW_UP===r?u=((u-l)%d+d)%d:k.KEYCODE.ARROW_DOWN===r?u=(u+l)%d:k.KEYCODE.ARROW_LEFT===r?u=((u-1)%d+d)%d:k.KEYCODE.ARROW_RIGHT===r&&(u=(u+1)%d);var f=E(a.get(u));
vendor: 12,491 bytes, lines 711-727
711g.events.disableBlur(),f.focus(),e=!1}}else k.KEYCODE.ENTER===r&&(g.button.exec(t),e=!1);return!1===e&&(o.preventDefault(),o.stopPropagation()),e},!0)}(c,"".concat(o,".picker")),c}(o)),!r.hasClass("fr-active"))if(g.popups.setContainer("".concat(o,".picker"),g.$tb),i("textColor"===o?"text":"background"),t.isVisible()){var e=g.button.getPosition(t),c=e.left,a=e.top;g.popups.show("".concat(o,".picker"),c,a,t.outerHeight())}else g.position.forSelection(r),g.popups.show("".concat(o,".picker"))},background:e,customColor:function a(o){var t=g.popups.get("".concat(o,"Color.picker")).find(".fr-color-hex-layer input");if(t.length){var r=t.val();"background"===o?e(r):c(r)}},text:c,back:function o(){g.popups.hide("textColor.picker"),g.popups.hide("backgroundColor.picker"),g.toolbar.showInline()}}},k.DefineIcon("textColor",{NAME:"tint",SVG_KEY:"textColor"}),k.RegisterCommand("textColor",{title:"Text Color",undo:!1,focus:!0,refreshOnCallback:!1,popup:!0,callback:function(){this.popups.isVisible("textColor.picker")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore()),this.popups.hide("textColor.picker")):this.colors.showColorsPopup("textColor")}}),k.RegisterCommand("applytextColor",{undo:!0,callback:function(o,t){this.colors.text(t)}}),k.RegisterCommand("customTextColor",{title:"OK",undo:!0,callback:function(){this.colors.customColor("text")}}),k.DefineIcon("backgroundColor",{NAME:"paint-brush",SVG_KEY:"backgroundColor"}),k.RegisterCommand("backgroundColor",{title:"Background Color",undo:!1,focus:!0,refreshOnCallback:!1,popup:!0,callback:function(){this.popups.isVisible("backgroundColor.picker")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore()),this.popups.hide("backgroundColor.picker")):this.colors.showColorsPopup("backgroundColor")}}),k.RegisterCommand("applybackgroundColor",{undo:!0,callback:function(o,t){this.colors.background(t)}}),k.RegisterCommand("customBackgroundColor",{title:"OK",undo:!0,callback:function(){this.colors.customColor("background")}}),k.DefineIcon("colorsBack",{NAME:"arrow-left",SVG_KEY:"back"}),k.RegisterCommand("colorsBack",{title:"Back",undo:!1,focus:!1,back:!0,refreshAfterCallback:!1,callback:function(){this.colors.back()}}),k.DefineIcon("remove",{NAME:"eraser",SVG_KEY:"remove"})});
712},{"froala-editor":8}],13:[function(require,module,exports){
713/*!
714 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
715 * License https://froala.com/wysiwyg-editor/terms/
716 * Copyright 2014-2023 Froala Labs
717 */
718
719!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(c){"use strict";c=c&&c.hasOwnProperty("default")?c["default"]:c,Object.assign(c.DEFAULTS,{dragInline:!0}),c.PLUGINS.draggable=function(g){var d=g.$;function e(e){return!(!e.originalEvent||!e.originalEvent.target||e.originalEvent.target.nodeType!==Node.TEXT_NODE)||(e.target&&"A"===e.target.tagName&&1===e.target.childNodes.length&&"IMG"===e.target.childNodes[0].tagName&&(e.target=e.target.childNodes[0]),d(e.target).hasClass("fr-draggable")?(g.undo.canDo()||g.undo.saveStep(),g.opts.dragInline?g.$el.attr("contenteditable",!0):g.$el.attr("contenteditable",!1),g.opts.toolbarInline&&g.toolbar.hide(),d(e.target).addClass("fr-dragging"),g.browser.msie||g.browser.edge||g.selection.clear(),void e.originalEvent.dataTransfer.setData("text","Froala")):(e.preventDefault(),!1))}var p,v=function v(e){return!(e&&("HTML"===e.tagName||"BODY"===e.tagName||g.node.isElement(e)))};function m(e,t,r){if(g.opts.iframe){var n=g.helpers.getPX(g.$wp.find(".fr-iframe").css("padding-top")),a=g.helpers.getPX(g.$wp.find(".fr-iframe").css("padding-left"));e+=g.$iframe.offset().top+n,t+=g.$iframe.offset().left+a}p.offset().top!==e&&p.css("top",e),p.offset().left!==t&&p.css("left",t),p.width()!==r&&p.css("width",r)}function t(e){e.originalEvent.dataTransfer.dropEffect="move",g.opts.dragInline?(!function r(){for(var e=null,t=0;t<c.INSTANCES.length;t++)if((e=c.INSTANCES[t].$el.find(".fr-dragging")).length)return e.get(0)}()||g.browser.msie||g.browser.edge)&&e.preventDefault():(e.preventDefault(),function f(e){var t=g.doc.elementFromPoint(e.originalEvent.pageX-g.win.pageXOffset,e.originalEvent.pageY-g.win.pageYOffset);if(!v(t)){for(var r=0,n=t;!v(n)&&n===t&&0<e.originalEvent.pageY-g.win.pageYOffset-r;)r++,n=g.doc.elementFromPoint(e.originalEvent.pageX-g.win.pageXOffset,e.originalEvent.pageY-g.win.pageYOffset-r);(!v(n)||p&&0===g.$el.find(n).length&&n!==p.get(0))&&(n=null);for(var a=0,o=t;!v(o)&&o===t&&e.originalEvent.pageY-g.win.pageYOffset+a<d(g.doc).height();)a++,o=g.doc.elementFromPoint(e.originalEvent.pageX-g.win.pageXOffset,e.originalEvent.pageY-g.win.pageYOffset+a);(!v(o)||p&&0===g.$el.find(o).length&&o!==p.get(0))&&(o=null),t=null===o&&n?n:o&&null===n?o:o&&n?r<a?n:o:null}if(d(t).hasClass("fr-drag-helper"))return!1;if(t&&!g.node.isBlock(t)&&(t=g.node.blockParent(t)),t&&0<=["TD","TH","TR","THEAD","TBODY"].indexOf(t.tagName)&&(t=d(t).parents("table").get(0)),t&&0<=["LI"].indexOf(t.tagName)&&(t=d(t).parents("UL, OL").get(0)),t&&!d(t).hasClass("fr-drag-helper")){var i;p||(c.$draggable_helper||(c.$draggable_helper=d(document.createElement("div")).attr("class","fr-drag-helper")),p=c.$draggable_helper,g.events.on("shared.destroy",function(){p.html("").removeData().remove(),p=null},!0)),i=e.originalEvent.pageY<d(t).offset().top+d(t).outerHeight()/2;var l=d(t),s=0;i||0!==l.next().length?(i||(l=l.next()),"before"===p.data("fr-position")&&l.is(p.data("fr-tag"))||(0<l.prev().length&&(s=parseFloat(l.prev().css("margin-bottom"))||0),s=Math.max(s,parseFloat(l.css("margin-top"))||0),m(l.offset().top-s/2-g.$box.offset().top,l.offset().left-g.win.pageXOffset-g.$box.offset().left,l.width()),p.data("fr-position","before"))):"after"===p.data("fr-position")&&l.is(p.data("fr-tag"))||(s=parseFloat(l.css("margin-bottom"))||0,m(l.offset().top+d(t).height()+s/2-g.$box.offset().top,l.offset().left-g.win.pageXOffset-g.$box.offset().left,l.width()),p.data("fr-position","after")),p.data("fr-tag",l),p.addClass("fr-visible"),g.$box.append(p)}else p&&0<g.$box.find(p).length&&p.removeClass("fr-visible")}(e))}function r(e){e.originalEvent.dataTransfer.dropEffect="move",g.opts.dragInline||e.preventDefault()}function n(e){g.$el.attr("contenteditable",!0);var t=g.$el.find(".fr-dragging");p&&p.hasClass("fr-visible")&&g.$box.find(p).length?a(e):t.length&&(e.preventDefault(),e.stopPropagation()),p&&g.$box.find(p).length&&p.removeClass("fr-visible"),t.removeClass("fr-dragging")}function a(e){var t,r;g.$el.attr("contenteditable",!0);for(var n=0;n<c.INSTANCES.length;n++)if((t=c.INSTANCES[n].$el.find(".fr-dragging")).length){r=c.INSTANCES[n];break}if(t.length){if(e.preventDefault(),e.stopPropagation(),p&&p.hasClass("fr-visible")&&g.$box.find(p).length)p.data("fr-tag")[p.data("fr-position")]('<span class="fr-marker"></span>'),p.removeClass("fr-visible");else if(!1===g.markers.insertAtPoint(e.originalEvent))return!1;if(t.removeClass("fr-dragging"),!1===(t=g.events.chainTrigger("element.beforeDrop",t)))return!1;var a=t;if(t.parent().is("A")&&1===t.parent().get(0).childNodes.length&&(a=t.parent()),g.core.isEmpty())g.events.focus();else g.$el.find(".fr-marker").replaceWith(c.MARKERS),g.selection.restore();if(r===g||g.undo.canDo()||g.undo.saveStep(),g.core.isEmpty())g.$el.html(a);else{var o=g.markers.insert();0===a.find(o).length?d(o).replaceWith(a):0===t.find(o).length&&d(o).replaceWith(t),t.after(c.MARKERS),g.selection.restore()}return g.popups.hideAll(),g.selection.save(),g.$el.find(g.html.emptyBlockTagsQuery()).not("TD, TH, LI, .fr-inner").not(g.opts.htmlAllowedEmptyTags.join(",")).remove(),g.html.wrap(),g.html.fillEmptyBlocks(),g.selection.restore(),g.undo.saveStep(),g.opts.iframe&&g.size.syncIframe(),r!==g&&(r.popups.hideAll(),r.$el.find(r.html.emptyBlockTagsQuery()).not("TD, TH, LI, .fr-inner").remove(),r.html.wrap(),r.html.fillEmptyBlocks(),r.undo.saveStep(),r.events.trigger("element.dropped"),r.opts.iframe&&r.size.syncIframe()),g.events.trigger("element.dropped",[a]),!1}p&&p.removeClass("fr-visible"),g.undo.canDo()||g.undo.saveStep(),setTimeout(function(){g.undo.saveStep()},0)}function o(e){if(e&&"DIV"===e.tagName&&g.node.hasClass(e,"fr-drag-helper"))e.parentNode.removeChild(e);else if(e&&e.nodeType===Node.ELEMENT_NODE)for(var t=e.querySelectorAll("div.fr-drag-helper"),r=0;r<t.length;r++)t[r].parentNode.removeChild(t[r])}return{_init:function i(){g.opts.enter===c.ENTER_BR&&(g.opts.dragInline=!0),g.events.on("dragstart",e,!0),g.events.on("dragover",t,!0),g.events.on("dragenter",r,!0),g.events.on("document.dragend",n,!0),g.events.on("document.drop",n,!0),g.events.on("drop",a,!0),g.events.on("html.processGet",o)}}}});
720},{"froala-editor":8}],14:[function(require,module,exports){
721/*!
722 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
723 * License https://froala.com/wysiwyg-editor/terms/
724 * Copyright 2014-2023 Froala Labs
725 */
726
727!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(m){"use strict";m=m&&m.hasOwnProperty("default")?m["default"]:m,Object.assign(m.POPUP_TEMPLATES,{"file.insert":"[_BUTTONS_][_UPLOAD_LAYER_][_PROGRESS_BAR_]"}),Object.assign(m.DEFAULTS,{fileUpload:!0,fileUploadURL:null,fileUploadParam:"file",fileUploadParams:{},fileUploadToS3:!1,fileUploadToAzure:!1,fileUploadMethod:"POST",fileMaxSize:10485760,fileAllowedTypes:["*"],fileInsertButtons:["fileBack","|"],fileUseSelectedText:!1}),m.PLUGINS.file=function(T){var i,u=T.$,A="https://i.froala.com/upload",c=2,v=3,g=4,S=5,P=6,o={};function k(){var e=T.popups.get("file.insert");e||(e=l()),e.find(".fr-layer.fr-active").removeClass("fr-active").addClass("fr-pactive"),e.find(".fr-file-progress-bar-layer").addClass("fr-active"),e.find(".fr-buttons").hide(),r(T.language.translate("Uploading"),0)}function a(e){var t=T.popups.get("file.insert");t&&(t.find(".fr-layer.fr-pactive").addClass("fr-active").removeClass("fr-pactive"),t.find(".fr-file-progress-bar-layer").removeClass("fr-active"),t.find(".fr-buttons").show(),e&&(T.events.focus(),T.popups.hide("file.insert")))}function r(e,t){var o=T.popups.get("file.insert");if(o){var i=o.find(".fr-file-progress-bar-layer");i.find("h3").text(e+(t?" ".concat(t,"%"):"")),i.removeClass("fr-error"),t?(i.find("div").removeClass("fr-indeterminate"),i.find("div > span").css("width","".concat(t,"%"))):i.find("div").addClass("fr-indeterminate")}}function h(e,t,o){T.edit.on(),T.events.focus(!0),T.selection.restore(),T.opts.fileUseSelectedText&&T.selection.text().length&&(t=T.selection.text()),T.html.insert('<a href="'.concat(e,'" target="_blank" id="fr-inserted-file" class="fr-file">').concat(t,"</a>"));var i=T.$el.find("#fr-inserted-file");i.removeAttr("id"),T.popups.hide("file.insert"),T.undo.saveStep(),f(),T.events.trigger("file.inserted",[i,o])}function w(e,t,o){var i=this.status,r=this.response,a=this.responseXML,n=this.responseText;try{if(T.opts.fileUploadToS3||T.opts.fileUploadToAzure)if(201===i){var s;if(T.opts.fileUploadToAzure){if(!1===T.events.trigger("file.uploadedToAzure",[this.responseURL,o,r],!0))return T.edit.on(),!1;s=t}else s=function p(e){try{var t=u(e).find("Location").text(),o=u(e).find("Key").text();return!1===T.events.trigger("file.uploadedToS3",[t,o,e],!0)?(T.edit.on(),!1):t}catch(i){return x(g,e),!1}}(a);s&&h(s,e,r||a)}else x(g,r||a);else if(200<=i&&i<300){var l=function f(e){try{if(!1===T.events.trigger("file.uploaded",[e],!0))return T.edit.on(),!1;var t=JSON.parse(e);return t.link?t:(x(c,e),!1)}catch(o){return x(g,e),!1}}(n);l&&h(l.link,e,r||n)}else x(v,r||n)}catch(d){x(g,r||n)}}function R(){x(g,this.response||this.responseText||this.responseXML)}function C(e){if(e.lengthComputable){var t=e.loaded/e.total*100|0;r(T.language.translate("Uploading"),t)}}function x(e,t){T.edit.on(),function i(e){k();var t=T.popups.get("file.insert").find(".fr-file-progress-bar-layer");t.addClass("fr-error");var o=t.find("h3");o.text(e),T.events.disableBlur(),o.focus()}(T.language.translate("Something went wrong. Please try again.")),T.events.trigger("file.error",[{code:e,message:o[e]},t])}function z(){T.edit.on(),a(!0)}function n(e){if(void 0!==e&&0<e.length){var t=e[0].type;if(e[0].name&&e[0].name.endsWith(".msg")&&(t="application/vnd.ms-outlook"),!1===T.events.trigger("file.beforeUpload",[e]))return!1;var o,i=e[0];
vendor: 5,835 bytes, line 727
727if(!(null!==T.opts.fileUploadURL&&T.opts.fileUploadURL!==A||T.opts.fileUploadToS3||T.opts.fileUploadToAzure))return function y(a){var n=new FileReader;n.onload=function(){for(var e=n.result,t=atob(n.result.split(",")[1]),o=[],i=0;i<t.length;i++)o.push(t.charCodeAt(i));var r=a.type;a.name&&a.name.endsWith(".msg")&&(r="application/vnd.ms-outlook"),e=window.URL.createObjectURL(new Blob([new Uint8Array(o)],{type:r})),T.file.insert(e,a.name,null)},k(),n.readAsDataURL(a)}(i),!1;if(i.size>T.opts.fileMaxSize)return x(S),!1;if(T.opts.fileAllowedTypes.indexOf("*")<0&&T.opts.fileAllowedTypes.indexOf(t.replace(/file\//g,""))<0)return x(P),!1;if(T.drag_support.formdata&&(o=T.drag_support.formdata?new FormData:null),o){var r;if(!1!==T.opts.fileUploadToS3)for(r in o.append("key",T.opts.fileUploadToS3.keyStart+(new Date).getTime()+"-"+(i.name||"untitled")),o.append("success_action_status","201"),o.append("X-Requested-With","xhr"),o.append("Content-Type",t),T.opts.fileUploadToS3.params)T.opts.fileUploadToS3.params.hasOwnProperty(r)&&o.append(r,T.opts.fileUploadToS3.params[r]);for(r in T.opts.fileUploadParams)T.opts.fileUploadParams.hasOwnProperty(r)&&o.append(r,T.opts.fileUploadParams[r]);o.append(T.opts.fileUploadParam,i);var a,n,s=T.opts.fileUploadURL;T.opts.fileUploadToS3&&(s=T.opts.fileUploadToS3.uploadURL?T.opts.fileUploadToS3.uploadURL:"https://".concat(T.opts.fileUploadToS3.region,".amazonaws.com/").concat(T.opts.fileUploadToS3.bucket));var l=T.opts.fileUploadMethod;T.opts.fileUploadToAzure&&(s=T.opts.fileUploadToAzure.uploadURL?"".concat(T.opts.fileUploadToAzure.uploadURL,"/").concat(i.name):encodeURI("https://".concat(T.opts.fileUploadToAzure.account,".blob.core.windows.net/").concat(T.opts.fileUploadToAzure.container,"/").concat(i.name)),a=s,T.opts.fileUploadToAzure.SASToken&&(s+=T.opts.fileUploadToAzure.SASToken),l="PUT");var p=T.core.getXHR(s,l);if(T.opts.fileUploadToAzure){var f=(new Date).toUTCString();if(!T.opts.fileUploadToAzure.SASToken&&T.opts.fileUploadToAzure.accessKey){var d=T.opts.fileUploadToAzure.account,u=T.opts.fileUploadToAzure.container;if(T.opts.fileUploadToAzure.uploadURL){var c=T.opts.fileUploadToAzure.uploadURL.split("/");u=c.pop(),d=c.pop().split(".")[0]}var v="x-ms-blob-type:BlockBlob\nx-ms-date:".concat(f,"\nx-ms-version:2019-07-07"),g=encodeURI("/"+d+"/"+u+"/"+i.name),h=l+"\n\n\n"+i.size+"\n\n"+t+"\n\n\n\n\n\n\n"+v+"\n"+g,U=T.cryptoJSPlugin.cryptoJS.HmacSHA256(h,T.cryptoJSPlugin.cryptoJS.enc.Base64.parse(T.opts.fileUploadToAzure.accessKey)).toString(T.cryptoJSPlugin.cryptoJS.enc.Base64),m="SharedKey "+d+":"+U;n=U,p.setRequestHeader("Authorization",m)}for(r in p.setRequestHeader("x-ms-version","2019-07-07"),p.setRequestHeader("x-ms-date",f),p.setRequestHeader("Content-Type",t),p.setRequestHeader("x-ms-blob-type","BlockBlob"),T.opts.fileUploadParams)T.opts.fileUploadParams.hasOwnProperty(r)&&p.setRequestHeader(r,T.opts.fileUploadParams[r]);for(r in T.opts.fileUploadToAzure.params)T.opts.fileUploadToAzure.params.hasOwnProperty(r)&&p.setRequestHeader(r,T.opts.fileUploadToAzure.params[r])}p.onload=function(){w.call(p,i.name,a,n)},p.onerror=R,p.upload.onprogress=C,p.onabort=z,k();var b=T.popups.get("file.insert");b&&(b.off("abortUpload"),b.on("abortUpload",function(){4!==p.readyState&&p.abort()})),p.send(T.opts.fileUploadToAzure?i:o)}}}function s(){a()}function l(e){if(e)return T.popups.onHide("file.insert",s),!0;var t;T.opts.fileUpload||T.opts.fileInsertButtons.splice(T.opts.fileInsertButtons.indexOf("fileUpload"),1),t='<div class="fr-buttons fr-tabs">'.concat(T.button.buildList(T.opts.fileInsertButtons),"</div>");var o="";T.opts.fileUpload&&(o='<div class="fr-file-upload-layer fr-layer fr-active" id="fr-file-upload-layer-'.concat(T.id,'"><strong>').concat(T.language.translate("Drop file"),"</strong><br>(").concat(T.language.translate("or click"),')<div class="fr-form"><input type="file" name="').concat(T.opts.fileUploadParam,'" accept="').concat(0<=T.opts.fileAllowedTypes.indexOf("*")?"/":"").concat(T.opts.fileAllowedTypes.join(", ").toLowerCase(),'" tabIndex="-1" aria-labelledby="fr-file-upload-layer-').concat(T.id,'" role="button"></div></div>'));var i={buttons:t,upload_layer:o,progress_bar:'<div class="fr-file-progress-bar-layer fr-layer"><h3 tabIndex="-1" class="fr-message">Uploading</h3><div class="fr-loader"><span class="fr-progress"></span></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-dismiss" data-cmd="fileDismissError" tabIndex="2" role="button">OK</button></div></div>'},r=T.popups.create("file.insert",i);return function a(o){T.events.$on(o,"dragover dragenter",".fr-file-upload-layer",function(){return u(this).addClass("fr-drop"),!1},!0),T.events.$on(o,"dragleave dragend",".fr-file-upload-layer",function(){return u(this).removeClass("fr-drop"),!1},!0),T.events.$on(o,"drop",".fr-file-upload-layer",function(e){e.preventDefault(),e.stopPropagation(),u(this).removeClass("fr-drop");var t=e.originalEvent.dataTransfer;t&&t.files&&(o.data("instance")||T).file.upload(t.files)},!0),T.helpers.isIOS()&&T.events.$on(o,"touchstart",'.fr-file-upload-layer input[type="file"]',function(){u(this).trigger("click")}),T.events.$on(o,"change",'.fr-file-upload-layer input[type="file"]',function(){if(this.files){var e=o.data("instance")||T;e.events.disableBlur(),o.find("input:focus").blur(),e.events.enableBlur(),e.file.upload(this.files)}u(this).val("")},!0)}(r),r}function t(e){T.node.hasClass(e,"fr-file")}function p(e){var t=e.originalEvent.dataTransfer;if(t&&t.files&&t.files.length){var o=t.files[0];if(o&&"undefined"!=typeof o.type){if(o.type.indexOf("image")<0){if(!T.opts.fileUpload)return e.preventDefault(),e.stopPropagation(),!1;T.markers.remove(),T.markers.insertAtPoint(e.originalEvent),T.$el.find(".fr-marker").replaceWith(m.MARKERS),T.popups.hideAll();var i=T.popups.get("file.insert");
vendor: 4,410 bytes, lines 727-735
727return i||(i=l()),T.popups.setContainer("file.insert",T.$sc),T.popups.show("file.insert",e.originalEvent.pageX,e.originalEvent.pageY),k(),n(t.files),e.preventDefault(),e.stopPropagation(),!1}}else o.type.indexOf("image")<0&&(e.preventDefault(),e.stopPropagation())}}function f(){var e,t=Array.prototype.slice.call(T.el.querySelectorAll("a.fr-file")),o=[];for(e=0;e<t.length;e++)o.push(t[e].getAttribute("href"));if(i)for(e=0;e<i.length;e++)o.indexOf(i[e].getAttribute("href"))<0&&T.events.trigger("file.unlink",[i[e]]);i=t}return o[1]="File cannot be loaded from the passed link.",o[c]="No link in upload response.",o[v]="Error during file upload.",o[g]="Parsing response failed.",o[S]="File is too large.",o[P]="File file type is invalid.",o[7]="Files can be uploaded only to same domain in IE 8 and IE 9.",{_init:function d(){!function e(){T.events.on("drop",p),T.events.$on(T.$win,"keydown",function(e){var t=e.which,o=T.popups.get("file.insert");o&&t===m.KEYCODE.ESC&&o.trigger("abortUpload")}),T.events.on("destroy",function(){var e=T.popups.get("file.insert");e&&e.trigger("abortUpload")})}(),T.events.on("link.beforeRemove",t),T.$wp&&(f(),T.events.on("contentChanged",f)),l(!0)},showInsertPopup:function U(){var e=T.$tb.find('.fr-command[data-cmd="insertFile"]'),t=T.popups.get("file.insert");if(t||(t=l()),a(),!t.hasClass("fr-active"))if(T.popups.refresh("file.insert"),T.popups.setContainer("file.insert",T.$tb),e.isVisible){var o=T.button.getPosition(e),i=o.left,r=o.top;T.popups.show("file.insert",i,r,e.outerHeight())}else T.position.forSelection(t),T.popups.show("file.insert")},upload:n,insert:h,back:function e(){T.events.disableBlur(),T.selection.restore(),T.events.enableBlur(),T.popups.hide("file.insert"),T.toolbar.showInline()},hideProgressBar:a}},m.DefineIcon("insertFile",{NAME:"file-o",FA5NAME:"file",SVG_KEY:"insertFile"}),m.RegisterCommand("insertFile",{title:"Upload File",undo:!1,focus:!0,refreshAfterCallback:!1,popup:!0,callback:function(){this.popups.isVisible("file.insert")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore()),this.popups.hide("file.insert")):this.file.showInsertPopup()},plugin:"file"}),m.DefineIcon("fileBack",{NAME:"arrow-left",SVG_KEY:"back"}),m.RegisterCommand("fileBack",{title:"Back",undo:!1,focus:!1,back:!0,refreshAfterCallback:!1,callback:function(){this.file.back()},refresh:function(e){this.opts.toolbarInline?(e.removeClass("fr-hidden"),e.next(".fr-separator").removeClass("fr-hidden")):(e.addClass("fr-hidden"),e.next(".fr-separator").addClass("fr-hidden"))}}),m.RegisterCommand("fileDismissError",{title:"OK",callback:function(){this.file.hideProgressBar(!0)}})});
728},{"froala-editor":8}],15:[function(require,module,exports){
729/*!
730 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
731 * License https://froala.com/wysiwyg-editor/terms/
732 * Copyright 2014-2023 Froala Labs
733 */
734
735!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(Me){"use strict";function Ke(e){return(Ke="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Me=Me&&Me.hasOwnProperty("default")?Me["default"]:Me,Object.assign(Me.POPUP_TEMPLATES,{"image.insert":"[_BUTTONS_][_UPLOAD_LAYER_][_BY_URL_LAYER_][_PROGRESS_BAR_]","image.edit":"[_BUTTONS_]","image.alt":"[_BUTTONS_][_ALT_LAYER_]","image.size":"[_BUTTONS_][_SIZE_LAYER_]"}),Object.assign(Me.DEFAULTS,{imageInsertButtons:["imageBack","|","imageUpload","imageByURL"],imageEditButtons:["imageReplace","imageAlign","imageCaption","imageRemove","imageLink","linkOpen","linkEdit","linkRemove","-","imageDisplay","imageStyle","imageAlt","imageSize"],imageAltButtons:["imageBack","|"],imageSizeButtons:["imageBack","|"],imageUpload:!0,imageUploadURL:null,imageCORSProxy:"https://cors-anywhere.froala.com",imageUploadRemoteUrls:!0,imageUploadParam:"file",imageUploadParams:{},imageUploadToS3:!1,imageUploadToAzure:!1,imageUploadMethod:"POST",imageMaxSize:10485760,imageAllowedTypes:["jpeg","jpg","png","gif","webp"],imageResize:!0,imageResizeWithPercent:!1,imageRoundPercent:!1,imageDefaultWidth:300,imageDefaultAlign:"center",imageDefaultDisplay:"block",imageSplitHTML:!1,imageStyles:{"fr
735-rounded":"Rounded","fr-bordered":"Bordered","fr-shadow":"Shadow"},imageMove:!0,imageMultipleStyles:!0,imageTextNear:!0,imagePaste:!0,imagePasteProcess:!1,imageMinWidth:16,imageOutputSize:!1,imageDefaultMargin:5,imageAddNewLine:!1}),Me.IMAGE_ALLOW_REGEX=/\.(gif|jpe?g|tiff?|png|webp|bmp)$/i,Me.PLUGINS.image=function(A){var C,p,g,f,s,a,S=A.$,E="https://i.froala.com/upload",t=!1,i=1,c=2,d=3,m=4,R=5,U=6,r={};function u(){var e=A.popups.get("image.insert").find(".fr-image-by-url-layer input");e.val(""),C&&e.val(C.attr("src")),e.trigger("change")}function o(e){return window.pageYOffset+e.get(0).getBoundingClientRect().top}function n(){var e=A.popups.get("image.edit");if(e||(e=P()),e){var t=C;A.popups.setContainer("image.edit",A.$sc),A.popups.refresh("image.edit");var a=t.offset().left+t.outerWidth()/2,i=t&&o(t),r=A.$wp&&o(A.$wp);r||(r=i);var n=0;A.opts.iframe?((n=A.$wp.scrollTop()+e.outerHeight())<t.get(0).getBoundingClientRect().top&&(n=t.get(0).getBoundingClientRect().top),n>t.get(0).getBoundingClientRect().top+t.height()&&(n=t.get(0).getBoundingClientRect().top+t.height())):n=r<i?i:A.$wp&&i+t.height()<r+A.$wp.height()?i+t.height():r+e.outerHeight(),C.hasClass("fr-uploading")?N():A.popups.show("image.edit",a,n,1,!0)}}function h(){k()}function l(e){0<e.parents(".fr-img-caption").length&&(e=e.parents(".fr-img-caption").first());var t=e.hasClass("fr-dib")?"block":e.hasClass("fr-dii")?"inline":null,a=e.hasClass("fr-fil")?"left":e.hasClass("fr-fir")?"right":ve(e);he(e,t,a),e.removeClass("fr-dib fr-dii fr-fir fr-fil")}function v(){for(var e,t="IMG"==A.el.tagName?[A.el]:A.el.querySelectorAll("img"),a=0;a<t.length;a++){var i=S(t[a]);!A.opts.htmlUntouched&&A.opts.useClasses?((A.opts.imageDefaultAlign||A.opts.imageDefaultDisplay)&&(0<(e=i).parents(".fr-img-caption").length&&(e=e.parents(".fr-img-caption").first()),e.hasClass("fr-dii")||e.hasClass("fr-dib")||(e.addClass("fr-fi".concat(ve(e)[0])),e.addClass("fr-di".concat(be(e)[0])),e.css("margin",""),e.css("float",""),e.css("display",""),e.css("z-index",""),e.css("position",""),e.css("overflow",""),e.css("vertical-align",""))),A.opts.imageTextNear||(0<i.parents(".fr-img-caption").length?i.parents(".fr-img-caption").first().removeClass("fr-dii").addClass("fr-dib"):i.removeClass("fr-dii").addClass("fr-dib"))):A.opts.htmlUntouched||A.opts.useClasses||(A.opts.imageDefaultAlign||A.opts.imageDefaultDisplay)&&l(i),A.opts.iframe&&i.on("load",A.size.syncIframe)}}function b(e){void 0===e&&(e=!0);var t,a=Array.prototype.slice.call(A.el.querySelectorAll("img")),i=[];for(t=0;t<a.length;t++)if(i.push(a[t].getAttribute("src")),S(a[t]).toggleClass("fr-draggable",A.opts.imageMove),""===a[t].getAttribute("class")&&a[t].removeAttribute("class"),""===a[t].getAttribute("style")&&a[t].removeAttribute("style"),a[t].parentNode&&a[t].parentNode.parentNode&&A.node.hasClass(a[t].parentNode.parentNode,"fr-img-caption")){var r=a[t].parentNode.parentNode;A.browser.mozilla||r.setAttribute("contenteditable",!1),r.setAttribute("draggable",!1),r.classList.add("fr-draggable");var n=a[t].nextSibling;n&&!A.browser.mozilla&&n.setAttribute("contenteditable",!0)}if(s)for(t=0;t<s.length;t++)i.indexOf(s[t].getAttribute("src"))<0&&A.events.trigger("image.removed",[S(s[t])]);if(s&&e){var o=[];for(t=0;t<s.length;t++)o.push(s[t].getAttribute("src"));for(t=0;t<a.length;t++)o.indexOf(a[t].getAttribute("src"))<0&&A.events.trigger("image.loaded",[S(a[t])])}s=a}function D(){if(p||function o(){var e;A.shared.$image_resizer?(p=A.shared.$image_resizer,f=A.shared.$img_overlay,A.events.on("destroy",function(){S("body").first().append(p.removeClass("fr-active"))},!0)):(A.shared.$image_resizer=S(document.createElement("div")).attr("class","fr-image-resizer"),p=A.shared.$image_resizer,A.events.$on(p,"mousedown",function(e){e.stopPropagation()},!0),A.opts.imageResize&&(p.append(y("nw")+y("ne")+y("sw")+y("se")),A.shared.$img_overlay=S(document.createElement("div")).attr("class","fr-image-overlay"),f=A.shared.$img_overlay,e=p.get(0).ownerDocument,S(e).find("body").first().append(f)));A.events.on("shared.destroy",function(){p.html("").removeData().remove(),p=null,A.opts.imageResize&&(f.remove(),f=null)},!0),A.helpers.isMobile()||A.events.$on(S(A.o_win),"resize",function(){C&&!C.hasClass("fr-uploading")?ce(!0):C&&(D(),ye(),N(!1))});if(A.opts.imageResize){e=p.get(0).ownerDocument,A.events.$on(p,A._mousedown,".fr-handler",x),A.events.$on(S(e),A._mousemove,T),A.events.$on(S(e.defaultView||e.parentWindow),A._mouseup,$),A.events.$on(f,"mouseleave",$);var i=1,r=null,n=0;A.events.on("keydown",function(e){if(C){var t=-1!=navigator.userAgent.indexOf("Mac OS X")?e.metaKey:e.ctrlKey,a=e.which;(a!==r||200<e.timeStamp-n)&&(i=1),(a==Me.KEYCODE.EQUALS||A.browser.mozilla&&a==Me.KEYCODE.FF_EQUALS)&&t&&!e.altKey?i=te.call(this,e,1,1,i):(a==Me.KEYCODE.HYPHEN||A.browser.mozilla&&a==Me.KEYCODE.FF_HYPHEN)&&t&&!e.altKey?i=te.call(this,e,2,-1,i):A.keys.ctrlKey(e)||a!=Me.KEYCODE.ENTER||(C.before("<br>"),z(C)),r=a,n=e.timeStamp}},!0),A.events.on("keyup",function(){i=1})}}(),!C)return!1;var e=A.$wp||A.$sc;e.append(p),p.data("instance",A);var t=e.scrollTop()-("static"!=e.css("position")?e.offset().top:0),a=e.scrollLeft()-("static"!=e.css("position")?e.offset().left:0);a-=A.helpers.getPX(e.css("border-left-width")),t-=A.helpers.getPX(e.css("border-top-width")),A.$el.is("img")&&A.$sc.is("body")&&(a=t=0);var i=Ce();Se()&&(i=i.find(".fr-img-wrap"));var r=0,n=0;A.opts.iframe&&(r=A.helpers.getPX(A.$wp.find(".fr-iframe").css("padding-top")),n=A.helpers.getPX(A.$wp.find(".fr-iframe").css("padding-left"))),p.css("top",(A.opts.iframe?i.offset().top+r:i.offset().top+t)-1).css("left",(A.opts.iframe?i.offset().left+n:i.offset().left+a)-1).css("width",i.get(0).getBoundingClientRect().width).css("height",i.get(0).getBoundingClientRect().height).addClass("fr-active")}function y(e){return'<div class="fr-handler fr-h'.concat(e,'"></div>')}function w(e){Se()&&C.parents(".fr-img-caption").css("width",e),C.css("width",e)}function x(e){if(!A.core.sameInstance(p))return!0;
vendor: 19,404 bytes, line 735
735if(e.preventDefault(),e.stopPropagation(),A.$el.find("img.fr-error").left)return!1;A.undo.canDo()||A.undo.saveStep();var t=e.pageX||e.originalEvent.touches[0].pageX;if("mousedown"==e.type){var a=A.$oel.get(0),i=a.ownerDocument,r=i.defaultView||i.parentWindow,n=!1;try{n=r.location!=r.parent.location&&!(r.$&&r.$.FE)}catch(l){}n&&r.frameElement&&(t+=A.helpers.getPX(S(a).offset().left)+r.frameElement.clientLeft)}(g=S(this)).data("start-x",t),g.data("start-width",C.width()),g.data("start-height",C.height());var o=C.width();if(A.opts.imageResizeWithPercent){var s=C.parentsUntil(A.$el,A.html.blockTagsQuery()).get(0)||A.el;o=(o/S(s).outerWidth()*100).toFixed(2)+"%"}w(o),f.show(),A.popups.hideAll(),ue()}function T(e){if(!A.core.sameInstance(p))return!0;var t;if(g&&C){if(e.preventDefault(),A.$el.find("img.fr-error").left)return!1;var a=e.pageX||(e.originalEvent.touches?e.originalEvent.touches[0].pageX:null);if(!a)return!1;var i=a-g.data("start-x"),r=g.data("start-width");if((g.hasClass("fr-hnw")||g.hasClass("fr-hsw"))&&(i=0-i),A.opts.imageResizeWithPercent){var n=C.parentsUntil(A.$el,A.html.blockTagsQuery()).get(0)||A.el;r=((r+i)/S(n).outerWidth()*100).toFixed(2),A.opts.imageRoundPercent&&(r=Math.round(r)),w("".concat(r,"%")),(t=Se()?(A.helpers.getPX(C.parents(".fr-img-caption").css("width"))/S(n).outerWidth()*100).toFixed(2):(A.helpers.getPX(C.css("width"))/S(n).outerWidth()*100).toFixed(2))===r||A.opts.imageRoundPercent||w("".concat(t,"%")),C.css("height","").removeAttr("height")}else r+i>=A.opts.imageMinWidth&&(w(r+i),t=Se()?A.helpers.getPX(C.parents(".fr-img-caption").css("width")):A.helpers.getPX(C.css("width"))),t!==r+i&&w(t),((C.attr("style")||"").match(/(^height:)|(; *height:)/)||C.attr("height"))&&(C.css("height",g.data("start-height")*C.width()/g.data("start-width")),C.removeAttr("height"));D(),A.events.trigger("image.resize",[Ae()])}}function $(e){if(!A.core.sameInstance(p))return!0;if(g&&C){if(e&&e.stopPropagation(),A.$el.find("img.fr-error").left)return!1;g=null,f.hide(),D(),n(),A.undo.saveStep(),A.events.trigger("image.resizeEnd",[Ae()])}else p.removeClass("fr-active")}function I(e,t,a){A.edit.on(),C&&C.addClass("fr-error"),r[e]?O(A.language.translate(r[e])):O(A.language.translate("Something went wrong. Please try again.")),!C&&a&&ae(a),A.events.trigger("image.error",[{code:e,message:r[e]},t,a])}function P(e){if(e)return A.$wp&&A.events.$on(A.$wp,"scroll.image-edit",function(){C&&A.popups.isVisible("image.edit")&&(A.events.disableBlur(),n())}),!0;var t="";if(0<A.opts.imageEditButtons.length){var a={buttons:t+='<div class="fr-buttons">\n        '.concat(A.button.buildList(A.opts.imageEditButtons),"\n        </div>")};return A.popups.create("image.edit",a)}return!1}function N(e){var t=A.popups.get("image.insert");if(t||(t=X()),t.find(".fr-layer.fr-active").removeClass("fr-active").addClass("fr-pactive"),t.find(".fr-image-progress-bar-layer").addClass("fr-active"),t.find(".fr-buttons").hide(),C){var a=Ce();A.popups.setContainer("image.insert",A.$sc);var i=a.offset().left,r=a.offset().top+a.height();A.popups.show("image.insert",i,r,a.outerHeight())}void 0===e&&B(A.language.translate("Uploading"),0)}function k(e){var t=A.popups.get("image.insert");if(t&&(t.find(".fr-layer.fr-pactive").addClass("fr-active").removeClass("fr-pactive"),t.find(".fr-image-progress-bar-layer").removeClass("fr-active"),t.find(".fr-buttons").show(),e||A.$el.find("img.fr-error").length)){if(A.events.focus(),A.$el.find("img.fr-error").length&&(A.$el.find("img.fr-error").remove(),A.undo.saveStep(),A.undo.run(),A.undo.dropRedo()),!A.$wp&&C){var a=C;ce(!0),A.selection.setAfter(a.get(0)),A.selection.restore()}A.popups.hide("image.insert")}}function B(e,t){var a=A.popups.get("image.insert");if(a){var i=a.find(".fr-image-progress-bar-layer");i.find("h3").text(e+(t?" ".concat(t,"%"):"")),i.removeClass("fr-error"),t?(i.find("div").removeClass("fr-indeterminate"),i.find("div > span").css("width","".concat(t,"%"))):i.find("div").addClass("fr-indeterminate")}}function O(e){N();var t=A.popups.get("image.insert").find(".fr-image-progress-bar-layer");t.addClass("fr-error");var a=t.find("h3");a.text(e),A.events.disableBlur(),a.focus()}function z(e){fe.call(e.get(0))}function L(){var e=S(this);A.popups.hide("image.insert"),e.removeClass("fr-uploading"),e.next().is("br")&&e.next().remove(),z(e),A.events.trigger("image.loaded",[e])}function _(o,e,s,l,p){l&&"string"==typeof l&&(l=A.$(l)),A.edit.off(),B(A.language.translate("Loading image")),e&&(o=A.helpers.sanitizeURL(o));var t=new Image;t.onload=function(){var e,t;if(l){A.undo.canDo()||l.hasClass("fr-uploading")||A.undo.saveStep();var a=l.data("fr-old-src");l.data("fr-image-pasted")&&(a=null),A.$wp?((e=l.clone().removeData("fr-old-src").removeClass("fr-uploading").removeAttr("data-fr-image-pasted")).off("load"),a&&l.attr("src",a),!A.opts.trackChangesEnabled||l[0].parentNode&&"SPAN"===l[0].parentNode.tagName&&l[0].parentNode.hasAttribute("data-tracking")||A.track_changes.replaceSpecialItem(l),l.replaceWith(e)):e=l;for(var i=e.get(0).attributes,r=0;r<i.length;r++){var n=i[r];0===n.nodeName.indexOf("data-")?e.removeAttr(n.nodeName):s&&s.hasOwnProperty(n.nodeName)&&e.removeAttr(n.nodeName)}if(void 0!==s)for(t in s)s.hasOwnProperty(t)&&"link"!=t&&e.attr("".concat(t),s[t]);e.on("load",L),e.attr("src",o),A.edit.on(),b(!1),l[0].src!=o&&A.selection.restore(),A.undo.saveStep(),A.events.disableBlur(),A.$el.blur(),A.events.trigger(a?"image.replaced":"image.inserted",[e,p])}else(e=W(o,s,L))&&(b(!1),A.undo.saveStep(),A.events.disableBlur(),A.$el.blur(),A.events.trigger("image.inserted",[e,p]))},t.onerror=function(){I(i)},N(A.language.translate("Loading image")),t.src=o}function M(e,t,a){B(A.language.translate("Loading image"));var i=this.status,r=this.response,n=this.responseXML,o=this.responseText;try{if(A.opts.imageUploadToS3||A.opts.imageUploadToAzure)if(201==i){var s;if(A.opts.imageUploadToAzure){if(!1===A.events.trigger("image.uploadedToAzure",[this.responseURL,a,r],!0))return A.edit.on(),!1;s=t}else s=function p(e){try{var t=S(e).find("Location").text(),a=S(e).find("Key").text();return!1===A.events.trigger("image.uploadedToS3",[t,a,e],!0)?(A.edit.on(),!1):t}catch(i){return I(m,e),!1}}(n);s&&_(s,!1,[],e,r||n)}else I(m,r||n,e);else if(200<=i&&i<300){var l=function g(e){try{if(!1===A.events.trigger("image.uploaded",[e],!0))return A.edit.on(),!1;var t=JSON.parse(e);return t.link?t:(I(c,e),!1)}catch(a){return I(m,e),!1}}(o);l&&_(l.link,!1,l,e,r||o)}else I(d,r||o,e)}catch(f){I(m,r||o,e)}}function K(){I(m,this.response||this.responseText||this.responseXML)}function Y(e){if(e.lengthComputable){var t=e.loaded/e.total*100|0;B(A.language.translate("Uploading"),t)}}function W(e,t,a){var i,r=S(document.createElement("img")).attr("src",e);if(t&&void 0!==t)for(i in t)t.hasOwnProperty(i)&&"link"!=i&&(" data-".concat(i,'="').concat(t[i],'"'),r.attr("".concat(i),t[i]));var n=A.opts.imageDefaultWidth;n&&"auto"!=n&&(n=A.opts.imageResizeWithPercent?"100%":"".concat(n,"px")),r.attr("style",n?"width: ".concat(n,";"):""),he(r,A.opts.imageDefaultDisplay,A.opts.imageDefaultAlign),r.on("load",a),r.on("error",a),A.edit.on(),A.events.focus(!0),A.selection.restore(),A.undo.saveStep(),A.opts.imageSplitHTML?A.markers.split():A.markers.insert(),A.html.wrap();var o=A.$el.find(".fr-marker");if(o.length)(o.parent().is("hr")||o.parent().is("IMG"))&&o.parent().after(o),A.node.isLastSibling(o)&&o.parent().hasClass("fr-deletable")&&o.insertAfter(o.parent()),o.replaceWith(r);else{if(A.opts.trackChangesEnabled)return k(!0),!1;A.$el.append(r)}return A.selection.clear(),r}function G(){A.edit.on(),k(!0)}function H(e,t){if(void 0!==e&&0<e.length){if(!1===A.events.trigger("image.beforeUpload",[e,t]))return!1;var a,i=e[0];if(!(null!==A.opts.imageUploadURL&&A.opts.imageUploadURL!=E||A.opts.imageUploadToS3||A.opts.imageUploadToAzure))return function y(r,n){var o=new FileReader;o.onload=function(){var e=o.result;if(o.result.indexOf("svg+xml")<0){for(var t=atob(o.result.split(",")[1]),a=[],i=0;i<t.length;i++)a.push(t.charCodeAt(i));e=window.URL.createObjectURL(new Blob([new Uint8Array(a)],{type:r.type})),n&&n.data("fr-old-src",n.attr("src")),A.image.insert(e,!1,null,n)}else A.image.insert(e,null,null,A.image.get())},N(),o.readAsDataURL(r)}(i,t||C),!1;if(i.name||(i.name=(new Date).getTime()+"."+(i.type||"image/jpeg").replace(/image\//g,"")),i.size>A.opts.imageMaxSize)return I(R),!1;if(A.opts.imageAllowedTypes.indexOf(i.type.replace(/image\//g,""))<0)return I(U),!1;if(A.drag_support.formdata&&(a=A.drag_support.formdata?new FormData:null),a){var r;if(!1!==A.opts.imageUploadToS3)for(r in a.append("key",A.opts.imageUploadToS3.keyStart+(new Date).getTime()+"-"+(i.name||"untitled")),a.append("success_action_status","201"),a.append("X-Requested-With","xhr"),a.append("Content-Type",i.type),A.opts.imageUploadToS3.params)A.opts.imageUploadToS3.params.hasOwnProperty(r)&&a.append(r,A.opts.imageUploadToS3.params[r]);for(r in A.opts.imageUploadParams)A.opts.imageUploadParams.hasOwnProperty(r)&&a.append(r,A.opts.imageUploadParams[r]);a.append(A.opts.imageUploadParam,i,i.name);var n,o,s=A.opts.imageUploadURL,l=A.opts.imageUploadMethod;A.opts.imageUploadToS3&&(s=A.opts.imageUploadToS3.uploadURL?A.opts.imageUploadToS3.uploadURL:"https://".concat(A.opts.imageUploadToS3.region,".amazonaws.com/").concat(A.opts.imageUploadToS3.bucket)),A.opts.imageUploadToAzure&&(n=s=A.opts.imageUploadToAzure.uploadURL?"".concat(A.opts.imageUploadToAzure.uploadURL,"/").concat(i.name):encodeURI("https://".concat(A.opts.imageUploadToAzure.account,".blob.core.windows.net/").concat(A.opts.imageUploadToAzure.container,"/").concat(i.name)),A.opts.imageUploadToAzure.SASToken&&(s+=A.opts.imageUploadToAzure.SASToken),l="PUT");var p=A.core.getXHR(s,l);if(A.opts.imageUploadToAzure){var g=(new Date).toUTCString();if(!A.opts.imageUploadToAzure.SASToken&&A.opts.imageUploadToAzure.accessKey){var f=A.opts.imageUploadToAzure.account,c=A.opts.imageUploadToAzure.container;if(A.opts.imageUploadToAzure.uploadURL){var d=A.opts.imageUploadToAzure.uploadURL.split("/");c=d.pop(),f=d.pop().split(".")[0]}var m="x-ms-blob-type:BlockBlob\nx-ms-date:".concat(g,"\nx-ms-version:2019-07-07"),u=encodeURI("/"+f+"/"+c+"/"+i.name),h=l+"\n\n\n"+i.size+"\n\n"+i.type+"\n\n\n\n\n\n\n"+m+"\n"+u,v=A.cryptoJSPlugin.cryptoJS.HmacSHA256(h,A.cryptoJSPlugin.cryptoJS.enc.Base64.parse(A.opts.imageUploadToAzure.accessKey)).toString(A.cryptoJSPlugin.cryptoJS.enc.Base64),b="SharedKey "+f+":"+v;o=v,p.setRequestHeader("Authorization",b)}for(r in p.setRequestHeader("x-ms-version","2019-07-07"),p.setRequestHeader("x-ms-date",g),p.setRequestHeader("Content-Type",i.type),p.setRequestHeader("x-ms-blob-type","BlockBlob"),A.opts.imageUploadParams)A.opts.imageUploadParams.hasOwnProperty(r)&&p.setRequestHeader(r,A.opts.imageUploadParams[r]);for(r in A.opts.imageUploadToAzure.params)A.opts.imageUploadToAzure.params.hasOwnProperty(r)&&p.setRequestHeader(r,A.opts.imageUploadToAzure.params[r])}!function w(t,a,i,r,n,o){function s(){var e=S(this);e.off("load"),e.addClass("fr-uploading"),e.next().is("br")&&e.next().remove(),A.placeholder.refresh(),z(e),D(),N(),A.edit.off(),t.onload=function(){M.call(t,e,n,o)},t.onerror=K,t.upload.onprogress=Y,t.onabort=G,S(e.off("abortUpload")).on("abortUpload",function(){4!=t.readyState&&(t.abort(),r?(r.attr("src",r.data("fr-old-src")),r.removeClass("fr-uploading")):e.remove(),ce(!0))}),t.send(A.opts.imageUploadToAzure?i:a)}var l=new FileReader;l.onload=function(){var e=l.result;if(l.result.indexOf("svg+xml")<0){for(var t=atob(l.result.split(",")[1]),a=[],i=0;i<t.length;i++)a.push(t.charCodeAt(i));e=window.URL.createObjectURL(new Blob([new Uint8Array(a)],{type:"image/jpeg"}))}r?(r.on("load",s),r.on("error",function(){s(),S(this).off("error")}),A.edit.on(),A.undo.saveStep(),r.data("fr-old-src",r.attr("src")),r.attr("src",e)):W(e,null,s)},l.readAsDataURL(i)}(p,a,i,t||C,n,o)}}}function F(e){if(e.is("img")&&0<e.parents(".fr-img-caption").length)return e.parents(".fr-img-caption")}function V(e){var t=e.originalEvent.dataTransfer;if(t&&t.files&&t.files.length){var a=t.files[0];if(a&&a.type&&-1!==a.type.indexOf("image")&&0<=A.opts.imageAllowedTypes.indexOf(a.type.replace(/image\//g,""))){if(!A.opts.imageUpload)return e.preventDefault(),e.stopPropagation(),!1;A.markers.remove(),A.markers.insertAtPoint(e.originalEvent),A.$el.find(".fr-marker").replaceWith(Me.MARKERS),0===A.$el.find(".fr-marker").length&&A.selection.setAtEnd(A.el),A.popups.hideAll();var i=A.popups.get("image.insert");i||(i=X()),A.popups.setContainer("image.insert",A.$sc);var r=e.originalEvent.pageX,n=e.originalEvent.pageY;if(A.opts.iframe){var o=A.helpers.getPX(A.$wp.find(".fr-iframe").css("padding-top")),s=A.helpers.getPX(A.$wp.find(".fr-iframe").css("padding-left"));n+=A.$iframe.offset().top+o,r+=A.$iframe.offset().left+s}return A.popups.show("image.insert",r,n),N(),0<=A.opts.imageAllowedTypes.indexOf(a.type.replace(/image\//g,""))?(ce(!0),H(t.files)):I(U),e.preventDefault(),e.stopPropagation(),!1}}}function X(e){if(e)return A.popups.onRefresh("image.insert",u),A.popups.onHide("image.insert",h),!0;var t,a,i="";A.opts.imageUpload||-1===A.opts.imageInsertButtons.indexOf("imageUpload")||A.opts.imageInsertButtons.splice(A.opts.imageInsertButtons.indexOf("imageUpload"),1);var r=A.button.buildList(A.opts.imageInsertButtons);""!==r&&(i='<div class="fr-buttons fr-tabs">'.concat(r,"</div>"));var n=A.opts.imageInsertButtons.indexOf("imageUpload"),o=A.opts.imageInsertButtons.indexOf("imageByURL"),s="";0<=n&&(t=" fr-active",0<=o&&o<n&&(t=""),s='<div class="fr-image-upload-layer'.concat(t,' fr-layer" id="fr-image-upload-layer-').concat(A.id,'"><strong>').concat(A.language.translate("Drop image"),"</strong><br>(").concat(A.language.translate("or click"),')<div class="fr-form"><input type="file" accept="image/').concat(A.opts.imageAllowedTypes.join(", image/").toLowerCase(),'" tabIndex="-1" aria-labelledby="fr-image-upload-layer-').concat(A.id,'" role="button"></div></div>'));var l="";0<=o&&(t=" fr-active",0<=n&&n<o&&(t=""),l='<div class="fr-image-by-url-layer'.concat(t,' fr-layer" id="fr-image-by-url-layer-').concat(A.id,'"><div class="fr-input-line"><input id="fr-image-by-url-layer-text-').concat(A.id,'" type="text" placeholder="http://" tabIndex="1" aria-required="true"></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-submit" data-cmd="imageInsertByURL" tabIndex="2" role="button">').concat(A.language.translate("Insert"),"</button></div></div>"));var p={buttons:i,upload_layer:s,by_url_layer:l,progress_bar:'<div class="fr-image-progress-bar-layer fr-layer"><h3 tabIndex="-1" class="fr-message">Uploading</h3><div class="fr-loader"><span class="fr-progress"></span></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-dismiss" data-cmd="imageDismissError" tabIndex="2" role="button">OK</button></div></div>'};return 1<=A.opts.imageInsertButtons.length&&(a=A.popups.create("image.insert",p)),A.$wp&&A.events.$on(A.$wp,"scroll",function(){C&&A.popups.isVisible("image.insert")&&ye()}),function g(i){A.events.$on(i,"dragover dragenter",".fr-image-upload-layer",function(e){return S(this).addClass("fr-drop"),(A.browser.msie||A.browser.edge)&&e.preventDefault(),!1},!0),A.events.$on(i,"dragleave dragend",".fr-image-upload-layer",function(e){return S(this).removeClass("fr-drop"),(A.browser.msie||A.browser.edge)&&e.preventDefault(),!1},!0),A.events.$on(i,"drop",".fr-image-upload-layer",function(e){e.preventDefault(),e.stopPropagation(),S(this).removeClass("fr-drop");var t=e.originalEvent.dataTransfer;if(t&&t.files){var a=i.data("instance")||A;a.events.disableBlur(),a.image.upload(t.files),a.events.enableBlur()}},!0),A.helpers.isIOS()&&A.events.$on(i,"touchstart",'.fr-image-upload-layer input[type="file"]',function(){S(this).trigger("click")},!0),A.events.$on(i,"change",'.fr-image-upload-layer input[type="file"]',function(){if(this.files){var e=i.data("instance")||A;e.events.disableBlur(),i.find("input:focus").blur(),e.events.enableBlur(),e.image.upload(this.files,C)}S(this).val("")},!0)}(a),a}function q(){C&&A.popups.get("image.alt").find("input").val(C.attr("alt")||"").trigger("change")}function j(){var e=A.popups.get("image.alt");e||(e=J()),k(),A.popups.refresh("image.alt"),A.popups.setContainer("image.alt",A.$sc);var t=Ce(),a=t.outerWidth()/2;Se()&&(t=t.find(".fr-img-wrap"),a=C.outerWidth()/2);var i=t.offset().left+a,r=t.offset().top+t.outerHeight(),n=t.outerHeight();A.opts.iframe&&Se()&&(n=C?C.outerHeight():0),A.popups.show("image.alt",i,r,n,!0)}function J(e){if(e)return A.popups.onRefresh("image.alt",q),!0;var t={buttons:'<div class="fr-buttons fr-tabs">'.concat(A.button.buildList(A.opts.imageAltButtons),"</div>"),alt_layer:'<div class="fr-image-alt-layer fr-layer fr-active" id="fr-image-alt-layer-'.concat(A.id,'"><div class="fr-input-line"><input id="fr-image-alt-layer-text-').concat(A.id,'" type="text" placeholder="').concat(A.language.translate("Alternative Text"),'" tabIndex="1"></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-submit" data-cmd="imageSetAlt" tabIndex="2" role="button">').concat(A.language.translate("Update"),"</button></div></div>")},a=A.popups.create("image.alt",t);return A.$wp&&A.events.$on(A.$wp,"scroll.image-alt",function(){C&&A.popups.isVisible("image.alt")&&j()}),a}function Q(){var e=A.popups.get("image.size"),t=C.get(0).style.height?C.get(0).style.height:"auto",a=C.get(0).style.width?C.get(0).style.width:"auto";if(C)if(Se()){var i=C.parent();i.get(0).style.width||(i=C.parent().parent()),e.find('input[name="width"]').val(a).trigger("change"),e.find('input[name="height"]').val(t).trigger("change")}else e.find('input[name="width"]').val(a).trigger("change"),e.find('input[name="height"]').val(t).trigger("change")}function Z(){var e=A.popups.get("image.size");e||(e=ee()),k(),A.popups.refresh("image.size"),A.popups.setContainer("image.size",A.$sc);var t=Ce(),a=t.outerWidth()/2;Se()&&(t=t.find(".fr-img-wrap"),a=C.outerWidth()/2);var i=t.outerHeight();A.opts.iframe&&Se()&&(i=C?C.outerHeight():0);var r=t.offset().left+a,n=t.offset().top+t.outerHeight();A.popups.show("image.size",r,n,i,!0)}function ee(e){if(e)return A.popups.onRefresh("image.size",Q),!0;var t={buttons:'<div class="fr-buttons fr-tabs">'.concat(A.button.buildList(A.opts.imageSizeButtons),"</div>"),size_layer:'<div class="fr-image-size-layer fr-layer fr-active" id="fr-image-size-layer-'.concat(A.id,'"><div class="fr-image-group"><div class="fr-input-line"><input id="fr-image-size-layer-width-\'').concat(A.id,'" type="text" name="width" placeholder="').concat(A.language.translate("Width"),'" tabIndex="1"></div><div class="fr-input-line"><input id="fr-image-size-layer-height').concat(A.id,'" type="text" name="height" placeholder="').concat(A.language.translate("Height"),'" tabIndex="1"></div></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-submit" data-cmd="imageSetSize" tabIndex="2" role="button">').concat(A.language.translate("Update"),"</button></div></div>")},a=A.popups.create("image.size",t);return A.$wp&&A.events.$on(A.$wp,"scroll.image-size",function(){C&&A.popups.isVisible("image.size")&&Z()}),a}function te(e,t,a,i){return e.pageX=t,x.call(this,e),e.pageX=e.pageX+a*Math.floor(Math.pow(1.1,i)),T.call(this,e),$.call(this,e),++i}function ae(e){if(e=e||Ce(),A.opts.trackChangesEnabled&&!A.helpers.isMobile()&&(!e[0].parentNode||"
735SPAN"!==e[0].parentNode.tagName||!e[0].parentNode.hasAttribute("data-tracking")))return A.track_changes.removeSpecialItem(e),A.popups.hideAll(),void ce(!0);e&&!1!==A.events.trigger("image.beforeRemove",[e])&&(A.popups.hideAll(),we(),ce(!0),A.undo.canDo()||A.undo.saveStep(),e.get(0)==A.el?e.removeAttr("src"):(e.get(0).parentNode&&"A"==e.get(0).parentNode.tagName?(A.selection.setBefore(e.get(0).parentNode)||A.selection.setAfter(e.get(0).parentNode)||e.parent().after(Me.MARKERS),S(e.get(0).parentNode).remove()):(A.selection.setBefore(e.get(0))||A.selection.setAfter(e.get(0))||e.after(Me.MARKERS),e.remove()),A.html.fillEmptyBlocks(),A.selection.restore()),A.undo.saveStep())}function ie(e){var t=e.which;if(C&&(t==Me.KEYCODE.BACKSPACE||t==Me.KEYCODE.DELETE))return e.preventDefault(),e.stopPropagation(),ae(),!1;if(C&&t==Me.KEYCODE.ESC){var a=C;return ce(!0),A.selection.setAfter(a.get(0)),A.selection.restore(),e.preventDefault(),!1}if(!C||t!=Me.KEYCODE.ARROW_LEFT&&t!=Me.KEYCODE.ARROW_RIGHT)return C&&t===Me.KEYCODE.TAB?(e.preventDefault(),e.stopPropagation(),ce(!0),!1):C&&t!=Me.KEYCODE.F10&&!A.keys.isBrowserAction(e)?(e.preventDefault(),e.stopPropagation(),!1):void 0;var i=C.get(0);return ce(!0),t==Me.KEYCODE.ARROW_LEFT?A.selection.setBefore(i):A.selection.setAfter(i),A.selection.restore(),e.preventDefault(),!1}function re(e){if(e&&"IMG"==e.tagName){if(A.node.hasClass(e,"fr-uploading")||A.node.hasClass(e,"fr-error")?e.parentNode.removeChild(e):A.node.hasClass(e,"fr-draggable")&&e.classList.remove("fr-draggable"),e.parentNode&&e.parentNode.parentNode&&A.node.hasClass(e.parentNode.parentNode,"fr-img-caption")){var t=e.parentNode.parentNode;t.removeAttribute("contenteditable"),t.removeAttribute("draggable"),t.classList.remove("fr-draggable");var a=e.nextSibling;a&&a.removeAttribute("contenteditable")}}else if(e&&e.nodeType==Node.ELEMENT_NODE)for(var i=e.querySelectorAll("img.fr-uploading, img.fr-error, img.fr-draggable"),r=0;r<i.length;r++)re(i[r])}function ne(e){if(!1===A.events.trigger("image.beforePasteUpload",[e]))return S(e).removeAttr("data-fr-image-pasted"),!1;C=S(e),D(),n(),ye(),N(),C.on("load",function(){var t=[];D(),S(A.popups.get("image.insert").get(0)).find("div.fr-active.fr-error").length<1&&N(),S(this).data("events").filter(function(e){"load"===e[0]&&t.push(e)}),t.length<=1&&S(this).off("load")});for(var t=S(e).attr("src").split(","),a=atob(t[1]),i=[],r=0;r<a.length;r++)i.push(a.charCodeAt(r));H([A.browser.safari&&!A.opts.imageUploadURL?new Blob([new Uint8Array(i)],{type:t[0].replace(/data\:/g,"")}):new Blob([new Uint8Array(i)],{type:t[0].replace(/data\:/g,"").replace(/;base64/g,"")})],C)}function oe(){A.opts.imagePaste?A.$el.find("img[data-fr-image-pasted]").each(function(e,a){if(A.opts.imagePasteProcess){var t=A.opts.imageDefaultWidth;t&&"auto"!=t&&(t+=A.opts.imageResizeWithPercent?"%":"px"),S(a).css("width",t).removeClass("fr-dii fr-dib fr-fir fr-fil"),he(S(a),A.opts.imageDefaultDisplay,A.opts.imageDefaultAlign)}if(0===a.src.indexOf("data:"))ne(a);else if(0===a.src.indexOf("blob:")||0===a.src.indexOf("http")&&A.opts.imageUploadRemoteUrls&&A.opts.imageCORSProxy){var i=new Image;i.crossOrigin="Anonymous",i.onload=function(){var e=A.o_doc.createElement("CANVAS"),t=e.getContext("2d");e.height=this.naturalHeight,e.width=this.naturalWidth,t.drawImage(this,0,0),setTimeout(function(){ne(a)},0),a.src=e.toDataURL(Me.IMAGE_TYPE)},A.browser.msie&&Me.IMAGE_ALLOW_REGEX.test(a.src)&&(Me.IMAGE_TYPE="image/"+a.src.split(Me.IMAGE_ALLOW_REGEX)[1]),i.src=(0===a.src.indexOf("blob:")?"":"".concat(A.opts.imageCORSProxy,"/"))+a.src,0!==a.src.indexOf("blob:")&&A.undo.saveStep()}else 0!==a.src.indexOf("http")||0===a.src.indexOf("https://mail.google.com/mail")?(A.selection.save(),S(a).remove(),A.selection.restore()):S(a).removeAttr("data-fr-image-pasted")}):A.$el.find("img[data-fr-image-pasted]").remove()}function se(e){var t=e.target.result,a=A.opts.imageDefaultWidth;a&&"auto"!=a&&(a+=A.opts.imageResizeWithPercent?"%":"px"),A.undo.saveStep(),A.html.insert('<img data-fr-image-pasted="true" src="'.concat(t,'"').concat(a?' style="width: '.concat(a,';"'):"",">"));var i=A.$el.find('img[data-fr-image-pasted="true"]');i&&he(i,A.opts.imageDefaultDisplay,A.opts.imageDefaultAlign),A.events.trigger("paste.after")}function le(e,t){var a=new FileReader;a.onload=function i(e){var t=A.opts.imageDefaultWidth;t&&"auto"!=t&&(t+=A.opts.imageResizeWithPercent?"%":"px"),A.html.insert('<img data-fr-image-pasted="true" src="'.concat(e,'"').concat(t?' style="width: '.concat(t,';"'):"",">"));var a=A.$el.find('img[data-fr-image-pasted="true"]');a&&he(a,A.opts.imageDefaultDisplay,A.opts.imageDefaultAlign),A.events.trigger("paste.after")}(t),a.readAsDataURL(e,t)}function pe(e){if(e&&e.clipboardData&&e.clipboardData.items){var t=(e.clipboardData||window.clipboardData).getData("text/html")||"";A.browser.mozilla&&(""===t||/<!--StartFragment-->([ ])<!--EndFragment-->/.test(t))&&(t=A.win.localStorage.getItem("fr-copied-html"));var a=(new DOMParser).parseFromString(t,"text/html").querySelector("img");if(a){if(!a)return!1;var i=a.src,r=null;if(e.clipboardData.types&&-1!=[].indexOf.call(e.clipboardData.types,"text/rtf")||e.clipboardData.getData("text/rtf"))r=e.clipboardData.items[0].getAsFile();else for(var n=0;n<e.clipboardData.items.length;n++)if(r=e.clipboardData.items[n].getAsFile()){Me.IMAGE_TYPE=r.type;break}if(r)return le(r,i),!1}else{var o=null;if(e.clipboardData.types&&-1!=[].indexOf.call(e.clipboardData.types,"text/rtf")||e.clipboardData.getData("text/rtf"))o=e.clipboardData.items[0].getAsFile();else for(var s=0;s<e.clipboardData.items.length&&!(o=e.clipboardData.items[s].getAsFile());s++);if(o)return function l(e){var t=new FileReader;
vendor: 5,705 bytes, line 735
735t.onload=se,t.readAsDataURL(e)}(o),!1}}}function ge(e){return e=e.replace(/<img /gi,'<img data-fr-image-pasted="true" ')}function fe(e){if("false"==S(this).parents("[contenteditable]").not(".fr-element").not(".fr-img-caption").not("body").first().attr("contenteditable"))return!0;if(e&&"touchend"==e.type&&a)return!0;if(e&&A.edit.isDisabled())return e.stopPropagation(),e.preventDefault(),!1;for(var t=0;t<Me.INSTANCES.length;t++)Me.INSTANCES[t]!=A&&Me.INSTANCES[t].events.trigger("image.hideResizer");A.toolbar.disable(),e&&(e.stopPropagation(),e.preventDefault()),A.helpers.isMobile()&&(A.events.disableBlur(),A.$el.blur(),A.events.enableBlur()),A.opts.iframe&&A.size.syncIframe(),C=S(this),we(),D(),n(),A.browser.msie?(A.popups.areVisible()&&A.events.disableBlur(),A.win.getSelection&&(A.win.getSelection().removeAllRanges(),A.win.getSelection().addRange(A.doc.createRange()))):A.selection.clear(),A.helpers.isIOS()&&(A.events.disableBlur(),A.$el.blur()),A.button.bulkRefresh(),A.events.trigger("video.hideResizer")}function ce(e){C&&(function t(){return de}()||!0===e)&&(A.toolbar.enable(),p.removeClass("fr-active"),A.popups.hideAll(),C=null,ue(),g=null,f&&f.hide())}r[i]="Image cannot be loaded from the passed link.",r[c]="No link in upload response.",r[d]="Error during file upload.",r[m]="Parsing response failed.",r[R]="File is too large.",r[U]="Image file type is invalid.",r[7]="Files can be uploaded only to same domain in IE 8 and IE 9.";var de=!(r[8]="Image file is corrupted.");function me(){de=!0}function ue(){de=!1}function he(e,t,a){if(!A.opts.htmlUntouched&&A.opts.useClasses)e.removeClass("fr-fil fr-fir fr-dib fr-dii"),a&&e.addClass("fr-fi".concat(a[0])),t&&e.addClass("fr-di".concat(t[0]));else if("inline"==t)if(e.css({display:"inline-block",verticalAlign:"bottom",margin:A.opts.imageDefaultMargin}),"center"==a)e.css({"float":"none",marginBottom:"",marginTop:"",maxWidth:"calc(100% - ".concat(2*A.opts.imageDefaultMargin,"px)"),textAlign:"center"});else if("left"==a){var i="0px",r=e.parent("span.fr-img-caption").get(0);r||(r=e.parent().get(0)),r&&"li"===r.tagName.toLowerCase()?i="20px":r&&"p"===r.tagName.toLowerCase()&&(i="15px"),e.css({"float":"left",marginLeft:0,maxWidth:"calc(100% - ".concat(A.opts.imageDefaultMargin,"px)"),textAlign:"left",marginRight:i})}else e.css({"float":"right",marginRight:0,maxWidth:"calc(100% - ".concat(A.opts.imageDefaultMargin,"px)"),textAlign:"right"});else"block"==t&&(e.css({display:"block","float":"none",verticalAlign:"top",margin:"".concat(A.opts.imageDefaultMargin,"px auto"),textAlign:"center"}),"left"==a?e.css({marginLeft:0,textAlign:"left"}):"right"==a&&e.css({marginRight:0,textAlign:"right"}))}function ve(e){if(void 0===e&&(e=Ce()),e){if(e.hasClass("fr-fil"))return"left";if(e.hasClass("fr-fir"))return"right";if(e.hasClass("fr-dib")||e.hasClass("fr-dii"))return"center";var t=e.css("float");if(e.css("float","none"),"block"==e.css("display")){if(e.css("float",""),e.css("float")!=t&&e.css("float",t),0===parseInt(e.css("margin-left"),10))return"left";if(0===parseInt(e.css("margin-right"),10))return"right"}else{if(e.css("float",""),e.css("float")!=t&&e.css("float",t),"left"==e.css("float"))return"left";if("right"==e.css("float"))return"right"}}return"center"}function be(e){void 0===e&&(e=Ce());var t=e.css("float");return e.css("float","none"),"block"==e.css("display")?(e.css("float",""),e.css("float")!=t&&e.css("float",t),"block"):(e.css("float",""),e.css("float")!=t&&e.css("float",t),"inline")}function ye(){var e=A.popups.get("image.insert");e||(e=X()),A.popups.isVisible("image.insert")||(k(),A.popups.refresh("image.insert"),A.popups.setContainer("image.insert",A.$sc));var t=Ce(),a=t.outerWidth()/2;Se()&&(t=t.find(".fr-img-wrap"),a=C.outerWidth()/2);var i=t.offset().left+a,r=t.outerHeight(!0);A.opts.iframe&&Se()&&(r=C?C.outerHeight():0);var n=t.offset().top+t.outerHeight();A.popups.show("image.insert",i,n,r,!0)}function we(){if(C){A.events.disableBlur(),A.selection.clear();var e=A.doc.createRange();e.selectNode(C.get(0)),A.browser.msie&&e.collapse(!0),A.selection.get().addRange(e),A.events.enableBlur()}}function Ae(){return C}function Ce(){return Se()?C.parents(".fr-img-caption").first():C}function Se(){return!!C&&0<C.parents(".fr-img-caption").length}function Ee(e){for(var t=document.createDocumentFragment();e.firstChild;){var a=e.removeChild(e.firstChild);t.appendChild(a)}e.parentNode.replaceChild(t,e)}return{_init:function Re(){var i;(function e(){A.events.$on(A.$el,A._mousedown,"IMG"==A.el.tagName?null:'img:not([contenteditable="false"])',function(e){if("false"==S(this).parents("contenteditable").not(".fr-element").not(".fr-img-caption").not("body").first().attr("contenteditable"))return!0;A.helpers.isMobile()||A.selection.clear(),t=!0,A.popups.areVisible()&&A.events.disableBlur(),A.browser.msie&&(A.events.disableBlur(),A.$el.attr("contenteditable",!1)),A.draggable||"touchstart"==e.type||e.preventDefault(),e.stopPropagation()}),A.events.$on(A.$el,A._mousedown,".fr-img-caption .fr-inner",function(e){A.core.hasFocus()||A.events.focus(),e.stopPropagation()}),A.events.$on(A.$el,"paste",".fr-img-caption .fr-inner",function(e){!0===A.opts.toolbarInline&&(A.toolbar.hide(),e.stopPropagation())}),A.events.$on(A.$el,A._mouseup,"IMG"==A.el.tagName?null:'img:not([contenteditable="false"])',function(e){if("false"==S(this).parents("contenteditable").not(".fr-element").not(".fr-img-caption").not("body").first().attr("contenteditable"))return!0;t&&(t=!1,e.stopPropagation(),A.browser.msie&&(A.$el.attr("contenteditable",!0),A.events.enableBlur()))}),A.events.on("keyup",function(e){if(e.shiftKey&&""===A.selection.text().replace(/\n/g,"")&&A.keys.isArrow(e.which)){var t=A.selection.element
vendor: 4,192 bytes, line 735
735(),a=A.selection.endElement();t&&"IMG"==t.tagName?z(S(t)):a&&"IMG"==a.tagName&&z(S(a))}},!0),A.events.on("drop",V),A.events.on("element.beforeDrop",F),A.events.on("mousedown window.mousedown",me),A.events.on("window.touchmove",ue),A.events.on("mouseup window.mouseup",function(){if(C&&!A.helpers.isMobile())return ce(),!1;ue()}),A.events.on("touchstart touchend",function(){if(C&&A.helpers.isMobile())return ce(),!1;ue()}),A.events.on("commands.mousedown",function(e){0<e.parents(".fr-toolbar").length&&ce()}),A.events.on("image.resizeEnd",function(){A.opts.iframe&&A.size.syncIframe()}),A.events.on("blur image.hideResizer commands.undo commands.redo element.dropped",function(){ce(!(t=!1))}),A.events.on("modals.hide",function(){C&&(we(),A.selection.clear())}),A.events.on("image.resizeEnd",function(){A.win.getSelection&&z(C)}),A.opts.imageAddNewLine&&A.events.on("image.inserted",function(e){var t=e.get(0);for(t.nextSibling&&"BR"===t.nextSibling.tagName&&(t=t.nextSibling);t&&!A.node.isElement(t);)t=A.node.isLastSibling(t)?t.parentNode:null;A.node.isElement(t)&&(A.opts.enter===Me.ENTER_BR?e.after("<br>"):S(A.node.blockParent(e.get(0))).after("<".concat(A.html.defaultTag(),"><br></").concat(A.html.defaultTag(),">")))})})(),"IMG"==A.el.tagName&&A.$el.addClass("fr-view"),A.events.$on(A.$el,A.helpers.isMobile()&&!A.helpers.isWindowsPhone()?"touchend":"click","IMG"==A.el.tagName?null:'img:not([contenteditable="false"])',fe),A.helpers.isMobile()&&(A.events.$on(A.$el,"touchstart","IMG"==A.el.tagName?null:'img:not([contenteditable="false"])',function(){a=!1}),A.events.$on(A.$el,"touchmove",function(){a=!0})),A.$wp?(A.events.on("window.keydown keydown",ie,!0),A.events.on("keyup",function(e){if(C&&e.which==Me.KEYCODE.ENTER)return!1},!0),A.events.$on(A.$el,"keydown",function(){var e=A.selection.element();(e.nodeType===Node.TEXT_NODE||"BR"==e.tagName&&A.node.isLastSibling(e))&&(e=e.parentNode),A.node.hasClass(e,"fr-inner")||(A.node.hasClass(e,"fr-img-caption")||(e=S(e).parents(".fr-img-caption").get(0)),A.node.hasClass(e,"fr-img-caption")&&(A.opts.trackChangesEnabled||S(e).after(Me.INVISIBLE_SPACE+Me.MARKERS),A.selection.restore()))})):A.events.$on(A.$win,"keydown",ie),A.events.on("toolbar.esc",function(){if(C){if(A.$wp)A.events.disableBlur(),A.events.focus();else{var e=C;ce(!0),A.selection.setAfter(e.get(0)),A.selection.restore()}return!1}},!0),A.events.on("toolbar.focusEditor",function(){if(C)return!1},!0),A.events.on("window.cut window.copy",function(e){if(C&&A.popups.isVisible("image.edit")&&!A.popups.get("image.edit").find(":focus").length){var t=Ce();Se()?(t.before(Me.START_MARKER),t.after(Me.END_MARKER),A.selection.restore(),A.paste.saveCopiedText(t.get(0).outerHTML,t.text())):(we(),A.paste.saveCopiedText(C.get(0).outerHTML,C.attr("alt"))),"copy"==e.type?setTimeout(function(){z(C)}):(ce(!0),A.undo.saveStep(),setTimeout(function(){A.undo.saveStep()},0))}},!0),A.browser.msie&&A.events.on("keydown",function(e){if(!A.selection.isCollapsed()||!C)return!0;var t=e.which;t==Me.KEYCODE.C&&A.keys.ctrlKey(e)?A.events.trigger("window.copy"):t==Me.KEYCODE.X&&A.keys.ctrlKey(e)&&A.events.trigger("window.cut")}),A.events.$on(S(A.o_win),"keydown",function(e){var t=e.which;if(C&&t==Me.KEYCODE.BACKSPACE)return e.preventDefault(),!1}),A.events.$on(A.$win,"keydown",function(e){var t=e.which;C&&C.hasClass("fr-uploading")&&t==Me.KEYCODE.ESC&&C.trigger("abortUpload")}),A.events.on("destroy",function(){C&&C.hasClass("fr-uploading")&&C.trigger("abortUpload")}),A.events.on("paste.before",pe),A.events.on("paste.beforeCleanup",ge),A.events.on("paste.after",oe),A.events.on("html.set",v),A.events.on("html.inserted",v),v(),A.events.on("destroy",function(){s=[]}),A.events.on("html.processGet",re),A.opts.imageOutputSize&&A.events.on("html.beforeGet",function(){i=A.el.querySelectorAll("img");for(var e=0;e<i.length;e++){var t=i[e].style.width||S(i[e]).width(),a=i[e].style.height||S(i[e]).height();t&&i[e].setAttribute("width","".concat(t).replace(/px/,"")),a&&i[e].setAttribute("height","".concat(a).replace(/px/,""))}}),A.opts.iframe&&A.events.on("image.loaded",A.size.syncIframe),A.$wp&&(b(),A.events.on("contentChanged",b)),A.events.$on(S(A.o_win),"orientationchange.
735image",function(){setTimeout(function(){C&&z(C)},100)}),P(!0),X(!0),ee(!0),J(!0),A.events.on("node.remove",function(e){if("IMG"==e.get(0).tagName)return ae(e),!1})},showInsertPopup:function Ue(){var e=A.$tb.find('.fr-command[data-cmd="insertImage"]'),t=A.popups.get("image.insert");if(t||(t=X()),k(),!t.hasClass("fr-active"))if(A.popups.refresh("image.insert"),A.popups.setContainer("image.insert",A.$tb),e.isVisible()){var a=A.button.getPosition(e),i=a.left,r=a.top;A.popups.show("image.insert",i,r,e.outerHeight())}else A.position.forSelection(t),A.popups.show("image.insert")},showLayer:function De(e){var t,a,i=A.popups.get("image.insert");if(C||A.opts.toolbarInline){if(C){var r=Ce(),n=0;Se()&&(r=r.find(".fr-img-wrap"),n=C.outerWidth()/2),a=r.offset().top+r.outerHeight(),t=r.offset().left+n}}else{var o=A.$tb.find('.fr-command[data-cmd="insertImage"]');t=o.offset().left,a=o.offset().top+(A.opts.toolbarBottom?10:o.outerHeight()-10)}!C&&A.opts.toolbarInline&&(a=i.offset().top-A.helpers.getPX(i.css("margin-top")),i.hasClass("fr-above")&&(a+=i.outerHeight())),i.find(".fr-layer").removeClass("fr-active"),i.find(".fr-".concat(e,"-layer")).addClass("fr-active"),A.popups.show("image.insert",t,a,C?C.outerHeight():0,Se()),A.accessibility.focusPopup(i)},refreshUploadButton:function xe(e){var t=A.popups.get("image.insert");t&&t.find(".fr-image-upload-layer").hasClass("fr-active")&&e.addClass("fr-active").attr("aria-pressed",!0)},refreshByURLButton:function Te(e){var t=A.popups.get("image.insert");t&&t.find(".fr-image-by-url-layer").hasClass("fr-active")&&e.addClass("fr-active").attr("aria-pressed",!0)},upload:H,insertByURL:function $e(){var e=A.popups.get("image.insert").find(".fr-image-by-url-layer input");if(0<e.val().length){N(),B(A.language.translate("Loading image"));var t=e.val().trim();if(A.opts.imageUploadRemoteUrls&&A.opts.imageCORSProxy&&A.opts.imageUpload){var a=new XMLHttpRequest;a.onload=function(){200==this.status?H([new Blob([this.response],{type:this.response.type||"image/png"})],C):I(i)},a.onerror=function(){_(t,!0,[],C)},a.open("GET","".concat(A.opts.imageCORSProxy,"/").concat(t),!0),a.responseType="blob",a.send()}else _(t,!0,[],C);e.val(""),e.blur()}},align:function Ie(e){var t=Ce();t.removeClass("fr-fir fr-fil"),!A.opts.htmlUntouched&&A.opts.useClasses?"left"==e?t.addClass("fr-fil"):"right"==e&&t.addClass("fr-fir"):he(t,be(),e),we(),D(),n(),A.selection.clear()},refreshAlign:function Pe(e){C&&e.find("> *").first().replaceWith(A.icon.create("image-align-".concat(ve())))}
vendor: 4,220 bytes, line 735
735,refreshAlignOnShow:function Ne(e,t){C&&t.find('.fr-command[data-param1="'.concat(ve(),'"]')).addClass("fr-active").attr("aria-selected",!0)},display:function ke(e){var t=Ce();t.removeClass("fr-dii fr-dib"),!A.opts.htmlUntouched&&A.opts.useClasses?"inline"==e?t.addClass("fr-dii"):"block"==e&&t.addClass("fr-dib"):he(t,e,ve()),we(),D(),n(),A.selection.clear()},refreshDisplayOnShow:function Be(e,t){C&&t.find('.fr-command[data-param1="'.concat(be(),'"]')).addClass("fr-active").attr("aria-selected",!0)},replace:ye,back:function e(){C?(A.events.disableBlur(),S(".fr-popup input:focus").blur(),z(C)):(A.events.disableBlur(),A.selection.restore(),A.events.enableBlur(),A.popups.hide("image.insert"),A.toolbar.showInline())},get:Ae,getEl:Ce,insert:_,showProgressBar:N,remove:ae,hideProgressBar:k,applyStyle:function Oe(e,t,a){if(void 0===t&&(t=A.opts.imageStyles),void 0===a&&(a=A.opts.imageMultipleStyles),!C)return!1;var i=Ce();if(!a){var r=Object.keys(t);r.splice(r.indexOf(e),1),i.removeClass(r.join(" "))}"object"==Ke(t[e])?(i.removeAttr("style"),i.css(t[e].style)):(i.toggleClass(e),Se()&&C.hasClass(e)&&C.removeClass(e)),z(C)},showAltPopup:j,showSizePopup:Z,setAlt:function ze(e){if(C){var t=A.popups.get("image.alt");C.attr("alt",e||t.find("input").val()||""),t.find("input:focus").blur(),z(C)}},setSize:function Le(e,t){if(C){var a=A.popups.get("image.size");e=e||a.find('input[name="width"]').val()||"",t=t||a.find('input[name="height"]').val()||"";var i=/^[\d]+((px)|%)*$/g;C.removeAttr("width").removeAttr("height"),e.match(i)?C.css("width",e):C.css("width",""),t.match(i)?C.css("height",t):C.css("height",""),Se()&&(C.parents(".fr-img-caption").removeAttr("width").removeAttr("height"),e.match(i)?C.parents(".fr-img-caption").css("width",e):C.parents(".fr-img-caption").css("width",""),t.match(i)?C.parents(".fr-img-caption").css("height",t):C.parents(".fr-img-caption").css("height","")),a&&a.find("input:focus").blur(),z(C)}},toggleCaption:function _e(){var e;if(C&&!Se()){(e=C).parent().is("a")&&(e=C.parent());var t,a,i=C.parents("ul")&&0<C.parents("ul").length?C.parents("ul"):C.parents("ol")&&0<C.parents("ol").length?C.parents("ol"):[];if(0<i.length){var r=i.find("li").length,n=C.parents("li"),o=document.createElement("li");r-1===n.index()&&(i.append(o),o.innerHTML="&nbsp;")}e.attr("style")?a=-1<(t=e.attr("style").split(":")).indexOf("width")?t[t.indexOf("width")+1].replace(";",""):"":e.attr("width")&&(a=e.attr("width"));var s=A.opts.imageResizeWithPercent?(-1<a.indexOf("px")?null:a)||"100%":C.width()+"px";e.wrap('<div class="fr-img-space-wrap"><span '+(A.browser.mozilla?"":'contenteditable="false"')+'class="fr-img-caption '+C.attr("class")+'" style="'+(A.opts.useClasses?"":e.attr("style"))+'" draggable="false"></span></div>'),e.wrap('<span class="fr-img-wrap"></span>'),C.after('<span class="fr-inner"'.concat(A.browser.mozilla?"":' contenteditable="true"',">").concat(Me.START_MARKER).concat(A.language.translate("Image Caption")).concat(Me.END_MARKER,"</span>")),C.parents(".fr-img-caption").css("width",s);var l=C.parents(".fr-img-space-wrap").length;1==l?Ee(document.querySelector(".fr-img-space-wrap")):1<l&&(Ee(document.querySelector(".fr-img-space-wrap")),Ee(document.querySelector(".fr-img-space-wrap2"))),ce(!0),A.selection.restore()}else{if(e=Ce(),C.insertBefore(e),null!==e[0].querySelector("a")){for(var p,g=e[0].querySelector("a"),f=document.createElement("a"),c=0,d=g.attributes,m=d.length;c<m;c++)p=d[c],f.setAttribute(p.nodeName,p.nodeValue);C.wrap(f)}C.attr("class",e.attr("class").replace("fr-img-caption","")).attr("style",e.attr("style")),e.remove();var u=C.parents(".fr-img-space-wrap").length;1==u?Ee(document.querySelector(".fr-img-space-wrap")):1<u&&(Ee(document.querySelector(".fr-img-space-wrap")),Ee(document.querySelector(".fr-img-space-wrap2"))),z(C)}},hasCaption:Se,exitEdit:ce,edit:z}},Me.DefineIcon("insertImage",{NAME:"image",SVG_KEY:"insertImage"}),Me.RegisterShortcut(Me.KEYCODE.P,"insertImage",null,"P"),Me.RegisterCommand("insertImage",{title:"Insert Image",undo:!1,focus:!0,refreshAfterCallback:!1,popup:!0,callback:function(){this.popups.isVisible("image.insert")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore(
vendor: 4,419 bytes, line 735
735)),this.popups.hide("image.insert")):this.image.showInsertPopup()},plugin:"image"}),Me.DefineIcon("imageUpload",{NAME:"upload",SVG_KEY:"upload"}),Me.RegisterCommand("imageUpload",{title:"Upload Image",undo:!1,focus:!1,toggle:!0,callback:function(){this.image.showLayer("image-upload")},refresh:function(e){this.image.refreshUploadButton(e)}}),Me.DefineIcon("imageByURL",{NAME:"link",SVG_KEY:"insertLink"}),Me.RegisterCommand("imageByURL",{title:"By URL",undo:!1,focus:!1,toggle:!0,callback:function(){this.image.showLayer("image-by-url")},refresh:function(e){this.image.refreshByURLButton(e)}}),Me.RegisterCommand("imageInsertByURL",{title:"Insert Image",undo:!0,refreshAfterCallback:!1,callback:function(){this.image.insertByURL()},refresh:function(e){this.image.get()?e.text(this.language.translate("Replace")):e.text(this.language.translate("Insert"))}}),Me.DefineIcon("imageDisplay",{NAME:"star",SVG_KEY:"imageDisplay"}),Me.RegisterCommand("imageDisplay",{title:"Display",type:"dropdown",options:{inline:"Inline",block:"Break Text"},callback:function(e,t){this.image.display(t)},refresh:function(e){this.opts.imageTextNear||e.addClass("fr-hidden")},refreshOnShow:function(e,t){this.image.refreshDisplayOnShow(e,t)}}),Me.DefineIcon("image-align",{NAME:"align-left",SVG_KEY:"alignLeft"}),Me.DefineIcon("image-align-left",{NAME:"align-left",SVG_KEY:"alignLeft"}),Me.DefineIcon("image-align-right",{NAME:"align-right",SVG_KEY:"alignRight"}),Me.DefineIcon("image-align-center",{NAME:"align-justify",SVG_KEY:"alignCenter"}),Me.DefineIcon("imageAlign",{NAME:"align-justify",SVG_KEY:"alignJustify"}),Me.RegisterCommand("imageAlign",{type:"dropdown",title:"Align",options:{left:"Align Left",center:"None",right:"Align Right"},html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=Me.COMMANDS.imageAlign.options;for(var a in t)t.hasOwnProperty(a)&&(e+='<li role="presentation"><a class="fr-command fr-title" tabIndex="-1" role="option" data-cmd="imageAlign" data-param1="'.concat(a,'" title="').concat(this.language.translate(t[a]),'">').concat(this.icon.create("image-align-".concat(a)),'<span class="fr-sr-only">').concat(this.language.translate(t[a]),"</span></a></li>"));return e+="</ul>"},callback:function(e,t){this.image.align(t)},refresh:function(e){this.image.refreshAlign(e)},refreshOnShow:function(e,t){this.image.refreshAlignOnShow(e,t)}}),Me.DefineIcon("imageReplace",{NAME:"exchange",FA5NAME:"exchange-alt",SVG_KEY:"replaceImage"}),Me.RegisterCommand("imageReplace",{title:"Replace",undo:!1,focus:!1,popup:!0,refreshAfterCallback:!1,callback:function(){this.image.replace()}}),Me.DefineIcon("imageRemove",{NAME:"trash",SVG_KEY:"remove"}),Me.RegisterCommand("imageRemove",{title:"Remove",callback:function(){this.image.remove()}}),Me.DefineIcon("imageBack",{NAME:"arrow-left",SVG_KEY:"back"}),Me.RegisterCommand("imageBack",{title:"Back",undo:!1,focus:!1,back:!0,callback:function(){this.image.back()},refresh:function(e){this.$;this.image.get()||this.opts.toolbarInline?(e.removeClass("fr-hidden"),e.next(".fr-separator").removeClass("fr-hidden")):(e.addClass("fr-hidden"),e.next(".fr-separator").addClass("fr-hidden"))}}),Me.RegisterCommand("imageDismissError",{title:"OK",undo:!1,callback:function(){this.image.hideProgressBar(!0)}}),Me.DefineIcon("imageStyle",{NAME:"magic",SVG_KEY:"imageClass"}),Me.RegisterCommand("imageStyle",{title:"Style",type:"dropdown",html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=this.opts.imageStyles;for(var a in t)if(t.hasOwnProperty(a)){var i=t[a];"object"==Ke(i)&&(i=i.title),e+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="imageStyle" data-param1="'.concat(a,'">').concat(this.language.translate(i),"</a></li>")}return e+="</ul>"},callback:function(e,t){this.image.applyStyle(t)},refreshOnShow:function(e,t){var a=this.$,i=this.image.getEl();i&&t.find(".fr-command").each(function(){var e=a(this).data("param1"),t=i.hasClass(e);a(this).toggleClass("fr-active",t).attr("aria-selected",t)})}}),Me.DefineIcon("imageAlt",{NAME:"info",SVG_KEY:"imageAltText"}),Me.RegisterCommand("imageAlt",{undo:!1,focus:!1,popup:!0,title:"Alternative Text",callback:function(){this.image.showAltPopup()}}),Me.RegisterCommand("imageSetAlt",{undo:!0,focus:!1,title:"Update",refreshAfterCallback:!1,callback:function(){this.image.setAlt()}}),Me.DefineIcon("imageSize",{NAME:"arrows-alt",SVG_KEY:"imageSize"}
vendor: 4,738 bytes, lines 735-751
735),Me.RegisterCommand("imageSize",{undo:!1,focus:!1,popup:!0,title:"Change Size",callback:function(){this.image.showSizePopup()}}),Me.RegisterCommand("imageSetSize",{undo:!0,focus:!1,title:"Update",refreshAfterCallback:!1,callback:function(){this.image.setSize()}}),Me.DefineIcon("imageCaption",{NAME:"commenting",FA5NAME:"comment-alt",SVG_KEY:"imageCaption"}),Me.RegisterCommand("imageCaption",{undo:!0,focus:!1,title:"Image Caption",refreshAfterCallback:!0,callback:function(){this.image.toggleCaption()},refresh:function(e){this.image.get()&&e.toggleClass("fr-active",this.image.hasCaption())}})});
736},{"froala-editor":8}],16:[function(require,module,exports){
737/*!
738 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
739 * License https://froala.com/wysiwyg-editor/terms/
740 * Copyright 2014-2023 Froala Labs
741 */
742
743!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(e){"use strict";e=e&&e.hasOwnProperty("default")?e["default"]:e,Object.assign(e.DEFAULTS,{inlineStyles:{"Big Red":"font-size: 20px; color: red;","Small Blue":"font-size: 14px; color: blue;"}}),e.PLUGINS.inlineStyle=function(i){return{apply:function a(e){for(var t=e.split(";"),n=0;n<t.length;n++){var l=t[n].split(":");t[n].length&&2==l.length&&i.format.applyStyle(l[0].trim(),l[1].trim())}}}},e.RegisterCommand("inlineStyle",{type:"dropdown",html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=this.opts.inlineStyles;for(var n in t)if(t.hasOwnProperty(n)){var l=t[n]+(-1===t[n].indexOf("display:block;")?" display:block;":"");e+='<li role="presentation"><span style="'.concat(l,'" role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="inlineStyle" data-param1="').concat(t[n],'" title="').concat(this.language.translate(n),'">').concat(this.language.translate(n),"</a></span></li>")}return e+="</ul>"},title:"Inline Style",callback:function(e,t){this.inlineStyle.apply(t)},plugin:"inlineStyle"}),e.DefineIcon("inlineStyle",{NAME:"paint-brush",SVG_KEY:"inlineStyle"})});
744},{"froala-editor":8}],17:[function(require,module,exports){
745/*!
746 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
747 * License https://froala.com/wysiwyg-editor/terms/
748 * Copyright 2014-2023 Froala Labs
749 */
750
751!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(y){"use strict";y=y&&y.hasOwnProperty("default")?y["default"]:y,Object.assign(y.POPUP_TEMPLATES,{"link.edit":"[_BUTTONS_]","link.insert":"[_BUTTONS_][_INPUT_LAYER_]"}),Object.assign(y.DEFAULTS,{linkEditButtons:["linkOpen","linkStyle","linkEdit","linkRemove"],linkInsertButtons:["linkBack","|","linkList"],linkAttributes:{},linkAutoPrefix:"http://",linkStyles:{"fr-green":"Green","fr-strong":"Thick"},linkMultipleStyles:!0,linkConvertEmailAddress:!0,linkAlwaysBlank:!1,linkAlwaysNoFollow:!1,linkNoOpener:!0,linkNoReferrer:!0,linkList:[{text:"Froala",href:"https://froala.com",target:"_blank"},{text:"Google",href:"https://google.com",target:"_blank"},{displayText:"Facebook",href:"https://facebook.com"}],linkText:!0}),y.PLUGINS.link=function(h){var m=h.$;function v(){var e=h.image?h.image.get():null;if(e||!h.$wp)return"A"==h.el.tagName?h.el:e&&e.get(0).parentNode&&"A"==e.get(0).parentNode.tagName?e.get(0).parentNode:void 0;var t=h.selection.ranges(0).commonAncestorContainer;try{t&&(t.contains&&t.contains(h.el)||!h.el.contains(t)||h.el==t)&&(t=null)}catch(r){t=null}if(t&&"A"===t.tagName)return t;var n=h.selection.element(),i=h.selection.endElement();"A"==n.tagName||h.node.isElement(n)||(n=m(n).parentsUntil(h.$el,"a").first().get(0)),"A"==i.tagName||h.node.isElement(i)||(i=m(i).parentsUntil(h.$el,"a").first().get(0));try{i&&(i.contains&&i.contains(h.el)||!h.el.contains(i)||h.el==i)&&(i=null)}catch(r){i=null}try{n&&(n.contains&&n.contains(h.el)||!h.el.contains(n)||h.el==n)&&(n=null)}catch(r){n=null}return i&&i==n&&"A"==i.tagName?(h.browser.msie||h.helpers.isMobile())&&(h.selection.info(n).atEnd||h.selection.info(n).atStart)?null:n:null}function b(){var e,t,n,i,r=h.image?h.image.get():null,a=[];if(r)"A"==r.get(0).parentNode.tagName&&a.push(r.get(0).parentNode);else if(h.win.getSelection){var l=h.win.getSelection();if(l.getRangeAt&&l.rangeCount){i=h.doc.createRange();for(var s=0;s<l.rangeCount;++s)if((t=(e=l.getRangeAt(s)).commonAncestorContainer)&&1!=t.nodeType&&(t=t.parentNode),t&&"a"==t.nodeName.toLowerCase())a.push(t);else{n=t.getElementsByTagName("a");for(var o=0;o<n.length;++o)i.selectNodeContents(n[o]),i.compareBoundaryPoints(e.END_TO_START,e)<1&&-1<i.
vendor: 19,339 bytes, lines 751-759
751compareBoundaryPoints(e.START_TO_END,e)&&a.push(n[o])}}}else if(h.doc.selection&&"Control"!=h.doc.selection.type)if("a"==(t=(e=h.doc.selection.createRange()).parentElement()).nodeName.toLowerCase())a.push(t);else{n=t.getElementsByTagName("a"),i=h.doc.body.createTextRange();for(var p=0;p<n.length;++p)i.moveToElementText(n[p]),-1<i.compareEndPoints("StartToEnd",e)&&i.compareEndPoints("EndToStart",e)<1&&a.push(n[p])}return a}function E(r){if(h.core.hasFocus()){if(a(),r&&"keyup"===r.type&&(r.altKey||r.which==y.KEYCODE.ALT))return!0;setTimeout(function(){if(!r||r&&(1==r.which||"mouseup"!=r.type)){var e=v(),t=h.image?h.image.get():null;if(e&&!t){if(h.image){var n=h.node.contents(e);if(1==n.length&&"IMG"==n[0].tagName){var i=h.selection.ranges(0);return 0===i.startOffset&&0===i.endOffset?m(e).before(y.INVISIBLE_SPACE+y.MARKERS):m(e).after(y.INVISIBLE_SPACE+y.MARKERS),h.selection.restore(),!1}}r&&r.stopPropagation(),l(e)}}},h.helpers.isIOS()?100:0)}}function l(e){var t=h.popups.get("link.edit");t||(t=function a(){var e="";1<=h.opts.linkEditButtons.length&&("A"==h.el.tagName&&0<=h.opts.linkEditButtons.indexOf("linkRemove")&&h.opts.linkEditButtons.splice(h.opts.linkEditButtons.indexOf("linkRemove"),1),e='<div class="fr-buttons">'.concat(h.button.buildList(h.opts.linkEditButtons),"</div>"));var t={buttons:e},n=h.popups.create("link.edit",t);h.$wp&&h.events.$on(h.$wp,"scroll.link-edit",function(){v()&&h.popups.isVisible("link.edit")&&l(v())});return n}());var n=m(e);h.popups.isVisible("link.edit")||h.popups.refresh("link.edit"),h.popups.setContainer("link.edit",h.$sc);var i=n.offset().left+n.outerWidth()/2,r=n.offset().top+n.outerHeight();h.popups.show("link.edit",i,r,n.outerHeight(),!0)}function a(){h.popups.hide("link.edit")}function o(){var e=h.popups.get("link.insert"),t=v();if(t){var n,i,r=m(t),a=e.find('input.fr-link-attr[type="text"]'),l=e.find('input.fr-link-attr[type="checkbox"]');for(n=0;n<a.length;n++)(i=m(a[n])).val(r.attr(i.attr("name")||""));for(l.attr("checked",!1),n=0;n<l.length;n++)i=m(l[n]),r.attr(i.attr("name"))==i.data("checked")&&i.attr("checked",!0);e.find('input.fr-link-attr[type="text"][name="text"]').val(r.text())}else e.find('input.fr-link-attr[type="text"]').val(""),e.find('input.fr-link-attr[type="checkbox"]').attr("checked",!1),e.find('input.fr-link-attr[type="text"][name="text"]').val(h.selection.text());e.find("input.fr-link-attr").trigger("change"),(h.image?h.image.get():null)?e.find('.fr-link-attr[name="text"]').parent().hide():e.find('.fr-link-attr[name="text"]').parent().show()}function s(e){if(e)return h.popups.onRefresh("link.insert",o),!0;var t="";1<=h.opts.linkInsertButtons.length&&(t='<div class="fr-buttons fr-tabs">'.concat(h.button.buildList(h.opts.linkInsertButtons),"</div>"));var n="",i=0;for(var r in n='<div class="fr-link-insert-layer fr-layer fr-active" id="fr-link-insert-layer-'.concat(h.id,'">'),n+='<div class="fr-input-line"><input id="fr-link-insert-layer-url-'.concat(h.id,'" name="href" type="text" class="fr-link-attr" placeholder="').concat(h.language.translate("URL"),'" tabIndex="').concat(++i,'"></div>'),h.opts.linkText&&(n+='<div class="fr-input-line"><input id="fr-link-insert-layer-text-'.concat(h.id,'" name="text" type="text" class="fr-link-attr" placeholder="').concat(h.language.translate("Text"),'" tabIndex="').concat(++i,'"></div>')),h.opts.linkAttributes)if(h.opts.linkAttributes.hasOwnProperty(r)){var a=h.opts.linkAttributes[r];n+='<div class="fr-input-line"><input name="'.concat(r,'" type="text" class="fr-link-attr" placeholder="').concat(h.language.translate(a),'" tabIndex="').concat(++i,'"></div>')}h.opts.linkAlwaysBlank||(n+='<div class="fr-checkbox-line"><span class="fr-checkbox"><input name="target" class="fr-link-attr" data-checked="_blank" type="checkbox" id="fr-link-target-'.concat(h.id,'" tabIndex="').concat(++i,'"><span>').concat('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="10" height="10" viewBox="0 0 32 32"><path d="M27 4l-15 15-7-7-5 5 12 12 20-20z" fill="#FFF"></path></svg>','</span></span><label id="fr-label-target-').concat(h.id,'">').concat(h.language.translate("Open in new tab"),"</label></div>"));var l={buttons:t,input_layer:n+='<div class="fr-action-buttons"><button class="fr-command fr-submit" role="button" data-cmd="linkInsert" href="#" tabIndex="'.concat(++i,'" type="button">').concat(h.language.translate("Insert"),"</button></div></div>")},s=h.popups.create("link.insert",l);return h.$wp&&h.events.$on(h.$wp,"scroll.link-insert",function(){(h.image?h.image.get():null)&&h.popups.isVisible("link.insert")&&f(),h.popups.isVisible("link.insert")&&c()}),s}function p(e,t,n){if(h.opts.trackChangesEnabled){if(h.edit.on(),h.events.focus(!0),h.undo.saveStep(),h.markers.insert(),h.html.wrap(),!h.$el.find(".fr-marker").length)return void h.popups.hide("link.insert");h.markers.remove()}if(void 0===n&&(n={}),!1===h.events.trigger("link.beforeInsert",[e,t,n]))return!1;var i=h.image?h.image.get():null;i||"A"==h.el.tagName?"A"==h.el.tagName&&h.$el.focus():(h.selection.restore(),h.popups.hide("link.insert"));var r=e;h.opts.linkConvertEmailAddress&&h.helpers.isEmail(e)&&!/^mailto:.*/i.test(e)&&(e="mailto:".concat(e));if(""===h.opts.linkAutoPrefix||new RegExp("^("+y.LinkProtocols.join("|")+"):.","i").test(e)||/^data:image.*/i.test(e)||/^(https?:|ftps?:|file:|)\/\//i.test(e)||/^([A-Za-z]:(\\){1,2}|[A-Za-z]:((\\){1,2}[^\\]+)+)(\\)?$/i.test(e)||["/","{","[","#","(","."].indexOf((e||"")[0])<0&&(e=h.opts.linkAutoPrefix+e),e=h.helpers.sanitizeURL(e),h.opts.linkAlwaysBlank&&(n.target="_blank"),h.opts.linkAlwaysNoFollow&&(n.rel="nofollow"),h.helpers.isEmail(r)&&(n.target=null,n.rel=null),"_blank"==n.target?(h.opts.linkNoOpener&&(n.rel?n.rel+=" noopener":n.rel="noopener"),h.opts.linkNoReferrer&&(n.rel?n.rel+=" noreferrer":n.rel="noreferrer")):null==n.target&&(n.rel?n.rel=n.rel.replace(/noopener/,"").replace(/noreferrer/,""):n.rel=null),t=t||"",e===h.opts.linkAutoPrefix)return h.popups.get("link.insert").find('input[name="href"]').addClass("fr-error"),h.events.trigger("link.bad",[r]),!1;var a,l=v();if(l){if((a=m(l)).attr("href",e),0<t.length&&a.text()!=t&&!i){if(h.opts.trackChangesEnabled){var s=m(a.get(0).outerHTML);s.insertBefore(a.parent());var o=h.track_changes.wrapLinkInTracking(s,h.track_changes.getPendingChanges().length-1),p=h.track_changes.wrapInDelete(o);a.parent().append(p)}for(var c=a.get(0);1===c.childNodes.length&&c.childNodes[0].nodeType==Node.ELEMENT_NODE;)c=c.childNodes[0];m(c).text(t)}for(var f in i||a.prepend(y.START_MARKER).append(y.END_MARKER),n)n[f]?a.attr(f,n[f]):a.removeAttr(f);i||h.selection.restore()}else{i?(i.wrap('<a href="'.concat(e,'"></a>')),h.image.hasCaption()&&i.parent().append(i.parents(".fr-img-caption").find(".fr-inner"))):(h.format.remove("a"),h.selection.isCollapsed()?(t=0===t.length?r:t,h.html.insert('<a href="'.concat(e,'">').concat(y.START_MARKER).concat(t.replace(/&/g,"&amp;").replace(/</,"&lt;",">","&gt;")).concat(y.END_MARKER,"</a>")),h.selection.restore()):0<t.length&&t!=h.selection.text().replace(/\n/g,"")?(h.selection.remove(),h.html.insert('<a href="'.concat(e,'">').concat(y.START_MARKER).concat(t.replace(/&/g,"&amp;")).concat(y.END_MARKER,"</a>")),h.selection.restore()):(!function g(){if(!h.selection.isCollapsed()){h.selection.save();for(var e=h.$el.find(".fr-marker").addClass("fr-unprocessed").toArray();e.length;){var t=m(e.pop());t.removeClass("fr-unprocessed");var n=h.node.deepestParent(t.get(0));if(n){for(var i=t.get(0),r="",a="";i=i.parentNode,h.node.isBlock(i)||(r+=h.node.closeTagString(i),a=h.node.openTagString(i)+a),i!=n;);var l=h.node.openTagString(t.get(0))+t.html()+h.node.closeTagString(t.get(0));t.replaceWith('<span id="fr-break"></span>');var s=n.outerHTML;s=(s=s.replace(/<span id="fr-break"><\/span>/g,r+l+a)).replace(a+r,""),n.outerHTML=s}e=h.$el.find(".fr-marker.fr-unprocessed").toArray()}h.html.cleanEmptyTags(),h.selection.restore()}}(),h.format.apply("a",{href:e})));for(var d=b(),u=0;u<d.length;u++)(a=m(d[u])).attr(n),a.removeAttr("_moz_dirty");1==d.length&&h.$wp&&!i&&(m(d[0]).prepend(y.START_MARKER).append(y.END_MARKER),h.selection.restore())}if(i){var k=h.popups.get("link.insert");k&&k.find("input:focus").blur(),h.image.edit(i)}else E()}function c(){a();var e=v();if(e){var t=h.popups.get("link.insert");t||(t=s()),h.popups.isVisible("link.insert")||(h.popups.refresh("link.insert"),h.selection.save(),h.helpers.isMobile()&&(h.events.disableBlur(),h.$el.blur(),h.events.enableBlur())),h.popups.setContainer("link.insert",h.$sc);var n=(h.image?h.image.get():null)||m(e),i=n.offset().left+n.outerWidth()/2,r=n.offset().top+n.outerHeight();h.popups.show("link.insert",i,r,n.outerHeight(),!0)}}function f(){var e=h.image?h.image.getEl():null;if(e){var t=h.popups.get("link.insert"),n=e.outerWidth()/2;h.image.hasCaption()&&(e=e.find(".fr-img-wrap"),m(e)&&m(e).find("img")&&(n=m(e).find("img").outerWidth()/2)),t||(t=s()),o(),h.popups.setContainer("link.insert",h.$sc);var i=e.offset().left+n,r=e.offset().top+e.outerHeight(),a=e.outerHeight();h.opts.iframe&&h.image.hasCaption()&&m(e)&&m(e).find("img")&&(a=m(e).find("img").outerHeight()),h.popups.show("link.insert",i,r,a,!0)}}return{_init:function e(){h.events.on("keyup",function(e){e.which!=y.KEYCODE.ESC&&E(e)}),h.events.on("window.mouseup",E),h.events.$on(h.$el,"click","a",function(e){h.edit.isDisabled()&&e.preventDefault()}),h.helpers.isMobile()&&h.events.$on(h.$doc,"selectionchange",E),s(!0),"A"==h.el.tagName&&h.$el.addClass("fr-view"),h.events.on("toolbar.esc",function(){if(h.popups.isVisible("link.edit"))return h.events.disableBlur(),h.events.focus(),!1},!0)},remove:function i(){var e=v(),t=h.image?h.image.get():null;if(!1===h.events.trigger("link.beforeRemove",[e]))return!1;if(t&&e)if(h.image.hasCaption()){t.addClass("img-link-caption"),m(e).replaceWith(m(e).html());var n=document.querySelectorAll("img.img-link-caption");h.image.edit(m(n[0])),m(n[0]).removeClass("img-link-caption")}else t.unwrap(),h.image.edit(t);else e&&(h.selection.save(),m(e).replaceWith(m(e).html()),h.selection.restore(),a())},showInsertPopup:function d(){var e=h.$tb.find('.fr-command[data-cmd="insertLink"]'),t=h.popups.get("link.insert");if(t||(t=s()),!t.hasClass("fr-active"))if(h.popups.refresh("link.insert"),h.popups.setContainer("link.insert",h.$tb||h.$sc),e.isVisible()){var n=h.button.getPosition(e),i=n.left,r=n.top;h.popups.show("link.insert",i,r,e.outerHeight())}else h.position.forSelection(t),h.popups.show("link.insert")},usePredefined:function u(e){var t,n,i=h.opts.linkList[e],r=h.popups.get("link.insert"),a=r.find('input.fr-link-attr[type="text"]'),l=r.find('input.fr-link-attr[type="checkbox"]');for(i.rel&&(r.rel=i.rel),n=0;n<a.length;n++)i[(t=m(a[n])).attr("name")]?(t.val(i[t.attr("name")]),t.toggleClass("fr-not-empty",!0)):"text"!=t.attr("name")&&t.val("");for(n=0;n<l.length;n++)(t=m(l[n])).attr("checked",t.data("checked")==i[t.attr("name")]);h.accessibility.focusPopup(r)},insertCallback:function k(){var e,t,n=h.popups.get("link.insert"),i=n.find('input.fr-link-attr[type="text"]'),r=n.find('input.fr-link-attr[type="checkbox"]'),a=(i.filter('[name="href"]').val()||"").trim(),l=h.opts.linkText?i.filter('[name="text"]').val():"",s={};for(t=0;t<i.length;t++)e=m(i[t]),["href","text"].indexOf(e.attr("name"))<0&&(s[e.attr("name")]=e.val());for(t=0;t<r.length;t++)(e=m(r[t])).is(":checked")?s[e.attr("name")]=e.data("checked"):s[e.attr("name")]=e.data("unchecked")||null;n.rel&&(s.rel=n.rel);var o=h.helpers.scrollTop();p(a,l,s),m(h.o_win).scrollTop(o)},insert:p,update:c,get:v,allSelected:b,back:function t(){h.image&&h.image.get()?h.image.back():(h.events.disableBlur(),h.selection.restore(),h.events.enableBlur(),v()&&h.$wp?(h.selection.restore(),a(),E()):"A"==h.el.tagName?(h.$el.focus(),E()):(h.popups.hide("link.insert"),h.toolbar.showInline()))},imageLink:f,applyStyle:function g(e,t,n){void 0===n&&(n=h.opts.linkMultipleStyles),void 0===t&&(t=h.opts.linkStyles);var i=v();if(!i)return!1;if(!n){var r=Object.keys(t);r.splice(r.indexOf(e),1),m(i).removeClass(r.join(" "))}m(i).toggleClass(e),E()}}},y.DefineIcon("insertLink",{NAME:"link",SVG_KEY:"insertLink"}),y.RegisterShortcut(y.KEYCODE.K,"insertLink",null,"K"),y.RegisterCommand("insertLink",{title:"Insert Link",undo:!1,focus:!0,refreshOnCallback:!1,popup:!0,callback:function(){this.popups.isVisible("link.insert")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore()),this.popups.hide("link.insert")):this.link.showInsertPopup()},plugin:"link"}),y.DefineIcon("linkOpen",{NAME:"external-link",FA5NAME:"external-link-alt",SVG_KEY:"openLink"}),y.RegisterCommand("linkOpen",{title:"Open Link",undo:!1,refresh:function(e){this.link.get()?e.removeClass("fr-hidden"):e.addClass("fr-hidden")},callback:function(){var e=this.link.get();e&&(-1!==e.href.indexOf("mailto:")?this.o_win.open(e.href).close():(e.target||(e.target="_self"),this.browser.msie||this.browser.edge?this.o_win.open(e.href,e.target):this.o_win.open(e.href,e.target,"noopener")),this.popups.hide("link.edit"))},plugin:"link"}),y.DefineIcon("linkEdit",{NAME:"edit",SVG_KEY:"edit"}),y.RegisterCommand("linkEdit",{title:"Edit Link",undo:!1,refreshAfterCallback:!1,popup:!0,callback:function(){this.link.update()},refresh:function(e){this.link.get()?e.removeClass("fr-hidden"):e.addClass("fr-hidden")},plugin:"link"}),y.DefineIcon("linkRemove",{NAME:"unlink",SVG_KEY:"unlink"}),y.RegisterCommand("linkRemove",{title:"Unlink",callback:function(){this.link.remove()},refresh:function(e){this.link.get()?e.removeClass("fr-hidden"):e.addClass("fr-hidden")},plugin:"link"}),y.DefineIcon("linkBack",{NAME:"arrow-left",SVG_KEY:"back"}),y.RegisterCommand("linkBack",{title:"Back",undo:!1,focus:!1,back:!0,refreshAfterCallback:!1,callback:function(){this.link.back()},refresh:function(e){var t=this.link.get()&&this.doc.hasFocus();(this.image?this.image.get():null)||t||this.opts.toolbarInline?(e.removeClass("fr-hidden"),e.next(".fr-separator").removeClass("fr-hidden")):(e.addClass("fr-hidden"),e.next(".fr-separator").addClass("fr-hidden"))},plugin:"link"}),y.DefineIcon("linkList",{NAME:"search",SVG_KEY:"search"}),y.RegisterCommand("linkList",{title:"Choose Link",type:"dropdown",focus:!1,undo:!1,refreshAfterCallback:!1,html:function(){for(var e='<ul class="fr-dropdown-list" role="presentation">',t=this.opts.linkList,n=0;n<t.length;n++)e+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="linkList" data-param1="'.concat(n,'">').concat(t[n].displayText||t[n].text,"</a></li>");return e+="</ul>"},callback:function(e,t){this.link.usePredefined(t)},plugin:"link"}),y.RegisterCommand("linkInsert",{focus:!1,refreshAfterCallback:!1,callback:function(){this.link.insertCallback()},refresh:function(e){this.link.get()?e.text(this.language.translate("Update")):e.text(this.language.translate("Insert"))},plugin:"link"}),y.DefineIcon("imageLink",{NAME:"link",SVG_KEY:"insertLink"}),y.RegisterCommand("imageLink",{title:"Insert Link",undo:!1,focus:!1,popup:!0,callback:function(){this.link.imageLink()},refresh:function(e){var t;this.link.get()?((t=e.prev()).hasClass("fr-separator")&&t.removeClass("fr-hidden"),e.addClass("fr-hidden")):((t=e.prev()).hasClass("fr-separator")&&t.addClass("fr-hidden"),e.removeClass("fr-hidden"))},plugin:"link"}),y.DefineIcon("linkStyle",{NAME:"magic",SVG_KEY:"linkStyles"}),y.RegisterCommand("linkStyle",{title:"Style",type:"dropdown",html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=this.opts.linkStyles;for(var n in t)t.hasOwnProperty(n)&&(e+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="linkStyle" data-param1="'.concat(n,'">').concat(this.language.translate(t[n]),"</a></li>"));return e+="</ul>"},callback:function(e,t){this.link.applyStyle(t)},refreshOnShow:function(e,t){var n=this.$,i=this.link.get();if(i){var r=n(i);t.find(".fr-command").each(function(){var e=n(this).data("param1"),t=r.hasClass(e);n(this).toggleClass("fr-active",t).attr("aria-selected",t)})}},refresh:function(e){this.link.get()?e.removeClass("fr-hidden"):e.addClass("fr-hidden")},plugin:"link"})});
752},{"froala-editor":8}],18:[function(require,module,exports){
753/*!
754 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
755 * License https://froala.com/wysiwyg-editor/terms/
756 * Copyright 2014-2023 Froala Labs
757 */
758
759!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(i){"use strict";i=i&&i.hasOwnProperty("default")?i["default"]:i,Object.assign(i.DEFAULTS,{listAdvancedTypes:!0}),i.PLUGINS.lists=function(m){var g=m.$;function d(e){return'<span class="fr-open-'.concat(e.toLowerCase(),'"></span>')}function f(e){return'<span class="fr-close-'.concat(e.toLowerCase(),'"></span>')}function o(e,t){!function c(e,t){for(var a=[],n=0;n<e.length;n++){var r=e[n].parentNode;"LI"==e[n].tagName&&r.tagName!=t&&a.indexOf(r)<0&&a.push(r)}for(var o=a.length-1;0<=o;o--){var l=g(a[o]);l.replaceWith("<".concat(t.toLowerCase()," ").concat(m.node.attributes(l.get(0)),">").concat(l.html(),"</").concat(t.toLowerCase(),">"))}}(e,t);var a,n=m.html.defaultTag(),r=null;e.length&&(a="rtl"==m.opts.direction||"rtl"==g(e[0]).css("direction")?"margin-right":"margin-left");for(var o=0;o<e.length;o++)if("TD"!=e[o].tagName&&"TH"!=e[o].tagName&&"LI"!=e[o].tagName){var l=m.helpers.getPX(g(e[o]).css(a))||0;(e[o].style.marginLeft=null)===r&&(r=l);var i=0<r?"<".concat(t,' style="').concat(a,": ").concat(r,'px ">'):"<".concat(t,">"),s="</".concat(t,">");for(l-=r;0<l/m.opts.indentMargin;)i+="</".concat(t,">"),s+=s,l-=m.opts.indentMargin;n&&e[o].tagName.toLowerCase()==n?g(e[o]).replaceWith("".concat(i,"<li").concat(m.node.attributes(e[o]),">").concat(g(e[o]).html(),"</li>").concat(s)):g(e[o]).wrap("".concat(i,"<li></li>").concat(s))}m.clean.lists()}function c(e){var t,a;for(t=e.length-1;0<=t;t--)for(a=t-1;0<=a;a--){if(g(e[a]).find(e[t]).length||e[a]==e[t]){e.splice(t,1);break}if(g(e[a]).contains(e[t])){e.splice(a,1);break}}var n=[];for(t=0;t<e.length;t++){var r=g(e[t]),o=e[t].parentNode,l=r.attr("class");if(r.before(f(o.tagName)),"LI"==o.parentNode.tagName)r.before(f("LI")),r.after(d("LI"));else if("OL"==o.parentNode.tagName)r.before(f("OL")),r.after(d("OL"));else if("UL"==o.parentNode.tagName)r.before(f("UL")),r.after(d("UL"));else{var i="";l&&(i+=' class="'.concat(l,'"'));var s="rtl"==m.opts.direction||"rtl"==r.css("direction")?"margin-right":"margin-left";m.helpers.getPX(g(o).css(s))&&0<=(g(o).attr("style")||"").indexOf("".concat(s,":"))&&(i+=' style="'.concat(s,":").concat(m.helpers.getPX(g(o).css(s)),'px;"')),m.html.defaultTag()&&0===r.find(m.html.blockTagsQuery()).length&&r.wrapInner(m.html.defaultTag()+i),m.node.isEmpty(r.get(0),!0)||0!==r.find(m.html.blockTagsQuery()).length||("DIV"==o.parentNode.tagName&&m.html.defaultTag()?(r.prepend(d(m.html.defaultTag())),r.append(f(m.html.defaultTag()))):r.append("<br>")),r.append(d("LI")),r.prepend(f("LI"))}r.after(d(o.tagName)),"LI"==o.parentNode.tagName&&(o=o.parentNode.parentNode),n.indexOf(o)<0&&n.push(o)}for(t=0;t<n.length;t++){var c=g(n[t]),p=c.html();p=(p=p.replace(/<span class="fr-close-([a-z]*)"><\/span>/g,"</$1>")).replace(/<span class="fr-open-([a-z]*)"><\/span>/g,"<$1>
759"),c.replaceWith(m.node.openTagString(c.get(0))+p+m.node.closeTagString(c.get(0)))}m.$el.find("li:empty").remove(),m.$el.find("ul:empty, ol:empty").remove(),m.clean.lists(),m.$el.find("ul:empty, ol:empty").remove(),m.html.wrap()}function e(e){if("indent"==e||"outdent"==e){var t=!1,a=m.selection.blocks(),n=[],r=a[0].previousSibling||a[0].parentElement;if("outdent"==e){if("UL"!=a[0].parentNode.tagName&&"UL"!=r.parentNode.tagName&&"OL"!=r.parentNode.tagName&&"LI"!=r.parentNode.tagName)return;if(!a[0].previousSibling&&"none"==r.parentNode.style.listStyleType)return void function l(e){for(m.selection.save();0<e.childNodes.length;)e.parentNode.parentNode.append(e.childNodes[0]);m.clean.lists(),m.selection.restore()}(r)}else{if("UL"!=a[0].parentElement.tagName&&"OL"!=a[0].parentElement.tagName&&"LI"!=a[0].parentElement.tagName)return;if(m.node.isBlock(a[0])&&"LI"!==a[0].tagName&&0<g(a[0]).parentsUntil(m.$el,"LI").length&&(a[0]=a[0].parentElement,r=a[0].parentElement),!a[0].previousSibling||"LI"!=a[0].previousSibling.tagName)return void function i(e){m.selection.save();for(var t="OL"==e.tagName?document.createElement("ol"):document.createElement("ul");0<e.childNodes.length;)t.append(e.childNodes[0]);var a=document.createElement("li");t.append(a),e.append(t),m.clean.lists(),m.selection.restore()}(r)}for(var o=0;o<a.length;o++)"LI"==a[o].tagName?(t=!0,n.push(a[o])):"LI"==a[o].parentNode.tagName&&(t=!0,n.push(a[o].parentNode));t&&("indent"==e?function f(e){m.selection.save();for(var t=0;t<e.length;t++){var a=e[t].previousSibling;if(a){var n=g(e[t]).find("> ul, > ol").last().get(0);if(n){var r=g(document.createElement("li"));if(n.childNodes.length)for(var o=n.childNodes[0].attributes,l=0;l<o.length;l++){var i=o[l];"style"===i.name&&(r[0].style.cssText+=i.value)}g(n).prepend(r);for(var s=m.node.contents(e[t])[0];s&&!m.node.isList(s);){var c=s.nextSibling;r.append(s),s=c}g(a).append(g(n)),g(e[t]).remove()}else{var p=g(a).find("> ul, > ol").last().get(0);if(p)g(p).append(g(e[t]));else{var d=g("<".concat(e[t].parentNode.tagName,">"));g(a).append(d),d.append(g(e[t]))}}}}m.clean.lists(),m.selection.restore()}(n):function s(e){m.selection.save(),c(e),m.selection.restore()}(n))}}return{_init:function t(){m.events.on("commands.after",e),m.events.on("keydown",function(e){if(e.which==i.KEYCODE.TAB){for(var t=m.selection.blocks(),a=[],n=0;n<t.length;n++)"LI"==t[n].tagName?a.push(t[n]):"LI"==t[n].parentNode.tagName&&a.push(t[n].parentNode);if(1<a.length||a.length&&(m.selection.info(a[0]).atStart||m.node.isEmpty(a[0])))return e.preventDefault(),e.stopPropagation(),e.shiftKey?m.commands.outdent():m.commands.indent(),!1}},!0)},format:function l(e,t){var a,n;for(m.html.syncInputs(),m.selection.save(),m.html.wrap(!0,!0,!0,!0),m.selection.restore(),n=m.selection.blocks(!0),a=0;a<n.length;a++)"LI"!=n[a].tagName&&"LI"==n[a].parentNode.tagName&&(n[a]=n[a].parentNode);if(m.selection.save(),function r(e,t){for(var a=!0,n=0;n<e.length;n++){if("LI"!=e[n].tagName)return!1;e[n].parentNode.tagName!=t&&(a=!1)}return a}(n,e)?t||c(n):o(n,e),m.html.unwrap(),m.selection.restore(),t=t||"default"){for(n=m.selection.blocks(),a=0;a<n.length;a++)"LI"!=n[a].tagName&&"LI"==n[a].parentNode.tagName&&(n[a]=n[a].parentNode);for(a=0;a<n.length;a++)"LI"==n[a].tagName&&(g(n[a].parentNode).css("list-style-type","default"===t?"":t),0===(g(n[a].parentNode).attr("style")||"").length&&g(n[a].parentNode).removeAttr("style"))}},refresh:function r(e,t){var a=g(m.selection.element());if(a.get(0)!=m.el){var n=a.get(0);(n="LI"!=n.tagName&&n.firstElementChild&&"LI"!=n.firstElementChild.tagName?a.parents("li").get(0):"LI"==n.tagName||n.firstElementChild?n.firstElementChild&&"LI"==n.firstElementChild.tagName?a.get(0).firstChild:a.get(0):a.parents("li").get(0))&&n.parentNode.tagName==t&&m.el.contains(n.parentNode)&&e.addClass("fr-active")}}}},i.DefineIcon("formatOLSimple",{NAME:"list-ol",SVG_KEY:"orderedList"}),i.RegisterCommand("formatOLSimple",{title:"Ordered List",type:"button",options:{"default":"Default",circle:"Circle",disc:"Disc",square:"Square"},refresh:function(e){this.lists.refresh(e,"OL")},callback:function(e,t){this.lists.format("OL",t)},plugin:"lists"}),i.RegisterCommand("formatUL",{title:"Unordered List",type:"button",hasOptions:function(){return this.opts.listAdvancedTypes},options:{"default":"Default",circle:"Circle",disc:"Disc",square:"Square"},refresh:function(e){this.lists.refresh(e,"UL")},callback:function(e,t){this.lists.format("UL",t)},plugin:"lists"}),i.RegisterCommand("formatOL",{title:"Ordered List",hasOptions:function(){return this.opts.listAdvancedTypes},options:{"default":"Default","lower-alpha":"Lower Alpha","lower-greek":"Lower Greek","lower-roman":"Lower Roman","upper-alpha":"Upper Alpha","upper-roman":"Upper Roman"},refresh:function(e){this.lists.refresh(e,"OL")},callback:function(e,t){this.lists.format("OL",t)},plugin:"lists"}),i.DefineIcon("formatUL",{NAME:"list-ul",SVG_KEY:"unorderedList"}),i.DefineIcon("formatOL",{NAME:"list-ol",SVG_KEY:"orderedList"})});
760},{"froala-editor":8}],19:[function(require,module,exports){
761/*!
762 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
763 * License https://froala.com/wysiwyg-editor/terms/
764 * Copyright 2014-2023 Froala Labs
765 */
766
767!function(a,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(a.FroalaEditor)}(this,function(a){"use strict";a=a&&a.hasOwnProperty("default")?a["default"]:a,Object.assign(a.DEFAULTS,{paragraphFormat:{N:"Normal",H1:"Heading 1",H2:"Heading 2",H3:"Heading 3",H4:"Heading 4",PRE:"Code"},paragraphFormatSelection:!1,paragraphDefaultSelection:"Paragraph Format"}),a.PLUGINS.paragraphFormat=function(h){var g=h.$;function c(a,t){var e=h.html.defaultTag();if(t&&t.toLowerCase()!=e)if(0<a.find("ul, ol").length){var r=g("<"+t+">");a.prepend(r);for(var n=h.node.contents(a.get(0))[0];n&&["UL","OL"].indexOf(n.tagName)<0;){var o=n.nextSibling;r.append(n),n=o}}else a.html("<"+t+">"+a.html()+"</"+t+">")}return{apply:function u(a){"N"==a&&(a=h.html.defaultTag()),h.selection.save(),h.html.wrap(!0,!0,!h.opts.paragraphFormat.BLOCKQUOTE,!0,!0),h.selection.restore(
vendor: 1,523 bytes, line 767
767);var t,e,r,n,o,i,p,l,s=h.selection.blocks();h.selection.save(),h.$el.find("pre").attr("skip",!0);for(var m=0;m<s.length;m++)if(s[m].tagName!=a&&!h.node.isList(s[m])){var d=g(s[m]);if("LI"==s[m].tagName)c(d,a);else if("LI"==s[m].parentNode.tagName&&s[m])i=d,p=a,l=h.html.defaultTag(),p&&p.toLowerCase()!=l||(p='div class="fr-temp-div"'),i.replaceWith(g("<"+p+">").html(i.html()));else if(0<=["TD","TH"].indexOf(s[m].parentNode.tagName))r=d,n=a,o=h.html.defaultTag(),n||(n='div class="fr-temp-div"'+(h.node.isEmpty(r.get(0),!0)?' data-empty="true"':"")),n.toLowerCase()==o?(h.node.isEmpty(r.get(0),!0)||r.append("<br/>"),r.replaceWith(r.html())):r.replaceWith(g("<"+n+">").html(r.html()));else{if("PRE"===a&&null===d[0].nextSibling){var f=g("<br>");d[0].after(f[0])}t=d,(e=a)||(e='div class="fr-temp-div"'+(h.node.isEmpty(t.get(0),!0)?' data-empty="true"':"")),("H1"==e||"H2"==e||"H3"==e||"H4"==e||"H5"==e)&&-1<h.node.attributes(t.get(0)).indexOf("font-size:")?t.replaceWith(g("<"+e+" "+h.node.attributes(t.get(0)).replace(/font-size:[0-9]+px;?/,"")+">").html(t.html()).removeAttr("data-empty")):t.replaceWith(g("<"+e+" "+h.node.attributes(t.get(0))+">").html(t.html()).removeAttr("data-empty"))}}h.$el.find('pre:not([skip="true"]) + pre:not([skip="true"])').each(function(){g(this).prev().append("<br>"+g(this).html()),g(this).remove()}),h.$el.find("pre").removeAttr("skip"),h.html.unwrap(),h.selection.restore()},refreshOnShow:function i(a,t){var e=h.selection.blocks();if(e.length){var r=e[0],n="N",o=h.html.defaultTag();
vendor: 2,631 bytes, lines 767-775
767r.tagName.toLowerCase()!=o&&r!=h.el&&(n=r.tagName),t.find('.fr-command[data-param1="'+n+'"]').addClass("fr-active").attr("aria-selected",!0)}else t.find('.fr-command[data-param1="N"]').addClass("fr-active").attr("aria-selected",!0)},refresh:function o(a){if(h.opts.paragraphFormatSelection){var t=h.selection.blocks();if(t.length){var e=t[0],r="N",n=h.html.defaultTag();e.tagName.toLowerCase()!=n&&e!=h.el&&(r=e.tagName),0<=["LI","TD","TH"].indexOf(r)&&(r="N"),a.find(">span").text(h.language.translate(h.opts.paragraphFormat[r]))}else a.find(">span").text(h.language.translate(h.opts.paragraphFormat.N))}}}},a.RegisterCommand("paragraphFormat",{type:"dropdown",displaySelection:function(a){return a.opts.paragraphFormatSelection},defaultSelection:function(a){return a.language.translate(a.opts.paragraphDefaultSelection)},displaySelectionWidth:80,html:function(){var a='<ul class="fr-dropdown-list" role="presentation">',t=this.opts.paragraphFormat;for(var e in t)if(t.hasOwnProperty(e)){var r=this.shortcuts.get("paragraphFormat."+e);r=r?'<span class="fr-shortcut">'+r+"</span>":"",a+='<li role="presentation"><'+("N"==e?this.html.defaultTag()||"DIV":e)+' style="padding: 0 !important; margin: 0 !important; border: 0 !important; background-color: transparent !important; '+("PRE"==e||"N"==e?"font-size: 15px":"font-weight: bold !important; ")+("H1"==e?"font-size: 2em !important; ":"")+("H2"==e?"font-size: 1.5em !important; ":"")+("H3"==e?"font-size: 1.17em !important; ":"")+("H4"==e?"font-size: 15px !important;":"")+'"  role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="paragraphFormat" data-param1="'+e+'" title="'+this.language.translate(t[e])+'">'+this.language.translate(t[e])+"</a></"+("N"==e?this.html.defaultTag()||"DIV":e)+"></li>"}return a+="</ul>"},title:"Paragraph Format",callback:function(a,t){this.paragraphFormat.apply(t)},refresh:function(a){this.paragraphFormat.refresh(a)},refreshOnShow:function(a,t){this.paragraphFormat.refreshOnShow(a,t)},plugin:"paragraphFormat"}),a.DefineIcon("paragraphFormat",{NAME:"paragraph",SVG_KEY:"paragraphFormat"})});
768},{"froala-editor":8}],20:[function(require,module,exports){
769/*!
770 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
771 * License https://froala.com/wysiwyg-editor/terms/
772 * Copyright 2014-2023 Froala Labs
773 */
774
775!function(a,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],e):e(a.FroalaEditor)}(this,function(a){"use strict";a=a&&a.hasOwnProperty("default")?a["default"]:a,Object.assign(a.DEFAULTS,{paragraphStyles:{"fr
775-text-gray":"Gray","fr-text-bordered":"Bordered","fr-text-spaced":"Spaced","fr-text-uppercase":"Uppercase"},paragraphMultipleStyles:!0}),a.PLUGINS.paragraphStyle=function(i){var p=i.$;return{_init:function a(){},apply:function c(a,e,t){void 0===e&&(e=i.opts.paragraphStyles),void 0===t&&(t=i.opts.paragraphMultipleStyles);var r="";t||((r=Object.keys(e)).splice(r.indexOf(a),1),r=r.join(" ")),i.selection.save(),i.html.wrap(!0,!0,!0,!0),i.selection.restore();var l=i.selection.blocks();i.selection.save();for(var n=p(l[0]).hasClass(a),s=0;s<l.length;s++)p(l[s]).removeClass(r).toggleClass(a,!n),p(l[s]).hasClass("fr-temp-div")&&p(l[s]).removeClass("fr-temp-div"),""===p(l[s]).attr("class")&&p(l[s]).removeAttr("class");if(1===l.length&&"fr-text-bordered"===a&&null===l[0].nextSibling){var o=p("<br>");l[0].after(o[0])}i.html.unwrap(),i.selection.restore()},refreshOnShow:function l(a,e){var t=i.selection.blocks();if(t.length){var r=p(t[0]);e.find(".fr-command").each(function(){var a=p(this).data("param1"),e=r.hasClass(a);p(this).toggleClass("fr-active",e).attr("aria-selected",e)})}}}},a.RegisterCommand("paragraphStyle",{type:"dropdown",html:function(){var a='<ul class="fr-dropdown-list" role="presentation">',e=this.opts.paragraphStyles;for(var t in e)e.hasOwnProperty(t)&&(a+='<li role="presentation"><a class="fr-command '.concat(t,'" tabIndex="-1" role="option" data-cmd="paragraphStyle" data-param1="').concat(t,'" title="').concat(this.language.translate(e[t]),'">').concat(this.language.translate(e[t]),"</a></li>"));return a+="</ul>"},title:"Paragraph Style",callback:function(a,e){this.paragraphStyle.apply(e)},refreshOnShow:function(a,e){this.paragraphStyle.refreshOnShow(a,e)},plugin:"paragraphStyle"}),a.DefineIcon("paragraphStyle",{NAME:"magic",SVG_KEY:"paragraphStyle"})});
776},{"froala-editor":8}],21:[function(require,module,exports){
777/*!
778 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
779 * License https://froala.com/wysiwyg-editor/terms/
780 * Copyright 2014-2023 Froala Labs
781 */
782
783!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(e){"use strict";(e=e&&e.hasOwnProperty("default")?e["default"]:e).PLUGINS.quote=function(r){var c=r.$;function s(e){for(;e.parentNode&&e.parentNode!=r.el;)e=e.parentNode;return e}return{apply:function t(e){r.selection.save(),r.html.wrap(!0,!0,!0,!0),r.selection.restore(),"increase"==e?function o(){var e,t=r.selection.blocks();for(e=0;e<t.length;e++)t[e]=s(t[e]);r.selection.save();var n=c(document.createElement("blockquote"));for(n.insertBefore(t[0]),e=0;e<t.length;e++)n.append(t[e]);r.opts.trackChangesEnabled&&r.track_changes.addQuote(n),r.html.unwrap(),r.selection.restore()}():"decrease"==e&&function a(){var e,t=r.opts.trackChangesEnabled,n=r.selection.blocks();for(e=0;e<n.length;e++)"BLOCKQUOTE"!=n[e].tagName&&(n[e]=t&&c(n[e]).parentsUntil(r.$el,"[data-track-id^=pending]").get(0)||c(n[e]).parentsUntil(r.$el,"BLOCKQUOTE").get(0));for(r.selection.save(),e=0;e<n.length;e++)n[e]&&(t?r.track_changes.removeQuote(c(n[e]),e):c(n[e]).replaceWith(n[e].innerHTML));r.html.unwrap(),r.selection.restore()}()}}},e.RegisterShortcut(e.KEYCODE.SINGLE_QUOTE,"quote","increase","'"),e.RegisterShortcut(e.KEYCODE.SINGLE_QUOTE,"quote","decrease","'",!0),e.RegisterCommand("quote",{title:"Quote",type:"dropdown",html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t={increase:"Increase",decrease:"Decrease"};for(var n in t)if(t.hasOwnProperty(n)){var o=this.shortcuts.get("quote.".concat(n));e+='<li role="presentation"><a class="fr-command fr-active '.concat(n,'" tabIndex="-1" role="option" data-cmd="quote" data-param1="').concat(n,'" title="').concat(t[n],'">').concat(this.language.translate(t[n])).concat(o?'<span class="fr-shortcut">'.concat(o,"</span>"):"","</a></li>")}return e+="</ul>"},callback:function(e,t){this.quote.apply(t)},plugin:"quote"}),e.DefineIcon("quote",{NAME:"quote-left",SVG_KEY:"blockquote"})});
784},{"froala-editor":8}],22:[function(require,module,exports){
785/*!
786 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
787 * License https://froala.com/wysiwyg-editor/terms/
788 * Copyright 2014-2023 Froala Labs
789 */
790
791!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(e){"use strict";e=e&&e.hasOwnProperty("default")?e["default"]:e,Object.assign(e.DEFAULTS,{saveInterval:1e4,saveURL:null,saveParams:{}
791,saveParam:"body",saveMethod:"POST"}),e.PLUGINS.save=function(i){var f=i.$,n=null,l=null,t=!1,v=1,c=2,s={};function u(e,t){i.events.trigger("save.error",[{code:e,message:s[e]},t])}function a(e){void 0===e&&(e=i.html.get());var n=e,t=i.events.trigger("save.before",[e]);if(!1===t)return!1;if("string"==typeof t&&(e=t),i.opts.saveURL){var s={};for(var a in i.opts.saveParams)if(i.opts.saveParams.hasOwnProperty(a)){var o=i.opts.saveParams[a];s[a]="function"==typeof o?o.call(this):o}var r={};r[i.opts.saveParam]=e,f(this).ajax({method:i.opts.saveMethod,url:i.opts.saveURL,data:Object.assign(r,s),crossDomain:i.opts.requestWithCORS,withCredentials:i.opts.requestWithCredentials,headers:i.opts.requestHeaders,done:function(e,t,s){l=n,i.events.trigger("save.after",[e])},fail:function(e){u(c,e.response||e.responseText)}})}else u(v)}function o(){clearTimeout(n),n=setTimeout(function(){var e=i.html.get();(l!=e||t)&&(t=!1,a(l=e))},0)}return s[v]="Missing saveURL option.",s[c]="Something went wrong during save.",{_init:function r(){if(i.opts.letteringClass)for(var e=i.opts.letteringClass,t=i.$el.find(".".concat(e)).length,s=0;s<t;s++)i.$el.find(".".concat(e))[s].innerHTML=i.$el.find(".".concat(e))[s].innerText.replace(/([\w'-]+|[?.",])/g,"<span class = 'fr-word-select'>$1</span>");i.opts.saveInterval&&(l=i.html.get(),i.events.on("contentChanged",function(){setTimeout(o,i.opts.saveInterval)}),i.events.on("keydown destroy",function(){clearTimeout(n)}))},save:a,reset:function e(){o(),t=!1},force:function d(){t=!0}}},e.DefineIcon("save",{NAME:"floppy-o",FA5NAME:"save"}),e.RegisterCommand("save",{title:"Save",undo:!1,focus:!1,refreshAfterCallback:!1,callback:function(){this.save.save()},plugin:"save"})});
792},{"froala-editor":8}],23:[function(require,module,exports){
793/*!
794 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
795 * License https://froala.com/wysiwyg-editor/terms/
796 * Copyright 2014-2023 Froala Labs
797 */
798
799!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(Ce){"use strict";Ce=Ce&&Ce.hasOwnProperty("default")?Ce["default"]:Ce,Object.assign(Ce.POPUP_TEMPLATES,{"table.insert":"[_BUTTONS_][_ROWS_COLUMNS_]","table.edit":"[_BUTTONS_]","table.colors":"[_BUTTONS_][_COLORS_][_CUSTOM_COLOR_]"}),Object.assign(Ce.DEFAULTS,{tableInsertMaxSize:10,tableEditButtons:["tableHeader","tableFooter","tableRemove","tableRows","tableColumns","tableStyle","-","tableCells","tableCellBackgroun
799d","tableCellVerticalAlign","tableCellHorizontalAlign","tableCellStyle"],tableInsertButtons:["tableBack","|"],tableResizer:!0,tableDefaultWidth:"100%",tableResizerOffset:5,tableResizingLimit:30,tableColorsButtons:["tableBack","|"],tableColors:["#61BD6D","#1ABC9C","#54ACD2","#2C82C9","#9365B8","#475577","#CCCCCC","#41A85F","#00A885","#3D8EB9","#2969B0","#553982","#28324E","#000000","#F7DA64","#FBA026","#EB6B56","#E25041","#A38F84","#EFEFEF","#FFFFFF","#FAC51C","#F37934","#D14841","#B8312F","#7C706B","#D1D5D8","REMOVE"],tableColorsStep:7,tableCellStyles:{"fr-highlighted":"Highlighted","fr-thick":"Thick"},tableStyles:{"fr-dashed-borders":"Dashed Borders","fr-alternate-rows":"Alternate Rows"},tableCellMultipleStyles:!0,tableMultipleStyles:!0,tableInsertHelper:!0,tableInsertHelperOffset:15}),Ce.PLUGINS.table=function(R){var A,f,n,r,l,o,O,y=R.$;function h(){var e=$();if(e){var t=R.popups.get("table.edit");if(t||(t=p()),t){R.popups.setContainer("table.edit",R.$sc);var a=S(e),l=a.left+(a.right-a.left)/2,n=a.bottom;R.popups.show("table.edit",l,n,a.bottom-a.top,!0),R.edit.isDisabled()&&(R.$el.removeClass("fr-no-selection"),R.edit.on(),R.button.bulkRefresh(),R.selection.setAtEnd(R.$el.find(".fr-selected-cell").last().get(0)),R.selection.restore())}}}function s(){var e=$();if(e){var t=R.popups.get("table.colors");t||(t=function o(){var e="";0<R.opts.tableColorsButtons.length&&(e='<div class="fr-buttons fr-tabs">'.concat(R.button.buildList(R.opts.tableColorsButtons),"</div>"));var t="";R.opts.colorsHEXInput&&(t='<div class="fr-color-hex-layer fr-table-colors-hex-layer fr-active fr-layer" id="fr-table-colors-hex-layer-'.concat(R.id,'"><div class="fr-input-line"><input maxlength="7" id="fr-table-colors-hex-layer-text-').concat(R.id,'" type="text" placeholder="').concat(R.language.translate("HEX Color"),'" tabIndex="1" aria-required="true"></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-submit" data-cmd="tableCellBackgroun
799dCustomColor" tabIndex="2" role="button">').concat(R.language.translate("OK"),"</button></div></div>"));var a={buttons:e,colors:function n(){for(var e='<div class="fr-color-set fr-table-colors">',t=0;t<R.opts.tableColors.length;t++)0!==t&&t%R.opts.tableColorsStep==0&&(e+="<br>"),"REMOVE"!=R.opts.tableColors[t]?e+='<span class="fr-command" style="background: '.concat(R.opts.tableColors[t],';" tabIndex="-1" role="button" data-cmd="tableCellBackgroundColor" data-param1="').concat(R.opts.tableColors[t],'"><span class="fr-sr-only">').concat(R.language.translate("Color")," ").concat(R.opts.tableColors[t],"&nbsp;&nbsp;&nbsp;</span></span>"):e+='<span class="fr-command" data-cmd="tableCellBackgroundColor" tabIndex="-1" role="button" data-param1="REMOVE" title="'.concat(R.language.translate("Clear Formatting"),'">').concat(R.icon.create("tableColorRemove"),'<span class="fr-sr-only">').concat(R.language.translate("Clear Formatting"),"</span></span>");return e+="</div>"}(),custom_color:t},l=R.popups.create("table.colors",a);return R.events.$on(R.$wp,"scroll.table-colors",function(){R.popups.isVisible("table.colors")&&s()}),function r(u){R.events.on("popup.tab",function(e){var t=y(e.currentTarget);if(!R.popups.isVisible("table.colors")||!t.is("span"))return!0;var a=e.which,l=!0;if(Ce.KEYCODE.TAB==a){var n=u.find(".fr-buttons");l=!R.accessibility.focusToolbar(n,!!e.shiftKey)}else if(Ce.KEYCODE.ARROW_UP==a||Ce.KEYCODE.ARROW_DOWN==a||Ce.KEYCODE.ARROW_LEFT==a||Ce.KEYCODE.ARROW_RIGHT==a){var r=t.parent().find("span.fr-command"),o=r.index(t),s=R.opts.colorsStep,i=Math.floor(r.length/s),f=o%s,c=Math.floor(o/s),d=c*s+f,p=i*s;Ce.KEYCODE.ARROW_UP==a?d=((d-s)%p+p)%p:Ce.KEYCODE.ARROW_DOWN==a?d=(d+s)%p:Ce.KEYCODE.ARROW_LEFT==a?d=((d-1)%p+p)%p:Ce.KEYCODE.ARROW_RIGHT==a&&(d=(d+1)%p);var h=y(r.get(d));R.events.disableBlur(),h.focus(),l=!1}else Ce.KEYCODE.ENTER==a&&(R.button.exec(t),l=!1);return!1===l&&(e.preventDefault(),e.stopPropagation()),l},!0)}(l),l}()),R.popups.setContainer("table.colors",R.$sc);var a=S(e),l=(a.left+a.right)/2,n=a.bottom;!function r(){var e=R.popups.get("table.colors"),t=R.$el.find(".fr-selected-cell").first(),a=R.helpers.RGBToHex(t.css("background-color")),l=e.find(".fr-table-colors-hex-layer input");e.find(".fr-selected-color").removeClass("fr-selected-color fr-active-item"),e.find('span[data-param1="'.concat(a,'"]')).addClass("fr-selected-color fr-active-item"),l.val(a).trigger("change")}(),R.popups.show("table.colors",l,n,a.bottom-a.top,!0)}}function i(){0===Q().length&&R.toolbar.enable()}function c(e){if(e)return R.popups.onHide("table.insert",function(){R.popups.get("table.insert").find('.fr-table-size .fr-select-table-size > span[data-row="1"][data-col="1"]').trigger("mouseover")}),!0;var t="";0<R.opts.tableInsertButtons.length&&(t='<div class="fr-buttons fr-tabs">'.concat(R.button.buildList(R.opts.tableInsertButtons),"</div>"));var a={buttons:t,rows_columns:function r(){for(var e='<div class="fr-table-size"><div class="fr-table-size-info">1 &times; 1</div><div class="fr-select-table-size">',t=1;t<=R.opts.tableInsertMaxSize;t++){for(var a=1;a<=R.opts.tableInsertMaxSize;a++){var l="inline-block";2<t&&!R.helpers.isMobile()&&(l="none");var n="fr-table-cell ";1==t&&1==a&&(n+=" hover"),e+='<span class="fr-command '.concat(n,'" tabIndex="-1" data-cmd="tableInsert" data-row="').concat(t,'" data-col="').concat(a,'" data-param1="').concat(t,'" data-param2="').concat(a,'" style="display: ').concat(l,';" role="button"><span></span><span class="fr-sr-only">').concat(t," &times; ").concat(a,"&nbsp;&nbsp;&nbsp;</span></span>")}e+='<div class="new-line"></div>'}return e+="</div></div>"}()},l=R.popups.create("table.insert",a);return R.events.$on(l,"mouseover",".fr-table-size .fr-select-table-size .fr-table-cell",function(e){d(y(e.currentTarget))},!0),function n(e){R.events.$on(e,"focus","[tabIndex]",function(e){var t=y(e.currentTarget);d(t)}),R.events.on("popup.tab",function(e){var t=y(e.currentTarget);if(!R.popups.isVisible("table.insert")||!t.is("span, a"))return!0;var a,l=e.which;if(Ce.KEYCODE.ARROW_UP==l||Ce.KEYCODE.ARROW_DOWN==l||Ce.KEYCODE.ARROW_LEFT==l||Ce.KEYCODE.ARROW_RIGHT==l){if(t.is("span.fr-table-cell")){var n=t.parent().find("span.fr-table-cell"),r=n.index(t),o=R.opts.tableInsertMaxSize,s=r%o,i=Math.floor(r/o);Ce.KEYCODE.ARROW_UP==l?i=Math.max(0,i-1):Ce.KEYCODE.ARROW_DOWN==l?i=Math.min(R.opts.tableInsertMaxSize-1,i+1):Ce.KEYCODE.ARROW_LEFT==l?s=Math.max(0,s-1):Ce.KEYCODE.ARROW_RIGHT==l&&(s=Math.min(R.opts.tableInsertMaxSize-1,s+1));var f=i*o+s,c=y(n.get(f));d(c),R.events.disableBlur(),c.focus(),a=!1}}else Ce.KEYCODE.ENTER==l&&(R.button.exec(t),a=!1);return!1===a&&(e.preventDefault(),e.stopPropagation()),a},!0)}(l),l}function d(e){var t=e.data("row");null!==t&&(t=parseInt(t));var a=e.data("col");null!==a&&(a=parseInt(a));var l=e.parent();l.siblings(".fr-table-size-info").html("".concat(t," &times; ").concat(a)),l.find("> span").removeClass("hover fr-active-item");for(var n=1;n<=R.opts.tableInsertMaxSize;n++)for(var r=0;r<=R.opts.tableInsertMaxSize;r++){var o=l.find('> span[data-row="'.concat(n,'"][data-col="').concat(r,'"]'));n<=t&&r<=a?o.addClass("hover"):n<=t+1||n<=2&&!R.helpers.isMobile()?o.css("display","inline-block"):2<n&&!R.helpers.isMobile()&&o.css("display","none")}e.addClass("fr-active-item")}function p(e){if(e)return R.popups.onHide("table.edit",i),!0;if(0<R.opts.tableEditButtons.length){var t={buttons:'<div class="fr-buttons">'.concat(R.button.buildList(R.opts.tableEditButtons),"</div>")},a=R.popups.create("table.edit",t);return R.events.$on(R.$wp,"scroll.table-edit",function(){R.popups.isVisible("table.edit")&&h()}),a}return!1}function u(){if(0<Q().length){var e=ee();R.selection.setBefore(e.get(0))||R.selection.setAfter(e.get(0)),R.selection.restore(
vendor: 17,811 bytes, line 799
799),R.popups.hide("table.edit"),R.opts.trackChangesEnabled?(R.track_changes.removedTable(e),_()):e.remove(),R.toolbar.enable()}}function g(e){var t=ee();if(0<t.length){if(0<R.$el.find("thead .fr-selected-cell").length&&"above"==e||0<R.$el.find("tfoot td.fr-selected-cell").length&&"below"==e)return;var a,l,n,r=$(),o=M(r);if(null==o)return;l="above"==e?o.min_i:o.max_i;var s="<tr>";for(a=0;a<r[l].length;a++){if("below"==e&&l<r.length-1&&r[l][a]==r[l+1][a]||"above"==e&&0<l&&r[l][a]==r[l-1][a]){if(0===a||0<a&&r[l][a]!=r[l][a-1]){var i=y(r[l][a]);i.attr("rowspan",parseInt(i.attr("rowspan"),10)+1)}}else s+='<td style="'+y(r[l][a]).attr("style")+'" ><br></td>'}s+="</tr>",n=0<R.$el.find("thead .fr-selected-cell").length&&"below"==e||0<R.$el.find("tfoot td.fr-selected-cell").length&&"above"==e?y(t.find("tbody").not(t.find("> table tbody"))):y(t.find("tr").not(t.find("> table tr")).get(l)),"below"==e?"TBODY"==n.attr("tagName")?n.prepend(s):n[0].parentNode&&n[0].insertAdjacentHTML("afterend",s):"above"==e&&("TBODY"==n.attr("tagName")?n.append(s):n.before(s),R.popups.isVisible("table.edit")&&h())}}function b(e,t,a){var l,n,r,o,s,i=0,f=$(a);if(e<(t=Math.min(t,f[0].length-1)))for(n=e;n<=t;n++)if(!(e<n&&f[0][n]==f[0][n-1])&&1<(o=Math.min(parseInt(f[0][n].getAttribute("colspan"),10)||1,t-e+1))&&f[0][n]==f[0][n+1])for(i=o-1,l=1;l<f.length;l++)if(f[l][n]!=f[l-1][n]){for(r=n;r<n+o;r++)if(f[l][r]!==undefined)if(1<(s=parseInt(f[l][r].getAttribute("colspan"),10)||1)&&f[l][r]==f[l][r+1])r+=i=Math.min(i,s-1);else if(!(i=Math.max(0,i-1)))break;if(!i)break}i&&v(f,i,"colspan",0,f.length-1,e,t)}function m(e,t,a){var l,n,r,o,s,i=0,f=$(a);if(e<(t=Math.min(t,f.length-1)))for(l=e;l<=t;l++)if(!(e<l&&f[l][0]==f[l-1][0])&&f[l][0]!==undefined&&1<(o=Math.min(parseInt(f[l][0].getAttribute("rowspan"),10)||1,t-e+1))&&f[l][0]==f[l+1][0])for(i=o-1,n=1;n<f[0].length;n++)if(f[l][n]!=f[l][n-1]){for(r=l;r<l+o;r++)if(f[r][n]!==undefined)if(1<(s=parseInt(f[r][n].getAttribute("rowspan"),10)||1)&&f[r][n]==f[r+1][n])r+=i=Math.min(i,s-1);else if(!(i=Math.max(0,i-1)))break;if(!i)break}i&&v(f,i,"rowspan",e,t,0,f[0].length-1)}function v(e,t,a,l,n,r,o){var s,i,f;for(s=l;s<=n;s++)for(i=r;i<=o;i++)l<s&&e[s][i]==e[s-1][i]||r<i&&e[s][i]==e[s][i-1]||e[s][i]!==undefined&&1<(f=parseInt(e[s][i].getAttribute(a),10)||1)&&(1<f-t?e[s][i].setAttribute(a,f-t):e[s][i].removeAttribute(a))}function w(e,t,a,l,n){m(e,t,n),b(a,l,n)}function t(e){var t=R.$el.find(".fr-selected-cell");"REMOVE"!=e?t.css("background-color",R.helpers.HEXtoRGB(e)):t.css("background-color",""),h()}function C(e){e.style.removeProperty("border"),e.style.removeProperty("border-top"),e.style.removeProperty("border-bottom"),e.style.removeProperty("border-left"),e.style.removeProperty("border-right")}function $(e){var f=[];if(null==(e=e||null)&&0<Q().length&&(e=ee()),e){if(!e.find("tr").html().match(/xl[0-9]+/gi))for(var t=e.find("tr:empty"),a=t.length-1;0<=a;a--)y(t[a]).remove();e.findVisible("tr").not(e.find("> table tr")).each(function(s,e){var t=y(e),i=0;t.find("> th, > td").each(function(e,t){for(var a=y(t),l=parseInt(a.attr("colspan"),10)||1,n=parseInt(a.attr("rowspan"),10)||1,r=s;r<s+n;r++)for(var o=i;o<i+l;o++)f[r]||(f[r]=[]),f[r][o]?i++:f[r][o]=t;i+=l})})}return f}function D(e,t){for(var a=0;a<t.length;a++)for(var l=0;l<t[a].length;l++)if(t[a][l]==e)return{row:a,col:l}}function x(e,t,a){for(var l=e+1,n=t+1;l<a.length;){if(a[l][t]!=a[e][t]){l--;break}l++}for(l==a.length&&l--;n<a[e].length;){if(a[e][n]!=a[e][t]){n--;break}n++}return n==a[e].length&&n--,{row:l,col:n}}function E(){R.el.querySelector(".fr-cell-fixed")&&R.el.querySelector(".fr-cell-fixed").classList.remove("fr-cell-fixed"),R.el.querySelector(".fr-cell-handler")&&R.el.querySelector(".fr-cell-handler").classList.remove("fr-cell-handler")}function _(){var e=R.$el.find(".fr-selected-cell");0<e.length&&e.each(function(){var e=y(this);e.removeClass("fr-selected-cell"),""===e.attr("class")&&e.removeAttr("class")}),E()}function T(){R.events.disableBlur(),R.selection.clear(),R.$el.addClass("fr-no-selection"),R.$el.blur(),R.events.enableBlur()}function M(e){var t=R.$el.find(".fr-selected-cell");if(0<t.length){var a,l=e.length,n=0,r=e[0].length,o=0;for(a=0;a<t.length;a++){var s=D(t[a],e),i=x(s.row,s.col,e);l=Math.min(s.row,l),n=Math.max(i.row,n),r=Math.min(s.col,r),o=Math.max(i.col,o)}return{min_i:l,max_i:n,min_j:r,max_j:o}}return null}function S(e){var t=M(e);if(null!=t){var a=y(e[t.min_i][t.min_j]),l=y(e[t.min_i][t.max_j]),n=y(e[t.max_i][t.min_j]);return{left:a.length&&a.offset().left,right:l.length&&l.offset().left+l.outerWidth(),top:a.length&&a.offset().top,bottom:n.length&&n.offset().top+n.outerHeight()}}}function N(e,t){if(y(e).is(t))_(),y(e).addClass("fr-selected-cell");else{T(),R.edit.off();var a=$(),l=D(e,a),n=D(t,a);if(!l||!n)return;var r=function h(e,t,a,l,n){var r,o,s,i,f=e,c=t,d=a,p=l;for(r=f;r<=c;r++)(1<(parseInt(y(n[r][d]).attr("rowspan"),10)||1)||1<(parseInt(y(n[r][d]).attr("colspan"),10)||1))&&(i=x((s=D(n[r][d],n)).row,s.col,n),f=Math.min(s.row,f),c=Math.max(i.row,c),d=Math.min(s.col,d),p=Math.max(i.col,p)),(1<(parseInt(y(n[r][p]).attr("rowspan"),10)||1)||1<(parseInt(y(n[r][p]).attr("colspan"),10)||1))&&(i=x((s=D(n[r][p],n)).row,s.col,n),f=Math.min(s.row,f),c=Math.max(i.row,c),d=Math.min(s.col,d),p=Math.max(i.col,p));for(o=d;o<=p;o++)(1<(parseInt(y(n[f][o]).attr("rowspan"),10)||1)||1<(parseInt(y(n[f][o]).attr("colspan"),10)||1))&&(i=x((s=D(n[f][o],n)).row,s.col,n),f=Math.min(s.row,f),c=Math.max(i.row,c),d=Math.min(s.col,d),p=Math.max(i.col,p)),(1<(parseInt(y(n[c][o]).attr("rowspan"),10)||1)||1<(parseInt(y(n[c][o]).attr("colspan"),10)||1))&&(i=x((s=D(n[c][o],n)).row,s.col,n),f=Math.min(s.row,f),c=Math.max(i.row,c),d=Math.min(s.col,d),p=Math.max(i.col,p));return f==e&&c==t&&d==a&&p==l?{min_i:e,max_i:t,min_j:a,max_j:l}:h(f,c,d,p,n)}(Math.min(l.row,n.row),Math.max(l.row,n.row),Math.min(l.col,n.col),Math.max(l.col,n.col),a);_(),e.classList.add("fr-cell-fixed"),t.classList.add("fr-cell-handler");for(var o=r.min_i;o<=r.max_i;o++)for(var s=r.min_j;s<=r.max_j;s++)y(e).closest("table").is(y(a[o][s]).closest("table"))&&y(a[o][s]).addClass("fr-selected-cell")}}function I(e){var t=null,a=y(e.target);return"TD"==e.target.tagName||"TH"==e.target.tagName?t=e.target:0<a.closest("th",a.closest("thead")[0]).length?t=a.closest("th",a.closest("thead")[0]).get(0):0<a.closest("td",a.closest("tr")[0]).length&&(t=a.closest("td",a.closest("tr")[0]).get(0)),-1===R.$el.html.toString().search(t)?null:t}function K(){_(),R.popups.hide("table.edit")}function e(e){var t=I(e);if("false"==y(t).parents("[contenteditable]").not(".fr-element").not(".fr-img-caption").not("body").first().attr("contenteditable"))return!0;if(0<Q().length&&!t&&K(),!R.edit.isDisabled()||R.popups.isVisible("table.edit"))if(1!=e.which||1==e.which&&R.helpers.isMac()&&e.ctrlKey)(3==e.which||1==e.which&&R.helpers.isMac()&&e.ctrlKey)&&t&&K();else if(r=!0,t){0<Q().length&&!e.shiftKey&&K(),e.stopPropagation(),R.events.trigger("image.hideResizer"),R.events.trigger("video.hideResizer"),n=!0;var a=t.tagName.toLowerCase();e.shiftKey&&0<R.$el.find("".concat(a,".fr-selected-cell")).length?y(R.$el.find("".concat(a,".fr-selected-cell")).closest("table")).is(y(t).closest("table"))?N(l,t):T():((R.keys.ctrlKey(e)||e.shiftKey)&&"TD"===e.currentTarget.tagName&&(1<Q().length||0===y(t).find(R.selection.element()).length&&!y(t).is(R.selection.element()))&&T(),l=t,0<R.opts.tableEditButtons.length&&N(l,l))}}function a(e){if(!R.edit.isDisabled()&&R.popups.areVisible())return!0;var t=I(e);if(1===Q().length&&null===t&&(R.toolbar.enable(),_()),(1===Q().length&&t&&"TD"!==t.tagName&&"TH"!==t.tagName||!n&&!R.$tb.is(e.target)&&!R.$tb.is(y(e.target).closest(".fr-toolbar")))&&(R.toolbar.enable(),_()),("BODY"===e.target.tagName||"HTML"===e.target.tagName)&&!t&&0<Q().length&&R.toolbar.enable(),!(1!=e.which||1==e.which&&R.helpers.isMac()&&e.ctrlKey)){if(r=!1,n)n=!1,I(e)||1!=Q().length?0<Q().length?R.selection.isCollapsed()?(h(),R.toolbar.enable()):(_(),R.edit.on()):Q().length||(R.$el.removeClass("fr-no-selection"),R.edit.on()):_();if(O){O=!1,A.removeClass("fr-moving"),R.$el.removeClass("fr-no-selection"),R.edit.on();var a=parseFloat(A.css("left"))+R.opts.tableResizerOffset+R.$wp.offset().left;R.opts.iframe&&(a-=R.$iframe.offset().left),A.data("release-position",a),A.removeData("max-left"),A.removeData("max-right"),function C(){var e=A.data("origin"),t=A.data("release-position");if(e!==t){var a=A.data("first"),l=A.data("second"),n=A.data("table"),r=n.outerWidth();if(R.undo.canDo()||R.undo.saveStep(),null!=a&&null!=l){var o,s,i,f=$(n),c=[],d=[],p=[],h=[];for(o=0;o<f.length;o++)s=y(f[o][a]),i=y(f[o][l]),c[o]=s.outerWidth(),p[o]=i.outerWidth(),d[o]=c[o]/r*100,h[o]=p[o]/r*100;for(o=0;o<f.length;o++)if(s=y(f[o][a]),i=y(f[o][l]),f[o][a]!=f[o][l]){var u=(d[o]*(c[o]+t-e)/c[o]).toFixed(4);s.css("width",u+"%"),i.css("width",(d[o]+h[o]-u).toFixed(4)+"%")}}else{var g,b=n.parent(),m=r/b.width()*100,v=(parseInt(n.css("margin-left"),10)||0)/b.width()*100,w=(parseInt(n.css("margin-right"),10)||0)/b.width()*100;"rtl"==R.opts.direction&&0===l||"rtl"!=R.opts.direction&&0!==l?(g=(r+t-e)/r*m,n.css("margin-right","calc(100% - ".concat(Math.round(g).toFixed(4),"% - ").concat(Math.round(v).toFixed(4),"%)"))):("rtl"==R.opts.direction&&0!==l||"rtl"!=R.opts.direction&&0===l)&&(g=(r-t+e)/r*m,n.css("margin-left","calc(100% - ".concat(Math.round(g).toFixed(4),"% - ").concat(Math.round(w).toFixed(4),"%)"))),n.css("width","".concat(Math.round(g).toFixed(4),"%"))}R.selection.restore(),R.undo.saveStep(),R.events.trigger("table.resized",[n.get(0)])}A.removeData("origin"),A.removeData("release-position"),A.removeData("first"),A.removeData("second"),A.removeData("table")}(),z()}}}function k(e){if(!(y(e.currentTarget).is(y(e.originalEvent.relatedTarget))||e.currentTarget.contains(e.originalEvent.relatedTarget)||e.originalEvent.relatedTarget&&e.originalEvent.relatedTarget.contains(e.currentTarget))&&(R.events.$on(y("input"),"click",te),!0===n&&0<R.opts.tableEditButtons.length)){if(y(e.currentTarget).closest("table").is(ee())){if("TBODY"===e.currentTarget.parentElement.parentElement.tagName&&"TD"==e.currentTarget.tagName&&0===R.$el.find("th.fr-selected-cell").length&&0===R.$el.find("tfoot td.fr-selected-cell").length)return void N(l,e.currentTarget);if("TFOOT"===e.currentTarget.parentElement.parentElement.tagName&&"TD"==e.currentTarget.tagName&&0===R.$el.find("tbody td.fr-selected-cell").length)return void N(l,e.currentTarget);if("TH"==e.currentTarget.tagName&&0===R.$el.find("td.fr-selected-cell").length)return void N(l,e.currentTarget)}"TD"!==e.currentTarget.tagName&&"TH"!==e.currentTarget.tagName&&T()}}function B(e,t,a,l){for(var n,r=t;r!=R.el&&"TD"!=r.tagName&&"TH"!=r.tagName&&("up"==l?n=r.previousElementSibling:"down"==l&&(n=r.nextElementSibling),!n);)r=r.parentNode;"TD"==r.tagName||"TH"==r.tagName?function o(e,t){for(var a=e;a&&"TABLE"!=a.tagName&&a.parentNode!=R.el;)a=a.parentNode;if(a&&"TABLE"==a.tagName){var l=$(y(a));"up"==t?Y(D(e,l),a,l):"down"==t&&F(D(e,l),a,l)}}(r,l):n&&("up"==l&&R.selection.setAtEnd(n),"down"==l&&R.selection.setAtStart(n))}function Y(e,t,a){0<y(".tribute-container").length&&"none"!=y(".tribute-container").css("display")||(0<e.row?R.selection.setAtEnd(a[e.row-1][e.col]):B(0,t,0,"up"))}function F(e,t,a){if(!(0<y(".tribute-container").length&&"none"!=y(".tribute-container").css("display"))){var l=parseInt(a[e.row][e.col].getAttribute("rowspan"),10)||1;e.row<a.length-l?R.selection.setAtStart(a[e.row+l][e.col]):B(0,t,0,"down")}}function z(){A&&(A.find("div").css("opacity",0),A.css("top",0),A.css("left",0),A.css("height",0),A.find("div").css("height",0),A.hide())}function W(){f&&f.removeClass("fr-visible").css("left","-9999px")}function L(e,t){var a=y(t),l=a.closest("table"),n=l.parent();if(t&&"TD"!=t.tagName&&"TH"!=t.tagName&&(0<a.closest("td").length?t=a.closest("td"):0<a.closest("th").length&&(t=a.closest("th"))),!t||"TD"!=t.tagName&&"TH"!=t.tagName)A&&a.get(0)!=A.get(0)&&a.parent().get(0)!=A.get(0)&&R.core.sameInstance(A)&&z();else{if(a=y(t),0===R.$el.find(a).length)return!1;var r=a.offset().left-1,o=r+a.outerWidth();if(Math.abs(e.pageX-r)<=R.opts.tableResizerOffset||Math.abs(o-e.pageX)<=R.opts.tableResizerOffset){var s,i,f,c,d,p=$(l),h=D(t,p),u=x(h.row,h.col,p),g=l.offset().top,b=l.outerHeight()-1;"rtl"!=R.opts.direction?e.pageX-r<=R.opts.tableResizerOffset?(f=r,0<h.col?(c=r-G(h.col-1,p)+R.opts.tableResizingLimit,d=r+G(h.col,p)-R.opts.tableResizingLimit,s=h.col-1,i=h.col):(s=null,i=0,c=l.offset().left-1-parseInt(l.css("margin-left"),10),d=l.offset().left-1+l.width()-p[0].length*R.opts.tableResizingLimit)):o-e.pageX<=R.opts.tableResizerOffset&&(f=o,u.col<p[u.row].length&&p[u.row][u.col+1]?(c=o-G(u.col,p)+R.opts.tableResizingLimit,d=o+G(u.col+1,p)-R.opts.tableResizingLimit,s=u.col,i=u.col+1):(s=u.col,i=null,c=l.offset().left-1+p[0].length*R.opts.tableResizingLimit,d=n.offset().left-1+n.width()+parseFloat(n.css("padding-left")))):o-e.pageX<=R.opts.tableResizerOffset?(f=o,0<h.col?(c=o-G(h.col,p)+R.opts.tableResizingLimit,d=o+G(h.col-1,p)-R.opts.tableResizingLimit,s=h.col,i=h.col-1):(s=null,i=0,c=l.offset().left+p[0].length*R.opts.tableResizingLimit,d=n.offset().left-1+n.width()+parseFloat(n.css("padding-left")))):e.pageX-r<=R.opts.tableResizerOffset&&(f=r,u.col<p[u.row].length&&p[u.row][u.col+1]?(c=r-G(u.col+1,p)+R.opts.tableResizingLimit,d=r+G(u.col,p)-R.opts.tableResizingLimit,s=u.col+1,i=u.col):(s=u.col,i=null,c=n.offset().left+parseFloat(n.css("padding-left")),d=l.offset().left-1+l.width()-p[0].length*R.opts.tableResizingLimit)),A||function E(){R.shared.$table_resizer||(R.shared.$table_resizer=y(document.createElement("div")).attr("class","fr-table-resizer").html("<div></div>")),A=R.shared.$table_resizer,R.events.$on(A,"mousedown",function(e){return!R.core.sameInstance(A)||(0<Q().length&&K(),1==e.which?(R.selection.save(),O=!0,A.addClass("fr-moving"),T(),R.edit.off(),A.find("div").css("opacity",1),!1):void 0)}),R.events.$on(A,"mousemove",function(e){if(!R.core.sameInstance(A))return!0;O&&(R.opts.iframe&&(e.pageX-=R.$iframe.offset().left),U(e))}),R.events.on("shared.destroy",function(){A.html("").removeData().remove(),A=null},!0),R.events.on("destroy",function(){R.$el.find(".fr-selected-cell").removeClass("fr-selected-cell"),y("body").first().append(A.hide())},!0)}(),A.data("table",l),A.data("first",s),A.data("second",i),A.data("instance",R),R.$wp.append(A);var m=f-R.win.pageXOffset-R.opts.tableResizerOffset-R.$wp.offset().left,v=g-R.$wp.offset().top+R.$wp.scrollTop();if(R.opts.iframe){var w=R.helpers.getPX(R.$wp.find(".fr-iframe").css("padding-top")),C=R.helpers.getPX(R.$wp.find(".fr-iframe").css("padding-left"));m+=R.$iframe.offset().left+C,v+=R.$iframe.offset().top+w,c+=R.$iframe.offset().left,d+=R.$iframe.offset().left}A.data("max-left",c),A.data("max-right",d),A.data("origin",f-R.win.pageXOffset),A.css("top",v),A.css("left",m),A.css("height",b),A.find("div").css("height",b),A.css("padding-left",R.opts.tableResizerOffset),A.css("padding-right",R.opts.tableResizerOffset),A.show()}else R.core.sameInstance(A)&&z()}}function H(e,t){if(R.$box.find(".fr-line-breaker").isVisible())return!1;f||J(),R.$box.append(f),f.data("instance",R);var a,l=y(t).find("tr").first(),n=e.pageX,r=0,o=0;if(R.opts.iframe){var s=R.helpers.getPX(R.$wp.find(".fr-iframe").css("padding-top")),i=R.helpers.getPX(R.$wp.find(".fr-iframe").css("padding-left"));r+=R.$iframe.offset().left-R.helpers.scrollLeft()+i,o+=R.$iframe.offset().top-R.helpers.scrollTop()+s}l.find("th, td").each(function(){var e=y(this);return e.offset().left<=n&&n<e.offset().left+e.outerWidth()/2?(a=parseInt(f.find("a").css("width"),10),f.css("top",o+e.offset().top-R.$box.offset().top-a-5),f.css("left",r+e.offset().left-R.$box.offset().left-a/2),f.data("selected-cell",e),f.data("position","before"),f.addClass("fr-visible"),!1):e.offset().left+e.outerWidth()/2<=n&&n<e.offset().left+e.outerWidth()?(a=parseInt(f.find("a").css("width"),10),f.css("top",o+e.offset().top-R.$box.offset().top-a-5),f.css("left",r+e.offset().left-R.$box.offset().left+e.outerWidth()-a/2),f.data("selected-cell",e),f.data("position","after"),f.addClass("fr-visible"),!1):void 0})}function P(e,t){if(R.$box.find(".fr-line-breaker").isVisible())return!1;f||J(),R.$box.append(f),f.data("instance",R);var a,l=y(t),n=e.pageY,r=0,o=0;if(R.opts.iframe){var s=R.helpers.getPX(R.$wp.find(".fr-iframe").css("padding-top")),i=R.helpers.getPX(R.$wp.find(".fr-iframe").css("padding-left"));r+=R.$iframe.offset().left-R.helpers.scrollLeft()+i,o+=R.$iframe.offset().top-R.helpers.scrollTop()+s}l.find("tr").each(function(){var e=y(this);a=parseInt(f.find("a").css("width"),10);var t=r+e.offset().left-R.$box.offset().left;return t=0!==R.$box.offset().left?t-a-5:t+a-5,e.offset().top<=n&&n<e.offset().top+e.outerHeight()/2?(f.css("top",o+e.offset().top-R.$box.offset().top-a/2),f.css("left",t),f.data("selected-cell",e.find("td").first()),f.data("position","above"),f.addClass("fr-visible"),!1):e.offset().top+e.outerHeight()/2<=n&&n<e.offset().top+e.outerHeight()?(f.css("top",o+e.offset().top-R.$box.offset().top+e.outerHeight()-a/2),f.css("left",t),f.data("selected-cell",e.find("td").first()),f.data("position","below"),f.addClass("fr-visible"),!1):void 0})}function V(e){o=null;var t=R.doc.elementFromPoint(e.pageX-R.win.pageXOffset,e.pageY-R.win.pageYOffset);R.opts.tableResizer&&(!R.popups.areVisible()||R.popups.areVisible()&&R.popups.isVisible("table.edit"))&&L(e,t),!R.opts.tableInsertHelper||R.popups.areVisible()||R.$tb.hasClass("fr-inline")&&R.$tb.isVisible()||function r(e,t){if(0===Q().length){var a,l,n;if(t&&("HTML"==t.tagName||"BODY"==t.tagName||R.node.isElement(t)))for(a=1;a<=R.opts.tableInsertHelperOffset;a++){if(l=R.doc.elementFromPoint(e.pageX-R.win.pageXOffset,e.pageY-R.win.pageYOffset+a),y(l).hasClass("fr-tooltip"))return!0;
vendor: 13,848 bytes, line 799
799if(l&&("TH"==l.tagName||"TD"==l.tagName||"TABLE"==l.tagName)&&(y(l).parents(".fr-wrapper").length||R.opts.iframe)&&"false"!=y(l).closest("table").attr("contenteditable"))return H(e,y(l).closest("table")),!0;if(n=R.doc.elementFromPoint(e.pageX-R.win.pageXOffset+a,e.pageY-R.win.pageYOffset),y(n).hasClass("fr-tooltip"))return!0;if(n&&("TH"==n.tagName||"TD"==n.tagName||"TABLE"==n.tagName)&&(y(n).parents(".fr-wrapper").length||R.opts.iframe)&&"false"!=y(n).closest("table").attr("contenteditable"))return P(e,y(n).closest("table")),!0}R.core.sameInstance(f)&&W()}}(e,t)}function j(){if(O){var e=A.data("table").offset().top-R.win.pageYOffset;if(R.opts.iframe){var t=R.helpers.getPX(R.$wp.find(".fr-iframe").css("padding-top"));e+=R.$iframe.offset().top-R.helpers.scrollTop()+t}A.css("top",e)}}function G(e,t){var a,l=y(t[0][e]).outerWidth();for(a=1;a<t.length;a++)l=Math.min(l,y(t[a][e]).outerWidth());return l}function X(e,t,a){var l,n=0;for(l=e;l<=t;l++)n+=G(l,a);return n}function U(e){if(1<Q().length&&r&&T(),!1===r&&!1===n&&!1===O)o&&clearTimeout(o),R.edit.isDisabled()&&!R.popups.isVisible("table.edit")||(o=setTimeout(V,30,e));else if(O){var t=e.pageX-R.win.pageXOffset;R.opts.iframe&&(t+=R.$iframe.offset().left);var a=A.data("max-left"),l=A.data("max-right");a<=t&&t<=l?A.css("left",t-R.opts.tableResizerOffset-R.$wp.offset().left):t<a&&parseFloat(A.css("left"),10)>a-R.opts.tableResizerOffset?A.css("left",a-R.opts.tableResizerOffset-R.$wp.offset().left):l<t&&parseFloat(A.css("left"),10)<l-R.opts.tableResizerOffset&&A.css("left",l-R.opts.tableResizerOffset-R.$wp.offset().left)}else r&&W()}function q(e){R.node.isEmpty(e.get(0))?e.prepend(Ce.MARKERS):e.prepend(Ce.START_MARKER).append(Ce.END_MARKER)}function J(){R.shared.$ti_helper||(R.shared.$ti_helper=y(document.createElement("div")).attr("class","fr-insert-helper").html('<a class="fr-floating-btn" role="button" tabIndex="-1" title="'.concat(R.language.translate("Insert"),'"><svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><path d="M22,16.75 L16.75,16.75 L16.75,22 L15.25,22.000 L15.25,16.75 L10,16.75 L10,15.25 L15.25,15.25 L15.25,10 L16.75,10 L16.75,15.25 L22,15.25 L22,16.75 Z"/></svg></a>')),R.events.bindClick(R.shared.$ti_helper,"a",function(){var e=f.data("selected-cell"),t=f.data("position"),a=f.data("instance")||R;"before"==t?(R.undo.saveStep(),e.addClass("fr-selected-cell"),a.table.insertColumn(t),e.removeClass("fr-selected-cell"),R.undo.saveStep()):"after"==t?(R.undo.saveStep(),e.addClass("fr-selected-cell"),a.table.insertColumn(t),e.removeClass("fr-selected-cell"),R.undo.saveStep()):"above"==t?(R.undo.saveStep(),e.addClass("fr-selected-cell"),a.table.insertRow(t),e.removeClass("fr-selected-cell"),R.undo.saveStep()):"below"==t&&(R.undo.saveStep(),e.addClass("fr-selected-cell"),a.table.insertRow(t),e.removeClass("fr-selected-cell"),R.undo.saveStep()),W()}),R.events.on("shared.destroy",function(){R.shared.$ti_helper.html("").removeData().remove(),R.shared.$ti_helper=null},!0),R.events.$on(R.shared.$ti_helper,"mousemove",function(e){e.stopPropagation()},!0),R.events.$on(y(R.o_win),"scroll",function(){W()},!0),R.events.$on(R.$wp,"scroll",function(){W()},!0)),f=R.shared.$ti_helper,R.events.on("destroy",function(){f=null}),R.tooltip.bind(R.$box,".fr-insert-helper > a.fr-floating-btn")}function Z(){l=null,clearTimeout(o)}function Q(){return R.el.querySelectorAll(".fr-selected-cell")}function ee(){var e=Q();if(e.length){for(var t=e[0];t&&"TABLE"!=t.tagName&&t.parentNode!=R.el;)t=t.parentNode;return t&&"TABLE"==t.tagName?y(t):y([])}return y([])}function te(e){n=!1}return{_init:function ae(){if(!R.$wp)return!1;if(R.helpers.isMobile()&&(R.events.$on(R.$el,"mousedown",e),R.events.$on(R.$win,"mouseup",a)),!R.helpers.isMobile()){O=n=r=!1,R.events.$on(R.$el,"mousedown",e),R.popups.onShow("image.edit",function(){_(),n=r=!1}),R.popups.onShow("link.edit",function(){_(),n=r=!1}),R.events.on("commands.mousedown",function(e){0<e.parents(".fr-toolbar").length&&_()}),R.events.$on(R.$el,"mouseover","th, td",k),R.events.$on(R.$win,"mouseup",a),R.opts.iframe&&R.events.$on(y(R.o_win),"mouseup",a),R.events.$on(R.$win,"mousemove",U),R.events.$on(y(R.o_win),"scroll",j),R.events.on("contentChanged",function(){0<Q().length&&(h(),R.$el.find("img").on("load.selected-cells",function(){y(this).off("load.selected-cells"),0<Q().length&&h()}))}),R.events.$on(y(R.o_win),"resize",function(){_()}),R.events.on("toolbar.esc",function(){if(0<Q().length)return R.events.disableBlur(),R.events.focus(),!1},!0),R.events.$on(y(R.o_win),"keydown",function(){r&&n&&(n=r=!1,R.$el.removeClass("fr-no-selection"),R.edit.on(),R.selection.setAtEnd(R.$el.find(".fr-selected-cell").last().get(0)),R.selection.restore(),_())}),R.events.$on(R.$el,"keydown",function(e){e.shiftKey?!1===function o(e){var t=Q();if(null!=t&&0<t.length){var a,l=$(),n=e.which,r=D(1==t.length?a=t[0]:(a=R.el.querySelector(".fr-cell-fixed"),R.el.querySelector(".fr-cell-handler")),l);if(Ce.KEYCODE.ARROW_RIGHT==n){if(r.col<l[0].length-1)return N(a,l[r.row][r.col+1]),!1}else if(Ce.KEYCODE.ARROW_DOWN==n){if(r.row<l.length-1)return N(a,l[r.row+1][r.col]),!1}else if(Ce.KEYCODE.ARROW_LEFT==n){if(0<r.col)return N(a,l[r.row][r.col-1]),!1}else if(Ce.KEYCODE.ARROW_UP==n&&0<r.row)return N(a,l[r.row-1][r.col]),!1}}(e)&&setTimeout(function(){h()},0):function s(e){var t=e.which,a=R.selection.blocks();if(a.length&&("P"!==(a=a[0]).tagName&&"DIV"!==a.tagName||(a=a.parentNode),"TD"==a.tagName||"TH"==a.tagName)){for(var l=a;l&&"TABLE"!=l.tagName&&l.parentNode!=R.el;)l=l.parentNode;if(l&&"TABLE"==l.tagName&&(Ce.KEYCODE.ARROW_LEFT==t||Ce.KEYCODE.ARROW_UP==t||Ce.KEYCODE.ARROW_RIGHT==t||Ce.KEYCODE.ARROW_DOWN==t)&&(0<Q().length&&K(),R.browser.webkit&&(Ce.KEYCODE.ARROW_UP==t||Ce.KEYCODE.ARROW_DOWN==t))){var n=R.selection.ranges(0).startContainer;if(n.nodeType==Node.TEXT_NODE&&(Ce.KEYCODE.ARROW_UP==t&&(n.previousSibling&&"BR"!==n.previousSibling.tagName||n.previousSibling&&"BR"===n.previousSibling.tagName&&n.previousSibling.previousSibling)||Ce.KEYCODE.ARROW_DOWN==t&&(n.nextSibling&&"BR"!==n.nextSibling.tagName||n.nextSibling&&"BR"===n.nextSibling.tagName&&n.nextSibling.nextSibling)))return;e.preventDefault(),e.stopPropagation();var r=$(y(l)),o=D(a,r);return Ce.KEYCODE.ARROW_UP==t?Y(o,l,r):Ce.KEYCODE.ARROW_DOWN==t&&F(o,l,r),R.selection.restore(),!1}}}(e)}),R.events.on("keydown",function(e){if(!1===function l(e){if(e.which==Ce.KEYCODE.TAB){var t;if(0<Q().length)t=R.$el.find(".fr-selected-cell").last();else{var a=R.selection.element();"TD"==a.tagName||"TH"==a.tagName?t=y(a):a!=R.el&&(0<y(a).parentsUntil(R.$el,"td").length?t=y(a).parents("td").first():0<y(a).parentsUntil(R.$el,"th").length&&(t=y(a).parents("th").first()))}if(t)return e.preventDefault(),!!(0===R.selection.get().focusOffset&&0<y(R.selection.element()).parentsUntil(R.$el,"ol, ul").length&&(0<y(R.selection.element()).closest("li").prev().length||y(R.selection.element()).is("li")&&0<y(R.selection.element()).prev().length))||(K(),e.shiftKey?0<t.prev().length?q(t.prev()):0<t.closest("tr").length&&0<t.closest("tr").prev().length?q(t.closest("tr").prev().find("td").last()):0<t.closest("tbody").length&&0<t.closest("table").find("thead tr").length&&q(t.closest("table").find("thead tr th").last()):0<t.next().length?q(t.next()):0<t.closest("tr").length&&0<t.closest("tr").next().length?q(t.closest("tr").next().find("td").first()):0<t.closest("thead").length&&0<t.closest("table").find("tbody tr").length?q(t.closest("table").find("tbody tr td").first()):(t.addClass("fr-selected-cell"),g("below"),_(),q(t.closest("tr").next().find("td").first())),R.selection.restore(),!1)}}(e))return!1;var t=Q();if(0<t.length){if(0<t.length&&R.keys.ctrlKey(e)&&e.which==Ce.KEYCODE.A)return _(),R.popups.isVisible("table.edit")&&R.popups.hide("table.edit"),t=[],!0;if(e.which==Ce.KEYCODE.ESC&&R.popups.isVisible("table.edit"))return _(),R.popups.hide("table.edit"),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),!(t=[]);if(1<t.length&&(e.which==Ce.KEYCODE.BACKSPACE||e.which==Ce.KEYCODE.DELETE)){R.undo.saveStep();for(var a=0;a<t.length;a++)y(t[a]).html("<br>"),a==t.length-1&&y(t[a]).prepend(Ce.MARKERS);return R.selection.restore(),R.undo.saveStep(),!(t=[])}if(1<t.length&&e.which!=Ce.KEYCODE.F10&&!R.keys.isBrowserAction(e))return e.preventDefault(),!(t=[])}else if(!(t=[])===function n(e){if(e.altKey&&e.which==Ce.KEYCODE.SPACE){var t,a=R.selection.element();if("TD"==a.tagName||"TH"==a.tagName?t=a:0<y(a).closest("td").length?t=y(a).closest("td").get(0):0<y(a).closest("th").length&&(t=y(a).closest("th").get(0)),t)return e.preventDefault(),N(t,t),h(),!1}}(e))return!1},!0);var t=[];R.events.on("html.beforeGet",function(){t=Q();for(var e=0;e<t.length;e++)t[e].className=(t[e].className||"").replace(/fr-selected-cell/g,"")}),R.events.on("html.afterGet",function(){for(var e=0;e<t.length;e++)t[e].className=(t[e].className?t[e].className.trim()+" ":"")+"fr-selected-cell";t=[]}),c(!0),p(!0)}R.events.on("destroy",Z)},insert:function le(e,t){var a,l,n="<table "+(R.opts.tableDefaultWidth?'style="width: '+R.opts.tableDefaultWidth+';" ':"")+'class="fr-inserted-table"><tbody>',r=100/t;for(a=0;a<e;a++){for(n+="<tr>",l=0;l<t;l++)n+="<td"+(R.opts.tableDefaultWidth?' style="width: '+r.toFixed(4)+'%;"':"")+">",0===a&&0===l&&(n+=Ce.MARKERS),n+="<br></td>";n+="</tr>"}if(n+="</tbody></table>",R.opts.trackChangesEnabled){R.edit.on(),R.events.focus(!0),R.selection.restore(),R.undo.saveStep(),R.markers.insert(),R.html.wrap();var o=R.$el.find(".fr-marker");R.node.isLastSibling(o)&&o.parent().hasClass("fr-deletable")&&o.insertAfter(o.parent()),o.replaceWith(n),R.selection.clear()}else R.html.insert(n);R.selection.restore();var s=R.$el.find(".fr-inserted-table");s.removeClass("fr-inserted-table"),R.events.trigger("table.inserted",[s.get(0)])},remove:u,insertRow:g,deleteRow:function ne(){var e=ee();if(0<e.length){var t,a,l,n=$(),r=M(n);if(null==r)return;if(0===r.min_i&&r.max_i==n.length-1)u();else{for(t=r.max_i;t>=r.min_i;t--){for(l=y(e.find("tr").not(e.find("> table tr")).get(t)),a=0;a<n[t].length;a++)if(0===a||n[t][a]!=n[t][a-1]){var o=y(n[t][a]);if(1<parseInt(o.attr("rowspan"),10)){var s=parseInt(o.attr("rowspan"),10)-1;1==s?o.removeAttr("rowspan"):o.attr("rowspan",s)}if(t<n.length-1&&n[t][a]==n[t+1][a]&&(0===t||n[t][a]!=n[t-1][a])){for(var i=n[t][a],f=a;0<f&&n[t][f]==n[t][f-1];)f--;0===f?y(e.find("tr").not(e.find("> table tr")).get(t+1)).prepend(i):y(n[t+1][f-1])[0].parentNode&&y(n[t+1][f-1])[0].insertAdjacentElement("afterend",i)}}var c=l.parent();l.remove(),0===c.find("tr").length&&c.remove(),n=$(e)}w(0,n.length-1,0,n[0].length-1,e),0<r.min_i?R.selection.setAtEnd(n[r.min_i-1][0]):R.selection.setAtEnd(n[0][0]),R.selection.restore(),R.popups.hide("table.edit")}}},insertColumn:function re(i){var e=ee();if(0<e.length){var f,c=$(),t=M(c);f="before"==i?t.min_j:t.max_j;var a,d=100/c[0].length,p=100/(c[0].length+1);e.find("th, td").each(function(){(a=y(this)).data("old-width",a.outerWidth()/e.outerWidth()*100)}),e.find("tr").not(e.find("> table tr")).each(function(e){for(var t,a=y(this),l=0,n=0;l-1<f;){if(!(t=a.find("> th, > td").get(n))){t=null;break}t==c[e][l]?(l+=parseInt(y(t).attr("colspan"),10)||1,n++):(l+=parseInt(y(c[e][l]).attr("colspan"),10)||1,"after"==i&&(t=0===n?-1:a.find("> th, > td").get(n-1)))}var r,o=y(t);if("after"==i&&f<l-1||"before"==i&&0<f&&c[e][f]==c[e][f-1]){if(0===e||0<e&&c[e][f]!=c[e-1][f]){var s=parseInt(o.attr("colspan"),10)+1;o.attr("colspan",s),o.css("width",(o.data("old-width")*p/d+p).toFixed(4)+"%"),o.removeData("old-width")}}else r=0<a.find("th").length?'<th style="width: '.concat(p.toFixed(4),'%;"><br></th>'):'<td style="width: '.concat(p.toFixed(4),'%;"><br></td>'),-1==t?a.prepend(r):null==t?a.append(r):"before"==i?o.before(r):"after"==i&&o[0].parentNode&&o[0].insertAdjacentHTML("afterend",r)}),e.find("th, td").each(function(){(a=y(this)).data("old-width")&&(a.css("width",(a.data("old-width")*p/d).toFixed(4)+"%"),a.removeData("old-width"))}),R.popups.isVisible("table.edit")&&h()}},deleteColumn:function oe(){var e=ee();if(0<e.length){var t,a,l,n=$(),r=M(n);if(null==r)return;if(0===r.min_j&&r.max_j==n[0].length-1)u();else{var o=0;for(t=0;t<n.length;t++)for(a=0;a<n[0].length;a++)(l=y(n[t][a])).hasClass("fr-selected-cell")||(l.data("old-width",l.outerWidth()/e.outerWidth()*100),(a<r.min_j||a>r.max_j)&&(o+=l.outerWidth()/e.outerWidth()*100));for(o/=n.length,a=r.max_j;a>=r.min_j;a--)for(t=0;t<n.length;t++)if(0===t||n[t][a]!=n[t-1][a])if(l=y(n[t][a]),1<(parseInt(l.attr("colspan"),10)||1)){var s=parseInt(l.attr("colspan"),10)-1;1==s?l.removeAttr("colspan"):l.attr("colspan",s),l.css("width",(100*(l.data("old-width")-G(a,n))/o).toFixed(4)+"%"),l.removeData("old-width")}else{var i=y(l.parent().get(0));l.remove(),0===i.find("> th, > td").length&&(0===i.prev().length||0===i.next().length||i.prev().find("> th[rowspan], > td[rowspan]").length<i.prev().find("> th, > td").length)&&i.remove()}w(0,n.length-1,0,n[0].length-1,e),0<r.min_j?R.selection.setAtEnd(n[r.min_i][r.min_j-1]):R.selection.setAtEnd(n[r.min_i][0]),R.selection.restore(),R.popups.hide("table.edit"),e.find("th, td").each(function(){(l=y(this)).data("old-width")&&(l.css("width",(100*l.data("old-width")/o).toFixed(4)+"%"),l.removeData("old-width"))})}}},mergeCells:function se(){if(1<Q().length&&(0===R.$el.find("th.fr-selected-cell").length||0===R.$el.find("td.fr-selected-cell").length)){E();var e,t,a=M($());if(null==a)return;var l=R.$el.find(".fr-selected-cell"),n=y(l[0]),r=n.parent().find(".fr-selected-cell"),o=n.closest("table"),s=n.html(),i=0;for(e=0;e<r.length;e++)i+=y(r[e]).outerWidth();for(n.css("width",Math.min(100,i/o.outerWidth()*100).toFixed(4)+"%"),a.min_j<a.max_j&&n.attr("colspan",a.max_j-a.min_j+1),a.min_i<a.max_i&&n.attr("rowspan",a.max_i-a.min_i+1),e=1;e<l.length;e++)"<br>"!=(t=y(l[e])).html()&&""!==t.html()&&(s+="<br>".concat(t.html())),t.remove();
vendor: 4,740 bytes, line 799
799n.html(s),R.selection.setAtEnd(n.get(0)),R.selection.restore(),R.toolbar.enable(),m(a.min_i,a.max_i,o);var f=o.find("tr:empty");for(e=f.length-1;0<=e;e--)y(f[e]).remove();b(a.min_j,a.max_j,o),h()}},splitCellVertically:function ie(){if(1==Q().length){var e=R.$el.find(".fr-selected-cell"),t=parseInt(e.attr("colspan"),10)||1,a=e.parent().outerWidth(),l=e.outerWidth(),n=e.clone().html("<br>"),r=$(),o=D(e.get(0),r);if(1<t){var s=Math.ceil(t/2);l=X(o.col,o.col+s-1,r)/a*100;var i=X(o.col+s,o.col+t-1,r)/a*100;1<s?e.attr("colspan",s):e.removeAttr("colspan"),1<t-s?n.attr("colspan",t-s):n.removeAttr("colspan"),e.css("width",l.toFixed(4)+"%"),n.css("width",i.toFixed(4)+"%")}else{var f;for(f=0;f<r.length;f++)if(0===f||r[f][o.col]!=r[f-1][o.col]){var c=y(r[f][o.col]);if(!c.is(e)){var d=(parseInt(c.attr("colspan"),10)||1)+1;c.attr("colspan",d)}}l=l/a*100/2,e.css("width","".concat(l.toFixed(4),"%")),n.css("width","".concat(l.toFixed(4),"%"))}e[0].parentNode&&e[0].insertAdjacentElement("afterend",n[0]),_(),R.popups.hide("table.edit")}},splitCellHorizontally:function fe(){if(1==Q().length){var e=R.$el.find(".fr-selected-cell"),t=e.parent(),a=e.closest("table"),l=parseInt(e.attr("rowspan"),10),n=$(),r=D(e.get(0),n),o=e.clone().html("<br>");if(1<l){var s=Math.ceil(l/2);1<s?e.attr("rowspan",s):e.removeAttr("rowspan"),1<l-s?o.attr("rowspan",l-s):o.removeAttr("rowspan");for(var i=r.row+s,f=0===r.col?r.col:r.col-1;0<=f&&(n[i][f]==n[i][f-1]||0<i&&n[i][f]==n[i-1][f]);)f--;-1==f?y(a.find("tr").not(a.find("> table tr")).get(i)).prepend(o):y(n[i][f])[0].parentNode&&y(n[i][f])[0].insertAdjacentElement("afterend",o[0])}else{var c,d=y(document.createElement("tr")).append(o);for(c=0;c<n[0].length;c++)if(0===c||n[r.row][c]!=n[r.row][c-1]){var p=y(n[r.row][c]);p.is(e)||p.attr("rowspan",(parseInt(p.attr("rowspan"),10)||1)+1)}t[0].parentNode&&t[0].insertAdjacentElement("afterend",d[0])}_(),R.popups.hide("table.edit")}},addHeader:function ce(){var e=ee();if(0<e.length&&0===e.find("> th").length){var t,a="<thead><tr>",l=0;for(l=e.find("tr").first().find("> th").length,e.find("tr").first().find("> td").each(function(){var e=y(this);l+=parseInt(e.attr("colspan"),10)||1}),t=0;t<l;t++)a+="<th><br></th>";a+="</tr></thead>",e.prepend(a),h()}},addFooter:function de(){var e=ee();if(0<e.length&&0===e.find("tfoot").length){var t,a="<tfoot><tr>",l=0,n="> td";for(0<e.find("thead").length&&(n="> th"),e.find("tr").first().find(n).each(function(){var e=y(this);l+=parseInt(e.attr("colspan"),10)||1}),t=0;t<l;t++)a+="<td><br></td>";a+="</tr></tfoot>",e.append(a),h()}},removeHeader:function pe(){var e=ee(),t=e.find("> thead");if(0<(t=y(t)).length)if(0===e.find("tbody tr").length)u();else if(t.remove(),0<Q().length)h();else{R.popups.hide("table.edit");var a=e.find("tbody tr").first().find("td").first().get(0);a&&(R.selection.setAtEnd(a),R.selection.restore())}},removeFooter:function he(){var e=ee(),t=e.find("tfoot");if(0<t.length)if(0===e.find("tbody tr").length)u();else if(t.remove(),0<Q().length)h();else{R.popups.hide("table.edit");var a=e.find("tbody tr").first().find("td").first().get(0);a&&(R.selection.setAtEnd(a),R.selection.restore())}},setBackground:t,showInsertPopup:function ue(){var e=R.$tb.find('.fr-command[data-cmd="insertTable"]'),t=R.popups.get("table.insert");if(t||(t=c()),!t.hasClass("fr-active")){R.popups.refresh("table.insert"),R.popups.setContainer("table.insert",R.$tb);var a=R.button.getPosition(e),l=a.left,n=a.top;R.popups.show("table.insert",l,n,e.outerHeight())}},showEditPopup:h,showColorsPopup:s,back:function ge(){0<Q().length?h():(R.popups.hide("table.insert"),R.toolbar.showInline())},verticalAlign:function be(e){R.$el.find(".fr-selected-cell").css("vertical-align",e)},horizontalAlign:function me(e){R.$el.find(".fr-selected-cell").css("text-align",e)},applyStyle:function ve(e,t,a,l){if(0<t.length){if(R.opts.useClasses||("TABLE"===t.get(0).tagName?function r(e,t){var a=e.childNodes;if(0<a.length)for(var l=0;l<a.length;l++)"TD"===a[l].tagName?"fr-dashed-borders"===t||"fr-highlighted"===t||"fr-thick"===t?C(a[l]):"fr-alternate-rows"===t&&a[l].style.removeProperty("background-color"):r(a[l],t)}(t.get(0),e):C(t.get(0))),!a){var n=Object.keys(l);n.splice(n.indexOf(e),1),t.removeClass(n.join(" "))}t.toggleClass(e)}},selectedTable:ee,selectedCells:Q,customColor:function we(){var e=R.popups.get("table.colors").find(".fr-table-colors-hex-layer input");e.length&&t(e.val())},selectCells:N}},Ce.DefineIcon("insertTable",{NAME:"table",SVG_KEY:"insertTable"}),Ce.RegisterCommand("insertTable",{title:"Insert Table",undo:!1,focus:!0,refreshOnCallback:!1,popup:!0,callback:function(){this.popups.isVisible("table.insert")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore(
vendor: 5,178 bytes, line 799
799)),this.popups.hide("table.insert")):this.table.showInsertPopup()},plugin:"table"}),Ce.RegisterCommand("tableInsert",{callback:function(e,t,a){this.table.insert(t,a),this.popups.hide("table.insert")}}),Ce.DefineIcon("tableHeader",{NAME:"header",FA5NAME:"heading",SVG_KEY:"tableHeader"}),Ce.RegisterCommand("tableHeader",{title:"Table Header",focus:!1,toggle:!0,callback:function(){this.popups.get("table.edit").find('.fr-command[data-cmd="tableHeader"]').hasClass("fr-active")?this.table.removeHeader():this.table.addHeader()},refresh:function(e){var t=this.table.selectedTable();0<t.length&&(0===t.find("> thead").length?e.removeClass("fr-active").attr("aria-pressed",!1):e.addClass("fr-active").attr("aria-pressed",!0))}}),Ce.DefineIcon("tableFooter",{NAME:"table",FA5NAME:"table",SVG_KEY:"tableFooter"}),Ce.RegisterCommand("tableFooter",{title:"Table Footer",focus:!1,toggle:!0,callback:function(){this.popups.get("table.edit").find('.fr-command[data-cmd="tableFooter"]').hasClass("fr-active")?this.table.removeFooter():this.table.addFooter()},refresh:function(e){var t=this.table.selectedTable();0<t.length&&(0===t.find("tfoot").length?e.removeClass("fr-active").attr("aria-pressed",!1):e.addClass("fr-active").attr("aria-pressed",!0))}}),Ce.DefineIcon("tableRows",{NAME:"bars",SVG_KEY:"row"}),Ce.RegisterCommand("tableRows",{type:"dropdown",focus:!1,title:"Row",options:{above:"Insert row above",below:"Insert row below","delete":"Delete row"},html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=Ce.COMMANDS.tableRows.options;for(var a in t)t.hasOwnProperty(a)&&(e+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="tableRows" data-param1="'+a+'" title="'+this.language.translate(t[a])+'">'+this.language.translate(t[a])+"</a></li>");return e+="</ul>"},callback:function(e,t){"above"==t||"below"==t?this.table.insertRow(t):this.table.deleteRow()}}),Ce.DefineIcon("tableColumns",{NAME:"bars fa-rotate-90",SVG_KEY:"columns"}),Ce.RegisterCommand("tableColumns",{type:"dropdown",focus:!1,title:"Column",options:{before:"Insert column before",after:"Insert column after","delete":"Delete column"},html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=Ce.COMMANDS.tableColumns.options;for(var a in t)t.hasOwnProperty(a)&&(e+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="tableColumns" data-param1="'.concat(a,'" title="').concat(this.language.translate(t[a]),'">').concat(this.language.translate(t[a]),"</a></li>"));return e+="</ul>"},callback:function(e,t){"before"==t||"after"==t?this.table.insertColumn(t):this.table.deleteColumn()}}),Ce.DefineIcon("tableCells",{NAME:"square-o",FA5NAME:"square",SVG_KEY:"cellOptions"}),Ce.RegisterCommand("tableCells",{type:"dropdown",focus:!1,title:"Cell",options:{merge:"Merge cells","vertical-split":"Vertical split","horizontal-split":"Horizontal split"},html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=Ce.COMMANDS.tableCells.options;for(var a in t)t.hasOwnProperty(a)&&(e+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="tableCells" data-param1="'.concat(a,'" title="').concat(this.language.translate(t[a]),'">').concat(this.language.translate(t[a]),"</a></li>"));return e+="</ul>"},callback:function(e,t){"merge"==t?this.table.mergeCells():"vertical-split"==t?this.table.splitCellVertically():this.table.splitCellHorizontally()},refreshOnShow:function(e,t){1<this.$el.find(".fr-selected-cell").length?(t.find('a[data-param1="vertical-split"]').addClass("fr-disabled").attr("aria-disabled",!0),t.find('a[data-param1="horizontal-split"]').addClass("fr-disabled").attr("aria-disabled",!0),t.find('a[data-param1="merge"]').removeClass("fr-disabled").attr("aria-disabled",!1)):(t.find('a[data-param1="merge"]').addClass("fr-disabled").attr("aria-disabled",!0),t.find('a[data-param1="vertical-split"]').removeClass("fr-disabled").attr("aria-disabled",!1),t.find('a[data-param1="horizontal-split"]').removeClass("fr-disabled").attr("aria-disabled",!1))}}),Ce.DefineIcon("tableRemove",{NAME:"trash",SVG_KEY:"removeTable"}),Ce.RegisterCommand("tableRemove",{title:"Remove Table",focus:!1,callback:function(){this.table.remove()}}),Ce.DefineIcon("tableStyle",{NAME:"paint-brush",SVG_KEY:"tableStyle"}),Ce.RegisterCommand("tableStyle",{title:"Table Style",type:"dropdown",focus:!1,html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=this.opts.tableStyles;for(var a in t)t.hasOwnProperty(a)&&(e+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="tableStyle" data-param1="'.concat(a,'" title="').concat(this.language.translate(t[a]),'">').concat(this.language.translate(t[a]),"</a></li>"));return e+="</ul>"},callback:function(e,t){this.table.applyStyle(t,this.$el.find(".fr-selected-cell").closest("table"),this.opts.tableMultipleStyles,this.opts.tableStyles)},refreshOnShow:function(e,t){var a=this.$,l=this.$el.find(".fr-selected-cell").closest("table");l&&t.find(".fr-command").each(function(){var e=a(this).data("param1"),t=l.hasClass(e);a(this).toggleClass("fr-active",t).attr("aria-selected",t)})}}
vendor: 4,084 bytes, line 799
799),Ce.DefineIcon("tableCellBackground",{NAME:"tint",SVG_KEY:"cellBackground"}),Ce.RegisterCommand("tableCellBackground",{title:"Cell Background",focus:!1,popup:!0,callback:function(){this.table.showColorsPopup()}}),Ce.RegisterCommand("tableCellBackgroundColor",{undo:!0,focus:!1,callback:function(e,t){this.table.setBackground(t)}}),Ce.DefineIcon("tableBack",{NAME:"arrow-left",SVG_KEY:"back"}),Ce.RegisterCommand("tableBack",{title:"Back",undo:!1,focus:!1,back:!0,callback:function(){this.table.back()},refresh:function(e){0!==this.table.selectedCells().length||this.opts.toolbarInline?(e.removeClass("fr-hidden"),e.next(".fr-separator").removeClass("fr-hidden")):(e.addClass("fr-hidden"),e.next(".fr-separator").addClass("fr-hidden"))}}),Ce.DefineIcon("tableCellVerticalAlign",{NAME:"arrows-v",FA5NAME:"arrows-alt-v",SVG_KEY:"verticalAlignMiddle"}),Ce.RegisterCommand("tableCellVerticalAlign",{type:"dropdown",focus:!1,title:"Vertical Align",options:{Top:"Align Top",Middle:"Align Middle",Bottom:"Align Bottom"},html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=Ce.COMMANDS.tableCellVerticalAlign.options;for(var a in t)t.hasOwnProperty(a)&&(e+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="tableCellVerticalAlign" data-param1="'.concat(a.toLowerCase(),'" title="').concat(this.language.translate(t[a]),'">').concat(this.language.translate(a),"</a></li>"));return e+="</ul>"},callback:function(e,t){this.table.verticalAlign(t)},refreshOnShow:function(e,t){t.find('.fr-command[data-param1="'+this.$el.find(".fr-selected-cell").css("vertical-align")+'"]').addClass("fr-active").attr("aria-selected",!0)}}),Ce.DefineIcon("tableCellHorizontalAlign",{NAME:"align-left",SVG_KEY:"alignLeft"}),Ce.DefineIcon("align-left",{NAME:"align-left",SVG_KEY:"alignLeft"}),Ce.DefineIcon("align-right",{NAME:"align-right",SVG_KEY:"alignRight"}),Ce.DefineIcon("align-center",{NAME:"align-center",SVG_KEY:"alignCenter"}),Ce.DefineIcon("align-justify",{NAME:"align-justify",SVG_KEY:"alignJustify"}),Ce.RegisterCommand("tableCellHorizontalAlign",{type:"dropdown",focus:!1,title:"Horizontal Align",options:{left:"Align Left",center:"Align Center",right:"Align Right",justify:"Align Justify"},html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=Ce.COMMANDS.tableCellHorizontalAlign.options;for(var a in t)t.hasOwnProperty(a)&&(e+='<li role="presentation"><a class="fr-command fr-title" tabIndex="-1" role="option" data-cmd="tableCellHorizontalAlign" data-param1="'.concat(a,'" title="').concat(this.language.translate(t[a]),'">').concat(this.icon.create("align-".concat(a)),'<span class="fr-sr-only">').concat(this.language.translate(t[a]),"</span></a></li>"));return e+="</ul>"},callback:function(e,t){this.table.horizontalAlign(t)},refresh:function(e){var t=this.table.selectedCells(),a=this.$;t.length&&e.find("> *").first().replaceWith(this.icon.create("align-".concat(this.helpers.getAlignment(a(t[0])))))},refreshOnShow:function(e,t){t.find('.fr-command[data-param1="'+this.helpers.getAlignment(this.$el.find(".fr-selected-cell").first())+'"]').addClass("fr-active").attr("aria-selected",!0)}}),Ce.DefineIcon("tableCellStyle",{NAME:"magic",SVG_KEY:"cellStyle"}),Ce.RegisterCommand("tableCellStyle",{title:"Cell Style",type:"dropdown",focus:!1,html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=this.opts.tableCellStyles;for(var a in t)t.hasOwnProperty(a)&&(e+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="tableCellStyle" data-param1="'.concat(a,'" title="').concat(this.language.translate(t[a]),'">').concat(this.language.translate(t[a]),"</a></li>"));return e+="</ul>"},callback:function(e,t){this.table.applyStyle(t,this.$el.find(".fr-selected-cell"),this.opts.tableCellMultipleStyles,this.opts.tableCellStyles)},refreshOnShow:function(e,t){var a=this.$,l=this.$el.find(".fr-selected-cell").first();l&&t.find(".fr-command").each(function(){var e=a(this).data("param1"),t=l.hasClass(e);a(this).toggleClass("fr-active",t).attr("aria-selected",t)})}}
vendor: 4,547 bytes, lines 799-807
799),Ce.RegisterCommand("tableCellBackgroundCustomColor",{title:"OK",undo:!0,callback:function(){this.table.customColor()}}),Ce.DefineIcon("tableColorRemove",{NAME:"eraser",SVG_KEY:"remove"})});
800},{"froala-editor":8}],24:[function(require,module,exports){
801/*!
802 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
803 * License https://froala.com/wysiwyg-editor/terms/
804 * Copyright 2014-2023 Froala Labs
805 */
806
807!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(e.FroalaEditor)}(this,function(we){"use strict";we=we&&we.hasOwnProperty("default")?we["default"]:we,Object.assign(we.POPUP_TEMPLATES,{"video.insert":"[_BUTTONS_][_BY_URL_LAYER_][_EMBED_LAYER_][_UPLOAD_LAYER_][_PROGRESS_BAR_]","video.edit":"[_BUTTONS_]","video.size":"[_BUTTONS_][_SIZE_LAYER_]"}),Object.assign(we.DEFAULTS,{videoAllowedTypes:["mp4","webm","ogg","mp3","mpeg","url"],videoAllowedProviders:[".*"],videoDefaultAlign:"center",videoDefaultDisplay:"block",videoDefaultWidth:600,videoEditButtons:["videoReplace","videoRemove","videoDisplay","videoAlign","videoSize","autoplay"],videoInsertButtons:["videoBack","|","videoByURL","videoEmbed","videoUpload"],videoMaxSize:52428800,videoMove:!0,videoResize:!0,videoResponsive:!1,videoSizeButtons:["videoBack","|"],videoSplitHTML:!1,videoTextNear:!0,videoUpload:!0,videoUploadMethod:"POST",videoUploadParam:"file",videoUploadParams:{},videoUploadToS3:!1,videoUploadToAzure:!1,videoUploadURL:null}),we.VIDEO_PROVIDERS=[{test_regex:/^.*((youtu.be)|(youtube.com))\/((v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))?\??v?=?([^#\&\?]*).*/,url_regex:/(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?v=|embed\/)?([0-9a-zA-Z_\-]+)(.+)?/g,url_text:"https://www.youtube.com/embed/$1?$2",html:'<iframe width="640" height="360" src="{url}&wmode=opaque&rel=0" frameborder="0" allowfullscreen></iframe>',provider:"youtube"},{test_regex:/^.*(?:vimeo.com)\/(?:channels(\/\w+\/)?|groups\/*\/videos\/\u200b\d+\/|video\/|)(\d+)(?:$|\/|\?)/,url_regex:/(?:https?:\/\/)?(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/(?:[^\/]*)\/videos\/|album\/(?:\d+)\/video\/|video\/|)(\d+)(?:[a-zA-Z0-9_\-]+)?(\/[a-zA-Z0-9_\-]+)?/i,url_text:"https://player.vimeo.com/video/$1",html:'<iframe width="640" height="360" src="{url}" frameborder="0" allowfullscreen></iframe>',provider:"vimeo"},{test_regex:/^.+(dailymotion.com|dai.ly)\/(video|hub)?\/?([^_]+)[^#]*(#video=([^_&]+))?/,url_regex:/(?:https?:\/\/)?(?:www\.)?(?:dailymotion\.com|dai\.ly)\/(?:video|hub)?\/?(.+)/g,url_text:"https://www.dailymotion.com/embed/video/$1",html:'<iframe width="640" height="360" src="{url}" frameborder="0" allowfullscreen></iframe>',provider:"dailymotion"},{test_regex:/^.+(screen.yahoo.com)\/[^_&]+/,url_regex:"",url_text:"",html:'<iframe width="640" height="360" src="{url}?format=embed" frameborder="0" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true" allowtransparency="true"></iframe>',provider:"yahoo"},{test_regex:/^.+(rutube.ru)\/[^_&]+/,url_regex:/(?:https?:\/\/)?(?:www\.)?(?:rutube\.ru)\/(?:video)?\/?(.+)/g,url_text:"https://rutube.ru/play/embed/$1",html:'<iframe width="640" height="360" src="{url}" frameborder="0" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true" allowtransparency="true"></iframe>',provider:"rutube"},{test_regex:/^(?:.+)vidyard.com\/(?:watch)?\/?([^.&/]+)\/?(?:[^_.&]+)?/,url_regex:/^(?:.+)vidyard.com\/(?:watch)?\/?([^.&/]+)\/?(?:[^_.&]+)?/g,url_text:"https://play.vidyard.com/$1",html:'<iframe width="640" height="360" src="{url}" frameborder="0" allowfullscreen></iframe>',provider:"vidyard"}],we.VIDEO_EMBED_REGEX=/^\W*((<iframe(.|\n)*>(\s|\n)*<\/iframe>)|(<embed(.|\n)*>))\W*$/i,we.PLUGINS.video=function(w){var s,p,f,E,i,o,A=w.$,C="https://i.froala.com/upload",c=2,v=3,u=4,S=5,U=6,a={};function g(){var e=w.popups.get("video.insert");e.find(".fr-video-by-url-layer input").val("").trigger("change");var t=e.find(".fr-video-embed-layer textarea");t.val("").trigger("change"),(t=e.find(".fr-video-upload-layer input")).val("").trigger("change")}function r(){var e=w.popups.get("video.edit");if(e||(e=function n(){var e="";if(0<w.opts.videoEditButtons.length){w.opts.videoResponsive&&(-1<w.opts.videoEditButtons.indexOf("videoSize")&&w.opts.videoEditButtons.splice(w.opts.videoEditButtons.indexOf("videoSize"),1),-1<w.opts.videoEditButtons.indexOf("videoDisplay")&&w.opts.videoEditButtons.splice(w.opts.videoEditButtons.indexOf("videoDisplay"),
vendor: 23,005 bytes, line 807
8071),-1<w.opts.videoEditButtons.indexOf("videoAlign")&&w.opts.videoEditButtons.splice(w.opts.videoEditButtons.indexOf("videoAlign"),1));var t={buttons:e+='<div class="fr-buttons"> \n      '.concat(w.button.buildList(w.opts.videoEditButtons)," \n      </div>")},o=w.popups.create("video.edit",t);return w.events.$on(w.$wp,"scroll.video-edit",function(){E&&w.popups.isVisible("video.edit")&&(w.events.disableBlur(),l(E))}),o}return!1}()),e){w.popups.setContainer("video.edit",w.$sc),w.popups.refresh("video.edit");var t=E.find("iframe, embed, ".concat(E.find("iframe, embed, audio").get(0)?"audio":"video")),o=t.offset().left+t.outerWidth()/2,i=t.offset().top+t.outerHeight(),a=t.get(0).src?t.get(0).src:t.get(0).currentSrc,r=!(!(a=(a=a.split("."))[a.length-1]).includes("pdf")&&!a.includes("txt"));t.hasClass("fr-file")||r||E.find("audio").get(0)?(document.getElementById("autoplay-".concat(w.id))&&(document.getElementById("autoplay-".concat(w.id)).style.display="none"),document.getElementById("videoReplace-".concat(w.id))&&(document.getElementById("videoReplace-".concat(w.id)).style.display="none")):(document.getElementById("autoplay-".concat(w.id))&&(document.getElementById("autoplay-".concat(w.id)).style.display=""),document.getElementById("videoReplace-".concat(w.id))&&(document.getElementById("videoReplace-".concat(w.id)).style.display="")),w.popups.show("video.edit",o,i,t.outerHeight(),!0)}}function n(e){if(e)return w.popups.onRefresh("video.insert",g),w.popups.onHide("video.insert",J),!0;var t="";w.opts.videoUpload||-1===w.opts.videoInsertButtons.indexOf("videoUpload")||w.opts.videoInsertButtons.splice(w.opts.videoInsertButtons.indexOf("videoUpload"),1);var o=w.button.buildList(w.opts.videoInsertButtons);""!==o&&(t='<div class="fr-buttons">'+o+"</div>");var i,a="",r=w.opts.videoInsertButtons.indexOf("videoUpload"),n=w.opts.videoInsertButtons.indexOf("videoByURL"),s=w.opts.videoInsertButtons.indexOf("videoEmbed");if(0<=n){i=" fr-active",(r<n&&0<=r||s<n&&0<=s)&&(i="");a='<div class="fr-video-by-url-layer fr-layer'.concat(i,'" id="fr-video-by-url-layer-').concat(w.id,'"><div class="fr-input-line"><input id="fr-video-by-url-layer-text-').concat(w.id,'" type="text" placeholder="').concat(w.language.translate("Paste in a video URL"),'" tabIndex="1" aria-required="true"></div><div class="fr-action-buttons"><span style=\'float:left\'><div class="fr-checkbox-line fr-autoplay-margin"><span class="fr-checkbox"> <input id=\'videoPluginAutoplay\' data-checked="_blank" type="checkbox"> <span>').concat('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="10" height="10" viewBox="0 0 32 32"><path d="M27 4l-15 15-7-7-5 5 12 12 20-20z" fill="#FFF"></path></svg>','</span></span> <label id="fr-label-target-').concat(w.id,'">Autoplay</label></div> </span><button type="button" class="fr-command fr-submit" data-cmd="videoInsertByURL" tabIndex="2" role="button">').concat(w.language.translate("Insert"),"</button></div></div>")}var d="";0<=s&&(i=" fr-active",(r<s&&0<=r||n<s&&0<=n)&&(i=""),d='<div class="fr-video-embed-layer fr-layer'.concat(i,'" id="fr-video-embed-layer-').concat(w.id,'"><div class="fr-input-line"><textarea id="fr-video-embed-layer-text').concat(w.id,'" type="text" placeholder="').concat(w.language.translate("Embedded Code"),'" tabIndex="1" aria-required="true" rows="5"></textarea></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-submit" data-cmd="videoInsertEmbed" tabIndex="2" role="button">').concat(w.language.translate("Insert"),"</button></div></div>"));var l="";0<=r&&(i=" fr-active",(s<r&&0<=s||n<r&&0<=n)&&(i=""),l='<div class="fr-video-upload-layer fr-layer'.concat(i,'" id="fr-video-upload-layer-').concat(w.id,'"><strong>').concat(w.language.translate("Drop video"),"</strong><br>(").concat(w.language.translate("or click"),')<div class="fr-form"><input type="file" accept="video/').concat(w.opts.videoAllowedTypes.join(", video/").toLowerCase(),'" tabIndex="-1" aria-labelledby="fr-video-upload-layer-').concat(w.id,'" role="button"></div></div>'));var p={buttons:t,by_url_layer:a,embed_layer:d,upload_layer:l,progress_bar:'<div class="fr-video-progress-bar-layer fr-layer"><h3 tabIndex="-1" class="fr-message">Uploading</h3><div class="fr-loader"><span class="fr-progress"></span></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-dismiss" data-cmd="videoDismissError" tabIndex="2" role="button">OK</button></div></div>'},f=w.popups.create("video.insert",p);return function c(i){w.events.$on(i,"dragover dragenter",".fr-video-upload-layer",function(){return A(this).addClass("fr-drop"),!1},!0),w.events.$on(i,"dragleave dragend",".fr-video-upload-layer",function(){return A(this).removeClass("fr-drop"),!1},!0),w.events.$on(i,"drop",".fr-video-upload-layer",function(e){e.preventDefault(),e.stopPropagation(),A(this).removeClass("fr-drop");var t=e.originalEvent.dataTransfer;if(t&&t.files){var o=i.data("instance")||w;o.events.disableBlur(),o.video.upload(t.files),o.events.enableBlur()}},!0),w.helpers.isIOS()&&w.events.$on(i,"touchstart",'.fr-video-upload-layer input[type="file"]',function(){A(this).trigger("click")},!0);w.events.$on(i,"change",'.fr-video-upload-layer input[type="file"]',function(){if(this.files){var e=i.data("instance")||w;e.events.disableBlur(),i.find("input:focus").blur(),e.events.enableBlur(),e.video.upload(this.files)}A(this).val("")},!0)}(f),f}function h(e){w.events.focus(!0),w.selection.restore();var t=!1;if(E&&(q(),t=!0),w.opts.trackChangesEnabled){w.edit.on(),w.events.focus(!0),w.selection.restore(),w.undo.saveStep(),w.markers.insert(),w.html.wrap();var o=w.$el.find(".fr-marker");w.node.isLastSibling(o)&&o.parent().hasClass("fr-deletable")&&o.insertAfter(o.parent()),o.replaceWith('<span contenteditable="false" draggable="true" class="fr-jiv fr-video fr-deletable">'.concat(e,"</span>")),w.selection.clear()}else w.html.insert('<span contenteditable="false" draggable="true" class="fr-jiv fr-video fr-deletable">'.concat(e,"</span>"),!1,w.opts.videoSplitHTML);w.popups.hide("video.insert");var i=w.$el.find(".fr-jiv");i.removeClass("fr-jiv"),i.toggleClass("fr-rv",w.opts.videoResponsive),Z(i,w.opts.videoDefaultDisplay,w.opts.videoDefaultAlign),i.toggleClass("fr-draggable",w.opts.videoMove),w.events.trigger(t?"video.replaced":"video.inserted",[i])}function m(){var e=A(this);w.popups.hide("video.insert"),e.removeClass("fr-uploading"),e.parent().next().is("br")&&e.parent().next().remove(),l(e.parent()),w.events.trigger("video.loaded",[e.parent()])}function x(s,e,d,l,p){w.edit.off(),b("Loading video"),e&&(s=w.helpers.sanitizeURL(s));var f=function f(){var e,t;if(l){w.undo.canDo()||l.find("video").hasClass("fr-uploading")||w.undo.saveStep();var o=l.find("video").data("fr-old-src"),i=l.data("fr-replaced");if(l.data("fr-replaced",!1),0<l.find("iframe").length)l.remove(),e=k(s,d,m);else{w.$wp?((e=l.clone(!0)).find("video").removeData("fr-old-src").removeClass("fr-uploading"),e.find("video").off("canplay"),o&&l.find("video").attr("src",o),l.replaceWith(e)):e=l;for(var a=e.find("video").get(0).attributes,r=0;r<a.length;r++){var n=a[r];0===n.nodeName.indexOf("data-")&&e.find("video").removeAttr(n.nodeName)}if(void 0!==d)for(t in d)d.hasOwnProperty(t)&&"link"!=t&&e.find("video").attr("data-".concat(t),d[t]);e.find("video").on("canplay",m),e.find("video").attr("src",s)}w.edit.on(),L(),w.undo.saveStep(),w.$el.blur(),w.events.trigger(i?"video.replaced":"video.inserted",[e,p])}else e=k(s,d,m),L(),w.undo.saveStep(),w.events.trigger("video.inserted",[e,p])};R("Loading video"),f()}function R(e){var t=w.popups.get("video.insert");if(t||(t=n()),t.find(".fr-layer.fr-active").removeClass("fr-active").addClass("fr-pactive"),t.find(".fr-video-progress-bar-layer").addClass("fr-active"),t.find(".fr-buttons").hide(),E){var o=E.find("iframe, embed, ".concat(E.find("iframe, embed, audio").get(0)?"audio":"video"));w.popups.setContainer("video.insert",w.$sc);var i=o.offset().left,a=o.offset().top+o.height();w.popups.show("video.insert",i,a,o.outerHeight())}void 0===e&&b(w.language.translate("Uploading"),0)}function d(e){var t=w.popups.get("video.insert");if(t&&(t.find(".fr-layer.fr-pactive").addClass("fr-active").removeClass("fr-pactive"),t.find(".fr-video-progress-bar-layer").removeClass("fr-active"),t.find(".fr-buttons").show(),e||w.$el.find("video.fr-error").length)){if(w.events.focus(),w.$el.find("video.fr-error").length&&(w.$el.find("video.fr-error").parent().remove(),w.undo.saveStep(),w.undo.run(),w.undo.dropRedo()),!w.$wp&&E){var o=E;V(!0),w.selection.setAfter(o.find("video").get(0)),w.selection.restore()}w.popups.hide("video.insert")}}function b(e,t){var o=w.popups.get("video.insert");if(o){var i=o.find(".fr-video-progress-bar-layer");i.find("h3").text(e+(t?" ".concat(t,"%"):"")),i.removeClass("fr-error"),t?(i.find("div").removeClass("fr-indeterminate"),i.find("div > span").css("width","".concat(t,"%"))):i.find("div").addClass("fr-indeterminate")}}function y(e){R();var t=w.popups.get("video.insert").find(".fr-video-progress-bar-layer");t.addClass("fr-error");var o=t.find("h3");o.text(e),w.events.disableBlur(),o.focus()}function l(e){t.call(e.get(0))}function _(e,t,o){b("Loading video");var i=this.status,a=this.response,r=this.responseXML,n=this.responseText;try{if(w.opts.videoUploadToS3||w.opts.videoUploadToAzure)if(201==i){var s;if(w.opts.videoUploadToAzure){if(!1===w.events.trigger("video.uploadedToAzure",[this.responseURL,o,a],!0))return w.edit.on(),!1;s=t}else s=function l(e){try{var t=A(e).find("Location").text(),o=A(e).find("Key").text();return!1===w.events.trigger("video.uploadedToS3",[t,o,e],!0)?(w.edit.on(),!1):t}catch(i){return F(u,e),!1}}(r);s&&x(s,!1,[],e,a||r)}else F(u,a||r);else if(200<=i&&i<300){var d=function p(e){try{if(!1===w.events.trigger("video.uploaded",[e],!0))return w.edit.on(),!1;var t=JSON.parse(e);return t.link?t:(F(c,e),!1)}catch(o){return F(u,e),!1}}(n);d&&x(d.link,!1,d,e,a||n)}else F(v,a||n)}catch(f){F(u,a||n)}}function B(){F(u,this.response||this.responseText||this.responseXML)}function D(e){if(e.lengthComputable){var t=e.loaded/e.total*100|0;b(w.language.translate("Uploading"),t)}}function I(){w.edit.on(),d(!0)}function k(e,t,o){var i,a="";if(t&&void 0!==t)for(i in t)t.hasOwnProperty(i)&&"link"!=i&&(a+=" data-".concat(i,'="').concat(t[i],'"'));var r=w.opts.videoDefaultWidth;r&&"auto"!=r&&(r="".concat(r,"px")),w.helpers.isMobile()&&w.browser.safari&&(a+=" autoplay playsinline");var n=A(document.createElement("span")).attr("contenteditable","false").attr("draggable","true").attr("class","fr-video fr-dv"+w.opts.videoDefaultDisplay[0]+("center"!=w.opts.videoDefaultAlign?" fr-fv"+w.opts.videoDefaultAlign[0]:"")).html('<video src="'+e+'" '+a+(r?' style="width: '+r+';" ':"")+" controls>"+w.language.translate("Your browser does not support HTML5 video.")+"</video>");n.toggleClass("fr-draggable",w.opts.videoMove),w.edit.on(),w.events.focus(!0),w.selection.restore(),w.undo.saveStep(),w.opts.videoSplitHTML?w.markers.split():(w.cursor.enter(),w.markers.insert()),w.html.wrap();var s=w.$el.find(".fr-marker");return w.node.isLastSibling(s)&&s.parent().hasClass("fr-deletable")&&s.insertAfter(s.parent()),s.replaceWith(n),w.selection.clear(),n.find("video").get(0).readyState>n.find("video").get(0).HAVE_FUTURE_DATA||w.helpers.isIOS()?o.call(n.find("video").get(0)):n.find("video").on("canplaythrough load",o),n}function T(e){if(!w.core.sameInstance(f))return!0;e.preventDefault(),e.stopPropagation();var t=e.pageX||(e.originalEvent.touches?e.originalEvent.touches[0].pageX:null),o=e.pageY||(e.originalEvent.touches?e.originalEvent.touches[0].pageY:null);if(!t||!o)return!1;if("mousedown"==e.type){var i=w.$oel.get(0).ownerDocument,a=i.defaultView||i.parentWindow,r=!1;try{r=a.location!=a.parent.location&&!(a.$&&a.$.FE)}catch(n){}r&&a.frameElement&&(t+=w.helpers.getPX(A(a.frameElement).offset().left)+a.frameElement.clientLeft,o=e.clientY+w.helpers.getPX(A(a.frameElement).offset().top)+a.frameElement.clientTop)}w.undo.canDo()||w.undo.saveStep(),(p=A(this)).data("start-x",t),p.data("start-y",o),s.show(),w.popups.hideAll(),Y()}function z(e){if(!w.core.sameInstance(f))return!0;if(p){e.preventDefault();var t=e.pageX||(e.originalEvent.touches?e.originalEvent.touches[0].pageX:null),o=e.pageY||(e.originalEvent.touches?e.originalEvent.touches[0].pageY:null);if(!t||!o)return!1;var i=p.data("start-x"),a=p.data("start-y");p.data("start-x",t),p.data("start-y",o);var r=t-i,n=o-a,s=E.find("iframe, embed, ".concat(E.find("iframe, embed, audio").get(0)?"audio":"video")),d=s.width(),l=s.height();(p.hasClass("fr-hnw")||p.hasClass("fr-hsw"))&&(r=0-r),(p.hasClass("fr-hnw")||p.hasClass("fr-hne"))&&(n=0-n),s.css("width",d+r),s.css("height",l+n),s.removeAttr("width"),s.removeAttr("height"),M()}}function P(e){if(!w.core.sameInstance(f))return!0;p&&E&&(e&&e.stopPropagation(),p=null,s.hide(),M(),r(),w.undo.saveStep())}function $(e){return'<div class="fr-handler fr-h'.concat(e,'"></div>')}function O(e,t,o,i){return e.pageX=t,e.pageY=t,T.call(this,e),e.pageX=e.pageX+o*Math.floor(Math.pow(1.1,i)),e.pageY=e.pageY+o*Math.floor(Math.pow(1.1,i)),z.call(this,e),P.call(this,e),++i}function L(){var e,t=Array.prototype.slice.call(w.el.querySelectorAll("video, .fr-video > *")),o=[];for(e=0;e<t.length;e++)o.push(t[e].getAttribute("src")),A(t[e]).toggleClass("fr-draggable",w.opts.videoMove),""===t[e].getAttribute("class")&&t[e].removeAttribute("class"),""===t[e].getAttribute("style")&&t[e].removeAttribute("style");if(i)for(e=0;e<i.length;e++)o.indexOf(i[e].getAttribute("src"))<0&&w.events.trigger("video.removed",[A(i[e])]);i=t}function M(){f||function n(){var e;if(w.shared.$video_resizer?(f=w.shared.$video_resizer,s=w.shared.$vid_overlay,w.events.on("destroy",function(){A("body").first().append(f.removeClass("fr-active"))},!0)):(w.shared.$video_resizer=A(document.createElement("div")).attr("class","fr-video-resizer"),f=w.shared.$video_resizer,w.events.$on(f,"mousedown",function(e){e.stopPropagation()},!0),w.opts.videoResize&&(f.append($("nw")+$("ne")+$("sw")+$("se")),w.shared.$vid_overlay=A(document.createElement("div")).attr("class","fr-video-overlay"),s=w.shared.$vid_overlay,e=f.get(0).ownerDocument,A(e).find("body").first().append(s))),w.events.on("shared.destroy",function(){f.html("").removeData().remove(),f=null,w.opts.videoResize&&(s.remove(),s=null)},!0),w.helpers.isMobile()||w.events.$on(A(w.o_win),"resize.video",function(){V(!0)}),w.opts.videoResize){e=f.get(0).ownerDocument,w.events.$on(f,w._mousedown,".fr-handler",T),w.events.$on(A(e),w._mousemove,z),w.events.$on(A(e.defaultView||e.parentWindow),w._mouseup,P),w.events.$on(s,"mouseleave",P);var i=1,a=null,r=0;w.events.on("keydown",function(e){if(E){var t=-1!=navigator.userAgent.indexOf("Mac OS X")?e.metaKey:e.ctrlKey,o=e.which;(o!==a||200<e.timeStamp-r)&&(i=1),(o==we.KEYCODE.EQUALS||w.browser.mozilla&&o==we.KEYCODE.FF_EQUALS)&&t&&!e.altKey?i=O.call(this,e,1,1,i):(o==we.KEYCODE.HYPHEN||w.browser.mozilla&&o==we.KEYCODE.FF_HYPHEN)&&t&&!e.altKey&&(i=O.call(this,e,2,-1,i)),a=o,r=e.timeStamp}}),w.events.on("keyup",function(){i=1})}}(),(w.$wp||w.$sc).append(f),f.data("instance",w);var e=E.find("iframe, embed, ".concat(E.find("iframe, embed, audio").get(0)?"audio":"video")),t=0,o=0;w.opts.iframe&&(o=w.helpers.getPX(w.$wp.find(".fr-iframe").css("padding-top")),t=w.helpers.getPX(w.$wp.find(".fr-iframe").css("padding-left"))),f.css("top",(w.opts.iframe?e.offset().top+o-1:e.offset().top-w.$wp.offset().top-1)+w.$wp.scrollTop()).css("left",(w.opts.iframe?e.offset().left+t-1:e.offset().left-w.$wp.offset().left-1)+w.$wp.scrollLeft()).css("width",e.get(0).getBoundingClientRect().width).css("height",e.get(0).getBoundingClientRect().height).addClass("fr-active")}function t(e){if(e&&"touchend"==e.type&&o)return!0;if(e&&w.edit.isDisabled())return e.stopPropagation(),e.preventDefault(),!1;if(w.edit.isDisabled())return!1;for(var t=0;t<we.INSTANCES.length;t++)we.INSTANCES[t]!=w&&we.INSTANCES[t].events.trigger("video.hideResizer");w.toolbar.disable(),w.helpers.isMobile()&&(w.events.disableBlur(),w.$el.blur(),w.events.enableBlur()),w.$el.find(".fr-video.fr-active").removeClass("fr-active"),(E=A(this)).addClass("fr-active"),w.opts.iframe&&w.size.syncIframe(),te(),M(),r(),w.selection.clear(),w.button.bulkRefresh(),w.events.trigger("image.hideResizer")}function V(e){E&&(function t(){return w.shared.vid_exit_flag}()||!0===e)&&(f.removeClass("fr-active"),w.toolbar.enable(),E.removeClass("fr-active"),E=null,Y())}function N(){w.shared.vid_exit_flag=!0}function Y(){w.shared.vid_exit_flag=!1}function H(e){var t=e.originalEvent.dataTransfer;if(t&&t.files&&t.files.length){var o=t.files[0];if(o&&o.type&&-1!==o.type.indexOf("video")){if(!w.opts.videoUpload)return e.preventDefault(),e.stopPropagation(),!1;w.markers.remove(),w.markers.insertAtPoint(e.originalEvent),w.$el.find(".fr-marker").replaceWith(we.MARKERS),w.popups.hideAll();var i=w.popups.get("video.insert");return i||(i=n()),w.popups.setContainer("video.insert",w.$sc),w.popups.show("video.insert",e.originalEvent.pageX,e.originalEvent.pageY),R(),0<=w.opts.videoAllowedTypes.indexOf(o.type.replace(/video\//g,""))?K(t.files):F(U),e.preventDefault(),e.stopPropagation(),!1}}}function K(e){if(void 0!==e&&0<e.length){if(!1===w.events.trigger("video.beforeUpload",[e]))return!1;var t,o=e[0];if(!(null!==w.opts.videoUploadURL&&w.opts.videoUploadURL!=C||w.opts.videoUploadToS3||w.opts.videoUploadToAzure))return function y(i){E&&E.find("iframe")&&E.find("iframe").length&&q();var a=new FileReader;a.onload=function(){a.result;for(var e=atob(a.result.split(",")[1]),t=[],o=0;o<e.length;o++)t.push(e.charCodeAt(o));x(window.URL.createObjectURL(new Blob([new Uint8Array(t)],{type:i.type})),!1,null,E)},R(),a.readAsDataURL(i)}(o),!1;if(o.size>w.opts.videoMaxSize)return F(S),!1;if(w.opts.videoAllowedTypes.indexOf(o.type.replace(/video\//g,""))<0)return F(U),!1;if(w.drag_support.formdata&&(t=w.drag_support.formdata?new FormData:null),t){var i;if(!1!==w.opts.videoUploadToS3)for(i in t.append("key",w.opts.videoUploadToS3.keyStart+(new Date).getTime()+"-"+(o.name||"untitled")),t.append("success_action_status","201"),t.append("X-Requested-With","xhr"),t.append("Content-Type",o.type),w.opts.videoUploadToS3.params)w.opts.videoUploadToS3.params.hasOwnProperty(i)&&t.append(i,w.opts.videoUploadToS3.params[i]);for(i in w.opts.videoUploadParams)w.opts.videoUploadParams.hasOwnProperty(i)&&t.append(i,w.opts.videoUploadParams[i]);t.append(w.opts.videoUploadParam,o);var a,r,n=w.opts.videoUploadURL;w.opts.videoUploadToS3&&(n=w.opts.videoUploadToS3.uploadURL?w.opts.videoUploadToS3.uploadURL:"https://".concat(w.opts.videoUploadToS3.region,".amazonaws.com/").concat(w.opts.videoUploadToS3.bucket));var s=w.opts.videoUploadMethod;w.opts.videoUploadToAzure&&(n=w.opts.videoUploadToAzure.uploadURL?"".concat(w.opts.videoUploadToAzure.uploadURL,"/").concat(o.name):encodeURI("https://".concat(w.opts.videoUploadToAzure.account,".blob.core.windows.net/").concat(w.opts.videoUploadToAzure.container,"/").concat(o.name)),a=n,w.opts.videoUploadToAzure.SASToken&&(n+=w.opts.videoUploadToAzure.SASToken),s="PUT");var d=w.core.getXHR(n,s);if(w.opts.videoUploadToAzure){var l=(new Date).toUTCString();if(!w.opts.videoUploadToAzure.SASToken&&w.opts.videoUploadToAzure.accessKey){var p=w.opts.videoUploadToAzure.account,f=w.opts.videoUploadToAzure.container;if(w.opts.videoUploadToAzure.uploadURL){var c=w.opts.videoUploadToAzure.uploadURL.split("/");f=c.pop(),p=c.pop().split(".")[0]}var v="x-ms-blob-type:BlockBlob\nx-ms-date:".concat(l,"\nx-ms-version:2019-07-07"),u=encodeURI("/"+p+"/"+f+"/"+o.name),g=s+"\n\n\n"+o.size+"\n\n"+o.type+"\n\n\n\n\n\n\n"+v+"\n"+u,h=w.cryptoJSPlugin.cryptoJS.HmacSHA256(g,w.cryptoJSPlugin.cryptoJS.enc.Base64.parse(w.opts.videoUploadToAzure.accessKey)).toString(w.cryptoJSPlugin.cryptoJS.enc.Base64),m="SharedKey "+p+":"+h;r=h,d.setRequestHeader("Authorization",m)}for(i in d.setRequestHeader("x-ms-version","2019-07-07"),d.setRequestHeader("x-ms-date",l),d.setRequestHeader("Content-Type",o.type),d.setRequestHeader("x-ms-blob-type","BlockBlob"),w.opts.videoUploadParams)w.opts.videoUploadParams.hasOwnProperty(i)&&d.setRequestHeader(i,w.opts.videoUploadParams[i]);for(i in w.opts.videoUploadToAzure.params)w.opts.videoUploadToAzure.params.hasOwnProperty(i)&&d.setRequestHeader(i,w.opts.videoUploadToAzure.params[i])}d.onload=function(){_.call(d,E,a,r)},d.onerror=B,d.upload.onprogress=D,d.onabort=I,R(),w.events.disableBlur(),w.edit.off(),w.events.enableBlur();var b=w.popups.get("video.insert");b&&A(b.off("abortUpload")).on("abortUpload",function(){4!=d.readyState&&d.abort()}),d.send(w.opts.videoUploadToAzure?o:t)}}}function F(e,t){w.edit.on(),E&&E.find("video").addClass("fr-error"),y(w.language.translate("Something went wrong. Please try again.")),w.events.trigger("video.error",[{code:e,message:a[e]},t])}function X(){if(E){var e=w.popups.get("video.size"),t=E.find("iframe, embed, ".concat(E.find("iframe, embed, audio").get(0)?"audio":"video"));e.find('input[name="width"]').val(t.get(0).style.width||t.attr("width")).trigger("change"),e.find('input[name="height"]').val(t.get(0).style.height||t.attr("height")).trigger("change")}}function G(e){if(e)return w.popups.onRefresh("video.size",X),!0;var t={buttons:'<div class="fr-buttons fr-tabs">'.concat(w.button.buildList(w.opts.videoSizeButtons),"</div>"),size_layer:'<div class="fr-video-size-layer fr-layer fr-active" id="fr-video-size-layer-'.concat(w.id,'"><div class="fr-video-group"><div class="fr-input-line"><input id="fr-video-size-layer-width-').concat(w.id,'" type="text" name="width" placeholder="').concat(w.language.translate("Width"),'" tabIndex="1"></div><div class="fr-input-line"><input id="fr-video-size-layer-height-').concat(w.id,'" type="text" name="height" placeholder="').concat(w.language.translate("Height"),'" tabIndex="1"></div></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-submit" data-cmd="videoSetSize" tabIndex="2" role="button">').concat(w.language.translate("Update"),"</button></div></div>")},o=w.popups.create("video.size",t);return w.events.$on(w.$wp,"scroll",function(){E&&w.popups.isVisible("video.size")&&(w.events.disableBlur(),l(E))}),o}function j(e){if(void 0===e&&(e=E),e){if(e.hasClass("fr-fvl"))return"left";if(e.hasClass("fr-fvr"))return"right";if(e.hasClass("fr-dvb")||e.hasClass("fr-dvi"))return"center";if("block"==e.css("display")){if("left"==e.css("text-algin"))return"left";if("right"==e.css("text-align"))return"right"}else{if("left"==e.css("float"))return"left";if("right"==e.css("float"))return"right"}}return"center"}function W(e){void 0===e&&(e=E);var t=e.css("float");return e.css("float","none"),"block"==e.css("display")?(e.css("float",""),e.css("float")!=t&&e.css("float",t),"block"):(e.css("float",""),e.css("float")!=t&&e.css("float",t),"inline")}function q(){if(E&&!1!==w.events.trigger("video.beforeRemove",[E])){var e=E;if(w.popups.hideAll(),V(!0),w.opts.trackChangesEnabled&&(!e[0].parentNode||"
807SPAN"!==e[0].parentNode.tagName||!e[0].parentNode.hasAttribute("data-tracking")))return void w.track_changes.removeSpecialItem(e);w.selection.setBefore(e.get(0))||w.selection.setAfter(e.get(0)),e.remove(),w.selection.restore(),w.html.fillEmptyBlocks()}}function J(){d()}function Z(e,t,o){!w.opts.htmlUntouched&&w.opts.useClasses?(e.removeClass("fr-fvl fr-fvr fr-dvb fr-dvi"),e.addClass("fr-fv".concat(o[0]," fr-dv").concat(t[0]))):"inline"==t?(e.css({display:"inline-block"}),"center"==o?e.css({"float":"none"}):"left"==o?e.css({"float":"left"}):e.css({"float":"right"})):(e.css({display:"block",clear:"both"}),"left"==o?e.css({textAlign:"left"}):"right"==o?e.css({textAlign:"right"}):e.css({textAlign:"center"}))}function Q(){var e=w.$el.find("video").filter(function(){return 0===A(this).parents("span.fr-video").length});if(0!=e.length){e.wrap(A(document.createElement("span")).attr("class","fr-video fr-deletable").attr("contenteditable","false")),w.$el.find("embed, iframe").filter(function(){if(w.browser.safari&&this.getAttribute("src")&&this.setAttribute("src",this.src),0<A(this).parents("span.fr-video").length)return!1;for(var e=A(this).attr("src"),t=0;t<we.VIDEO_PROVIDERS.length;t++){var o=we.VIDEO_PROVIDERS[t];if(o.test_regex.test(e)&&new RegExp(w.opts.videoAllowedProviders.join("|")).test(o.provider))return!0}return!1}).map(function(){return 0===A(this).parents("object").length?this:A(this).parents("object").get(0)}).wrap(A(document.createElement("span")).attr("class","fr-video").attr("contenteditable","false"));for(var t,o,i,a,r=w.$el.find("span.fr-video, video"),n=0;n<r.length;n++){var s=A(r[n]);!w.opts.htmlUntouched&&w.opts.useClasses?((a=s).hasClass("fr-dvi")||a.hasClass("fr-dvb")||(a.addClass("fr-fv".concat(j(a)[0])),a.addClass("fr-dv".concat(W(a)[0]))),w.opts.videoTextNear||s.removeClass("fr-dvi").addClass("fr-dvb")):w.opts.htmlUntouched||w.opts.useClasses||(void 0,o=(t=s).hasClass("fr-dvb")?"block":t.hasClass("fr-dvi")?"inline":null,i=t.hasClass("fr-fvl")?"left":t.hasClass("fr-fvr")?"right":j(t),Z(t,o,i),t.removeClass("fr-dvb fr-dvi fr-fvr fr-fvl"))}r.toggleClass("fr-draggable",w.opts.videoMove)}}function ee(e){document.getElementById("autoplay-".concat(w.id)).style.cssText="background:".concat(e)}function te(){if(E){w.selection.clear();var e=w.doc.createRange();e.selectNode(E.get(0)),w.selection.get().addRange(e)}}return a[1]="Video cannot be loaded from the passed link.",a[c]="No link in upload response.",a[v]="Error during file upload.",a[u]="Parsing response failed.",a[S]="File is too large.",a[U]="Video file type is invalid.",a[7]="Files can be uploaded only to same domain in IE 8 and IE 9.",w.shared.vid_exit_flag=!1,{_init:function oe(){w.opts.videoResponsive&&(w.opts.videoResize=!1),function e(){w.events.on("drop",H,!0),w.events.on("mousedown window.mousedown",N),w.events.on("window.touchmove",Y),w.events.on("mouseup window.mouseup",V),w.events.on("commands.mousedown",function(e){0<e.parents(".fr-toolbar").length&&V()}),w.events.on("video.hideResizer commands.undo commands.redo element.dropped",function(){V(!0)})}(),w.helpers.isMobile()&&(w.events.$on(w.$el,"touchstart","span.fr-video",function(){o=!1}),w.events.$on(w.$el,"touchmove",function(){o=!0})),w.events.on("html.set",Q),Q(),w.events.$on(w.$el,"mousedown","span.fr-video",function(e){e.stopPropagation(),(w.browser.msie||w.browser.edge)&&(e.target.innerText||(e.target.dragDrop(),t.call(this,e)))}),w.events.$on(w.$el,"click touchend","span.fr-video",function(e){if(e.target.innerText.length||"false"==A(this).parents("[contenteditable]").not(".fr-element").not(".fr-img-caption").not("body").first().attr("contenteditable"))return!0;t.call(this,e)}),w.events.on("keydown",function(e){var t=e.which;return!E||t!=we.KEYCODE.BACKSPACE&&t!=we.KEYCODE.DELETE?E&&t==we.KEYCODE.ESC?(V(!0),e.preventDefault(),!1):E&&t!=we.KEYCODE.F10&&!w.keys.isBrowserAction(e)?(e.preventDefault(),!1):void 0:(e.preventDefault(),q(),w.undo.saveStep(),!1)},!0),w.events.on("toolbar.esc",function(){if(E)return w.events.disableBlur(),w.events.focus(),!1},!0),w.events.on("toolbar.focusEditor",function(){if(E)return!1},!0),w.events.on("keydown",function(){w.$el.find("span.fr-video:empty").remove()}),w.$wp&&(L(),w.events.on("contentChanged",L)),n(!0),G(!0)}
vendor: 9,527 bytes, line 807
807,showInsertPopup:function ie(){var e=w.$tb.find('.fr-command[data-cmd="insertVideo"]'),t=w.popups.get("video.insert");if(t||(t=n()),d(),!t.hasClass("fr-active"))if(w.popups.refresh("video.insert"),w.popups.setContainer("video.insert",w.$tb),e.isVisible()){var o=w.button.getPosition(e),i=o.left,a=o.top;w.popups.show("video.insert",i,a,e.outerHeight())}else w.position.forSelection(t),w.popups.show("video.insert")},showLayer:function ae(e){var t,o,i=w.popups.get("video.insert");if(!E&&!w.opts.toolbarInline){var a=w.$tb.find('.fr-command[data-cmd="insertVideo"]');t=a.offset().left,o=a.offset().top+(w.opts.toolbarBottom?10:a.outerHeight()-10)}w.opts.toolbarInline&&(o=i.offset().top-w.helpers.getPX(i.css("margin-top")),i.hasClass("fr-above")&&(o+=i.outerHeight())),i.find(".fr-layer").removeClass("fr-active"),i.find(".fr-".concat(e,"-layer")).addClass("fr-active"),w.popups.show("video.insert",t,o,0),w.accessibility.focusPopup(i)},refreshByURLButton:function re(e){var t=w.popups.get("video.insert");t&&t.find(".fr-video-by-url-layer").hasClass("fr-active")&&e.addClass("fr-active").attr("aria-pressed",!0)},refreshEmbedButton:function ne(e){var t=w.popups.get("video.insert");t&&t.find(".fr-video-embed-layer").hasClass("fr-active")&&e.addClass("fr-active").attr("aria-pressed",!0)},refreshUploadButton:function se(e){var t=w.popups.get("video.insert");t&&t.find(".fr-video-upload-layer").hasClass("fr-active")&&e.addClass("fr-active").attr("aria-pressed",!0)},upload:K,insertByURL:function de(e){var t=!!document.getElementById("videoPluginAutoplay")&&document.getElementById("videoPluginAutoplay").checked;if(void 0===e){var o=(e=(w.popups.get("video.insert").find('.fr-video-by-url-layer input[type="text"]').val()||"").trim()).match(/(https?:\/\/)?(www\.)?(player\.)?vimeo\.com\/?(showcase\/)*([0-9))([a-z]*\/)*([0-9]{6,11})[?]?.*/);if(o&&7==o.length){var i=o[6],a=e.substring(0,e.lastIndexOf("/")),r=e.substring(e.lastIndexOf("/")+1,e.length);e=r.includes("?h=")||r.includes("?v=")||i===r?("".concat(a,"/").concat(r)||"").trim():("".concat(a,"?h=").concat(r)||"").trim()}}var n=null;if(/^http/.test(e)||(e="https://".concat(e)),w.helpers.isURL(e))for(var s=0;s<we.VIDEO_PROVIDERS.length;s++){var d=we.VIDEO_PROVIDERS[s],l="autoplay=1&mute=1";if(d.html.includes("autoplay=1")&&document.getElementById("videoPluginAutoplay").checked)d.html=d.html,document.getElementById("videoPluginAutoplay").checked=!1;else if(t){var p=d.html.indexOf("{url}")+5;d.html=[d.html.slice(0,p),l,d.html.slice(p)].join(""),t=!1,document.getElementById("videoPluginAutoplay").checked=!1}else(d=we.VIDEO_PROVIDERS[s]).html=d.html.replace(l,"");if(d.test_regex.test(e)&&new RegExp(w.opts.videoAllowedProviders.join("|")).test(d.provider)){n=e.replace(d.url_regex,d.url_text),n=d.html.replace(/\{url\}/,n);break}}n?h(n):(y(w.language.translate("Something went wrong. Please try again.")),w.events.trigger("video.linkError",[e]))},insertEmbed:function le(e){void 0===e&&(e=w.popups.get("video.insert").find(".fr-video-embed-layer textarea").val()||""),0!==e.length&&we.VIDEO_EMBED_REGEX.test(e)?h(e):(y(w.language.translate("Something went wrong. Please try again.")),w.events.trigger("video.codeError",[e]))},insert:h,align:function pe(e){E.removeClass("fr-fvr fr-fvl"),!w.opts.htmlUntouched&&w.opts.useClasses?"left"==e?E.addClass("fr-fvl"):"right"==e&&E.addClass("fr-fvr"):Z(E,W(),e),te(),M(),r(),w.selection.clear()},refreshAlign:function fe(e){if(!E)return!1;e.find(">*").first().replaceWith(w.icon.create("video-align-".concat(j())))},refreshAlignOnShow:function ce(e,t){E&&t.find('.fr-command[data-param1="'.concat(j(),'"]')).addClass("fr-active").attr("aria-selected",!0)},display:function ve(e){E.removeClass("fr-dvi fr-dvb"),!w.opts.htmlUntouched&&w.opts.useClasses?"inline"==e?E.addClass("fr-dvi"):"block"==e&&E.addClass("fr-dvb"):Z(E,e,j()),te(),M(),r(),w.selection.clear()},refreshDisplayOnShow:function ue(e,t){E&&t.find('.fr-command[data-param1="'.concat(W(),'"]')).addClass("fr-active").attr("aria-selected",!0)},remove:q,hideProgressBar:d,showSizePopup:function ge(){var e=w.popups.get("video.size");e||(e=G()),d(),w.popups.refresh("video.size"),w.popups.setContainer("video.size",w.$sc);var t=E.find("iframe, embed, ".concat(E.find("iframe, embed, audio").get(0)?"audio":"video")),o=t.offset().left+t.outerWidth()/2,i=t.offset().top+t.height();w.popups.show("video.size",o,i,t.height(),!0)},replace:function he(){var e=w.popups.get("video.insert");e||(e=n()),w.popups.isVisible("video.insert")||(d(),w.popups.refresh("video.insert"),w.popups.setContainer("video.insert",w.$sc));var t=E.offset().left+E.outerWidth()/2,o=E.offset().top+E.height();w.popups.show("video.insert",t,o,E.outerHeight(),!0)},back:function e(){E?(w.events.disableBlur(),E[0].click()):(w.events.disableBlur(),w.selection.restore(),w.events.enableBlur(),w.popups.hide("video.insert"),w.toolbar.showInline())},setSize:function me(e,t){if(E){var o=w.popups.get("video.size"),i=E.find("iframe, embed, ".concat(E.find("iframe, embed, audio").get(0)?"audio":"video"));i.css("width",e||o.find('input[name="width"]').val()),i.css("height",t||o.find('input[name="height"]').val()),i.get(0).style.width&&i.removeAttr("width"),i.get(0).style.height&&i.removeAttr("height"),o.find("input:focus").blur(),setTimeout(function(){E.trigger("click")},w.helpers.isAndroid()?50:0)}},get:function be(){return E},showProgressBar:R,_editVideo:l,setAutoplay:function ye(){var e;if(E.find("iframe, embed, audio").get(0))(e=E.find("iframe, embed, audio")).get(0).src.includes("autoplay=1")?(ee("#FFFFFF"),e.get(0).src=e.get(0).src.replace("&autoplay=1","")):(ee("#D6D6D6"),e.get(0).src=e.get(0).src+"&autoplay=1");else if((e=E.find("iframe, embed, video")).get(0).outerHTML.includes("autoplay"))ee("#FFFFFF"),e.get(0).outerHTML=e.get(0).outerHTML.replace("autoplay","");else{ee("#D6D6D6");var t=e.get(0).outerHTML.indexOf("class")-1;e.get(0).outerHTML=[e.get(0).outerHTML.slice(0,t),"autoplay",e.get(0).outerHTML.slice(t)].join("")}}}},we.RegisterCommand("insertVideo",{title:"Insert Video",undo:!1,focus:!0,refreshAfterCallback:!1,popup:!0,callback:function(){this.popups.isVisible("video.insert")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore()),this.popups.hide("video.insert")):this.video.showInsertPopup()},plugin:"video"}),we.DefineIcon("insertVideo",{NAME:"video-camera",FA5NAME:"camera",SVG_KEY:"insertVideo"}),we.DefineIcon("videoByURL",{NAME:"link",SVG_KEY:"insertLink"}),we.RegisterCommand("videoByURL",{title:"By URL",undo:!1,focus:!1,toggle:!0,callback:function(){this.video.showLayer("video-by-url")},refresh:function(e){this.video.refreshByURLButton(e)}}),we.DefineIcon("videoEmbed",{NAME:"code",SVG_KEY:"codeView"}),we.RegisterCommand("videoEmbed",{title:"Embedded Code",undo:!1,focus:!1,toggle:!0,callback:function(){this.video.showLayer("video-embed")},refresh:function(e){this.video.refreshEmbedButton(e)}}),we.DefineIcon("videoUpload",{NAME:"upload",SVG_KEY:"upload"}),we.RegisterCommand("videoUpload",{title:"Upload Video",undo:!1,focus:!1,toggle:!0,callback:function(){this.video.showLayer("video-upload")},refresh:function(e){this.video.refreshUploadButton(e)}}),we.RegisterCommand("videoInsertByURL",{undo:!0,focus:!0,callback:function(){this.video.insertByURL()}}),we.RegisterCommand("videoInsertEmbed",{undo:!0,focus:!0,callback:function(){this.video.insertEmbed()}}),we.DefineIcon("videoDisplay",{NAME:"star",SVG_KEY:"star"}),we.RegisterCommand("videoDisplay",{title:"Display",type:"dropdown",options:{inline:"Inline",block:"Break Text"},callback:function(e,t){this.video.display(t)},refresh:function(e){this.opts.videoTextNear||e.addClass("fr-hidden")},refreshOnShow:function(e,t){this.video.refreshDisplayOnShow(e,t)}}),we.DefineIcon("video-align",{NAME:"align-left",SVG_KEY:"align Left"}),we.DefineIcon("video-align-left",{NAME:"align-left",SVG_KEY:"alignLeft"}),we.DefineIcon("video-align-right",{NAME:"align-right",SVG_KEY:"alignRight"}),we.DefineIcon("video-align-center",{NAME:"align-justify",SVG_KEY:"alignJustify"}),we.DefineIcon("videoAlign",{NAME:"align-center",SVG_KEY:"alignCenter"}),we.RegisterCommand("videoAlign",{type:"dropdown",title:"Align",options:{left:"Align Left",center:"None",right:"Align Right"},html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=we.COMMANDS.videoAlign.options;for(var o in t)t.hasOwnProperty(o)&&(e+='<li role="presentation"><a class="fr-command fr-title" tabIndex="-1" role="option" data-cmd="videoAlign" data-param1="'.concat(o,'" title="').concat(this.language.translate(t[o]),'">').concat(this.icon.create("video-align-".concat(o)),'<span class="fr-sr-only">').concat(this.language.translate(t[o]),"</span></a></li>"));return e+="</ul>"},callback:function(e,t){this.video.align(t)},refresh:function(e){this.video.refreshAlign(e)},refreshOnShow:function(e,t){this.video.refreshAlignOnShow(e,t)}}),we.DefineIcon("videoReplace",{NAME:"exchange",FA5NAME:"exchange-alt",SVG_KEY:"replaceImage"}),we.RegisterCommand("videoReplace",{title:"Replace",undo:!1,focus:!1,popup:!0,refreshAfterCallback:!1,callback:function(){this.video.replace()}}),we.DefineIcon("videoRemove",{NAME:"trash",SVG_KEY:"remove"}),we.RegisterCommand("videoRemove",{title:"Remove",callback:function(){this.video.remove()}}),we.DefineIcon("autoplay",{NAME:"autoplay",SVG_KEY:"autoplay"}),we.RegisterCommand("autoplay",{undo:!1,focus:!1,popup:!0,title:"Autoplay",callback:function(){this.video.setAutoplay()}}),we.DefineIcon("videoSize",{NAME:"arrows-alt",SVG_KEY:"imageSize"}
vendor: 1,498 bytes, lines 807-815
807),we.RegisterCommand("videoSize",{undo:!1,focus:!1,popup:!0,title:"Change Size",callback:function(){this.video.showSizePopup()}}),we.DefineIcon("videoBack",{NAME:"arrow-left",SVG_KEY:"back"}),we.RegisterCommand("videoBack",{title:"Back",undo:!1,focus:!1,back:!0,callback:function(){this.video.back()},refresh:function(e){this.video.get()||this.opts.toolbarInline?(e.removeClass("fr-hidden"),e.next().hasClass("fr-separator")&&e.next().removeClass("fr-hidden")):(e.addClass("fr-hidden"),e.next().hasClass("fr-separator")&&e.next().addClass("fr-hidden"))}}),we.RegisterCommand("videoDismissError",{title:"OK",undo:!1,callback:function(){this.video.hideProgressBar(!0)}}),we.RegisterCommand("videoSetSize",{undo:!0,focus:!1,title:"Update",refreshAfterCallback:!1,callback:function(){this.video.setSize()}})});
808},{"froala-editor":8}],25:[function(require,module,exports){
809/*!
810 * froala_editor v4.0.17 (https://www.froala.com/wysiwyg-editor)
811 * License https://froala.com/wysiwyg-editor/terms/
812 * Copyright 2014-2023 Froala Labs
813 */
814
815!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?a(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],a):a(e.FroalaEditor)}(this,function(g){"use strict";g=g&&g.hasOwnProperty("default")?g["default"]:g,Object.assign(g.DEFAULTS,{fontAwesomeTemplate:'<i class="fa  fa-[NAME] fr-deletable" aria-hidden="true">&nbsp;</i>',fontAwesomeTemplate5:'<i class="fa [FPREFIX] fa-[NAME] fr-deletable" aria-hidden="true">&nbsp;
vendor: 9,501 bytes, line 815
815</i>',fontAwesomeSets:[{title:"Web Application Icons",icon:"address-book",list:["address-book","address-book-o","address-card","address-card-o","adjust","american-sign-language-interpreting","anchor","archive","area-chart","arrows","arrows-h","arrows-v","asl-interpreting ","assistive-listening-systems","asterisk","at","audio-description","automobile ","balance-scale","ban","bank ","bar-chart","bar-chart-o ","barcode","bars","bath","bathtub ","battery ","battery-0 ","battery-1 ","battery-2 ","battery-3 ","battery-4 ","battery-empty","battery-full","battery-half","battery-quarter","battery-three-quarters","bed","beer","bell","bell-o","bell-slash","bell-slash-o","bicycle","binoculars","birthday-cake","blind","bluetooth","bluetooth-b","bolt","bomb","book","bookmark","bookmark-o","braille","briefcase","bug","building","building-o","bullhorn","bullseye","bus","cab ","calculator","calendar","calendar-check-o","calendar-minus-o","calendar-o","calendar-plus-o","calendar-times-o","camera","camera-retro","car","caret-square-o-down","caret-square-o-left","caret-square-o-right","caret-square-o-up","cart-arrow-down","cart-plus","cc","certificate","check","check-circle","check-circle-o","check-square","check-square-o","child","circle","circle-o","circle-o-notch","circle-thin","clock-o","clone","close ","cloud","cloud-download","cloud-upload","code","code-fork","coffee","cog","cogs","comment","comment-o","commenting","commenting-o","comments","comments-o","compass","copyright","creative-commons","credit-card","credit-card-alt","crop","crosshairs","cube","cubes","cutlery","dashboard ","database","deaf","deafness ","desktop","diamond","dot-circle-o","download","drivers-license ","drivers-license-o ","edit ","ellipsis-h","ellipsis-v","envelope","envelope-o","envelope-open","envelope-open-o","envelope-square","eraser","exchange","exclamation","exclamation-circle","exclamation-triangle","external-link","external-link-square","eye","eye-slash","eyedropper","fax","feed ","female","fighter-jet","file-archive-o","file-audio-o","file-code-o","file-excel-o","file-image-o","file-movie-o ","file-pdf-o","file-photo-o ","file-picture-o ","file-powerpoint-o","file-sound-o ","file-video-o","file-word-o","file-zip-o ","film","filter","fire","fire-extinguisher","flag","flag-checkered","flag-o","flash ","flask","folder","folder-o","folder-open","folder-open-o","frown-o","futbol-o","gamepad","gavel","gear ","gears ","gift","glass","globe","graduation-cap","group ","hand-grab-o ","hand-lizard-o","hand-paper-o","hand-peace-o","hand-pointer-o","hand-rock-o","hand-scissors-o","hand-spock-o","hand-stop-o ","handshake-o","hard-of-hearing ","hashtag","hdd-o","headphones","heart","heart-o","heartbeat","history","home","hotel ","hourglass","hourglass-1 ","hourglass-2 ","hourglass-3 ","hourglass-end","hourglass-half","hourglass-o","hourglass-start","i-cursor","id-badge","id-card","id-card-o","image ","inbox","industry","info","info-circle","institution ","key","keyboard-o","language","laptop","leaf","legal ","lemon-o","level-down","level-up","life-bouy ","life-buoy ","life-ring","life-saver ","lightbulb-o","line-chart","location-arrow","lock","low-vision","magic","magnet","mail-forward ","mail-reply ","mail-reply-all ","male","map","map-marker","map-o","map-pin","map-signs","meh-o","microchip","microphone","microphone-slash","minus","minus-circle","minus-square","minus-square-o","mobile","mobile-phone ","money","moon-o","mortar-board ","motorcycle","mouse-pointer","music","navicon ","newspaper-o","object-group","object-ungroup","paint-brush","paper-plane","paper-plane-o","paw","pencil","pencil-square","pencil-square-o","percent","phone","phone-square","photo ","picture-o","pie-chart","plane","plug","plus","plus-circle","plus-square","plus-square-o","podcast","power-off","print","puzzle-piece","qrcode","question","question-circle","question-circle-o","quote-left","quote-right","random","recycle","refresh","registered","remove ","reorder ","reply","reply-all","retweet","road","rocket","rss","rss-square","s15 ","search","search-minus","search-plus","send ","send-o ","server","share","share-alt","share-alt-square","share-square","share-square-o","shield","ship","shopping-bag","shopping-basket","shopping-cart","shower","sign-in","sign-language","sign-out","signal","signing ","sitemap","sliders","smile-o","snowflake-o","soccer-ball-o ","sort","sort-alpha-asc","sort-alpha-desc","sort-amount-asc","sort-amount-desc","sort-asc","sort-desc","sort-down ","sort-numeric-asc","sort-numeric-desc","sort-up ","space-shuttle","spinner","spoon","square","square-o","star","star-half","star-half-empty ","star-half-full ","star-half-o","star-o","sticky-note","sticky-note-o","street-view","suitcase","sun-o","support ","tablet","tachometer","tag","tags","tasks","taxi","television","terminal","thermometer ","thermometer-0 ","thermometer-1 ","thermometer-2 ","thermometer-3 ","thermometer-4 ","thermometer-empty","thermometer-full","thermometer-half","thermometer-quarter","thermometer-three-quarters","thumb-tack","thumbs-down","thumbs-o-down","thumbs-o-up","thumbs-up","ticket","times","times-circle","times-circle-o","times-rectangle ","times-rectangle-o ","tint","toggle-down ","toggle-left ","toggle-off","toggle-on","toggle-right ","toggle-up ","trademark","trash","trash-o","tree","trophy","truck","tty","tv ","umbrella","universal-access","university","unlock","unlock-alt","unsorted ","upload","user","user-circle","user-circle-o","user-o","user-plus","user-secret","user-times","users","vcard ","vcard-o ","video-camera","volume-control-phone","volume-down","volume-off","volume-up","warning ","wheelchair","wheelchair-alt","wifi","window-close","window-close-o","window-maximize","window-minimize","window-restore","wrench"]},{title:"Accessibility Icons",icon:"american-sign-language-interpreting",list:["american-sign-language-interpreting","asl-interpreting ","assistive-listening-systems","audio-description","blind","braille","cc","deaf","deafness ","hard-of-hearing ","low-vision","question-circle-o","sign-language","signing ","tty","universal-access","volume-control-phone","wheelchair","wheelchair-alt"]},{title:"Hand Icons",icon:"hand-grab-o",list:["hand-grab-o ","hand-lizard-o","hand-o-down","hand-o-left","hand-o-right","hand-o-up","hand-paper-o","hand-peace-o","hand-pointer-o","hand-rock-o","hand-scissors-o","hand-spock-o","hand-stop-o ","thumbs-down","thumbs-o-down","thumbs-o-up","thumbs-up"]},{title:"Transportation Icons",icon:"ambulance",list:["ambulance","automobile ","bicycle","bus","cab ","car","fighter-jet","motorcycle","plane","rocket","ship","space-shuttle","subway","taxi","train","truck","wheelchair","wheelchair-alt"]},{title:"Gender Icons",icon:"genderless",list:["genderless","intersex ","mars","mars-double","mars-stroke","mars-stroke-h","mars-stroke-v","mercury","neuter","transgender","transgender-alt","venus","venus-double","venus-mars"]},{title:"Form Control Icons",icon:"check-square",list:["check-square","check-square-o","circle","circle-o","dot-circle-o","minus-square","minus-square-o","plus-square","plus-square-o","square","square-o"]},{title:"Payment Icons",icon:"cc-amex",list:["cc-amex","cc-diners-club","cc-discover","cc-jcb","cc-mastercard","cc-paypal","cc-stripe","cc-visa","credit-card","credit-card-alt","google-wallet","paypal"]},{title:"Chart Icons",icon:"area-chart",list:["area-chart","bar-chart","bar-chart-o ","line-chart","pie-chart"]},{title:"Currency Icons",icon:"bitcoin",list:["bitcoin ","btc","cny ","dollar ","eur","euro ","gbp","gg","gg-circle","ils","inr","jpy","krw","money","rmb ","rouble ","rub","ruble ","rupee ","shekel ","sheqel ","try","turkish-lira ","usd","viacoin","won ","yen"]},{title:"Text Editor Icons",icon:"align-center",list:["align-center","align-justify","align-left","align-right","bold","chain ","chain-broken","clipboard","columns","copy ","cut ","dedent ","eraser","file","file-o","file-text","file-text-o","files-o","floppy-o","font","header","indent","italic","link","list","list-alt","list-ol","list-ul","outdent","paperclip","paragraph","paste ","repeat","rotate-left ","rotate-right ","save ","scissors","strikethrough","subscript","superscript","table","text-height","text-width","th","th-large","th-list","underline","undo","unlink"]},{title:"Brand Icons",icon:"500px",list:["500px","adn","amazon","android","angellist","apple","bandcamp","behance","behance-square","bitbucket","bitbucket-square","bitcoin ","black-tie","bluetooth","bluetooth-b","btc","buysellads","cc-amex","cc-diners-club","cc-discover","cc-jcb","cc-mastercard","cc-paypal","cc-stripe","cc-visa","chrome","codepen","codiepie","connectdevelop","contao","css3","dashcube","delicious","deviantart","digg","dribbble","dropbox","drupal","edge","eercast","empire","envira","etsy","expeditedssl","fa ","facebook","facebook-f ","facebook-official","facebook-square","firefox","first-order","flickr","font-awesome","fonticons","fort-awesome","forumbee","foursquare","free-code-camp","ge ","get-pocket","gg","gg-circle","git","git-square","github","github-alt","github-square","gitlab","gittip ","glide","glide-g","google","google-plus","google-plus-circle ","google-plus-official","google-plus-square","google-wallet","gratipay","grav","hacker-news","houzz","html5","imdb","instagram","internet-explorer","ioxhost","joomla","jsfiddle","lastfm","lastfm-square","leanpub","linkedin","linkedin-square","linode","linux","maxcdn","meanpath","medium","meetup","mixcloud","modx","odnoklassniki","odnoklassniki-square","o
vendor: 11,697 bytes, line 815
815pencart","openid","opera","optin-monster","pagelines","paypal","pied-piper","pied-piper-alt","pied-piper-pp","pinterest","pinterest-p","pinterest-square","product-hunt","qq","quora","ra ","ravelry","rebel","reddit","reddit-alien","reddit-square","renren","resistance ","safari","scribd","sellsy","share-alt","share-alt-square","shirtsinbulk","simplybuilt","skyatlas","skype","slack","slideshare","snapchat","snapchat-ghost","snapchat-square","soundcloud","spotify","stack-exchange","stack-overflow","steam","steam-square","stumbleupon","stumbleupon-circle","superpowers","telegram","tencent-weibo","themeisle","trello","tripadvisor","tumblr","tumblr-square","twitch","twitter","twitter-square","usb","viacoin","viadeo","viadeo-square","vimeo","vimeo-square","vine","vk","wechat ","weibo","weixin","whatsapp","wikipedia-w","windows","wordpress","wpbeginner","wpexplorer","wpforms","xing","xing-square","y-combinator","y-combinator-square ","yahoo","yc ","yc-square ","yelp","yoast","youtube","youtube-play","youtube-square"]}],fontAwesome5Sets:[{title:"Web Application Icons",icon:"address-book",list:["address-book","far address-book","fas address-card","far address-card","adjust","fas american-sign-language-interpreting","anchor","archive","fas chart-area","fas arrows-alt","fas arrows-alt-h","fas arrows-alt-v","assistive-listening-systems","asterisk","at","audio-description","fas car","balance-scale","ban","fas university","far chart-bar","barcode","bars","fas bath","fas battery-full","fas battery-empty","fas battery-quarter","fas battery-half","fas battery-three-quarters","bed","beer","bell","far bell","bell-slash","far bell-slash","bicycle","binoculars","birthday-cake","blind","fab bluetooth","fab bluetooth-b","bolt","bomb","book","bookmark","far bookmark","braille","briefcase","bug","building","far building","bullhorn","bullseye","bus","fas taxi","calculator","calendar","far calendar-check","far calendar-minus","far calendar","far calendar-plus","far calendar-times","camera","camera-retro","car","far caret-square-down","far caret-square-left","far caret-square-right","far caret-square-up","cart-arrow-down","cart-plus","far closed-captioning","certificate","check","check-circle","far check-circle","check-square","far check-square","child","circle","far circle","fas circle-notch","far clock","clone","fas times","cloud","fas cloud-download-alt","fas cloud-upload-alt","code","fas code-branch","coffee","fas cog","fas cogs","comment","far comment","comments","far comments","compass","copyright","fab creative-commons","far credit-card","fas credit-card","crop","crosshairs","cube","cubes","fas utensils","fas tachometer-alt","database","fas deaf","desktop","far gem","far dot-circle","download","fas id-card","far id-card","edit ","ellipsis-h","ellipsis-v","envelope","far envelope","envelope-open","far envelope-open","envelope-square","eraser","fas exchange-alt","exclamation","exclamation-circle","fas exclamation-triangle","fas external-link-alt","fas external-link-square-alt","eye","eye-slash","fas eye-dropper","fax","fas rss","female","fighter-jet","far file-archive","far file-audio","far file-code","far file-excel","far file-image","far file-video","far file-pdf","far file-powerpoint","far file-word","film","filter","fire","fire-extinguisher","flag","flag-checkered","far flag","fas bolt","flask","folder","far folder","folder-open","far folder-open","far frown","far futbol","gamepad","fas gavel","gift","fas glass-martini","globe","fas graduation-cap","fas users","far hand-rock","far hand-lizard","far hand-paper","far hand-peace","far hand-pointer","far hand-scissors","far hand-spock","far handshake","hashtag","far hdd","headphones","heart","far heart","heartbeat","history","home","fas bed","hourglass","fas hourglass-start","fas hourglass-half","fas hourglass-end","far hourglass","i-cursor","id-badge","image ","inbox","industry","info","info-circle","key","far keyboard","language","laptop","leaf","far lemon","fas level-down-alt","fas level-up-alt","far life-ring","far lightbulb","fas chart-line","location-arrow","lock","low-vision","magic","magnet","fas share","fas reply ","fas reply-all ","male","map","map-marker","far map","map-pin","map-signs","far meh","microchip","microphone","microphone-slash","minus","minus-circle","minus-square","far minus-square","mobile","far money-bill-alt","far moon","motorcycle","mouse-pointer","music","fas bars","far newspaper","object-group","object-ungroup","paint-brush","fas paper-plane","far paper-plane","paw","fas pencil-alt","fas pen-square","far edit","percent","phone","phone-square","far image","fas chart-pie","plane","plug","plus","plus-circle","plus-square","far plus-square","podcast","power-off","print","puzzle-piece","qrcode","question","question-circle","far question-circle","quote-left","quote-right","random","recycle","fas sync","registered","reply","reply-all","retweet","road","rocket","rss","rss-square","search","search-minus","search-plus","server","share-alt","share-alt-square","share-square","far share-square","fas shield-alt","ship","shopping-bag","shopping-basket","shopping-cart","shower","fas sign-in-alt","fas sign-language","fas sign-out-alt","signal","sitemap","fas sliders-h","far smile","far snowflake","sort","fas sort-alpha-down","fas sort-alpha-up","fas sort-amount-down","fas sort-amount-up","fas sort-up","fas sort-down","fas sort-numeric-down","fas sort-numeric-up","space-shuttle","spinner","fas utensil-spoon","square","far square","star","far star-half","far star","sticky-note","far sticky-note","street-view","suitcase","far sun","tablet","tag","tags","tasks","taxi","fas tv","terminal","fas thermometer-empty","fas thermometer-full","fas thermometer-half","fas thermometer-quarter","fas thermometer-three-quarters","fas thumbtack","thumbs-down","far thumbs-down","far thumbs-up","thumbs-up","fas ticket-alt","times","times-circle","far times-circle","fas window-close","far window-close ","tint","toggle-off","toggle-on","trademark","trash","far trash-alt","tree","trophy","truck","tty","tv ","umbrella","universal-access","university","unlock","unlock-alt","fas sort","upload","user","user-circle","far user-circle","far user","user-plus","user-secret","user-times","fas video","fas phone-volume","volume-down","volume-off","volume-up","wheelchair","fab accessible-icon","wifi","window-maximize","window-minimize","window-restore","wrench"]},{title:"Accessibility Icons",icon:"american-sign-language-interpreting",list:["fas american-sign-language-interpreting","assistive-listening-systems","audio-description","blind","braille","far closed-captioning","fas deaf","low-vision","far question-circle","fas sign-language","tty","universal-access","fas phone-volume","wheelchair","fab accessible-icon"]},{title:"Hand Icons",icon:"hand-grab-o",list:["far hand-rock","far hand-lizard","far hand-point-down","far hand-point-left","far hand-point-right","far hand-point-up","far hand-paper","far hand-peace","far hand-pointer","far hand-scissors","far hand-spock","thumbs-down","far thumbs-down","far thumbs-up","thumbs-up"]},{title:"Transportation Icons",icon:"ambulance",list:["ambulance","fas car","bicycle","bus","fas taxi","car","fighter-jet","motorcycle","plane","rocket","ship","space-shuttle","subway","taxi","train","truck","wheelchair","fab accessible-icon"]},{title:"Gender Icons",icon:"genderless",list:["genderless","mars","mars-double","mars-stroke","mars-stroke-h","mars-stroke-v","mercury","neuter","fas transgender","transgender-alt","venus","venus-double","venus-mars"]},{title:"Form Control Icons",icon:"check-square",list:["check-square","far check-square","circle","far circle","far dot-circle","minus-square","far minus-square","plus-square","far plus-square","square","far square"]},{title:"Payment Icons",icon:"cc-amex",list:["fab cc-amex","fab cc-diners-club","fab cc-discover","fab cc-jcb","fab cc-mastercard","fab cc-paypal","fab cc-stripe","fab cc-visa","far credit-card","fas credit-card","fab google-wallet","fab paypal"]},{title:"Chart Icons",icon:"area-chart",list:["fas chart-area","far chart-bar","fas chart-line","fas chart-pie"]},{title:"Currency Icons",icon:"bitcoin",list:["fab btc","fas yen-sign","fas dollar-sign","fas euro-sign","fas pound-sign","fab gg","fab gg-circle","fas shekel-sign","fas rupee-sign","fas won-sign","far money-bill-alt","fas ruble-sign ","fas lira-sign","fab viacoin"]},{title:"Text Editor Icons",icon:"align-center",list:["align-center","align-justify","align-left","align-right","bold","fas link","fas unlink","clipboard","columns","copy ","cut ","fas outdent","eraser","file","far file","fas file-alt","far file-alt","far copy","far save","font","fas heading","indent","italic","list","list-alt","list-ol","list-ul","paperclip","paragraph","paste ","fas undo","fas redo ","save","strikethrough","subscript","superscript","table","text-height","text-width","th","th-large","th-list","underline"]},{title:"Brand Icons",icon:"500px",list:["fab 500px","fab adn","fab amazon","fab android","fab angellist","fab apple","fab bandcamp","fab behance","fab behance-square","fab bitbucket","fab btc","fab black-tie","fab bluetooth","fab bluetooth-b","fab buysellads","fab cc-amex","fab cc-diners-club","fab cc-discover","fab cc-jcb","fab cc-mastercard","fab cc-paypal","fab cc-stripe","fab cc-visa","fab chrome","fab codepen","fab codiepie","fab connectdevelop","fab contao","fab css3","fab dashcube","fab delicious","fab deviantart","fab digg","fab dribbble","fab dropbox","fab drupal","fab edge","fab sellcast","fab empire","fab envira","fab etsy","fab expeditedssl","fab font-awesome","fab facebook-f","fab facebook","fab facebook-square","fab firefox","fab first-order","fab flickr","fab fonticons","fab fort-awesome","fab forumbee","fab foursquare","fab free-code-camp","fab get-pocket","fab gg","fab gg-circle","fab git","fab git-square","fab github","fab github-alt","fab github-square","fab gitlab","fab gratipay","fab glide","fab glide-g","fab google","fab google-plus-g","fab google-plus","fab google-plus-square","fab google-wallet","fab grav","fab hacker-news","fab houzz","fab html5","fab imdb","fab instagram","fab internet-explorer","fab ioxhost","fab joomla","fab jsfiddle","fab lastfm","fab lastfm-square","fab leanpub","fab linkedin-in","fab linkedin","fab linode","fab linux","fab maxcdn","fab medium","fab meetup","fab mixcloud","fab modx","fab odnoklassniki","fab odnoklassniki-square","fab opencart","fab openid","fab opera","fab optin-monster","fab pagelines","fab paypal","fab pied-piper","fab pied-piper-alt","fab pied-piper-pp","fab pinterest","fab pinterest-p","fab pinterest-square","fab product-hunt","fab qq","fab quora","fab rebel","fab ravelry","fab reddit","fab reddit-alien","fab reddit-square","fab renren","fab safari","fab scribd","fab sellsy","share-alt","share-alt-square","fab shirtsinbulk","fab simplybuilt","fab skyatlas","fab skype","fab slack","fab slideshare","fab snapchat","fab snapchat-ghost","fab snapchat-square","fab soundcloud","fab spotify","fab stack-exchange","fab stack-overflow","fab steam","fab steam-square","fab stumbleupon","fab stumbleupon-circle","fab superpowers","fab telegram","fab tencent-weibo","fab themeisle","fab trello","fab tripadvisor","fab tumblr","fab tumblr-square","fab twitch","fab twitter","fab twitter-square","fab usb","fab viacoin","fab viadeo","fab viadeo-square","fab vimeo","fab vimeo-square","fab vine","fab vk","fab weixin","fab weibo","fab whatsapp","fab wikipedia-w","fab windows","fab wordpress","fab wpbeginner","fab wpexplorer","fab wpforms","fab xing","fab xing-square","fab y-combinator","fab yahoo","fab yelp","fab yoast","fab youtube","fab youtube-square"]}],faButtons:["fontAwesomeBack","|"]}),Object.assign(
815g.POPUP_TEMPLATES,{fontAwesome:"[_BUTTONS_][_CUSTOM_LAYER_]"}),g.PLUGINS.fontAwesome=function(h){var m=h.$;"font_awesome_5"===h.opts.iconsTemplate&&(h.opts.fontAwesomeSets=h.opts.fontAwesome5Sets,h.opts.fontAwesomeTemplate=h.opts.fontAwesomeTemplate5);var t=h.opts.fontAwesomeSets[0],o=h.opts.fontAwesomeSets,r="";function i(){h.opts.toolbarInline&&0<h.opts.faButtons.length&&(r='<div class="fr-buttons fr-tabs">'.concat(h.button.buildList(h.opts.faButtons),"</div>"));var e={buttons:r,custom_layer:s()},a=h.popups.create("fontAwesome",e);return function t(d){h.events.on("popup.tab",function(e){var a=m(e.currentTarget);if(!h.popups.isVisible("fontAwesome")||!a.is("span, a"))return!0;var t,r,s,o=e.which;if(g.KEYCODE.TAB==o){if(a.is("span.fr-icon")&&e.shiftKey||a.is("a")&&!e.shiftKey){var i=d.find(".fr-buttons");t=!h.accessibility.focusToolbar(i,!!e.shiftKey)}if(!1!==t){var n=d.find("span.fr-icon:focus").first().concat(d.findVisible(" span.fr-icon").first().concat(d.find("a")));a.is("span.fr-icon")&&(n=n.not("span.fr-icon:not(:focus)")),r=n.index(a),r=e.shiftKey?((r-1)%n.length+n.length)%n.length:(r+1)%n.length,s=n.get(r),h.events.disableBlur(),s.focus(),t=!1}}else if(g.KEYCODE.ARROW_UP==o||g.KEYCODE.ARROW_DOWN==o||g.KEYCODE.ARROW_LEFT==o||g.KEYCODE.ARROW_RIGHT==o){if(a.is("span.fr-icon")){var l=a.parent().find("span.fr-icon");r=l.index(a);var c=Math.floor(l.length/8),f=r%8,u=Math.floor(r/8),p=8*u+f,b=8*c;g.KEYCODE.ARROW_UP==o?p=((p-8)%b+b)%b:g.KEYCODE.ARROW_DOWN==o?p=(p+8)%b:g.KEYCODE.ARROW_LEFT==o?p=((p-1)%b+b)%b:g.KEYCODE.ARROW_RIGHT==o&&(p=(p+1)%b),s=m(l.get(p)),h.events.disableBlur(),s.focus(),t=!1}}else g.KEYCODE.ENTER==o&&(a.is("a")?a[0].click():h.button.exec(a),t=!1);return!1===t&&(e.preventDefault(),e.stopPropagation()),t},!0)}(a),a}function s(){return"".concat(function r(e,a,t){return'\n        <div class="fr-buttons fr-tabs fr-tabs-scroll">\n            '.concat(function n(e,t,r){var s="";if("font_awesome_5"===h.opts.iconsTemplate){var o="",i=r;e.forEach(function(e){o="cc-amex"===e.icon||"bitcoin"==e.icon||"500px"==e.icon?i.replace("fa ","fab "):r;var a={elementClass:e.title===t.title?"fr-active fr-active-tab":"",title:e.title,dataCmd:"setIconCategory",dataParam1:e.title,iconValue:o.replace(/\[NAME\]/g,e.icon)};s+='<button class="fr-fa-icon-category fr-command fr-btn '.concat(a.elementClass,'" title="').concat(a.title,'" data-cmd="').concat(a.dataCmd,'" data-param1="').concat(a.dataParam1,'"</button><span>').concat(a.iconValue,"</span>")})}else e.forEach(function(e){var a={elementClass:e.title===t.title?"fr-active fr-active-tab":"",title:e.title,dataCmd:"setIconCategory",dataParam1:e.title,iconValue:r.replace(/\[NAME\]/g,e.icon)};s+='<button class="fr-fa-icon-category fr-command fr-btn '.concat(a.elementClass,'" title="').concat(a.title,'" data-cmd="').concat(a.dataCmd,'" data-param1="').concat(a.dataParam1,'"</button><span>').concat(a.iconValue,"</span>")});return s}(e,a,t),"\n        </div>\n        ")}(o,t,h.opts.fontAwesomeTemplate),"\n                     ").concat(function s(e,a){return'\n        <div class="fr-icon-container fr-fa-container">\n            '.concat(function t(e,n){var l="";return e.list.forEach(function(e){if("font_awesome_5"===h.opts.iconsTemplate){var a={name:e,fprefix:"fa"},t=e.trim().split(" ");1<t.length&&(a={name:t[1],fprefix:t[0]});var r=h.opts.fontAwesomeTemplate.replace(/\[NAME\]|\[FPREFIX\]/g,function(e){return a[e.substring(1,e.length-1).toLowerCase()]});0<r.search("fab")&&(r=r.replace("fa",""));var s=e,o=e;
815n.replace(/\[NAME\]/g,e),l+='<span class="fr-command fr-fa-icon fr-icon" data-cmd="insertIcon" data-param1="'+s+'" title="'+o+'" tabIndex="-1"  role="button" value="'+a.name+'" data-fprefix="'+a.fprefix+'">'+r+'<span class="fr-sr-only">'+h.language.translate("Example of")+a.name+"&nbsp;&nbsp;&nbsp;</span></span>"}else{var i={dataParam1:e,title:e,iconValue:n.replace(/\[NAME\]/g,e)};l+='<span class="fr-command fr-fa-icon fr-icon" role="button" data-cmd="insertIcon" data-param1="'.concat(i.dataParam1,'" title="').concat(i.title,'">').concat(i.iconValue,"</span>")}}),l}(e,a),"\n        </div>\n        ")}(t,h.opts.fontAwesomeTemplate))}return{setIconCategory:function n(a){t=o.filter(function(e){return e.title===a})[0],function e(){h.popups.get("fontAwesome").html(r+s())}()},showFontAwesomePopup:function l(){var e=h.popups.get("fontAwesome");if(e||(e=i()),!e.hasClass("fr-active")){h.popups.refresh("fontAwesome"),h.popups.setContainer("fontAwesome",h.$tb);var a=h.$tb.find('.fr-command[data-cmd="fontAwesome"]'),t=h.button.getPosition(a),r=t.left,s=t.top;h.popups.show("fontAwesome",r,s,a.outerHeight())}},back:function e(){h.popups.hide("fontAwesome"),h.toolbar.showInline()}}},g.DefineIcon("fontAwesome",{NAME:"flag",SVG_KEY:"fontAwesome"}),g.RegisterCommand("fontAwesome",{title:"Font Awesome",icon:"fontAwesome",undo:!1,focus:!1,refreshAfterCallback:!1,popup:!0,callback:function(){this.popups.isVisible("fontAwesome")?(this.$el.find(".fr-marker")&&(this.events.disableBlur(),this.selection.restore()),this.popups.hide("fontAwesome")):this.fontAwesome.showFontAwesomePopup()},plugin:"fontAwesome",showOnMobile:!0}),g.RegisterCommand("insertIcon",{callback:function(e,a){if(this.opts&&"font_awesome_5"===this.opts.iconsTemplate){var t={name:a,fprefix:"fa"},r=this.opts.fontAwesomeTemplate.replace(/\[NAME\]|\[FPREFIX\]/g,function(e){return t[e.substring(1,e.length-1).toLowerCase()]});this.undo.saveStep(),this.html.insert(r,!0),this.undo.saveStep()}else this.undo.saveStep(),this.html.insert("".concat(this.opts.fontAwesomeTemplate.replace(/\[NAME\]/g,a),"&nbsp;")),this.undo.saveStep();this.popups.hide("fontAwesome")}}),g.RegisterCommand("setIconCategory",{undo:!1,focus:!1,callback:function(e,a){this.fontAwesome.setIconCategory(a)}}),g.DefineIcon("fontAwesomeBack",{NAME:"arrow-left",SVG_KEY:"back"}),g.RegisterCommand("fontAwesomeBack",{title:"Back",undo:!1,focus:!1,back:!0,refreshAfterCallback:!1,callback:function(){this.fontAwesome.back()}})});
816},{"froala-editor":8}],26:[function(require,module,exports){
817(function (global){(function (){
818
819; require("jquery");
820; var __browserify_shim_require__=require;(function browserifyShim(module, define, require) {
821/*!
822 * jQuery Validation Plugin v1.19.5
823 *
824 * https://jqueryvalidation.org/
825 *
826 * Copyright (c) 2022 Jörn Zaefferer
827 * Released under the MIT license
828 */
829(function( factory ) {
830	if ( typeof define === "function" && define.amd ) {
831		define( ["jquery"], factory );
832	} else if (typeof module === "object" && module.exports) {
833		module.exports = factory( (typeof window !== "undefined" ? window['$'] : typeof global !== "undefined" ? global['$'] : null) );
834	} else {
835		factory( jQuery );
836	}
837}(function( $ ) {
838
839$.extend( $.fn, {
840
841	// https://jqueryvalidation.org/validate/
842	validate: function( options ) {
843
844		// If nothing is selected, return nothing; can't chain anyway
845		if ( !this.length ) {
846			if ( options && options.debug && window.console ) {
847				console.warn( "Nothing selected, can't validate, returning nothing." );
848			}
849			return;
850		}
851
852		// Check if a validator for this form was already created
853		var validator = $.data( this[ 0 ], "validator" );
854		if ( validator ) {
855			return validator;
856		}
857
858		// Add novalidate tag if HTML5.
859		this.attr( "novalidate", "novalidate" );
860
861		validator = new $.validator( options, this[ 0 ] );
862		$.data( this[ 0 ], "validator", validator );
863
864		if ( validator.settings.onsubmit ) {
865
866			this.on( "click.validate", ":submit", function( event ) {
867
868				// Track the used submit button to properly handle scripted
869				// submits later.
870				validator.submitButton = event.currentTarget;
871
872				// Allow suppressing validation by adding a cancel class to the submit button
873				if ( $( this ).hasClass( "cancel" ) ) {
874					validator.cancelSubmit = true;
875				}
876
877				// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
878				if ( $( this ).attr( "formnovalidate" ) !== undefined ) {
879					validator.cancelSubmit = true;
880				}
881			} );
882
883			// Validate the form on submit
884			this.on( "submit.validate", function( event ) {
885				if ( validator.settings.debug ) {
886
887					// Prevent form submit to be able to see console output
888					event.preventDefault();
889				}
890
891				function handle() {
892					var hidden, result;
893
894					// Insert a hidden input as a replacement for the missing submit button
895					// The hidden input is inserted in two cases:
896					//   - A user defined a `submitHandler`
897					//   - There was a pending request due to `remote` method and `stopRequest()`
898					//     was called to submit the form in case it's valid
899					if ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {
900						hidden = $( "<input type='hidden'/>" )
901							.attr( "name", validator.submitButton.name )
902							.val( $( validator.submitButton ).val() )
903							.appendTo( validator.currentForm );
904					}
905
906					if ( validator.settings.submitHandler && !validator.settings.debug ) {
907						result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
908						if ( hidden ) {
909
910							// And clean up afterwards; thanks to no-block-scope, hidden can be referenced
911							hidden.remove();
912						}
913						if ( result !== undefined ) {
914							return result;
915						}
916						return false;
vendor: 24,311 bytes, lines 917-1739
917					}
918					return true;
919				}
920
921				// Prevent submit for invalid forms or custom submit handlers
922				if ( validator.cancelSubmit ) {
923					validator.cancelSubmit = false;
924					return handle();
925				}
926				if ( validator.form() ) {
927					if ( validator.pendingRequest ) {
928						validator.formSubmitted = true;
929						return false;
930					}
931					return handle();
932				} else {
933					validator.focusInvalid();
934					return false;
935				}
936			} );
937		}
938
939		return validator;
940	},
941
942	// https://jqueryvalidation.org/valid/
943	valid: function() {
944		var valid, validator, errorList;
945
946		if ( $( this[ 0 ] ).is( "form" ) ) {
947			valid = this.validate().form();
948		} else {
949			errorList = [];
950			valid = true;
951			validator = $( this[ 0 ].form ).validate();
952			this.each( function() {
953				valid = validator.element( this ) && valid;
954				if ( !valid ) {
955					errorList = errorList.concat( validator.errorList );
956				}
957			} );
958			validator.errorList = errorList;
959		}
960		return valid;
961	},
962
963	// https://jqueryvalidation.org/rules/
964	rules: function( command, argument ) {
965		var element = this[ 0 ],
966			isContentEditable = typeof this.attr( "contenteditable" ) !== "undefined" && this.attr( "contenteditable" ) !== "false",
967			settings, staticRules, existingRules, data, param, filtered;
968
969		// If nothing is selected, return empty object; can't chain anyway
970		if ( element == null ) {
971			return;
972		}
973
974		if ( !element.form && isContentEditable ) {
975			element.form = this.closest( "form" )[ 0 ];
976			element.name = this.attr( "name" );
977		}
978
979		if ( element.form == null ) {
980			return;
981		}
982
983		if ( command ) {
984			settings = $.data( element.form, "validator" ).settings;
985			staticRules = settings.rules;
986			existingRules = $.validator.staticRules( element );
987			switch ( command ) {
988			case "add":
989				$.extend( existingRules, $.validator.normalizeRule( argument ) );
990
991				// Remove messages from rules, but allow them to be set separately
992				delete existingRules.messages;
993				staticRules[ element.name ] = existingRules;
994				if ( argument.messages ) {
995					settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
996				}
997				break;
998			case "remove":
999				if ( !argument ) {
1000					delete staticRules[ element.name ];
1001					return existingRules;
1002				}
1003				filtered = {};
1004				$.each( argument.split( /\s/ ), function( index, method ) {
1005					filtered[ method ] = existingRules[ method ];
1006					delete existingRules[ method ];
1007				} );
1008				return filtered;
1009			}
1010		}
1011
1012		data = $.validator.normalizeRules(
1013		$.extend(
1014			{},
1015			$.validator.classRules( element ),
1016			$.validator.attributeRules( element ),
1017			$.validator.dataRules( element ),
1018			$.validator.staticRules( element )
1019		), element );
1020
1021		// Make sure required is at front
1022		if ( data.required ) {
1023			param = data.required;
1024			delete data.required;
1025			data = $.extend( { required: param }, data );
1026		}
1027
1028		// Make sure remote is at back
1029		if ( data.remote ) {
1030			param = data.remote;
1031			delete data.remote;
1032			data = $.extend( data, { remote: param } );
1033		}
1034
1035		return data;
1036	}
1037} );
1038
1039// JQuery trim is deprecated, provide a trim method based on String.prototype.trim
1040var trim = function( str ) {
1041
1042	// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill
1043	return str.replace( /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "" );
1044};
1045
1046// Custom selectors
1047$.extend( $.expr.pseudos || $.expr[ ":" ], {		// '|| $.expr[ ":" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support
1048
1049	// https://jqueryvalidation.org/blank-selector/
1050	blank: function( a ) {
1051		return !trim( "" + $( a ).val() );
1052	},
1053
1054	// https://jqueryvalidation.org/filled-selector/
1055	filled: function( a ) {
1056		var val = $( a ).val();
1057		return val !== null && !!trim( "" + val );
1058	},
1059
1060	// https://jqueryvalidation.org/unchecked-selector/
1061	unchecked: function( a ) {
1062		return !$( a ).prop( "checked" );
1063	}
1064} );
1065
1066// Constructor for validator
1067$.validator = function( options, form ) {
1068	this.settings = $.extend( true, {}, $.validator.defaults, options );
1069	this.currentForm = form;
1070	this.init();
1071};
1072
1073// https://jqueryvalidation.org/jQuery.validator.format/
1074$.validator.format = function( source, params ) {
1075	if ( arguments.length === 1 ) {
1076		return function() {
1077			var args = $.makeArray( arguments );
1078			args.unshift( source );
1079			return $.validator.format.apply( this, args );
1080		};
1081	}
1082	if ( params === undefined ) {
1083		return source;
1084	}
1085	if ( arguments.length > 2 && params.constructor !== Array  ) {
1086		params = $.makeArray( arguments ).slice( 1 );
1087	}
1088	if ( params.constructor !== Array ) {
1089		params = [ params ];
1090	}
1091	$.each( params, function( i, n ) {
1092		source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
1093			return n;
1094		} );
1095	} );
1096	return source;
1097};
1098
1099$.extend( $.validator, {
1100
1101	defaults: {
1102		messages: {},
1103		groups: {},
1104		rules: {},
1105		errorClass: "error",
1106		pendingClass: "pending",
1107		validClass: "valid",
1108		errorElement: "label",
1109		focusCleanup: false,
1110		focusInvalid: true,
1111		errorContainer: $( [] ),
1112		errorLabelContainer: $( [] ),
1113		onsubmit: true,
1114		ignore: ":hidden",
1115		ignoreTitle: false,
1116		onfocusin: function( element ) {
1117			this.lastActive = element;
1118
1119			// Hide error label and remove error class on focus if enabled
1120			if ( this.settings.focusCleanup ) {
1121				if ( this.settings.unhighlight ) {
1122					this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
1123				}
1124				this.hideThese( this.errorsFor( element ) );
1125			}
1126		},
1127		onfocusout: function( element ) {
1128			if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
1129				this.element( element );
1130			}
1131		},
1132		onkeyup: function( element, event ) {
1133
1134			// Avoid revalidate the field when pressing one of the following keys
1135			// Shift       => 16
1136			// Ctrl        => 17
1137			// Alt         => 18
1138			// Caps lock   => 20
1139			// End         => 35
1140			// Home        => 36
1141			// Left arrow  => 37
1142			// Up arrow    => 38
1143			// Right arrow => 39
1144			// Down arrow  => 40
1145			// Insert      => 45
1146			// Num lock    => 144
1147			// AltGr key   => 225
1148			var excludedKeys = [
1149				16, 17, 18, 20, 35, 36, 37,
1150				38, 39, 40, 45, 144, 225
1151			];
1152
1153			if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
1154				return;
1155			} else if ( element.name in this.submitted || element.name in this.invalid ) {
1156				this.element( element );
1157			}
1158		},
1159		onclick: function( element ) {
1160
1161			// Click on selects, radiobuttons and checkboxes
1162			if ( element.name in this.submitted ) {
1163				this.element( element );
1164
1165			// Or option elements, check parent select in that case
1166			} else if ( element.parentNode.name in this.submitted ) {
1167				this.element( element.parentNode );
1168			}
1169		},
1170		highlight: function( element, errorClass, validClass ) {
1171			if ( element.type === "radio" ) {
1172				this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
1173			} else {
1174				$( element ).addClass( errorClass ).removeClass( validClass );
1175			}
1176		},
1177		unhighlight: function( element, errorClass, validClass ) {
1178			if ( element.type === "radio" ) {
1179				this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
1180			} else {
1181				$( element ).removeClass( errorClass ).addClass( validClass );
1182			}
1183		}
1184	},
1185
1186	// https://jqueryvalidation.org/jQuery.validator.setDefaults/
1187	setDefaults: function( settings ) {
1188		$.extend( $.validator.defaults, settings );
1189	},
1190
1191	messages: {
1192		required: "This field is required.",
1193		remote: "Please fix this field.",
1194		email: "Please enter a valid email address.",
1195		url: "Please enter a valid URL.",
1196		date: "Please enter a valid date.",
1197		dateISO: "Please enter a valid date (ISO).",
1198		number: "Please enter a valid number.",
1199		digits: "Please enter only digits.",
1200		equalTo: "Please enter the same value again.",
1201		maxlength: $.validator.format( "Please enter no more than {0} characters." ),
1202		minlength: $.validator.format( "Please enter at least {0} characters." ),
1203		rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
1204		range: $.validator.format( "Please enter a value between {0} and {1}." ),
1205		max: $.validator.format( "Please enter a value less than or equal to {0}." ),
1206		min: $.validator.format( "Please enter a value greater than or equal to {0}." ),
1207		step: $.validator.format( "Please enter a multiple of {0}." )
1208	},
1209
1210	autoCreateRanges: false,
1211
1212	prototype: {
1213
1214		init: function() {
1215			this.labelContainer = $( this.settings.errorLabelContainer );
1216			this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
1217			this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
1218			this.submitted = {};
1219			this.valueCache = {};
1220			this.pendingRequest = 0;
1221			this.pending = {};
1222			this.invalid = {};
1223			this.reset();
1224
1225			var currentForm = this.currentForm,
1226				groups = ( this.groups = {} ),
1227				rules;
1228			$.each( this.settings.groups, function( key, value ) {
1229				if ( typeof value === "string" ) {
1230					value = value.split( /\s/ );
1231				}
1232				$.each( value, function( index, name ) {
1233					groups[ name ] = key;
1234				} );
1235			} );
1236			rules = this.settings.rules;
1237			$.each( rules, function( key, value ) {
1238				rules[ key ] = $.validator.normalizeRule( value );
1239			} );
1240
1241			function delegate( event ) {
1242				var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";
1243
1244				// Set form expando on contenteditable
1245				if ( !this.form && isContentEditable ) {
1246					this.form = $( this ).closest( "form" )[ 0 ];
1247					this.name = $( this ).attr( "name" );
1248				}
1249
1250				// Ignore the element if it belongs to another form. This will happen mainly
1251				// when setting the `form` attribute of an input to the id of another form.
1252				if ( currentForm !== this.form ) {
1253					return;
1254				}
1255
1256				var validator = $.data( this.form, "validator" ),
1257					eventType = "on" + event.type.replace( /^validate/, "" ),
1258					settings = validator.settings;
1259				if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
1260					settings[ eventType ].call( validator, this, event );
1261				}
1262			}
1263
1264			$( this.currentForm )
1265				.on( "focusin.validate focusout.validate keyup.validate",
1266					":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
1267					"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
1268					"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
1269					"[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate )
1270
1271				// Support: Chrome, oldIE
1272				// "select" is provided as event.target when clicking a option
1273				.on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate );
1274
1275			if ( this.settings.invalidHandler ) {
1276				$( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
1277			}
1278		},
1279
1280		// https://jqueryvalidation.org/Validator.form/
1281		form: function() {
1282			this.checkForm();
1283			$.extend( this.submitted, this.errorMap );
1284			this.invalid = $.extend( {}, this.errorMap );
1285			if ( !this.valid() ) {
1286				$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
1287			}
1288			this.showErrors();
1289			return this.valid();
1290		},
1291
1292		checkForm: function() {
1293			this.prepareForm();
1294			for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
1295				this.check( elements[ i ] );
1296			}
1297			return this.valid();
1298		},
1299
1300		// https://jqueryvalidation.org/Validator.element/
1301		element: function( element ) {
1302			var cleanElement = this.clean( element ),
1303				checkElement = this.validationTargetFor( cleanElement ),
1304				v = this,
1305				result = true,
1306				rs, group;
1307
1308			if ( checkElement === undefined ) {
1309				delete this.invalid[ cleanElement.name ];
1310			} else {
1311				this.prepareElement( checkElement );
1312				this.currentElements = $( checkElement );
1313
1314				// If this element is grouped, then validate all group elements already
1315				// containing a value
1316				group = this.groups[ checkElement.name ];
1317				if ( group ) {
1318					$.each( this.groups, function( name, testgroup ) {
1319						if ( testgroup === group && name !== checkElement.name ) {
1320							cleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );
1321							if ( cleanElement && cleanElement.name in v.invalid ) {
1322								v.currentElements.push( cleanElement );
1323								result = v.check( cleanElement ) && result;
1324							}
1325						}
1326					} );
1327				}
1328
1329				rs = this.check( checkElement ) !== false;
1330				result = result && rs;
1331				if ( rs ) {
1332					this.invalid[ checkElement.name ] = false;
1333				} else {
1334					this.invalid[ checkElement.name ] = true;
1335				}
1336
1337				if ( !this.numberOfInvalids() ) {
1338
1339					// Hide error containers on last error
1340					this.toHide = this.toHide.add( this.containers );
1341				}
1342				this.showErrors();
1343
1344				// Add aria-invalid status for screen readers
1345				$( element ).attr( "aria-invalid", !rs );
1346			}
1347
1348			return result;
1349		},
1350
1351		// https://jqueryvalidation.org/Validator.showErrors/
1352		showErrors: function( errors ) {
1353			if ( errors ) {
1354				var validator = this;
1355
1356				// Add items to error list and map
1357				$.extend( this.errorMap, errors );
1358				this.errorList = $.map( this.errorMap, function( message, name ) {
1359					return {
1360						message: message,
1361						element: validator.findByName( name )[ 0 ]
1362					};
1363				} );
1364
1365				// Remove items from success list
1366				this.successList = $.grep( this.successList, function( element ) {
1367					return !( element.name in errors );
1368				} );
1369			}
1370			if ( this.settings.showErrors ) {
1371				this.settings.showErrors.call( this, this.errorMap, this.errorList );
1372			} else {
1373				this.defaultShowErrors();
1374			}
1375		},
1376
1377		// https://jqueryvalidation.org/Validator.resetForm/
1378		resetForm: function() {
1379			if ( $.fn.resetForm ) {
1380				$( this.currentForm ).resetForm();
1381			}
1382			this.invalid = {};
1383			this.submitted = {};
1384			this.prepareForm();
1385			this.hideErrors();
1386			var elements = this.elements()
1387				.removeData( "previousValue" )
1388				.removeAttr( "aria-invalid" );
1389
1390			this.resetElements( elements );
1391		},
1392
1393		resetElements: function( elements ) {
1394			var i;
1395
1396			if ( this.settings.unhighlight ) {
1397				for ( i = 0; elements[ i ]; i++ ) {
1398					this.settings.unhighlight.call( this, elements[ i ],
1399						this.settings.errorClass, "" );
1400					this.findByName( elements[ i ].name ).removeClass( this.settings.validClass );
1401				}
1402			} else {
1403				elements
1404					.removeClass( this.settings.errorClass )
1405					.removeClass( this.settings.validClass );
1406			}
1407		},
1408
1409		numberOfInvalids: function() {
1410			return this.objectLength( this.invalid );
1411		},
1412
1413		objectLength: function( obj ) {
1414			/* jshint unused: false */
1415			var count = 0,
1416				i;
1417			for ( i in obj ) {
1418
1419				// This check allows counting elements with empty error
1420				// message as invalid elements
1421				if ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {
1422					count++;
1423				}
1424			}
1425			return count;
1426		},
1427
1428		hideErrors: function() {
1429			this.hideThese( this.toHide );
1430		},
1431
1432		hideThese: function( errors ) {
1433			errors.not( this.containers ).text( "" );
1434			this.addWrapper( errors ).hide();
1435		},
1436
1437		valid: function() {
1438			return this.size() === 0;
1439		},
1440
1441		size: function() {
1442			return this.errorList.length;
1443		},
1444
1445		focusInvalid: function() {
1446			if ( this.settings.focusInvalid ) {
1447				try {
1448					$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )
1449					.filter( ":visible" )
1450					.trigger( "focus" )
1451
1452					// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
1453					.trigger( "focusin" );
1454				} catch ( e ) {
1455
1456					// Ignore IE throwing errors when focusing hidden elements
1457				}
1458			}
1459		},
1460
1461		findLastActive: function() {
1462			var lastActive = this.lastActive;
1463			return lastActive && $.grep( this.errorList, function( n ) {
1464				return n.element.name === lastActive.name;
1465			} ).length === 1 && lastActive;
1466		},
1467
1468		elements: function() {
1469			var validator = this,
1470				rulesCache = {};
1471
1472			// Select all valid inputs inside the form (no submit or reset buttons)
1473			return $( this.currentForm )
1474			.find( "input, select, textarea, [contenteditable]" )
1475			.not( ":submit, :reset, :image, :disabled" )
1476			.not( this.settings.ignore )
1477			.filter( function() {
1478				var name = this.name || $( this ).attr( "name" ); // For contenteditable
1479				var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";
1480
1481				if ( !name && validator.settings.debug && window.console ) {
1482					console.error( "%o has no name assigned", this );
1483				}
1484
1485				// Set form expando on contenteditable
1486				if ( isContentEditable ) {
1487					this.form = $( this ).closest( "form" )[ 0 ];
1488					this.name = name;
1489				}
1490
1491				// Ignore elements that belong to other/nested forms
1492				if ( this.form !== validator.currentForm ) {
1493					return false;
1494				}
1495
1496				// Select only the first element for each name, and only those with rules specified
1497				if ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
1498					return false;
1499				}
1500
1501				rulesCache[ name ] = true;
1502				return true;
1503			} );
1504		},
1505
1506		clean: function( selector ) {
1507			return $( selector )[ 0 ];
1508		},
1509
1510		errors: function() {
1511			var errorClass = this.settings.errorClass.split( " " ).join( "." );
1512			return $( this.settings.errorElement + "." + errorClass, this.errorContext );
1513		},
1514
1515		resetInternals: function() {
1516			this.successList = [];
1517			this.errorList = [];
1518			this.errorMap = {};
1519			this.toShow = $( [] );
1520			this.toHide = $( [] );
1521		},
1522
1523		reset: function() {
1524			this.resetInternals();
1525			this.currentElements = $( [] );
1526		},
1527
1528		prepareForm: function() {
1529			this.reset();
1530			this.toHide = this.errors().add( this.containers );
1531		},
1532
1533		prepareElement: function( element ) {
1534			this.reset();
1535			this.toHide = this.errorsFor( element );
1536		},
1537
1538		elementValue: function( element ) {
1539			var $element = $( element ),
1540				type = element.type,
1541				isContentEditable = typeof $element.attr( "contenteditable" ) !== "undefined" && $element.attr( "contenteditable" ) !== "false",
1542				val, idx;
1543
1544			if ( type === "radio" || type === "checkbox" ) {
1545				return this.findByName( element.name ).filter( ":checked" ).val();
1546			} else if ( type === "number" && typeof element.validity !== "undefined" ) {
1547				return element.validity.badInput ? "NaN" : $element.val();
1548			}
1549
1550			if ( isContentEditable ) {
1551				val = $element.text();
1552			} else {
1553				val = $element.val();
1554			}
1555
1556			if ( type === "file" ) {
1557
1558				// Modern browser (chrome & safari)
1559				if ( val.substr( 0, 12 ) === "C:\\fakepath\\" ) {
1560					return val.substr( 12 );
1561				}
1562
1563				// Legacy browsers
1564				// Unix-based path
1565				idx = val.lastIndexOf( "/" );
1566				if ( idx >= 0 ) {
1567					return val.substr( idx + 1 );
1568				}
1569
1570				// Windows-based path
1571				idx = val.lastIndexOf( "\\" );
1572				if ( idx >= 0 ) {
1573					return val.substr( idx + 1 );
1574				}
1575
1576				// Just the file name
1577				return val;
1578			}
1579
1580			if ( typeof val === "string" ) {
1581				return val.replace( /\r/g, "" );
1582			}
1583			return val;
1584		},
1585
1586		check: function( element ) {
1587			element = this.validationTargetFor( this.clean( element ) );
1588
1589			var rules = $( element ).rules(),
1590				rulesCount = $.map( rules, function( n, i ) {
1591					return i;
1592				} ).length,
1593				dependencyMismatch = false,
1594				val = this.elementValue( element ),
1595				result, method, rule, normalizer;
1596
1597			// Prioritize the local normalizer defined for this element over the global one
1598			// if the former exists, otherwise user the global one in case it exists.
1599			if ( typeof rules.normalizer === "function" ) {
1600				normalizer = rules.normalizer;
1601			} else if (	typeof this.settings.normalizer === "function" ) {
1602				normalizer = this.settings.normalizer;
1603			}
1604
1605			// If normalizer is defined, then call it to retreive the changed value instead
1606			// of using the real one.
1607			// Note that `this` in the normalizer is `element`.
1608			if ( normalizer ) {
1609				val = normalizer.call( element, val );
1610
1611				// Delete the normalizer from rules to avoid treating it as a pre-defined method.
1612				delete rules.normalizer;
1613			}
1614
1615			for ( method in rules ) {
1616				rule = { method: method, parameters: rules[ method ] };
1617				try {
1618					result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
1619
1620					// If a method indicates that the field is optional and therefore valid,
1621					// don't mark it as valid when there are no other rules
1622					if ( result === "dependency-mismatch" && rulesCount === 1 ) {
1623						dependencyMismatch = true;
1624						continue;
1625					}
1626					dependencyMismatch = false;
1627
1628					if ( result === "pending" ) {
1629						this.toHide = this.toHide.not( this.errorsFor( element ) );
1630						return;
1631					}
1632
1633					if ( !result ) {
1634						this.formatAndAdd( element, rule );
1635						return false;
1636					}
1637				} catch ( e ) {
1638					if ( this.settings.debug && window.console ) {
1639						console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
1640					}
1641					if ( e instanceof TypeError ) {
1642						e.message += ".  Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
1643					}
1644
1645					throw e;
1646				}
1647			}
1648			if ( dependencyMismatch ) {
1649				return;
1650			}
1651			if ( this.objectLength( rules ) ) {
1652				this.successList.push( element );
1653			}
1654			return true;
1655		},
1656
1657		// Return the custom message for the given element and validation method
1658		// specified in the element's HTML5 data attribute
1659		// return the generic message if present and no method specific message is present
1660		customDataMessage: function( element, method ) {
1661			return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
1662				method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
1663		},
1664
1665		// Return the custom message for the given element name and validation method
1666		customMessage: function( name, method ) {
1667			var m = this.settings.messages[ name ];
1668			return m && ( m.constructor === String ? m : m[ method ] );
1669		},
1670
1671		// Return the first defined argument, allowing empty strings
1672		findDefined: function() {
1673			for ( var i = 0; i < arguments.length; i++ ) {
1674				if ( arguments[ i ] !== undefined ) {
1675					return arguments[ i ];
1676				}
1677			}
1678			return undefined;
1679		},
1680
1681		// The second parameter 'rule' used to be a string, and extended to an object literal
1682		// of the following form:
1683		// rule = {
1684		//     method: "method name",
1685		//     parameters: "the given method parameters"
1686		// }
1687		//
1688		// The old behavior still supported, kept to maintain backward compatibility with
1689		// old code, and will be removed in the next major release.
1690		defaultMessage: function( element, rule ) {
1691			if ( typeof rule === "string" ) {
1692				rule = { method: rule };
1693			}
1694
1695			var message = this.findDefined(
1696					this.customMessage( element.name, rule.method ),
1697					this.customDataMessage( element, rule.method ),
1698
1699					// 'title' is never undefined, so handle empty string as undefined
1700					!this.settings.ignoreTitle && element.title || undefined,
1701					$.validator.messages[ rule.method ],
1702					"<strong>Warning: No message defined for " + element.name + "</strong>"
1703				),
1704				theregex = /\$?\{(\d+)\}/g;
1705			if ( typeof message === "function" ) {
1706				message = message.call( this, rule.parameters, element );
1707			} else if ( theregex.test( message ) ) {
1708				message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
1709			}
1710
1711			return message;
1712		},
1713
1714		formatAndAdd: function( element, rule ) {
1715			var message = this.defaultMessage( element, rule );
1716
1717			this.errorList.push( {
1718				message: message,
1719				element: element,
1720				method: rule.method
1721			} );
1722
1723			this.errorMap[ element.name ] = message;
1724			this.submitted[ element.name ] = message;
1725		},
1726
1727		addWrapper: function( toToggle ) {
1728			if ( this.settings.wrapper ) {
1729				toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
1730			}
1731			return toToggle;
1732		},
1733
1734		defaultShowErrors: function() {
1735			var i, elements, error;
1736			for ( i = 0; this.errorList[ i ]; i++ ) {
1737				error = this.errorList[ i ];
1738				if ( this.settings.highlight ) {
1739					this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.val
1739idClass );
1740				}
1741				this.showLabel( error.element, error.message );
1742			}
1743			if ( this.errorList.length ) {
1744				this.toShow = this.toShow.add( this.containers );
1745			}
1746			if ( this.settings.success ) {
1747				for ( i = 0; this.successList[ i ]; i++ ) {
1748					this.showLabel( this.successList[ i ] );
1749				}
1750			}
1751			if ( this.settings.unhighlight ) {
1752				for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
1753					this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
1754				}
1755			}
1756			this.toHide = this.toHide.not( this.toShow );
1757			this.hideErrors();
1758			this.addWrapper( this.toShow ).show();
1759		},
1760
1761		validElements: function() {
1762			return this.currentElements.not( this.invalidElements() );
1763		},
1764
1765		invalidElements: function() {
1766			return $( this.errorList ).map( function() {
1767				return this.element;
1768			} );
1769		},
1770
1771		showLabel: function( element, message ) {
1772			var place, group, errorID, v,
1773				error = this.errorsFor( element ),
1774				elementID = this.idOrName( element ),
1775				describedBy = $( element ).attr( "aria-describedby" );
1776
1777			if ( error.length ) {
1778
1779				// Refresh error/success class
1780				error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
1781
1782				// Replace message on existing label
1783				error.html( message );
1784			} else {
1785
1786				// Create error element
1787				error = $( "<" + this.settings.errorElement + ">" )
1788					.attr( "id", elementID + "-error" )
1789					.addClass( this.settings.errorClass )
1790					.html( message || "" );
1791
1792				// Maintain reference to the element to be placed into the DOM
1793				place = error;
1794				if ( this.settings.wrapper ) {
1795
1796					// Make sure the element is visible, even in IE
1797					// actually showing the wrapped element is handled elsewhere
1798					place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
1799				}
1800				if ( this.labelContainer.length ) {
1801					this.labelContainer.append( place );
1802				} else if ( this.settings.errorPlacement ) {
1803					this.settings.errorPlacement.call( this, place, $( element ) );
1804				} else {
1805					place.insertAfter( element );
1806				}
1807
1808				// Link error back to the element
1809				if ( error.is( "label" ) ) {
1810
1811					// If the error is a label, then associate using 'for'
1812					error.attr( "for", elementID );
1813
1814					// If the element is not a child of an associated label, then it's necessary
1815					// to explicitly apply aria-describedby
1816				} else if ( error.parents( "label[for='" + this.escapeCssMeta( elementID ) + "']" ).length === 0 ) {
1817					errorID = error.attr( "id" );
1818
1819					// Respect existing non-error aria-describedby
1820					if ( !describedBy ) {
1821						describedBy = errorID;
1822					} else if ( !describedBy.match( new RegExp( "\\b" + this.escapeCssMeta( errorID ) + "\\b" ) ) ) {
1823
1824						// Add to end of list if not already present
1825						describedBy += " " + errorID;
1826					}
1827					$( element ).attr( "aria-describedby", describedBy );
1828
1829					// If this element is grouped, then assign to all elements in the same group
1830					group = this.groups[ element.name ];
1831					if ( group ) {
1832						v = this;
1833						$.each( v.groups, function( name, testgroup ) {
1834							if ( testgroup === group ) {
1835								$( "[name='" + v.escapeCssMeta( name ) + "']", v.currentForm )
1836									.attr( "aria-describedby", error.attr( "id" ) );
1837							}
1838						} );
1839					}
1840				}
1841			}
1842			if ( !message && this.settings.success ) {
1843				error.text( "" );
1844				if ( typeof this.settings.success === "string" ) {
1845					error.addClass( this.settings.success );
1846				} else {
1847					this.settings.success( error, element );
1848				}
1849			}
1850			this.toShow = this.toShow.add( error );
1851		},
1852
1853		errorsFor: function( element ) {
1854			var name = this.escapeCssMeta( this.idOrName( element ) ),
1855				describer = $( element ).attr( "aria-describedby" ),
1856				selector = "label[for='" + name + "'], label[for='" + name + "'] *";
1857
1858			// 'aria-describedby' should directly reference the error element
1859			if ( describer ) {
1860				selector = selector + ", #" + this.escapeCssMeta( describer )
1861					.replace( /\s+/g, ", #" );
1862			}
1863
1864			return this
1865				.errors()
1866				.filter( selector );
1867		},
1868
1869		// See https://api.jquery.com/category/selectors/, for CSS
1870		// meta-characters that should be escaped in order to be used with JQuery
1871		// as a literal part of a name/id or any selector.
1872		escapeCssMeta: function( string ) {
1873			if ( string === undefined ) {
1874				return "";
1875			}
1876
1877			return string.replace( /([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1" );
1878		},
1879
1880		idOrName: function( element ) {
1881			return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.i
vendor: 15,592 bytes, lines 1881-2362
1881d || element.name );
1882		},
1883
1884		validationTargetFor: function( element ) {
1885
1886			// If radio/checkbox, validate first element in group instead
1887			if ( this.checkable( element ) ) {
1888				element = this.findByName( element.name );
1889			}
1890
1891			// Always apply ignore filter
1892			return $( element ).not( this.settings.ignore )[ 0 ];
1893		},
1894
1895		checkable: function( element ) {
1896			return ( /radio|checkbox/i ).test( element.type );
1897		},
1898
1899		findByName: function( name ) {
1900			return $( this.currentForm ).find( "[name='" + this.escapeCssMeta( name ) + "']" );
1901		},
1902
1903		getLength: function( value, element ) {
1904			switch ( element.nodeName.toLowerCase() ) {
1905			case "select":
1906				return $( "option:selected", element ).length;
1907			case "input":
1908				if ( this.checkable( element ) ) {
1909					return this.findByName( element.name ).filter( ":checked" ).length;
1910				}
1911			}
1912			return value.length;
1913		},
1914
1915		depend: function( param, element ) {
1916			return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;
1917		},
1918
1919		dependTypes: {
1920			"boolean": function( param ) {
1921				return param;
1922			},
1923			"string": function( param, element ) {
1924				return !!$( param, element.form ).length;
1925			},
1926			"function": function( param, element ) {
1927				return param( element );
1928			}
1929		},
1930
1931		optional: function( element ) {
1932			var val = this.elementValue( element );
1933			return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
1934		},
1935
1936		startRequest: function( element ) {
1937			if ( !this.pending[ element.name ] ) {
1938				this.pendingRequest++;
1939				$( element ).addClass( this.settings.pendingClass );
1940				this.pending[ element.name ] = true;
1941			}
1942		},
1943
1944		stopRequest: function( element, valid ) {
1945			this.pendingRequest--;
1946
1947			// Sometimes synchronization fails, make sure pendingRequest is never < 0
1948			if ( this.pendingRequest < 0 ) {
1949				this.pendingRequest = 0;
1950			}
1951			delete this.pending[ element.name ];
1952			$( element ).removeClass( this.settings.pendingClass );
1953			if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() && this.pendingRequest === 0 ) {
1954				$( this.currentForm ).trigger( "submit" );
1955
1956				// Remove the hidden input that was used as a replacement for the
1957				// missing submit button. The hidden input is added by `handle()`
1958				// to ensure that the value of the used submit button is passed on
1959				// for scripted submits triggered by this method
1960				if ( this.submitButton ) {
1961					$( "input:hidden[name='" + this.submitButton.name + "']", this.currentForm ).remove();
1962				}
1963
1964				this.formSubmitted = false;
1965			} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {
1966				$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
1967				this.formSubmitted = false;
1968			}
1969		},
1970
1971		previousValue: function( element, method ) {
1972			method = typeof method === "string" && method || "remote";
1973
1974			return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
1975				old: null,
1976				valid: true,
1977				message: this.defaultMessage( element, { method: method } )
1978			} );
1979		},
1980
1981		// Cleans up all forms and elements, removes validator-specific events
1982		destroy: function() {
1983			this.resetForm();
1984
1985			$( this.currentForm )
1986				.off( ".validate" )
1987				.removeData( "validator" )
1988				.find( ".validate-equalTo-blur" )
1989					.off( ".validate-equalTo" )
1990					.removeClass( "validate-equalTo-blur" )
1991				.find( ".validate-lessThan-blur" )
1992					.off( ".validate-lessThan" )
1993					.removeClass( "validate-lessThan-blur" )
1994				.find( ".validate-lessThanEqual-blur" )
1995					.off( ".validate-lessThanEqual" )
1996					.removeClass( "validate-lessThanEqual-blur" )
1997				.find( ".validate-greaterThanEqual-blur" )
1998					.off( ".validate-greaterThanEqual" )
1999					.removeClass( "validate-greaterThanEqual-blur" )
2000				.find( ".validate-greaterThan-blur" )
2001					.off( ".validate-greaterThan" )
2002					.removeClass( "validate-greaterThan-blur" );
2003		}
2004
2005	},
2006
2007	classRuleSettings: {
2008		required: { required: true },
2009		email: { email: true },
2010		url: { url: true },
2011		date: { date: true },
2012		dateISO: { dateISO: true },
2013		number: { number: true },
2014		digits: { digits: true },
2015		creditcard: { creditcard: true }
2016	},
2017
2018	addClassRules: function( className, rules ) {
2019		if ( className.constructor === String ) {
2020			this.classRuleSettings[ className ] = rules;
2021		} else {
2022			$.extend( this.classRuleSettings, className );
2023		}
2024	},
2025
2026	classRules: function( element ) {
2027		var rules = {},
2028			classes = $( element ).attr( "class" );
2029
2030		if ( classes ) {
2031			$.each( classes.split( " " ), function() {
2032				if ( this in $.validator.classRuleSettings ) {
2033					$.extend( rules, $.validator.classRuleSettings[ this ] );
2034				}
2035			} );
2036		}
2037		return rules;
2038	},
2039
2040	normalizeAttributeRule: function( rules, type, method, value ) {
2041
2042		// Convert the value to a number for number inputs, and for text for backwards compability
2043		// allows type="date" and others to be compared as strings
2044		if ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
2045			value = Number( value );
2046
2047			// Support Opera Mini, which returns NaN for undefined minlength
2048			if ( isNaN( value ) ) {
2049				value = undefined;
2050			}
2051		}
2052
2053		if ( value || value === 0 ) {
2054			rules[ method ] = value;
2055		} else if ( type === method && type !== "range" ) {
2056
2057			// Exception: the jquery validate 'range' method
2058			// does not test for the html5 'range' type
2059			rules[ type === "date" ? "dateISO" : method ] = true;
2060		}
2061	},
2062
2063	attributeRules: function( element ) {
2064		var rules = {},
2065			$element = $( element ),
2066			type = element.getAttribute( "type" ),
2067			method, value;
2068
2069		for ( method in $.validator.methods ) {
2070
2071			// Support for <input required> in both html5 and older browsers
2072			if ( method === "required" ) {
2073				value = element.getAttribute( method );
2074
2075				// Some browsers return an empty string for the required attribute
2076				// and non-HTML5 browsers might have required="" markup
2077				if ( value === "" ) {
2078					value = true;
2079				}
2080
2081				// Force non-HTML5 browsers to return bool
2082				value = !!value;
2083			} else {
2084				value = $element.attr( method );
2085			}
2086
2087			this.normalizeAttributeRule( rules, type, method, value );
2088		}
2089
2090		// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
2091		if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
2092			delete rules.maxlength;
2093		}
2094
2095		return rules;
2096	},
2097
2098	dataRules: function( element ) {
2099		var rules = {},
2100			$element = $( element ),
2101			type = element.getAttribute( "type" ),
2102			method, value;
2103
2104		for ( method in $.validator.methods ) {
2105			value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
2106
2107			// Cast empty attributes like `data-rule-required` to `true`
2108			if ( value === "" ) {
2109				value = true;
2110			}
2111
2112			this.normalizeAttributeRule( rules, type, method, value );
2113		}
2114		return rules;
2115	},
2116
2117	staticRules: function( element ) {
2118		var rules = {},
2119			validator = $.data( element.form, "validator" );
2120
2121		if ( validator.settings.rules ) {
2122			rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
2123		}
2124		return rules;
2125	},
2126
2127	normalizeRules: function( rules, element ) {
2128
2129		// Handle dependency check
2130		$.each( rules, function( prop, val ) {
2131
2132			// Ignore rule when param is explicitly false, eg. required:false
2133			if ( val === false ) {
2134				delete rules[ prop ];
2135				return;
2136			}
2137			if ( val.param || val.depends ) {
2138				var keepRule = true;
2139				switch ( typeof val.depends ) {
2140				case "string":
2141					keepRule = !!$( val.depends, element.form ).length;
2142					break;
2143				case "function":
2144					keepRule = val.depends.call( element, element );
2145					break;
2146				}
2147				if ( keepRule ) {
2148					rules[ prop ] = val.param !== undefined ? val.param : true;
2149				} else {
2150					$.data( element.form, "validator" ).resetElements( $( element ) );
2151					delete rules[ prop ];
2152				}
2153			}
2154		} );
2155
2156		// Evaluate parameters
2157		$.each( rules, function( rule, parameter ) {
2158			rules[ rule ] = typeof parameter === "function" && rule !== "normalizer" ? parameter( element ) : parameter;
2159		} );
2160
2161		// Clean number parameters
2162		$.each( [ "minlength", "maxlength" ], function() {
2163			if ( rules[ this ] ) {
2164				rules[ this ] = Number( rules[ this ] );
2165			}
2166		} );
2167		$.each( [ "rangelength", "range" ], function() {
2168			var parts;
2169			if ( rules[ this ] ) {
2170				if ( Array.isArray( rules[ this ] ) ) {
2171					rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];
2172				} else if ( typeof rules[ this ] === "string" ) {
2173					parts = rules[ this ].replace( /[\[\]]/g, "" ).split( /[\s,]+/ );
2174					rules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];
2175				}
2176			}
2177		} );
2178
2179		if ( $.validator.autoCreateRanges ) {
2180
2181			// Auto-create ranges
2182			if ( rules.min != null && rules.max != null ) {
2183				rules.range = [ rules.min, rules.max ];
2184				delete rules.min;
2185				delete rules.max;
2186			}
2187			if ( rules.minlength != null && rules.maxlength != null ) {
2188				rules.rangelength = [ rules.minlength, rules.maxlength ];
2189				delete rules.minlength;
2190				delete rules.maxlength;
2191			}
2192		}
2193
2194		return rules;
2195	},
2196
2197	// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
2198	normalizeRule: function( data ) {
2199		if ( typeof data === "string" ) {
2200			var transformed = {};
2201			$.each( data.split( /\s/ ), function() {
2202				transformed[ this ] = true;
2203			} );
2204			data = transformed;
2205		}
2206		return data;
2207	},
2208
2209	// https://jqueryvalidation.org/jQuery.validator.addMethod/
2210	addMethod: function( name, method, message ) {
2211		$.validator.methods[ name ] = method;
2212		$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
2213		if ( method.length < 3 ) {
2214			$.validator.addClassRules( name, $.validator.normalizeRule( name ) );
2215		}
2216	},
2217
2218	// https://jqueryvalidation.org/jQuery.validator.methods/
2219	methods: {
2220
2221		// https://jqueryvalidation.org/required-method/
2222		required: function( value, element, param ) {
2223
2224			// Check if dependency is met
2225			if ( !this.depend( param, element ) ) {
2226				return "dependency-mismatch";
2227			}
2228			if ( element.nodeName.toLowerCase() === "select" ) {
2229
2230				// Could be an array for select-multiple or a string, both are fine this way
2231				var val = $( element ).val();
2232				return val && val.length > 0;
2233			}
2234			if ( this.checkable( element ) ) {
2235				return this.getLength( value, element ) > 0;
2236			}
2237			return value !== undefined && value !== null && value.length > 0;
2238		},
2239
2240		// https://jqueryvalidation.org/email-method/
2241		email: function( value, element ) {
2242
2243			// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
2244			// Retrieved 2014-01-14
2245			// If you have a problem with this implementation, report a bug against the above spec
2246			// Or use custom methods to implement your own email validation
2247			return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
2248		},
2249
2250		// https://jqueryvalidation.org/url-method/
2251		url: function( value, element ) {
2252
2253			// Copyright (c) 2010-2013 Diego Perini, MIT licensed
2254			// https://gist.github.com/dperini/729294
2255			// see also https://mathiasbynens.be/demo/url-regex
2256			// modified to allow protocol-relative URLs
2257			return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
2258		},
2259
2260		// https://jqueryvalidation.org/date-method/
2261		date: ( function() {
2262			var called = false;
2263
2264			return function( value, element ) {
2265				if ( !called ) {
2266					called = true;
2267					if ( this.settings.debug && window.console ) {
2268						console.warn(
2269							"The `date` method is deprecated and will be removed in version '2.0.0'.\n" +
2270							"Please don't use it, since it relies on the Date constructor, which\n" +
2271							"behaves very differently across browsers and locales. Use `dateISO`\n" +
2272							"instead or one of the locale specific methods in `localizations/`\n" +
2273							"and `additional-methods.js`."
2274						);
2275					}
2276				}
2277
2278				return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
2279			};
2280		}() ),
2281
2282		// https://jqueryvalidation.org/dateISO-method/
2283		dateISO: function( value, element ) {
2284			return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
2285		},
2286
2287		// https://jqueryvalidation.org/number-method/
2288		number: function( value, element ) {
2289			return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
2290		},
2291
2292		// https://jqueryvalidation.org/digits-method/
2293		digits: function( value, element ) {
2294			return this.optional( element ) || /^\d+$/.test( value );
2295		},
2296
2297		// https://jqueryvalidation.org/minlength-method/
2298		minlength: function( value, element, param ) {
2299			var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
2300			return this.optional( element ) || length >= param;
2301		},
2302
2303		// https://jqueryvalidation.org/maxlength-method/
2304		maxlength: function( value, element, param ) {
2305			var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
2306			return this.optional( element ) || length <= param;
2307		},
2308
2309		// https://jqueryvalidation.org/rangelength-method/
2310		rangelength: function( value, element, param ) {
2311			var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
2312			return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
2313		},
2314
2315		// https://jqueryvalidation.org/min-method/
2316		min: function( value, element, param ) {
2317			return this.optional( element ) || value >= param;
2318		},
2319
2320		// https://jqueryvalidation.org/max-method/
2321		max: function( value, element, param ) {
2322			return this.optional( element ) || value <= param;
2323		},
2324
2325		// https://jqueryvalidation.org/range-method/
2326		range: function( value, element, param ) {
2327			return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
2328		},
2329
2330		// https://jqueryvalidation.org/step-method/
2331		step: function( value, element, param ) {
2332			var type = $( element ).attr( "type" ),
2333				errorMessage = "Step attribute on input type " + type + " is not supported.",
2334				supportedTypes = [ "text", "number", "range" ],
2335				re = new RegExp( "\\b" + type + "\\b" ),
2336				notSupported = type && !re.test( supportedTypes.join() ),
2337				decimalPlaces = function( num ) {
2338					var match = ( "" + num ).match( /(?:\.(\d+))?$/ );
2339					if ( !match ) {
2340						return 0;
2341					}
2342
2343					// Number of digits right of decimal point.
2344					return match[ 1 ] ? match[ 1 ].length : 0;
2345				},
2346				toInt = function( num ) {
2347					return Math.round( num * Math.pow( 10, decimals ) );
2348				},
2349				valid = true,
2350				decimals;
2351
2352			// Works only for text, number and range input types
2353			// TODO find a way to support input types date, datetime, datetime-local, month, time and week
2354			if ( notSupported ) {
2355				throw new Error( errorMessage );
2356			}
2357
2358			decimals = decimalPlaces( param );
2359
2360			// Value can't have too many decimals
2361			if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {
2362				valid = false;
2363			}
2364
2365			return this.optional( element ) || valid;
2366		},
2367
2368		// https://jqueryvalidation.org/equalTo-method/
2369		equalTo: function( value, element, param ) {
2370
2371			// Bind to the blur event of the target in order to revalidate whenever the target field is updated
2372			var target = $( param );
2373			if ( this.settings.onfocusout && target.not( ".validate-equalTo-blur" ).length ) {
2374				target.addClass( "validate-equalTo-blur" ).on( "blur.validate-equalTo", function() {
2375					$( element ).valid();
2376				} );
2377			}
2378			return value === target.val();
2379		},
2380
2381		// https://jqueryvalidation.org/remote-method/
2382		remote: function( value, element, param, method ) {
2383			if ( this.optional( element ) ) {
2384				return "dependency-mismatch";
2385			}
2386
2387			method = typeof method === "string" && method || "remote";
2388
2389			var previous = this.previousValue( element, method ),
2390				validator, data, optionDataString;
2391
2392			if ( !this.settings.messages[ element.name ] ) {
2393				this.settings.messages[ element.name ] = {};
2394			}
2395			previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
2396			this.settings.messages[ element.name ][ method ] = previous.message;
2397
2398			param = typeof param === "string" && { url: param } || param;
2399			optionDataString = $.param( $.extend( { data: value }, param.data ) );
2400			if ( previous.old === optionDataString ) {
2401				return previous.valid;
2402			}
2403
2404			previous.old = optionDataString;
2405			validator = this;
2406			this.startRequest( element );
2407			data = {};
2408			data[ element.name ] = value;
2409			$.ajax( $.extend( true, {
2410				mode: "abort",
2411				port: "validate" + element.name,
2412				dataType: "json",
2413				data: data,
2414				context: validator.currentForm,
2415				success: function( response ) {
2416					var valid = response === true || response === "true",
2417						errors, message, submitted;
2418
2419					validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
2420					if ( valid ) {
2421						submitted = validator.formSubmitted;
2422						validator.resetInternals();
2423						validator.toHide = validator.errorsFor( element );
2424						validator.formSubmitted = submitted;
2425						validator.successList.push( element );
2426						validator.invalid[ element.name ] = false;
2427						validator.showErrors();
2428					} else {
2429						errors = {};
2430						message = response || validator.defaultMessage( element, { method: method, parameters: value } );
2431						errors[ element.name ] = previous.message = message;
2432						validator.invalid[ element.name ] = true;
2433						validator.showErrors( errors );
2434					}
2435					previous.valid = valid;
2436					validator.stopRequest( element, valid );
2437				}
2438			}, param ) );
2439			return "pending";
2440		}
2441	}
2442
2443} );
2444
2445// Ajax mode: abort
2446// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
2447// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
2448
2449var pendingRequests = {},
2450	ajax;
2451
2452// Use a prefilter if available (1.5+)
2453if ( $.ajaxPrefilter ) {
2454	$.ajaxPrefilter( function( settings, _, xhr ) {
2455		var port = settings.port;
2456		if ( settings.mode === "abort" ) {
2457			if ( pendingRequests[ port ] ) {
2458				pendingRequests[ port ].abort();
2459			}
2460			pendingRequests[ port ] = xhr;
2461		}
2462	} );
2463} else {
2464
2465	// Proxy ajax
2466	ajax = $.ajax;
2467	$.ajax = function( settings ) {
2468		var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
2469			port = ( "port" in settings ? settings : $.ajaxSettings ).port;
2470		if ( mode === "abort" ) {
2471			if ( pendingRequests[ port ] ) {
2472				pendingRequests[ port ].abort();
2473			}
2474			pendingRequests[ port ] = ajax.apply( this, arguments );
2475			return pendingRequests[ port ];
2476		}
2477		return ajax.apply( this, arguments );
2478	};
2479}
2480return $;
2481}));
2482}).call(global, module, undefined, undefined);
2483
2484}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
2485},{"jquery":27}],27:[function(require,module,exports){
2486/*!
2487 * jQuery JavaScript Library v3.5.1
2488 * https://jquery.com/
2489 *
2490 * Includes Sizzle.js
2491 * https://sizzlejs.com/
2492 *
2493 * Copyright JS Foundation and other contributors
2494 * Released under the MIT license
2495 * https://jquery.org/license
2496 *
2497 * Date: 2020-05-04T22:49Z
2498 */
2499( function( global, factory ) {
2500
2501	"use strict";
2502
2503	if ( typeof module === "object" && typeof module.exports === "object" ) {
2504
2505		// For CommonJS and CommonJS-like environments where a proper `window`
2506		// is present, execute the factory and get jQuery.
2507		// For environments that do not have a `window` with a `document`
2508		// (such as Node.js), expose a factory as module.exports.
2509		// This accentuates the need for the creation of a real `window`.
2510		// e.g. var jQuery = require("jquery")(window);
2511		// See ticket #14549 for more info.
2512		module.exports = global.document ?
2513			factory( global, true ) :
2514			function( w ) {
2515				if ( !w.document ) {
2516					throw new Error( "jQuery requires a window with a document" );
2517				}
2518				return factory( w );
2519			};
2520	} else {
2521		factory( global );
2522	}
2523
2524// Pass this if window is not defined yet
2525} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
2526
2527// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
2528// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
2529// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), str
vendor: 5,155 bytes, lines 2529-2743
2529ict mode should be common
2530// enough that all such attempts are guarded in a try block.
2531"use strict";
2532
2533var arr = [];
2534
2535var getProto = Object.getPrototypeOf;
2536
2537var slice = arr.slice;
2538
2539var flat = arr.flat ? function( array ) {
2540	return arr.flat.call( array );
2541} : function( array ) {
2542	return arr.concat.apply( [], array );
2543};
2544
2545
2546var push = arr.push;
2547
2548var indexOf = arr.indexOf;
2549
2550var class2type = {};
2551
2552var toString = class2type.toString;
2553
2554var hasOwn = class2type.hasOwnProperty;
2555
2556var fnToString = hasOwn.toString;
2557
2558var ObjectFunctionString = fnToString.call( Object );
2559
2560var support = {};
2561
2562var isFunction = function isFunction( obj ) {
2563
2564      // Support: Chrome <=57, Firefox <=52
2565      // In some browsers, typeof returns "function" for HTML <object> elements
2566      // (i.e., `typeof document.createElement( "object" ) === "function"`).
2567      // We don't want to classify *any* DOM node as a function.
2568      return typeof obj === "function" && typeof obj.nodeType !== "number";
2569  };
2570
2571
2572var isWindow = function isWindow( obj ) {
2573		return obj != null && obj === obj.window;
2574	};
2575
2576
2577var document = window.document;
2578
2579
2580
2581	var preservedScriptAttributes = {
2582		type: true,
2583		src: true,
2584		nonce: true,
2585		noModule: true
2586	};
2587
2588	function DOMEval( code, node, doc ) {
2589		doc = doc || document;
2590
2591		var i, val,
2592			script = doc.createElement( "script" );
2593
2594		script.text = code;
2595		if ( node ) {
2596			for ( i in preservedScriptAttributes ) {
2597
2598				// Support: Firefox 64+, Edge 18+
2599				// Some browsers don't support the "nonce" property on scripts.
2600				// On the other hand, just using `getAttribute` is not enough as
2601				// the `nonce` attribute is reset to an empty string whenever it
2602				// becomes browsing-context connected.
2603				// See https://github.com/whatwg/html/issues/2369
2604				// See https://html.spec.whatwg.org/#nonce-attributes
2605				// The `node.getAttribute` check was added for the sake of
2606				// `jQuery.globalEval` so that it can fake a nonce-containing node
2607				// via an object.
2608				val = node[ i ] || node.getAttribute && node.getAttribute( i );
2609				if ( val ) {
2610					script.setAttribute( i, val );
2611				}
2612			}
2613		}
2614		doc.head.appendChild( script ).parentNode.removeChild( script );
2615	}
2616
2617
2618function toType( obj ) {
2619	if ( obj == null ) {
2620		return obj + "";
2621	}
2622
2623	// Support: Android <=2.3 only (functionish RegExp)
2624	return typeof obj === "object" || typeof obj === "function" ?
2625		class2type[ toString.call( obj ) ] || "object" :
2626		typeof obj;
2627}
2628/* global Symbol */
2629// Defining this global in .eslintrc.json would create a danger of using the global
2630// unguarded in another place, it seems safer to define global only for this module
2631
2632
2633
2634var
2635	version = "3.5.1",
2636
2637	// Define a local copy of jQuery
2638	jQuery = function( selector, context ) {
2639
2640		// The jQuery object is actually just the init constructor 'enhanced'
2641		// Need init if jQuery is called (just allow error to be thrown if not included)
2642		return new jQuery.fn.init( selector, context );
2643	};
2644
2645jQuery.fn = jQuery.prototype = {
2646
2647	// The current version of jQuery being used
2648	jquery: version,
2649
2650	constructor: jQuery,
2651
2652	// The default length of a jQuery object is 0
2653	length: 0,
2654
2655	toArray: function() {
2656		return slice.call( this );
2657	},
2658
2659	// Get the Nth element in the matched element set OR
2660	// Get the whole matched element set as a clean array
2661	get: function( num ) {
2662
2663		// Return all the elements in a clean array
2664		if ( num == null ) {
2665			return slice.call( this );
2666		}
2667
2668		// Return just the one element from the set
2669		return num < 0 ? this[ num + this.length ] : this[ num ];
2670	},
2671
2672	// Take an array of elements and push it onto the stack
2673	// (returning the new matched element set)
2674	pushStack: function( elems ) {
2675
2676		// Build a new jQuery matched element set
2677		var ret = jQuery.merge( this.constructor(), elems );
2678
2679		// Add the old object onto the stack (as a reference)
2680		ret.prevObject = this;
2681
2682		// Return the newly-formed element set
2683		return ret;
2684	},
2685
2686	// Execute a callback for every element in the matched set.
2687	each: function( callback ) {
2688		return jQuery.each( this, callback );
2689	},
2690
2691	map: function( callback ) {
2692		return this.pushStack( jQuery.map( this, function( elem, i ) {
2693			return callback.call( elem, i, elem );
2694		} ) );
2695	},
2696
2697	slice: function() {
2698		return this.pushStack( slice.apply( this, arguments ) );
2699	},
2700
2701	first: function() {
2702		return this.eq( 0 );
2703	},
2704
2705	last: function() {
2706		return this.eq( -1 );
2707	},
2708
2709	even: function() {
2710		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
2711			return ( i + 1 ) % 2;
2712		} ) );
2713	},
2714
2715	odd: function() {
2716		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
2717			return i % 2;
2718		} ) );
2719	},
2720
2721	eq: function( i ) {
2722		var len = this.length,
2723			j = +i + ( i < 0 ? len : 0 );
2724		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
2725	},
2726
2727	end: function() {
2728		return this.prevObject || this.constructor();
2729	},
2730
2731	// For internal use only.
2732	// Behaves like an Array's method, not like a jQuery method.
2733	push: push,
2734	sort: arr.sort,
2735	splice: arr.splice
2736};
2737
2738jQuery.extend = jQuery.fn.extend = function() {
2739	var options, name, src, copy, copyIsArray, clone,
2740		target = arguments[ 0 ] || {},
2741		i = 1,
2742		length = arguments.length,
2743		deep = false;
vendor: 4,654 bytes, lines 2744-2950
2744
2745	// Handle a deep copy situation
2746	if ( typeof target === "boolean" ) {
2747		deep = target;
2748
2749		// Skip the boolean and the target
2750		target = arguments[ i ] || {};
2751		i++;
2752	}
2753
2754	// Handle case when target is a string or something (possible in deep copy)
2755	if ( typeof target !== "object" && !isFunction( target ) ) {
2756		target = {};
2757	}
2758
2759	// Extend jQuery itself if only one argument is passed
2760	if ( i === length ) {
2761		target = this;
2762		i--;
2763	}
2764
2765	for ( ; i < length; i++ ) {
2766
2767		// Only deal with non-null/undefined values
2768		if ( ( options = arguments[ i ] ) != null ) {
2769
2770			// Extend the base object
2771			for ( name in options ) {
2772				copy = options[ name ];
2773
2774				// Prevent Object.prototype pollution
2775				// Prevent never-ending loop
2776				if ( name === "__proto__" || target === copy ) {
2777					continue;
2778				}
2779
2780				// Recurse if we're merging plain objects or arrays
2781				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
2782					( copyIsArray = Array.isArray( copy ) ) ) ) {
2783					src = target[ name ];
2784
2785					// Ensure proper type for the source value
2786					if ( copyIsArray && !Array.isArray( src ) ) {
2787						clone = [];
2788					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
2789						clone = {};
2790					} else {
2791						clone = src;
2792					}
2793					copyIsArray = false;
2794
2795					// Never move original objects, clone them
2796					target[ name ] = jQuery.extend( deep, clone, copy );
2797
2798				// Don't bring in undefined values
2799				} else if ( copy !== undefined ) {
2800					target[ name ] = copy;
2801				}
2802			}
2803		}
2804	}
2805
2806	// Return the modified object
2807	return target;
2808};
2809
2810jQuery.extend( {
2811
2812	// Unique for each copy of jQuery on the page
2813	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
2814
2815	// Assume jQuery is ready without the ready module
2816	isReady: true,
2817
2818	error: function( msg ) {
2819		throw new Error( msg );
2820	},
2821
2822	noop: function() {},
2823
2824	isPlainObject: function( obj ) {
2825		var proto, Ctor;
2826
2827		// Detect obvious negatives
2828		// Use toString instead of jQuery.type to catch host objects
2829		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
2830			return false;
2831		}
2832
2833		proto = getProto( obj );
2834
2835		// Objects with no prototype (e.g., `Object.create( null )`) are plain
2836		if ( !proto ) {
2837			return true;
2838		}
2839
2840		// Objects with prototype are plain iff they were constructed by a global Object function
2841		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
2842		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
2843	},
2844
2845	isEmptyObject: function( obj ) {
2846		var name;
2847
2848		for ( name in obj ) {
2849			return false;
2850		}
2851		return true;
2852	},
2853
2854	// Evaluates a script in a provided context; falls back to the global one
2855	// if not specified.
2856	globalEval: function( code, options, doc ) {
2857		DOMEval( code, { nonce: options && options.nonce }, doc );
2858	},
2859
2860	each: function( obj, callback ) {
2861		var length, i = 0;
2862
2863		if ( isArrayLike( obj ) ) {
2864			length = obj.length;
2865			for ( ; i < length; i++ ) {
2866				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
2867					break;
2868				}
2869			}
2870		} else {
2871			for ( i in obj ) {
2872				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
2873					break;
2874				}
2875			}
2876		}
2877
2878		return obj;
2879	},
2880
2881	// results is for internal usage only
2882	makeArray: function( arr, results ) {
2883		var ret = results || [];
2884
2885		if ( arr != null ) {
2886			if ( isArrayLike( Object( arr ) ) ) {
2887				jQuery.merge( ret,
2888					typeof arr === "string" ?
2889					[ arr ] : arr
2890				);
2891			} else {
2892				push.call( ret, arr );
2893			}
2894		}
2895
2896		return ret;
2897	},
2898
2899	inArray: function( elem, arr, i ) {
2900		return arr == null ? -1 : indexOf.call( arr, elem, i );
2901	},
2902
2903	// Support: Android <=4.0 only, PhantomJS 1 only
2904	// push.apply(_, arraylike) throws on ancient WebKit
2905	merge: function( first, second ) {
2906		var len = +second.length,
2907			j = 0,
2908			i = first.length;
2909
2910		for ( ; j < len; j++ ) {
2911			first[ i++ ] = second[ j ];
2912		}
2913
2914		first.length = i;
2915
2916		return first;
2917	},
2918
2919	grep: function( elems, callback, invert ) {
2920		var callbackInverse,
2921			matches = [],
2922			i = 0,
2923			length = elems.length,
2924			callbackExpect = !invert;
2925
2926		// Go through the array, only saving the items
2927		// that pass the validator function
2928		for ( ; i < length; i++ ) {
2929			callbackInverse = !callback( elems[ i ], i );
2930			if ( callbackInverse !== callbackExpect ) {
2931				matches.push( elems[ i ] );
2932			}
2933		}
2934
2935		return matches;
2936	},
2937
2938	// arg is for internal usage only
2939	map: function( elems, callback, arg ) {
2940		var length, value,
2941			i = 0,
2942			ret = [];
2943
2944		// Go through the array, translating each of the items to their new values
2945		if ( isArrayLike( elems ) ) {
2946			length = elems.length;
2947			for ( ; i < length; i++ ) {
2948				value = callback( elems[ i ], i, arg );
2949
2950				if ( value != null ) {
vendor: 1,491 bytes, lines 2951-3013
2951					ret.push( value );
2952				}
2953			}
2954
2955		// Go through every key on the object,
2956		} else {
2957			for ( i in elems ) {
2958				value = callback( elems[ i ], i, arg );
2959
2960				if ( value != null ) {
2961					ret.push( value );
2962				}
2963			}
2964		}
2965
2966		// Flatten any nested arrays
2967		return flat( ret );
2968	},
2969
2970	// A global GUID counter for objects
2971	guid: 1,
2972
2973	// jQuery.support is not used in Core but other projects attach their
2974	// properties to it so it needs to exist.
2975	support: support
2976} );
2977
2978if ( typeof Symbol === "function" ) {
2979	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
2980}
2981
2982// Populate the class2type map
2983jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
2984function( _i, name ) {
2985	class2type[ "[object " + name + "]" ] = name.toLowerCase();
2986} );
2987
2988function isArrayLike( obj ) {
2989
2990	// Support: real iOS 8.2 only (not reproducible in simulator)
2991	// `in` check used to prevent JIT error (gh-2145)
2992	// hasOwn isn't used here due to false negatives
2993	// regarding Nodelist length in IE
2994	var length = !!obj && "length" in obj && obj.length,
2995		type = toType( obj );
2996
2997	if ( isFunction( obj ) || isWindow( obj ) ) {
2998		return false;
2999	}
3000
3001	return type === "array" || length === 0 ||
3002		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
3003}
3004var Sizzle =
3005/*!
3006 * Sizzle CSS Selector Engine v2.3.5
3007 * https://sizzlejs.com/
3008 *
3009 * Copyright JS Foundation and other contributors
3010 * Released under the MIT license
3011 * https://js.foundation/
3012 *
3013 * Date: 2020-03-14
vendor: 16,386 bytes, lines 3013-3596
3013
3014 */
3015( function( window ) {
3016var i,
3017	support,
3018	Expr,
3019	getText,
3020	isXML,
3021	tokenize,
3022	compile,
3023	select,
3024	outermostContext,
3025	sortInput,
3026	hasDuplicate,
3027
3028	// Local document vars
3029	setDocument,
3030	document,
3031	docElem,
3032	documentIsHTML,
3033	rbuggyQSA,
3034	rbuggyMatches,
3035	matches,
3036	contains,
3037
3038	// Instance-specific data
3039	expando = "sizzle" + 1 * new Date(),
3040	preferredDoc = window.document,
3041	dirruns = 0,
3042	done = 0,
3043	classCache = createCache(),
3044	tokenCache = createCache(),
3045	compilerCache = createCache(),
3046	nonnativeSelectorCache = createCache(),
3047	sortOrder = function( a, b ) {
3048		if ( a === b ) {
3049			hasDuplicate = true;
3050		}
3051		return 0;
3052	},
3053
3054	// Instance methods
3055	hasOwn = ( {} ).hasOwnProperty,
3056	arr = [],
3057	pop = arr.pop,
3058	pushNative = arr.push,
3059	push = arr.push,
3060	slice = arr.slice,
3061
3062	// Use a stripped-down indexOf as it's faster than native
3063	// https://jsperf.com/thor-indexof-vs-for/5
3064	indexOf = function( list, elem ) {
3065		var i = 0,
3066			len = list.length;
3067		for ( ; i < len; i++ ) {
3068			if ( list[ i ] === elem ) {
3069				return i;
3070			}
3071		}
3072		return -1;
3073	},
3074
3075	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
3076		"ismap|loop|multiple|open|readonly|required|scoped",
3077
3078	// Regular expressions
3079
3080	// http://www.w3.org/TR/css3-selectors/#whitespace
3081	whitespace = "[\\x20\\t\\r\\n\\f]",
3082
3083	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
3084	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
3085		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
3086
3087	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
3088	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
3089
3090		// Operator (capture 2)
3091		"*([*^$|!~]?=)" + whitespace +
3092
3093		// "Attribute values must be CSS identifiers [capture 5]
3094		// or strings [capture 3 or capture 4]"
3095		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
3096		whitespace + "*\\]",
3097
3098	pseudos = ":(" + identifier + ")(?:\\((" +
3099
3100		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
3101		// 1. quoted (capture 3; capture 4 or capture 5)
3102		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
3103
3104		// 2. simple (capture 6)
3105		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
3106
3107		// 3. anything else (capture 2)
3108		".*" +
3109		")\\)|)",
3110
3111	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
3112	rwhitespace = new RegExp( whitespace + "+", "g" ),
3113	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
3114		whitespace + "+$", "g" ),
3115
3116	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
3117	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
3118		"*" ),
3119	rdescend = new RegExp( whitespace + "|>" ),
3120
3121	rpseudo = new RegExp( pseudos ),
3122	ridentifier = new RegExp( "^" + identifier + "$" ),
3123
3124	matchExpr = {
3125		"ID": new RegExp( "^#(" + identifier + ")" ),
3126		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
3127		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
3128		"ATTR": new RegExp( "^" + attributes ),
3129		"PSEUDO": new RegExp( "^" + pseudos ),
3130		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
3131			whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
3132			whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
3133		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
3134
3135		// For use in libraries implementing .is()
3136		// We use this for POS matching in `select`
3137		"needsContext": new RegExp( "^" + whitespace +
3138			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
3139			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
3140	},
3141
3142	rhtml = /HTML$/i,
3143	rinputs = /^(?:input|select|textarea|button)$/i,
3144	rheader = /^h\d$/i,
3145
3146	rnative = /^[^{]+\{\s*\[native \w/,
3147
3148	// Easily-parseable/retrievable ID or TAG or CLASS selectors
3149	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
3150
3151	rsibling = /[+~]/,
3152
3153	// CSS escapes
3154	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
3155	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
3156	funescape = function( escape, nonHex ) {
3157		var high = "0x" + escape.slice( 1 ) - 0x10000;
3158
3159		return nonHex ?
3160
3161			// Strip the backslash prefix from a non-hex escape sequence
3162			nonHex :
3163
3164			// Replace a hexadecimal escape sequence with the encoded Unicode code point
3165			// Support: IE <=11+
3166			// For values outside the Basic Multilingual Plane (BMP), manually construct a
3167			// surrogate pair
3168			high < 0 ?
3169				String.fromCharCode( high + 0x10000 ) :
3170				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
3171	},
3172
3173	// CSS string/identifier serialization
3174	// https://drafts.csswg.org/cssom/#common-serializing-idioms
3175	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
3176	fcssescape = function( ch, asCodePoint ) {
3177		if ( asCodePoint ) {
3178
3179			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
3180			if ( ch === "\0" ) {
3181				return "\uFFFD";
3182			}
3183
3184			// Control characters and (dependent upon position) numbers get escaped as code points
3185			return ch.slice( 0, -1 ) + "\\" +
3186				ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
3187		}
3188
3189		// Other potentially-special ASCII characters get backslash-escaped
3190		return "\\" + ch;
3191	},
3192
3193	// Used for iframes
3194	// See setDocument()
3195	// Removing the function wrapper causes a "Permission Denied"
3196	// error in IE
3197	unloadHandler = function() {
3198		setDocument();
3199	},
3200
3201	inDisabledFieldset = addCombinator(
3202		function( elem ) {
3203			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
3204		},
3205		{ dir: "parentNode", next: "legend" }
3206	);
3207
3208// Optimize for push.apply( _, NodeList )
3209try {
3210	push.apply(
3211		( arr = slice.call( preferredDoc.childNodes ) ),
3212		preferredDoc.childNodes
3213	);
3214
3215	// Support: Android<4.0
3216	// Detect silently failing push.apply
3217	// eslint-disable-next-line no-unused-expressions
3218	arr[ preferredDoc.childNodes.length ].nodeType;
3219} catch ( e ) {
3220	push = { apply: arr.length ?
3221
3222		// Leverage slice if possible
3223		function( target, els ) {
3224			pushNative.apply( target, slice.call( els ) );
3225		} :
3226
3227		// Support: IE<9
3228		// Otherwise append directly
3229		function( target, els ) {
3230			var j = target.length,
3231				i = 0;
3232
3233			// Can't trust NodeList.length
3234			while ( ( target[ j++ ] = els[ i++ ] ) ) {}
3235			target.length = j - 1;
3236		}
3237	};
3238}
3239
3240function Sizzle( selector, context, results, seed ) {
3241	var m, i, elem, nid, match, groups, newSelector,
3242		newContext = context && context.ownerDocument,
3243
3244		// nodeType defaults to 9, since context defaults to document
3245		nodeType = context ? context.nodeType : 9;
3246
3247	results = results || [];
3248
3249	// Return early from calls with invalid selector or context
3250	if ( typeof selector !== "string" || !selector ||
3251		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
3252
3253		return results;
3254	}
3255
3256	// Try to shortcut find operations (as opposed to filters) in HTML documents
3257	if ( !seed ) {
3258		setDocument( context );
3259		context = context || document;
3260
3261		if ( documentIsHTML ) {
3262
3263			// If the selector is sufficiently simple, try using a "get*By*" DOM method
3264			// (excepting DocumentFragment context, where the methods don't exist)
3265			if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
3266
3267				// ID selector
3268				if ( ( m = match[ 1 ] ) ) {
3269
3270					// Document context
3271					if ( nodeType === 9 ) {
3272						if ( ( elem = context.getElementById( m ) ) ) {
3273
3274							// Support: IE, Opera, Webkit
3275							// TODO: identify versions
3276							// getElementById can match elements by name instead of ID
3277							if ( elem.id === m ) {
3278								results.push( elem );
3279								return results;
3280							}
3281						} else {
3282							return results;
3283						}
3284
3285					// Element context
3286					} else {
3287
3288						// Support: IE, Opera, Webkit
3289						// TODO: identify versions
3290						// getElementById can match elements by name instead of ID
3291						if ( newContext && ( elem = newContext.getElementById( m ) ) &&
3292							contains( context, elem ) &&
3293							elem.id === m ) {
3294
3295							results.push( elem );
3296							return results;
3297						}
3298					}
3299
3300				// Type selector
3301				} else if ( match[ 2 ] ) {
3302					push.apply( results, context.getElementsByTagName( selector ) );
3303					return results;
3304
3305				// Class selector
3306				} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
3307					context.getElementsByClassName ) {
3308
3309					push.apply( results, context.getElementsByClassName( m ) );
3310					return results;
3311				}
3312			}
3313
3314			// Take advantage of querySelectorAll
3315			if ( support.qsa &&
3316				!nonnativeSelectorCache[ selector + " " ] &&
3317				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
3318
3319				// Support: IE 8 only
3320				// Exclude object elements
3321				( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
3322
3323				newSelector = selector;
3324				newContext = context;
3325
3326				// qSA considers elements outside a scoping root when evaluating child or
3327				// descendant combinators, which is not what we want.
3328				// In such cases, we work around the behavior by prefixing every selector in the
3329				// list with an ID selector referencing the scope context.
3330				// The technique has to be used as well when a leading combinator is used
3331				// as such selectors are not recognized by querySelectorAll.
3332				// Thanks to Andrew Dupont for this technique.
3333				if ( nodeType === 1 &&
3334					( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
3335
3336					// Expand context for sibling selectors
3337					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
3338						context;
3339
3340					// We can use :scope instead of the ID hack if the browser
3341					// supports it & if we're not changing the context.
3342					if ( newContext !== context || !support.scope ) {
3343
3344						// Capture the context ID, setting it first if necessary
3345						if ( ( nid = context.getAttribute( "id" ) ) ) {
3346							nid = nid.replace( rcssescape, fcssescape );
3347						} else {
3348							context.setAttribute( "id", ( nid = expando ) );
3349						}
3350					}
3351
3352					// Prefix every selector in the list
3353					groups = tokenize( selector );
3354					i = groups.length;
3355					while ( i-- ) {
3356						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
3357							toSelector( groups[ i ] );
3358					}
3359					newSelector = groups.join( "," );
3360				}
3361
3362				try {
3363					push.apply( results,
3364						newContext.querySelectorAll( newSelector )
3365					);
3366					return results;
3367				} catch ( qsaError ) {
3368					nonnativeSelectorCache( selector, true );
3369				} finally {
3370					if ( nid === expando ) {
3371						context.removeAttribute( "id" );
3372					}
3373				}
3374			}
3375		}
3376	}
3377
3378	// All others
3379	return select( selector.replace( rtrim, "$1" ), context, results, seed );
3380}
3381
3382/**
3383 * Create key-value caches of limited size
3384 * @returns {function(string, object)} Returns the Object data after storing it on itself with
3385 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
3386 *	deleting the oldest entry
3387 */
3388function createCache() {
3389	var keys = [];
3390
3391	function cache( key, value ) {
3392
3393		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
3394		if ( keys.push( key + " " ) > Expr.cacheLength ) {
3395
3396			// Only keep the most recent entries
3397			delete cache[ keys.shift() ];
3398		}
3399		return ( cache[ key + " " ] = value );
3400	}
3401	return cache;
3402}
3403
3404/**
3405 * Mark a function for special use by Sizzle
3406 * @param {Function} fn The function to mark
3407 */
3408function markFunction( fn ) {
3409	fn[ expando ] = true;
3410	return fn;
3411}
3412
3413/**
3414 * Support testing using an element
3415 * @param {Function} fn Passed the created element and returns a boolean result
3416 */
3417function assert( fn ) {
3418	var el = document.createElement( "fieldset" );
3419
3420	try {
3421		return !!fn( el );
3422	} catch ( e ) {
3423		return false;
3424	} finally {
3425
3426		// Remove from its parent by default
3427		if ( el.parentNode ) {
3428			el.parentNode.removeChild( el );
3429		}
3430
3431		// release memory in IE
3432		el = null;
3433	}
3434}
3435
3436/**
3437 * Adds the same handler for all of the specified attrs
3438 * @param {String} attrs Pipe-separated list of attributes
3439 * @param {Function} handler The method that will be applied
3440 */
3441function addHandle( attrs, handler ) {
3442	var arr = attrs.split( "|" ),
3443		i = arr.length;
3444
3445	while ( i-- ) {
3446		Expr.attrHandle[ arr[ i ] ] = handler;
3447	}
3448}
3449
3450/**
3451 * Checks document order of two siblings
3452 * @param {Element} a
3453 * @param {Element} b
3454 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
3455 */
3456function siblingCheck( a, b ) {
3457	var cur = b && a,
3458		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
3459			a.sourceIndex - b.sourceIndex;
3460
3461	// Use IE sourceIndex if available on both nodes
3462	if ( diff ) {
3463		return diff;
3464	}
3465
3466	// Check if b follows a
3467	if ( cur ) {
3468		while ( ( cur = cur.nextSibling ) ) {
3469			if ( cur === b ) {
3470				return -1;
3471			}
3472		}
3473	}
3474
3475	return a ? 1 : -1;
3476}
3477
3478/**
3479 * Returns a function to use in pseudos for input types
3480 * @param {String} type
3481 */
3482function createInputPseudo( type ) {
3483	return function( elem ) {
3484		var name = elem.nodeName.toLowerCase();
3485		return name === "input" && elem.type === type;
3486	};
3487}
3488
3489/**
3490 * Returns a function to use in pseudos for buttons
3491 * @param {String} type
3492 */
3493function createButtonPseudo( type ) {
3494	return function( elem ) {
3495		var name = elem.nodeName.toLowerCase();
3496		return ( name === "input" || name === "button" ) && elem.type === type;
3497	};
3498}
3499
3500/**
3501 * Returns a function to use in pseudos for :enabled/:disabled
3502 * @param {Boolean} disabled true for :disabled; false for :enabled
3503 */
3504function createDisabledPseudo( disabled ) {
3505
3506	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
3507	return function( elem ) {
3508
3509		// Only certain elements can match :enabled or :disabled
3510		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
3511		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
3512		if ( "form" in elem ) {
3513
3514			// Check for inherited disabledness on relevant non-disabled elements:
3515			// * listed form-associated elements in a disabled fieldset
3516			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
3517			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
3518			// * option elements in a disabled optgroup
3519			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
3520			// All such elements have a "form" property.
3521			if ( elem.parentNode && elem.disabled === false ) {
3522
3523				// Option elements defer to a parent optgroup if present
3524				if ( "label" in elem ) {
3525					if ( "label" in elem.parentNode ) {
3526						return elem.parentNode.disabled === disabled;
3527					} else {
3528						return elem.disabled === disabled;
3529					}
3530				}
3531
3532				// Support: IE 6 - 11
3533				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
3534				return elem.isDisabled === disabled ||
3535
3536					// Where there is no isDisabled, check manually
3537					/* jshint -W018 */
3538					elem.isDisabled !== !disabled &&
3539					inDisabledFieldset( elem ) === disabled;
3540			}
3541
3542			return elem.disabled === disabled;
3543
3544		// Try to winnow out elements that can't be disabled before trusting the disabled property.
3545		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
3546		// even exist on them, let alone have a boolean value.
3547		} else if ( "label" in elem ) {
3548			return elem.disabled === disabled;
3549		}
3550
3551		// Remaining elements are neither :enabled nor :disabled
3552		return false;
3553	};
3554}
3555
3556/**
3557 * Returns a function to use in pseudos for positionals
3558 * @param {Function} fn
3559 */
3560function createPositionalPseudo( fn ) {
3561	return markFunction( function( argument ) {
3562		argument = +argument;
3563		return markFunction( function( seed, matches ) {
3564			var j,
3565				matchIndexes = fn( [], seed.length, argument ),
3566				i = matchIndexes.length;
3567
3568			// Match elements found at the specified indexes
3569			while ( i-- ) {
3570				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
3571					seed[ j ] = !( matches[ j ] = seed[ j ] );
3572				}
3573			}
3574		} );
3575	} );
3576}
3577
3578/**
3579 * Checks a node for validity as a Sizzle context
3580 * @param {Element|Object=} context
3581 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
3582 */
3583function testContext( context ) {
3584	return context && typeof context.getElementsByTagName !== "undefined" && context;
3585}
3586
3587// Expose support vars for convenience
3588support = Sizzle.support = {};
3589
3590/**
3591 * Detects XML nodes
3592 * @param {Element|Object} elem An element or a document
3593 * @returns {Boolean} True iff elem is a non-HTML XML node
3594 */
3595isXML = Sizzle.isXML = function( elem ) {
3596	var namespace = elem
3596.namespaceURI,
3597		docElem =
vendor: 54,357 bytes, lines 3597-5511
3597 ( elem.ownerDocument || elem ).documentElement;
3598
3599	// Support: IE <=8
3600	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
3601	// https://bugs.jquery.com/ticket/4833
3602	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
3603};
3604
3605/**
3606 * Sets document-related variables once based on the current document
3607 * @param {Element|Object} [doc] An element or document object to use to set the document
3608 * @returns {Object} Returns the current document
3609 */
3610setDocument = Sizzle.setDocument = function( node ) {
3611	var hasCompare, subWindow,
3612		doc = node ? node.ownerDocument || node : preferredDoc;
3613
3614	// Return early if doc is invalid or already selected
3615	// Support: IE 11+, Edge 17 - 18+
3616	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
3617	// two documents; shallow comparisons work.
3618	// eslint-disable-next-line eqeqeq
3619	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
3620		return document;
3621	}
3622
3623	// Update global variables
3624	document = doc;
3625	docElem = document.documentElement;
3626	documentIsHTML = !isXML( document );
3627
3628	// Support: IE 9 - 11+, Edge 12 - 18+
3629	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
3630	// Support: IE 11+, Edge 17 - 18+
3631	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
3632	// two documents; shallow comparisons work.
3633	// eslint-disable-next-line eqeqeq
3634	if ( preferredDoc != document &&
3635		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
3636
3637		// Support: IE 11, Edge
3638		if ( subWindow.addEventListener ) {
3639			subWindow.addEventListener( "unload", unloadHandler, false );
3640
3641		// Support: IE 9 - 10 only
3642		} else if ( subWindow.attachEvent ) {
3643			subWindow.attachEvent( "onunload", unloadHandler );
3644		}
3645	}
3646
3647	// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
3648	// Safari 4 - 5 only, Opera <=11.6 - 12.x only
3649	// IE/Edge & older browsers don't support the :scope pseudo-class.
3650	// Support: Safari 6.0 only
3651	// Safari 6.0 supports :scope but it's an alias of :root there.
3652	support.scope = assert( function( el ) {
3653		docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
3654		return typeof el.querySelectorAll !== "undefined" &&
3655			!el.querySelectorAll( ":scope fieldset div" ).length;
3656	} );
3657
3658	/* Attributes
3659	---------------------------------------------------------------------- */
3660
3661	// Support: IE<8
3662	// Verify that getAttribute really returns attributes and not properties
3663	// (excepting IE8 booleans)
3664	support.attributes = assert( function( el ) {
3665		el.className = "i";
3666		return !el.getAttribute( "className" );
3667	} );
3668
3669	/* getElement(s)By*
3670	---------------------------------------------------------------------- */
3671
3672	// Check if getElementsByTagName("*") returns only elements
3673	support.getElementsByTagName = assert( function( el ) {
3674		el.appendChild( document.createComment( "" ) );
3675		return !el.getElementsByTagName( "*" ).length;
3676	} );
3677
3678	// Support: IE<9
3679	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
3680
3681	// Support: IE<10
3682	// Check if getElementById returns elements by name
3683	// The broken getElementById methods don't pick up programmatically-set names,
3684	// so use a roundabout getElementsByName test
3685	support.getById = assert( function( el ) {
3686		docElem.appendChild( el ).id = expando;
3687		return !document.getElementsByName || !document.getElementsByName( expando ).length;
3688	} );
3689
3690	// ID filter and find
3691	if ( support.getById ) {
3692		Expr.filter[ "ID" ] = function( id ) {
3693			var attrId = id.replace( runescape, funescape );
3694			return function( elem ) {
3695				return elem.getAttribute( "id" ) === attrId;
3696			};
3697		};
3698		Expr.find[ "ID" ] = function( id, context ) {
3699			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
3700				var elem = context.getElementById( id );
3701				return elem ? [ elem ] : [];
3702			}
3703		};
3704	} else {
3705		Expr.filter[ "ID" ] =  function( id ) {
3706			var attrId = id.replace( runescape, funescape );
3707			return function( elem ) {
3708				var node = typeof elem.getAttributeNode !== "undefined" &&
3709					elem.getAttributeNode( "id" );
3710				return node && node.value === attrId;
3711			};
3712		};
3713
3714		// Support: IE 6 - 7 only
3715		// getElementById is not reliable as a find shortcut
3716		Expr.find[ "ID" ] = function( id, context ) {
3717			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
3718				var node, i, elems,
3719					elem = context.getElementById( id );
3720
3721				if ( elem ) {
3722
3723					// Verify the id attribute
3724					node = elem.getAttributeNode( "id" );
3725					if ( node && node.value === id ) {
3726						return [ elem ];
3727					}
3728
3729					// Fall back on getElementsByName
3730					elems = context.getElementsByName( id );
3731					i = 0;
3732					while ( ( elem = elems[ i++ ] ) ) {
3733						node = elem.getAttributeNode( "id" );
3734						if ( node && node.value === id ) {
3735							return [ elem ];
3736						}
3737					}
3738				}
3739
3740				return [];
3741			}
3742		};
3743	}
3744
3745	// Tag
3746	Expr.find[ "TAG" ] = support.getElementsByTagName ?
3747		function( tag, context ) {
3748			if ( typeof context.getElementsByTagName !== "undefined" ) {
3749				return context.getElementsByTagName( tag );
3750
3751			// DocumentFragment nodes don't have gEBTN
3752			} else if ( support.qsa ) {
3753				return context.querySelectorAll( tag );
3754			}
3755		} :
3756
3757		function( tag, context ) {
3758			var elem,
3759				tmp = [],
3760				i = 0,
3761
3762				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
3763				results = context.getElementsByTagName( tag );
3764
3765			// Filter out possible comments
3766			if ( tag === "*" ) {
3767				while ( ( elem = results[ i++ ] ) ) {
3768					if ( elem.nodeType === 1 ) {
3769						tmp.push( elem );
3770					}
3771				}
3772
3773				return tmp;
3774			}
3775			return results;
3776		};
3777
3778	// Class
3779	Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
3780		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
3781			return context.getElementsByClassName( className );
3782		}
3783	};
3784
3785	/* QSA/matchesSelector
3786	---------------------------------------------------------------------- */
3787
3788	// QSA and matchesSelector support
3789
3790	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
3791	rbuggyMatches = [];
3792
3793	// qSa(:focus) reports false when true (Chrome 21)
3794	// We allow this because of a bug in IE8/9 that throws an error
3795	// whenever `document.activeElement` is accessed on an iframe
3796	// So, we allow :focus to pass through QSA all the time to avoid the IE error
3797	// See https://bugs.jquery.com/ticket/13378
3798	rbuggyQSA = [];
3799
3800	if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
3801
3802		// Build QSA regex
3803		// Regex strategy adopted from Diego Perini
3804		assert( function( el ) {
3805
3806			var input;
3807
3808			// Select is set to empty string on purpose
3809			// This is to test IE's treatment of not explicitly
3810			// setting a boolean content attribute,
3811			// since its presence should be enough
3812			// https://bugs.jquery.com/ticket/12359
3813			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
3814				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
3815				"<option selected=''></option></select>";
3816
3817			// Support: IE8, Opera 11-12.16
3818			// Nothing should be selected when empty strings follow ^= or $= or *=
3819			// The test attribute must be unknown in Opera but "safe" for WinRT
3820			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
3821			if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
3822				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
3823			}
3824
3825			// Support: IE8
3826			// Boolean attributes and "value" are not treated correctly
3827			if ( !el.querySelectorAll( "[selected]" ).length ) {
3828				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
3829			}
3830
3831			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
3832			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
3833				rbuggyQSA.push( "~=" );
3834			}
3835
3836			// Support: IE 11+, Edge 15 - 18+
3837			// IE 11/Edge don't find elements on a `[name='']` query in some cases.
3838			// Adding a temporary attribute to the document before the selection works
3839			// around the issue.
3840			// Interestingly, IE 10 & older don't seem to have the issue.
3841			input = document.createElement( "input" );
3842			input.setAttribute( "name", "" );
3843			el.appendChild( input );
3844			if ( !el.querySelectorAll( "[name='']" ).length ) {
3845				rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
3846					whitespace + "*(?:''|\"\")" );
3847			}
3848
3849			// Webkit/Opera - :checked should return selected option elements
3850			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
3851			// IE8 throws error here and will not see later tests
3852			if ( !el.querySelectorAll( ":checked" ).length ) {
3853				rbuggyQSA.push( ":checked" );
3854			}
3855
3856			// Support: Safari 8+, iOS 8+
3857			// https://bugs.webkit.org/show_bug.cgi?id=136851
3858			// In-page `selector#id sibling-combinator selector` fails
3859			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
3860				rbuggyQSA.push( ".#.+[+~]" );
3861			}
3862
3863			// Support: Firefox <=3.6 - 5 only
3864			// Old Firefox doesn't throw on a badly-escaped identifier.
3865			el.querySelectorAll( "\\\f" );
3866			rbuggyQSA.push( "[\\r\\n\\f]" );
3867		} );
3868
3869		assert( function( el ) {
3870			el.innerHTML = "<a href='' disabled='disabled'></a>" +
3871				"<select disabled='disabled'><option/></select>";
3872
3873			// Support: Windows 8 Native Apps
3874			// The type and name attributes are restricted during .innerHTML assignment
3875			var input = document.createElement( "input" );
3876			input.setAttribute( "type", "hidden" );
3877			el.appendChild( input ).setAttribute( "name", "D" );
3878
3879			// Support: IE8
3880			// Enforce case-sensitivity of name attribute
3881			if ( el.querySelectorAll( "[name=d]" ).length ) {
3882				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
3883			}
3884
3885			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
3886			// IE8 throws error here and will not see later tests
3887			if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
3888				rbuggyQSA.push( ":enabled", ":disabled" );
3889			}
3890
3891			// Support: IE9-11+
3892			// IE's :disabled selector does not pick up the children of disabled fieldsets
3893			docElem.appendChild( el ).disabled = true;
3894			if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
3895				rbuggyQSA.push( ":enabled", ":disabled" );
3896			}
3897
3898			// Support: Opera 10 - 11 only
3899			// Opera 10-11 does not throw on post-comma invalid pseudos
3900			el.querySelectorAll( "*,:x" );
3901			rbuggyQSA.push( ",.*:" );
3902		} );
3903	}
3904
3905	if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
3906		docElem.webkitMatchesSelector ||
3907		docElem.mozMatchesSelector ||
3908		docElem.oMatchesSelector ||
3909		docElem.msMatchesSelector ) ) ) ) {
3910
3911		assert( function( el ) {
3912
3913			// Check to see if it's possible to do matchesSelector
3914			// on a disconnected node (IE 9)
3915			support.disconnectedMatch = matches.call( el, "*" );
3916
3917			// This should fail with an exception
3918			// Gecko does not error, returns false instead
3919			matches.call( el, "[s!='']:x" );
3920			rbuggyMatches.push( "!=", pseudos );
3921		} );
3922	}
3923
3924	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
3925	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
3926
3927	/* Contains
3928	---------------------------------------------------------------------- */
3929	hasCompare = rnative.test( docElem.compareDocumentPosition );
3930
3931	// Element contains another
3932	// Purposefully self-exclusive
3933	// As in, an element does not contain itself
3934	contains = hasCompare || rnative.test( docElem.contains ) ?
3935		function( a, b ) {
3936			var adown = a.nodeType === 9 ? a.documentElement : a,
3937				bup = b && b.parentNode;
3938			return a === bup || !!( bup && bup.nodeType === 1 && (
3939				adown.contains ?
3940					adown.contains( bup ) :
3941					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
3942			) );
3943		} :
3944		function( a, b ) {
3945			if ( b ) {
3946				while ( ( b = b.parentNode ) ) {
3947					if ( b === a ) {
3948						return true;
3949					}
3950				}
3951			}
3952			return false;
3953		};
3954
3955	/* Sorting
3956	---------------------------------------------------------------------- */
3957
3958	// Document order sorting
3959	sortOrder = hasCompare ?
3960	function( a, b ) {
3961
3962		// Flag for duplicate removal
3963		if ( a === b ) {
3964			hasDuplicate = true;
3965			return 0;
3966		}
3967
3968		// Sort on method existence if only one input has compareDocumentPosition
3969		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
3970		if ( compare ) {
3971			return compare;
3972		}
3973
3974		// Calculate position if both inputs belong to the same document
3975		// Support: IE 11+, Edge 17 - 18+
3976		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
3977		// two documents; shallow comparisons work.
3978		// eslint-disable-next-line eqeqeq
3979		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
3980			a.compareDocumentPosition( b ) :
3981
3982			// Otherwise we know they are disconnected
3983			1;
3984
3985		// Disconnected nodes
3986		if ( compare & 1 ||
3987			( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
3988
3989			// Choose the first element that is related to our preferred document
3990			// Support: IE 11+, Edge 17 - 18+
3991			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
3992			// two documents; shallow comparisons work.
3993			// eslint-disable-next-line eqeqeq
3994			if ( a == document || a.ownerDocument == preferredDoc &&
3995				contains( preferredDoc, a ) ) {
3996				return -1;
3997			}
3998
3999			// Support: IE 11+, Edge 17 - 18+
4000			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4001			// two documents; shallow comparisons work.
4002			// eslint-disable-next-line eqeqeq
4003			if ( b == document || b.ownerDocument == preferredDoc &&
4004				contains( preferredDoc, b ) ) {
4005				return 1;
4006			}
4007
4008			// Maintain original order
4009			return sortInput ?
4010				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
4011				0;
4012		}
4013
4014		return compare & 4 ? -1 : 1;
4015	} :
4016	function( a, b ) {
4017
4018		// Exit early if the nodes are identical
4019		if ( a === b ) {
4020			hasDuplicate = true;
4021			return 0;
4022		}
4023
4024		var cur,
4025			i = 0,
4026			aup = a.parentNode,
4027			bup = b.parentNode,
4028			ap = [ a ],
4029			bp = [ b ];
4030
4031		// Parentless nodes are either documents or disconnected
4032		if ( !aup || !bup ) {
4033
4034			// Support: IE 11+, Edge 17 - 18+
4035			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4036			// two documents; shallow comparisons work.
4037			/* eslint-disable eqeqeq */
4038			return a == document ? -1 :
4039				b == document ? 1 :
4040				/* eslint-enable eqeqeq */
4041				aup ? -1 :
4042				bup ? 1 :
4043				sortInput ?
4044				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
4045				0;
4046
4047		// If the nodes are siblings, we can do a quick check
4048		} else if ( aup === bup ) {
4049			return siblingCheck( a, b );
4050		}
4051
4052		// Otherwise we need full lists of their ancestors for comparison
4053		cur = a;
4054		while ( ( cur = cur.parentNode ) ) {
4055			ap.unshift( cur );
4056		}
4057		cur = b;
4058		while ( ( cur = cur.parentNode ) ) {
4059			bp.unshift( cur );
4060		}
4061
4062		// Walk down the tree looking for a discrepancy
4063		while ( ap[ i ] === bp[ i ] ) {
4064			i++;
4065		}
4066
4067		return i ?
4068
4069			// Do a sibling check if the nodes have a common ancestor
4070			siblingCheck( ap[ i ], bp[ i ] ) :
4071
4072			// Otherwise nodes in our document sort first
4073			// Support: IE 11+, Edge 17 - 18+
4074			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4075			// two documents; shallow comparisons work.
4076			/* eslint-disable eqeqeq */
4077			ap[ i ] == preferredDoc ? -1 :
4078			bp[ i ] == preferredDoc ? 1 :
4079			/* eslint-enable eqeqeq */
4080			0;
4081	};
4082
4083	return document;
4084};
4085
4086Sizzle.matches = function( expr, elements ) {
4087	return Sizzle( expr, null, null, elements );
4088};
4089
4090Sizzle.matchesSelector = function( elem, expr ) {
4091	setDocument( elem );
4092
4093	if ( support.matchesSelector && documentIsHTML &&
4094		!nonnativeSelectorCache[ expr + " " ] &&
4095		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
4096		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
4097
4098		try {
4099			var ret = matches.call( elem, expr );
4100
4101			// IE 9's matchesSelector returns false on disconnected nodes
4102			if ( ret || support.disconnectedMatch ||
4103
4104				// As well, disconnected nodes are said to be in a document
4105				// fragment in IE 9
4106				elem.document && elem.document.nodeType !== 11 ) {
4107				return ret;
4108			}
4109		} catch ( e ) {
4110			nonnativeSelectorCache( expr, true );
4111		}
4112	}
4113
4114	return Sizzle( expr, document, null, [ elem ] ).length > 0;
4115};
4116
4117Sizzle.contains = function( context, elem ) {
4118
4119	// Set document vars if needed
4120	// Support: IE 11+, Edge 17 - 18+
4121	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4122	// two documents; shallow comparisons work.
4123	// eslint-disable-next-line eqeqeq
4124	if ( ( context.ownerDocument || context ) != document ) {
4125		setDocument( context );
4126	}
4127	return contains( context, elem );
4128};
4129
4130Sizzle.attr = function( elem, name ) {
4131
4132	// Set document vars if needed
4133	// Support: IE 11+, Edge 17 - 18+
4134	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4135	// two documents; shallow comparisons work.
4136	// eslint-disable-next-line eqeqeq
4137	if ( ( elem.ownerDocument || elem ) != document ) {
4138		setDocument( elem );
4139	}
4140
4141	var fn = Expr.attrHandle[ name.toLowerCase() ],
4142
4143		// Don't get fooled by Object.prototype properties (jQuery #13807)
4144		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
4145			fn( elem, name, !documentIsHTML ) :
4146			undefined;
4147
4148	return val !== undefined ?
4149		val :
4150		support.attributes || !documentIsHTML ?
4151			elem.getAttribute( name ) :
4152			( val = elem.getAttributeNode( name ) ) && val.specified ?
4153				val.value :
4154				null;
4155};
4156
4157Sizzle.escape = function( sel ) {
4158	return ( sel + "" ).replace( rcssescape, fcssescape );
4159};
4160
4161Sizzle.error = function( msg ) {
4162	throw new Error( "Syntax error, unrecognized expression: " + msg );
4163};
4164
4165/**
4166 * Document sorting and removing duplicates
4167 * @param {ArrayLike} results
4168 */
4169Sizzle.uniqueSort = function( results ) {
4170	var elem,
4171		duplicates = [],
4172		j = 0,
4173		i = 0;
4174
4175	// Unless we *know* we can detect duplicates, assume their presence
4176	hasDuplicate = !support.detectDuplicates;
4177	sortInput = !support.sortStable && results.slice( 0 );
4178	results.sort( sortOrder );
4179
4180	if ( hasDuplicate ) {
4181		while ( ( elem = results[ i++ ] ) ) {
4182			if ( elem === results[ i ] ) {
4183				j = duplicates.push( i );
4184			}
4185		}
4186		while ( j-- ) {
4187			results.splice( duplicates[ j ], 1 );
4188		}
4189	}
4190
4191	// Clear input after sorting to release objects
4192	// See https://github.com/jquery/sizzle/pull/225
4193	sortInput = null;
4194
4195	return results;
4196};
4197
4198/**
4199 * Utility function for retrieving the text value of an array of DOM nodes
4200 * @param {Array|Element} elem
4201 */
4202getText = Sizzle.getText = function( elem ) {
4203	var node,
4204		ret = "",
4205		i = 0,
4206		nodeType = elem.nodeType;
4207
4208	if ( !nodeType ) {
4209
4210		// If no nodeType, this is expected to be an array
4211		while ( ( node = elem[ i++ ] ) ) {
4212
4213			// Do not traverse comment nodes
4214			ret += getText( node );
4215		}
4216	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
4217
4218		// Use textContent for elements
4219		// innerText usage removed for consistency of new lines (jQuery #11153)
4220		if ( typeof elem.textContent === "string" ) {
4221			return elem.textContent;
4222		} else {
4223
4224			// Traverse its children
4225			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
4226				ret += getText( elem );
4227			}
4228		}
4229	} else if ( nodeType === 3 || nodeType === 4 ) {
4230		return elem.nodeValue;
4231	}
4232
4233	// Do not include comment or processing instruction nodes
4234
4235	return ret;
4236};
4237
4238Expr = Sizzle.selectors = {
4239
4240	// Can be adjusted by the user
4241	cacheLength: 50,
4242
4243	createPseudo: markFunction,
4244
4245	match: matchExpr,
4246
4247	attrHandle: {},
4248
4249	find: {},
4250
4251	relative: {
4252		">": { dir: "parentNode", first: true },
4253		" ": { dir: "parentNode" },
4254		"+": { dir: "previousSibling", first: true },
4255		"~": { dir: "previousSibling" }
4256	},
4257
4258	preFilter: {
4259		"ATTR": function( match ) {
4260			match[ 1 ] = match[ 1 ].replace( runescape, funescape );
4261
4262			// Move the given value to match[3] whether quoted or unquoted
4263			match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
4264				match[ 5 ] || "" ).replace( runescape, funescape );
4265
4266			if ( match[ 2 ] === "~=" ) {
4267				match[ 3 ] = " " + match[ 3 ] + " ";
4268			}
4269
4270			return match.slice( 0, 4 );
4271		},
4272
4273		"CHILD": function( match ) {
4274
4275			/* matches from matchExpr["CHILD"]
4276				1 type (only|nth|...)
4277				2 what (child|of-type)
4278				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
4279				4 xn-component of xn+y argument ([+-]?\d*n|)
4280				5 sign of xn-component
4281				6 x of xn-component
4282				7 sign of y-component
4283				8 y of y-component
4284			*/
4285			match[ 1 ] = match[ 1 ].toLowerCase();
4286
4287			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
4288
4289				// nth-* requires argument
4290				if ( !match[ 3 ] ) {
4291					Sizzle.error( match[ 0 ] );
4292				}
4293
4294				// numeric x and y parameters for Expr.filter.CHILD
4295				// remember that false/true cast respectively to 0/1
4296				match[ 4 ] = +( match[ 4 ] ?
4297					match[ 5 ] + ( match[ 6 ] || 1 ) :
4298					2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
4299				match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
4300
4301				// other types prohibit arguments
4302			} else if ( match[ 3 ] ) {
4303				Sizzle.error( match[ 0 ] );
4304			}
4305
4306			return match;
4307		},
4308
4309		"PSEUDO": function( match ) {
4310			var excess,
4311				unquoted = !match[ 6 ] && match[ 2 ];
4312
4313			if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
4314				return null;
4315			}
4316
4317			// Accept quoted arguments as-is
4318			if ( match[ 3 ] ) {
4319				match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
4320
4321			// Strip excess characters from unquoted arguments
4322			} else if ( unquoted && rpseudo.test( unquoted ) &&
4323
4324				// Get excess from tokenize (recursively)
4325				( excess = tokenize( unquoted, true ) ) &&
4326
4327				// advance to the next closing parenthesis
4328				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
4329
4330				// excess is a negative index
4331				match[ 0 ] = match[ 0 ].slice( 0, excess );
4332				match[ 2 ] = unquoted.slice( 0, excess );
4333			}
4334
4335			// Return only captures needed by the pseudo filter method (type and argument)
4336			return match.slice( 0, 3 );
4337		}
4338	},
4339
4340	filter: {
4341
4342		"TAG": function( nodeNameSelector ) {
4343			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
4344			return nodeNameSelector === "*" ?
4345				function() {
4346					return true;
4347				} :
4348				function( elem ) {
4349					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
4350				};
4351		},
4352
4353		"CLASS": function( className ) {
4354			var pattern = classCache[ className + " " ];
4355
4356			return pattern ||
4357				( pattern = new RegExp( "(^|" + whitespace +
4358					")" + className + "(" + whitespace + "|$)" ) ) && classCache(
4359						className, function( elem ) {
4360							return pattern.test(
4361								typeof elem.className === "string" && elem.className ||
4362								typeof elem.getAttribute !== "undefined" &&
4363									elem.getAttribute( "class" ) ||
4364								""
4365							);
4366				} );
4367		},
4368
4369		"ATTR": function( name, operator, check ) {
4370			return function( elem ) {
4371				var result = Sizzle.attr( elem, name );
4372
4373				if ( result == null ) {
4374					return operator === "!=";
4375				}
4376				if ( !operator ) {
4377					return true;
4378				}
4379
4380				result += "";
4381
4382				/* eslint-disable max-len */
4383
4384				return operator === "=" ? result === check :
4385					operator === "!=" ? result !== check :
4386					operator === "^=" ? check && result.indexOf( check ) === 0 :
4387					operator === "*=" ? check && result.indexOf( check ) > -1 :
4388					operator === "$=" ? check && result.slice( -check.length ) === check :
4389					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
4390					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
4391					false;
4392				/* eslint-enable max-len */
4393
4394			};
4395		},
4396
4397		"CHILD": function( type, what, _argument, first, last ) {
4398			var simple = type.slice( 0, 3 ) !== "nth",
4399				forward = type.slice( -4 ) !== "last",
4400				ofType = what === "of-type";
4401
4402			return first === 1 && last === 0 ?
4403
4404				// Shortcut for :nth-*(n)
4405				function( elem ) {
4406					return !!elem.parentNode;
4407				} :
4408
4409				function( elem, _context, xml ) {
4410					var cache, uniqueCache, outerCache, node, nodeIndex, start,
4411						dir = simple !== forward ? "nextSibling" : "previousSibling",
4412						parent = elem.parentNode,
4413						name = ofType && elem.nodeName.toLowerCase(),
4414						useCache = !xml && !ofType,
4415						diff = false;
4416
4417					if ( parent ) {
4418
4419						// :(first|last|only)-(child|of-type)
4420						if ( simple ) {
4421							while ( dir ) {
4422								node = elem;
4423								while ( ( node = node[ dir ] ) ) {
4424									if ( ofType ?
4425										node.nodeName.toLowerCase() === name :
4426										node.nodeType === 1 ) {
4427
4428										return false;
4429									}
4430								}
4431
4432								// Reverse direction for :only-* (if we haven't yet done so)
4433								start = dir = type === "only" && !start && "nextSibling";
4434							}
4435							return true;
4436						}
4437
4438						start = [ forward ? parent.firstChild : parent.lastChild ];
4439
4440						// non-xml :nth-child(...) stores cache data on `parent`
4441						if ( forward && useCache ) {
4442
4443							// Seek `elem` from a previously-cached index
4444
4445							// ...in a gzip-friendly way
4446							node = parent;
4447							outerCache = node[ expando ] || ( node[ expando ] = {} );
4448
4449							// Support: IE <9 only
4450							// Defend against cloned attroperties (jQuery gh-1709)
4451							uniqueCache = outerCache[ node.uniqueID ] ||
4452								( outerCache[ node.uniqueID ] = {} );
4453
4454							cache = uniqueCache[ type ] || [];
4455							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
4456							diff = nodeIndex && cache[ 2 ];
4457							node = nodeIndex && parent.childNodes[ nodeIndex ];
4458
4459							while ( ( node = ++nodeIndex && node && node[ dir ] ||
4460
4461								// Fallback to seeking `elem` from the start
4462								( diff = nodeIndex = 0 ) || start.pop() ) ) {
4463
4464								// When found, cache indexes on `parent` and break
4465								if ( node.nodeType === 1 && ++diff && node === elem ) {
4466									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
4467									break;
4468								}
4469							}
4470
4471						} else {
4472
4473							// Use previously-cached element index if available
4474							if ( useCache ) {
4475
4476								// ...in a gzip-friendly way
4477								node = elem;
4478								outerCache = node[ expando ] || ( node[ expando ] = {} );
4479
4480								// Support: IE <9 only
4481								// Defend against cloned attroperties (jQuery gh-1709)
4482								uniqueCache = outerCache[ node.uniqueID ] ||
4483									( outerCache[ node.uniqueID ] = {} );
4484
4485								cache = uniqueCache[ type ] || [];
4486								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
4487								diff = nodeIndex;
4488							}
4489
4490							// xml :nth-child(...)
4491							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
4492							if ( diff === false ) {
4493
4494								// Use the same loop as above to seek `elem` from the start
4495								while ( ( node = ++nodeIndex && node && node[ dir ] ||
4496									( diff = nodeIndex = 0 ) || start.pop() ) ) {
4497
4498									if ( ( ofType ?
4499										node.nodeName.toLowerCase() === name :
4500										node.nodeType === 1 ) &&
4501										++diff ) {
4502
4503										// Cache the index of each encountered element
4504										if ( useCache ) {
4505											outerCache = node[ expando ] ||
4506												( node[ expando ] = {} );
4507
4508											// Support: IE <9 only
4509											// Defend against cloned attroperties (jQuery gh-1709)
4510											uniqueCache = outerCache[ node.uniqueID ] ||
4511												( outerCache[ node.uniqueID ] = {} );
4512
4513											uniqueCache[ type ] = [ dirruns, diff ];
4514										}
4515
4516										if ( node === elem ) {
4517											break;
4518										}
4519									}
4520								}
4521							}
4522						}
4523
4524						// Incorporate the offset, then check against cycle size
4525						diff -= last;
4526						return diff === first || ( diff % first === 0 && diff / first >= 0 );
4527					}
4528				};
4529		},
4530
4531		"PSEUDO": function( pseudo, argument ) {
4532
4533			// pseudo-class names are case-insensitive
4534			// http://www.w3.org/TR/selectors/#pseudo-classes
4535			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
4536			// Remember that setFilters inherits from pseudos
4537			var args,
4538				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
4539					Sizzle.error( "unsupported pseudo: " + pseudo );
4540
4541			// The user may use createPseudo to indicate that
4542			// arguments are needed to create the filter function
4543			// just as Sizzle does
4544			if ( fn[ expando ] ) {
4545				return fn( argument );
4546			}
4547
4548			// But maintain support for old signatures
4549			if ( fn.length > 1 ) {
4550				args = [ pseudo, pseudo, "", argument ];
4551				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
4552					markFunction( function( seed, matches ) {
4553						var idx,
4554							matched = fn( seed, argument ),
4555							i = matched.length;
4556						while ( i-- ) {
4557							idx = indexOf( seed, matched[ i ] );
4558							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
4559						}
4560					} ) :
4561					function( elem ) {
4562						return fn( elem, 0, args );
4563					};
4564			}
4565
4566			return fn;
4567		}
4568	},
4569
4570	pseudos: {
4571
4572		// Potentially complex pseudos
4573		"not": markFunction( function( selector ) {
4574
4575			// Trim the selector passed to compile
4576			// to avoid treating leading and trailing
4577			// spaces as combinators
4578			var input = [],
4579				results = [],
4580				matcher = compile( selector.replace( rtrim, "$1" ) );
4581
4582			return matcher[ expando ] ?
4583				markFunction( function( seed, matches, _context, xml ) {
4584					var elem,
4585						unmatched = matcher( seed, null, xml, [] ),
4586						i = seed.length;
4587
4588					// Match elements unmatched by `matcher`
4589					while ( i-- ) {
4590						if ( ( elem = unmatched[ i ] ) ) {
4591							seed[ i ] = !( matches[ i ] = elem );
4592						}
4593					}
4594				} ) :
4595				function( elem, _context, xml ) {
4596					input[ 0 ] = elem;
4597					matcher( input, null, xml, results );
4598
4599					// Don't keep the element (issue #299)
4600					input[ 0 ] = null;
4601					return !results.pop();
4602				};
4603		} ),
4604
4605		"has": markFunction( function( selector ) {
4606			return function( elem ) {
4607				return Sizzle( selector, elem ).length > 0;
4608			};
4609		} ),
4610
4611		"contains": markFunction( function( text ) {
4612			text = text.replace( runescape, funescape );
4613			return function( elem ) {
4614				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
4615			};
4616		} ),
4617
4618		// "Whether an element is represented by a :lang() selector
4619		// is based solely on the element's language value
4620		// being equal to the identifier C,
4621		// or beginning with the identifier C immediately followed by "-".
4622		// The matching of C against the element's language value is performed case-insensitively.
4623		// The identifier C does not have to be a valid language name."
4624		// http://www.w3.org/TR/selectors/#lang-pseudo
4625		"lang": markFunction( function( lang ) {
4626
4627			// lang value must be a valid identifier
4628			if ( !ridentifier.test( lang || "" ) ) {
4629				Sizzle.error( "unsupported lang: " + lang );
4630			}
4631			lang = lang.replace( runescape, funescape ).toLowerCase();
4632			return function( elem ) {
4633				var elemLang;
4634				do {
4635					if ( ( elemLang = documentIsHTML ?
4636						elem.lang :
4637						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
4638
4639						elemLang = elemLang.toLowerCase();
4640						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
4641					}
4642				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
4643				return false;
4644			};
4645		} ),
4646
4647		// Miscellaneous
4648		"target": function( elem ) {
4649			var hash = window.location && window.location.hash;
4650			return hash && hash.slice( 1 ) === elem.id;
4651		},
4652
4653		"root": function( elem ) {
4654			return elem === docElem;
4655		},
4656
4657		"focus": function( elem ) {
4658			return elem === document.activeElement &&
4659				( !document.hasFocus || document.hasFocus() ) &&
4660				!!( elem.type || elem.href || ~elem.tabIndex );
4661		},
4662
4663		// Boolean properties
4664		"enabled": createDisabledPseudo( false ),
4665		"disabled": createDisabledPseudo( true ),
4666
4667		"checked": function( elem ) {
4668
4669			// In CSS3, :checked should return both checked and selected elements
4670			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
4671			var nodeName = elem.nodeName.toLowerCase();
4672			return ( nodeName === "input" && !!elem.checked ) ||
4673				( nodeName === "option" && !!elem.selected );
4674		},
4675
4676		"selected": function( elem ) {
4677
4678			// Accessing this property makes selected-by-default
4679			// options in Safari work properly
4680			if ( elem.parentNode ) {
4681				// eslint-disable-next-line no-unused-expressions
4682				elem.parentNode.selectedIndex;
4683			}
4684
4685			return elem.selected === true;
4686		},
4687
4688		// Contents
4689		"empty": function( elem ) {
4690
4691			// http://www.w3.org/TR/selectors/#empty-pseudo
4692			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
4693			//   but not by others (comment: 8; processing instruction: 7; etc.)
4694			// nodeType < 6 works because attributes (2) do not appear as children
4695			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
4696				if ( elem.nodeType < 6 ) {
4697					return false;
4698				}
4699			}
4700			return true;
4701		},
4702
4703		"parent": function( elem ) {
4704			return !Expr.pseudos[ "empty" ]( elem );
4705		},
4706
4707		// Element/input types
4708		"header": function( elem ) {
4709			return rheader.test( elem.nodeName );
4710		},
4711
4712		"input": function( elem ) {
4713			return rinputs.test( elem.nodeName );
4714		},
4715
4716		"button": function( elem ) {
4717			var name = elem.nodeName.toLowerCase();
4718			return name === "input" && elem.type === "button" || name === "button";
4719		},
4720
4721		"text": function( elem ) {
4722			var attr;
4723			return elem.nodeName.toLowerCase() === "input" &&
4724				elem.type === "text" &&
4725
4726				// Support: IE<8
4727				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
4728				( ( attr = elem.getAttribute( "type" ) ) == null ||
4729					attr.toLowerCase() === "text" );
4730		},
4731
4732		// Position-in-collection
4733		"first": createPositionalPseudo( function() {
4734			return [ 0 ];
4735		} ),
4736
4737		"last": createPositionalPseudo( function( _matchIndexes, length ) {
4738			return [ length - 1 ];
4739		} ),
4740
4741		"eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
4742			return [ argument < 0 ? argument + length : argument ];
4743		} ),
4744
4745		"even": createPositionalPseudo( function( matchIndexes, length ) {
4746			var i = 0;
4747			for ( ; i < length; i += 2 ) {
4748				matchIndexes.push( i );
4749			}
4750			return matchIndexes;
4751		} ),
4752
4753		"odd": createPositionalPseudo( function( matchIndexes, length ) {
4754			var i = 1;
4755			for ( ; i < length; i += 2 ) {
4756				matchIndexes.push( i );
4757			}
4758			return matchIndexes;
4759		} ),
4760
4761		"lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
4762			var i = argument < 0 ?
4763				argument + length :
4764				argument > length ?
4765					length :
4766					argument;
4767			for ( ; --i >= 0; ) {
4768				matchIndexes.push( i );
4769			}
4770			return matchIndexes;
4771		} ),
4772
4773		"gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
4774			var i = argument < 0 ? argument + length : argument;
4775			for ( ; ++i < length; ) {
4776				matchIndexes.push( i );
4777			}
4778			return matchIndexes;
4779		} )
4780	}
4781};
4782
4783Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
4784
4785// Add button/input type pseudos
4786for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
4787	Expr.pseudos[ i ] = createInputPseudo( i );
4788}
4789for ( i in { submit: true, reset: true } ) {
4790	Expr.pseudos[ i ] = createButtonPseudo( i );
4791}
4792
4793// Easy API for creating new setFilters
4794function setFilters() {}
4795setFilters.prototype = Expr.filters = Expr.pseudos;
4796Expr.setFilters = new setFilters();
4797
4798tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
4799	var matched, match, tokens, type,
4800		soFar, groups, preFilters,
4801		cached = tokenCache[ selector + " " ];
4802
4803	if ( cached ) {
4804		return parseOnly ? 0 : cached.slice( 0 );
4805	}
4806
4807	soFar = selector;
4808	groups = [];
4809	preFilters = Expr.preFilter;
4810
4811	while ( soFar ) {
4812
4813		// Comma and first run
4814		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
4815			if ( match ) {
4816
4817				// Don't consume trailing commas as valid
4818				soFar = soFar.slice( match[ 0 ].length ) || soFar;
4819			}
4820			groups.push( ( tokens = [] ) );
4821		}
4822
4823		matched = false;
4824
4825		// Combinators
4826		if ( ( match = rcombinators.exec( soFar ) ) ) {
4827			matched = match.shift();
4828			tokens.push( {
4829				value: matched,
4830
4831				// Cast descendant combinators to space
4832				type: match[ 0 ].replace( rtrim, " " )
4833			} );
4834			soFar = soFar.slice( matched.length );
4835		}
4836
4837		// Filters
4838		for ( type in Expr.filter ) {
4839			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
4840				( match = preFilters[ type ]( match ) ) ) ) {
4841				matched = match.shift();
4842				tokens.push( {
4843					value: matched,
4844					type: type,
4845					matches: match
4846				} );
4847				soFar = soFar.slice( matched.length );
4848			}
4849		}
4850
4851		if ( !matched ) {
4852			break;
4853		}
4854	}
4855
4856	// Return the length of the invalid excess
4857	// if we're just parsing
4858	// Otherwise, throw an error or return tokens
4859	return parseOnly ?
4860		soFar.length :
4861		soFar ?
4862			Sizzle.error( selector ) :
4863
4864			// Cache the tokens
4865			tokenCache( selector, groups ).slice( 0 );
4866};
4867
4868function toSelector( tokens ) {
4869	var i = 0,
4870		len = tokens.length,
4871		selector = "";
4872	for ( ; i < len; i++ ) {
4873		selector += tokens[ i ].value;
4874	}
4875	return selector;
4876}
4877
4878function addCombinator( matcher, combinator, base ) {
4879	var dir = combinator.dir,
4880		skip = combinator.next,
4881		key = skip || dir,
4882		checkNonElements = base && key === "parentNode",
4883		doneName = done++;
4884
4885	return combinator.first ?
4886
4887		// Check against closest ancestor/preceding element
4888		function( elem, context, xml ) {
4889			while ( ( elem = elem[ dir ] ) ) {
4890				if ( elem.nodeType === 1 || checkNonElements ) {
4891					return matcher( elem, context, xml );
4892				}
4893			}
4894			return false;
4895		} :
4896
4897		// Check against all ancestor/preceding elements
4898		function( elem, context, xml ) {
4899			var oldCache, uniqueCache, outerCache,
4900				newCache = [ dirruns, doneName ];
4901
4902			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
4903			if ( xml ) {
4904				while ( ( elem = elem[ dir ] ) ) {
4905					if ( elem.nodeType === 1 || checkNonElements ) {
4906						if ( matcher( elem, context, xml ) ) {
4907							return true;
4908						}
4909					}
4910				}
4911			} else {
4912				while ( ( elem = elem[ dir ] ) ) {
4913					if ( elem.nodeType === 1 || checkNonElements ) {
4914						outerCache = elem[ expando ] || ( elem[ expando ] = {} );
4915
4916						// Support: IE <9 only
4917						// Defend against cloned attroperties (jQuery gh-1709)
4918						uniqueCache = outerCache[ elem.uniqueID ] ||
4919							( outerCache[ elem.uniqueID ] = {} );
4920
4921						if ( skip && skip === elem.nodeName.toLowerCase() ) {
4922							elem = elem[ dir ] || elem;
4923						} else if ( ( oldCache = uniqueCache[ key ] ) &&
4924							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
4925
4926							// Assign to newCache so results back-propagate to previous elements
4927							return ( newCache[ 2 ] = oldCache[ 2 ] );
4928						} else {
4929
4930							// Reuse newcache so results back-propagate to previous elements
4931							uniqueCache[ key ] = newCache;
4932
4933							// A match means we're done; a fail means we have to keep checking
4934							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
4935								return true;
4936							}
4937						}
4938					}
4939				}
4940			}
4941			return false;
4942		};
4943}
4944
4945function elementMatcher( matchers ) {
4946	return matchers.length > 1 ?
4947		function( elem, context, xml ) {
4948			var i = matchers.length;
4949			while ( i-- ) {
4950				if ( !matchers[ i ]( elem, context, xml ) ) {
4951					return false;
4952				}
4953			}
4954			return true;
4955		} :
4956		matchers[ 0 ];
4957}
4958
4959function multipleContexts( selector, contexts, results ) {
4960	var i = 0,
4961		len = contexts.length;
4962	for ( ; i < len; i++ ) {
4963		Sizzle( selector, contexts[ i ], results );
4964	}
4965	return results;
4966}
4967
4968function condense( unmatched, map, filter, context, xml ) {
4969	var elem,
4970		newUnmatched = [],
4971		i = 0,
4972		len = unmatched.length,
4973		mapped = map != null;
4974
4975	for ( ; i < len; i++ ) {
4976		if ( ( elem = unmatched[ i ] ) ) {
4977			if ( !filter || filter( elem, context, xml ) ) {
4978				newUnmatched.push( elem );
4979				if ( mapped ) {
4980					map.push( i );
4981				}
4982			}
4983		}
4984	}
4985
4986	return newUnmatched;
4987}
4988
4989function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
4990	if ( postFilter && !postFilter[ expando ] ) {
4991		postFilter = setMatcher( postFilter );
4992	}
4993	if ( postFinder && !postFinder[ expando ] ) {
4994		postFinder = setMatcher( postFinder, postSelector );
4995	}
4996	return markFunction( function( seed, results, context, xml ) {
4997		var temp, i, elem,
4998			preMap = [],
4999			postMap = [],
5000			preexisting = results.length,
5001
5002			// Get initial elements from seed or context
5003			elems = seed || multipleContexts(
5004				selector || "*",
5005				context.nodeType ? [ context ] : context,
5006				[]
5007			),
5008
5009			// Prefilter to get matcher input, preserving a map for seed-results synchronization
5010			matcherIn = preFilter && ( seed || !selector ) ?
5011				condense( elems, preMap, preFilter, context, xml ) :
5012				elems,
5013
5014			matcherOut = matcher ?
5015
5016				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
5017				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
5018
5019					// ...intermediate processing is necessary
5020					[] :
5021
5022					// ...otherwise use results directly
5023					results :
5024				matcherIn;
5025
5026		// Find primary matches
5027		if ( matcher ) {
5028			matcher( matcherIn, matcherOut, context, xml );
5029		}
5030
5031		// Apply postFilter
5032		if ( postFilter ) {
5033			temp = condense( matcherOut, postMap );
5034			postFilter( temp, [], context, xml );
5035
5036			// Un-match failing elements by moving them back to matcherIn
5037			i = temp.length;
5038			while ( i-- ) {
5039				if ( ( elem = temp[ i ] ) ) {
5040					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
5041				}
5042			}
5043		}
5044
5045		if ( seed ) {
5046			if ( postFinder || preFilter ) {
5047				if ( postFinder ) {
5048
5049					// Get the final matcherOut by condensing this intermediate into postFinder contexts
5050					temp = [];
5051					i = matcherOut.length;
5052					while ( i-- ) {
5053						if ( ( elem = matcherOut[ i ] ) ) {
5054
5055							// Restore matcherIn since elem is not yet a final match
5056							temp.push( ( matcherIn[ i ] = elem ) );
5057						}
5058					}
5059					postFinder( null, ( matcherOut = [] ), temp, xml );
5060				}
5061
5062				// Move matched elements from seed to results to keep them synchronized
5063				i = matcherOut.length;
5064				while ( i-- ) {
5065					if ( ( elem = matcherOut[ i ] ) &&
5066						( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
5067
5068						seed[ temp ] = !( results[ temp ] = elem );
5069					}
5070				}
5071			}
5072
5073		// Add elements to results, through postFinder if defined
5074		} else {
5075			matcherOut = condense(
5076				matcherOut === results ?
5077					matcherOut.splice( preexisting, matcherOut.length ) :
5078					matcherOut
5079			);
5080			if ( postFinder ) {
5081				postFinder( null, results, matcherOut, xml );
5082			} else {
5083				push.apply( results, matcherOut );
5084			}
5085		}
5086	} );
5087}
5088
5089function matcherFromTokens( tokens ) {
5090	var checkContext, matcher, j,
5091		len = tokens.length,
5092		leadingRelative = Expr.relative[ tokens[ 0 ].type ],
5093		implicitRelative = leadingRelative || Expr.relative[ " " ],
5094		i = leadingRelative ? 1 : 0,
5095
5096		// The foundational matcher ensures that elements are reachable from top-level context(s)
5097		matchContext = addCombinator( function( elem ) {
5098			return elem === checkContext;
5099		}, implicitRelative, true ),
5100		matchAnyContext = addCombinator( function( elem ) {
5101			return indexOf( checkContext, elem ) > -1;
5102		}, implicitRelative, true ),
5103		matchers = [ function( elem, context, xml ) {
5104			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
5105				( checkContext = context ).nodeType ?
5106					matchContext( elem, context, xml ) :
5107					matchAnyContext( elem, context, xml ) );
5108
5109			// Avoid hanging onto element (issue #299)
5110			checkContext = null;
5111			return ret;
5112		} ];
5113
5114	for ( ; i < len; i++ ) {
5115		if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
5116			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
5117		} else {
5118			matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
5119
5120			// Return special upon seeing a positional matcher
5121			if ( matcher[ expando ] ) {
5122
5123				// Find the next relative operator (if any) for proper handling
5124				j = ++i;
5125				for ( ; j < len; j++ ) {
5126					if ( Expr.relative[ tokens[ j ].type ] ) {
5127						break;
5128					}
5129				}
5130				return setMatcher(
5131					i > 1 && elementMatcher( matchers ),
5132					i > 1 && toSelector(
5133
5134					// If the preceding token was a descendant combinator, insert an implicit any-element `*`
5135					tokens
5136						.slice( 0, i - 1 )
5137						.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
5138					).replace( rtrim, "$1" ),
5139					matcher,
5140					i < j && matcherFromTokens( tokens.slice( i, j ) ),
5141					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
5142					j < len && toSelector( tokens )
5143				);
5144			}
5145			matchers.push( matcher );
5146		}
5147	}
5148
5149	return elementMatcher( matchers );
5150}
5151
5152function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
5153	var bySet = setMatchers.length > 0,
5154		byElement = elementMatchers.length > 0,
5155		superMatcher = function( seed, context, xml, results, outermost ) {
5156			var elem, j, matcher,
5157				matchedCount = 0,
5158				i = "0",
5159				unmatched = seed && [],
5160				setMatched = [],
5161				contextBackup = outermostContext,
5162
5163				// We must always have either seed elements or outermost context
5164				elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
5165
5166				// Use integer dirruns iff this is the outermost matcher
5167				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
5168				len = elems.length;
5169
5170			if ( outermost ) {
5171
5172				// Support: IE 11+, Edge 17 - 18+
5173				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
5174				// two documents; shallow comparisons work.
5175				// eslint-disable-next-line eqeqeq
5176				outermostContext = context == document || context || outermost;
5177			}
5178
5179			// Add elements passing elementMatchers directly to results
5180			// Support: IE<9, Safari
5181			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
5182			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
5183				if ( byElement && elem ) {
5184					j = 0;
5185
5186					// Support: IE 11+, Edge 17 - 18+
5187					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
5188					// two documents; shallow comparisons work.
5189					// eslint-disable-next-line eqeqeq
5190					if ( !context && elem.ownerDocument != document ) {
5191						setDocument( elem );
5192						xml = !documentIsHTML;
5193					}
5194					while ( ( matcher = elementMatchers[ j++ ] ) ) {
5195						if ( matcher( elem, context || document, xml ) ) {
5196							results.push( elem );
5197							break;
5198						}
5199					}
5200					if ( outermost ) {
5201						dirruns = dirrunsUnique;
5202					}
5203				}
5204
5205				// Track unmatched elements for set filters
5206				if ( bySet ) {
5207
5208					// They will have gone through all possible matchers
5209					if ( ( elem = !matcher && elem ) ) {
5210						matchedCount--;
5211					}
5212
5213					// Lengthen the array for every element, matched or not
5214					if ( seed ) {
5215						unmatched.push( elem );
5216					}
5217				}
5218			}
5219
5220			// `i` is now the count of elements visited above, and adding it to `matchedCount`
5221			// makes the latter nonnegative.
5222			matchedCount += i;
5223
5224			// Apply set filters to unmatched elements
5225			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
5226			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
5227			// no element matchers and no seed.
5228			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
5229			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
5230			// numerically zero.
5231			if ( bySet && i !== matchedCount ) {
5232				j = 0;
5233				while ( ( matcher = setMatchers[ j++ ] ) ) {
5234					matcher( unmatched, setMatched, context, xml );
5235				}
5236
5237				if ( seed ) {
5238
5239					// Reintegrate element matches to eliminate the need for sorting
5240					if ( matchedCount > 0 ) {
5241						while ( i-- ) {
5242							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
5243								setMatched[ i ] = pop.call( results );
5244							}
5245						}
5246					}
5247
5248					// Discard index placeholder values to get only actual matches
5249					setMatched = condense( setMatched );
5250				}
5251
5252				// Add matches to results
5253				push.apply( results, setMatched );
5254
5255				// Seedless set matches succeeding multiple successful matchers stipulate sorting
5256				if ( outermost && !seed && setMatched.length > 0 &&
5257					( matchedCount + setMatchers.length ) > 1 ) {
5258
5259					Sizzle.uniqueSort( results );
5260				}
5261			}
5262
5263			// Override manipulation of globals by nested matchers
5264			if ( outermost ) {
5265				dirruns = dirrunsUnique;
5266				outermostContext = contextBackup;
5267			}
5268
5269			return unmatched;
5270		};
5271
5272	return bySet ?
5273		markFunction( superMatcher ) :
5274		superMatcher;
5275}
5276
5277compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
5278	var i,
5279		setMatchers = [],
5280		elementMatchers = [],
5281		cached = compilerCache[ selector + " " ];
5282
5283	if ( !cached ) {
5284
5285		// Generate a function of recursive functions that can be used to check each element
5286		if ( !match ) {
5287			match = tokenize( selector );
5288		}
5289		i = match.length;
5290		while ( i-- ) {
5291			cached = matcherFromTokens( match[ i ] );
5292			if ( cached[ expando ] ) {
5293				setMatchers.push( cached );
5294			} else {
5295				elementMatchers.push( cached );
5296			}
5297		}
5298
5299		// Cache the compiled function
5300		cached = compilerCache(
5301			selector,
5302			matcherFromGroupMatchers( elementMatchers, setMatchers )
5303		);
5304
5305		// Save selector and tokenization
5306		cached.selector = selector;
5307	}
5308	return cached;
5309};
5310
5311/**
5312 * A low-level selection function that works with Sizzle's compiled
5313 *  selector functions
5314 * @param {String|Function} selector A selector or a pre-compiled
5315 *  selector function built with Sizzle.compile
5316 * @param {Element} context
5317 * @param {Array} [results]
5318 * @param {Array} [seed] A set of elements to match against
5319 */
5320select = Sizzle.select = function( selector, context, results, seed ) {
5321	var i, tokens, token, type, find,
5322		compiled = typeof selector === "function" && selector,
5323		match = !seed && tokenize( ( selector = compiled.selector || selector ) );
5324
5325	results = results || [];
5326
5327	// Try to minimize operations if there is only one selector in the list and no seed
5328	// (the latter of which guarantees us context)
5329	if ( match.length === 1 ) {
5330
5331		// Reduce context if the leading compound selector is an ID
5332		tokens = match[ 0 ] = match[ 0 ].slice( 0 );
5333		if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
5334			context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
5335
5336			context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
5337				.replace( runescape, funescape ), context ) || [] )[ 0 ];
5338			if ( !context ) {
5339				return results;
5340
5341			// Precompiled matchers will still verify ancestry, so step up a level
5342			} else if ( compiled ) {
5343				context = context.parentNode;
5344			}
5345
5346			selector = selector.slice( tokens.shift().value.length );
5347		}
5348
5349		// Fetch a seed set for right-to-left matching
5350		i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
5351		while ( i-- ) {
5352			token = tokens[ i ];
5353
5354			// Abort if we hit a combinator
5355			if ( Expr.relative[ ( type = token.type ) ] ) {
5356				break;
5357			}
5358			if ( ( find = Expr.find[ type ] ) ) {
5359
5360				// Search, expanding context for leading sibling combinators
5361				if ( ( seed = find(
5362					token.matches[ 0 ].replace( runescape, funescape ),
5363					rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
5364						context
5365				) ) ) {
5366
5367					// If seed is empty or no tokens remain, we can return early
5368					tokens.splice( i, 1 );
5369					selector = seed.length && toSelector( tokens );
5370					if ( !selector ) {
5371						push.apply( results, seed );
5372						return results;
5373					}
5374
5375					break;
5376				}
5377			}
5378		}
5379	}
5380
5381	// Compile and execute a filtering function if one is not provided
5382	// Provide `match` to avoid retokenization if we modified the selector above
5383	( compiled || compile( selector, match ) )(
5384		seed,
5385		context,
5386		!documentIsHTML,
5387		results,
5388		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
5389	);
5390	return results;
5391};
5392
5393// One-time assignments
5394
5395// Sort stability
5396support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
5397
5398// Support: Chrome 14-35+
5399// Always assume duplicates if they aren't passed to the comparison function
5400support.detectDuplicates = !!hasDuplicate;
5401
5402// Initialize against the default document
5403setDocument();
5404
5405// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
5406// Detached nodes confoundingly follow *each other*
5407support.sortDetached = assert( function( el ) {
5408
5409	// Should return 1, but returns 4 (following)
5410	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
5411} );
5412
5413// Support: IE<8
5414// Prevent attribute/property "interpolation"
5415// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
5416if ( !assert( function( el ) {
5417	el.innerHTML = "<a href='#'></a>";
5418	return el.firstChild.getAttribute( "href" ) === "#";
5419} ) ) {
5420	addHandle( "type|href|height|width", function( elem, name, isXML ) {
5421		if ( !isXML ) {
5422			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
5423		}
5424	} );
5425}
5426
5427// Support: IE<9
5428// Use defaultValue in place of getAttribute("value")
5429if ( !support.attributes || !assert( function( el ) {
5430	el.innerHTML = "<input/>";
5431	el.firstChild.setAttribute( "value", "" );
5432	return el.firstChild.getAttribute( "value" ) === "";
5433} ) ) {
5434	addHandle( "value", function( elem, _name, isXML ) {
5435		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
5436			return elem.defaultValue;
5437		}
5438	} );
5439}
5440
5441// Support: IE<9
5442// Use getAttributeNode to fetch booleans when getAttribute lies
5443if ( !assert( function( el ) {
5444	return el.getAttribute( "disabled" ) == null;
5445} ) ) {
5446	addHandle( booleans, function( elem, name, isXML ) {
5447		var val;
5448		if ( !isXML ) {
5449			return elem[ name ] === true ? name.toLowerCase() :
5450				( val = elem.getAttributeNode( name ) ) && val.specified ?
5451					val.value :
5452					null;
5453		}
5454	} );
5455}
5456
5457return Sizzle;
5458
5459} )( window );
5460
5461
5462
5463jQuery.find = Sizzle;
5464jQuery.expr = Sizzle.selectors;
5465
5466// Deprecated
5467jQuery.expr[ ":" ] = jQuery.expr.pseudos;
5468jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
5469jQuery.text = Sizzle.getText;
5470jQuery.isXMLDoc = Sizzle.isXML;
5471jQuery.contains = Sizzle.contains;
5472jQuery.escapeSelector = Sizzle.escape;
5473
5474
5475
5476
5477var dir = function( elem, dir, until ) {
5478	var matched = [],
5479		truncate = until !== undefined;
5480
5481	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
5482		if ( elem.nodeType === 1 ) {
5483			if ( truncate && jQuery( elem ).is( until ) ) {
5484				break;
5485			}
5486			matched.push( elem );
5487		}
5488	}
5489	return matched;
5490};
5491
5492
5493var siblings = function( n, elem ) {
5494	var matched = [];
5495
5496	for ( ; n; n = n.nextSibling ) {
5497		if ( n.nodeType === 1 && n !== elem ) {
5498			matched.push( n );
5499		}
5500	}
5501
5502	return matched;
5503};
5504
5505
5506var rneedsContext = jQuery.expr.match.needsContext;
5507
5508
5509
5510function nodeName( elem, name ) {
5511
5512  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
5513
5514};
vendor: 21,546 bytes, lines 5514-6339
5514
5515var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
5516
5517
5518
5519// Implement the identical functionality for filter and not
5520function winnow( elements, qualifier, not ) {
5521	if ( isFunction( qualifier ) ) {
5522		return jQuery.grep( elements, function( elem, i ) {
5523			return !!qualifier.call( elem, i, elem ) !== not;
5524		} );
5525	}
5526
5527	// Single element
5528	if ( qualifier.nodeType ) {
5529		return jQuery.grep( elements, function( elem ) {
5530			return ( elem === qualifier ) !== not;
5531		} );
5532	}
5533
5534	// Arraylike of elements (jQuery, arguments, Array)
5535	if ( typeof qualifier !== "string" ) {
5536		return jQuery.grep( elements, function( elem ) {
5537			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
5538		} );
5539	}
5540
5541	// Filtered directly for both simple and complex selectors
5542	return jQuery.filter( qualifier, elements, not );
5543}
5544
5545jQuery.filter = function( expr, elems, not ) {
5546	var elem = elems[ 0 ];
5547
5548	if ( not ) {
5549		expr = ":not(" + expr + ")";
5550	}
5551
5552	if ( elems.length === 1 && elem.nodeType === 1 ) {
5553		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
5554	}
5555
5556	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
5557		return elem.nodeType === 1;
5558	} ) );
5559};
5560
5561jQuery.fn.extend( {
5562	find: function( selector ) {
5563		var i, ret,
5564			len = this.length,
5565			self = this;
5566
5567		if ( typeof selector !== "string" ) {
5568			return this.pushStack( jQuery( selector ).filter( function() {
5569				for ( i = 0; i < len; i++ ) {
5570					if ( jQuery.contains( self[ i ], this ) ) {
5571						return true;
5572					}
5573				}
5574			} ) );
5575		}
5576
5577		ret = this.pushStack( [] );
5578
5579		for ( i = 0; i < len; i++ ) {
5580			jQuery.find( selector, self[ i ], ret );
5581		}
5582
5583		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
5584	},
5585	filter: function( selector ) {
5586		return this.pushStack( winnow( this, selector || [], false ) );
5587	},
5588	not: function( selector ) {
5589		return this.pushStack( winnow( this, selector || [], true ) );
5590	},
5591	is: function( selector ) {
5592		return !!winnow(
5593			this,
5594
5595			// If this is a positional/relative selector, check membership in the returned set
5596			// so $("p:first").is("p:last") won't return true for a doc with two "p".
5597			typeof selector === "string" && rneedsContext.test( selector ) ?
5598				jQuery( selector ) :
5599				selector || [],
5600			false
5601		).length;
5602	}
5603} );
5604
5605
5606// Initialize a jQuery object
5607
5608
5609// A central reference to the root jQuery(document)
5610var rootjQuery,
5611
5612	// A simple way to check for HTML strings
5613	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
5614	// Strict HTML recognition (#11290: must start with <)
5615	// Shortcut simple #id case for speed
5616	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
5617
5618	init = jQuery.fn.init = function( selector, context, root ) {
5619		var match, elem;
5620
5621		// HANDLE: $(""), $(null), $(undefined), $(false)
5622		if ( !selector ) {
5623			return this;
5624		}
5625
5626		// Method init() accepts an alternate rootjQuery
5627		// so migrate can support jQuery.sub (gh-2101)
5628		root = root || rootjQuery;
5629
5630		// Handle HTML strings
5631		if ( typeof selector === "string" ) {
5632			if ( selector[ 0 ] === "<" &&
5633				selector[ selector.length - 1 ] === ">" &&
5634				selector.length >= 3 ) {
5635
5636				// Assume that strings that start and end with <> are HTML and skip the regex check
5637				match = [ null, selector, null ];
5638
5639			} else {
5640				match = rquickExpr.exec( selector );
5641			}
5642
5643			// Match html or make sure no context is specified for #id
5644			if ( match && ( match[ 1 ] || !context ) ) {
5645
5646				// HANDLE: $(html) -> $(array)
5647				if ( match[ 1 ] ) {
5648					context = context instanceof jQuery ? context[ 0 ] : context;
5649
5650					// Option to run scripts is true for back-compat
5651					// Intentionally let the error be thrown if parseHTML is not present
5652					jQuery.merge( this, jQuery.parseHTML(
5653						match[ 1 ],
5654						context && context.nodeType ? context.ownerDocument || context : document,
5655						true
5656					) );
5657
5658					// HANDLE: $(html, props)
5659					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
5660						for ( match in context ) {
5661
5662							// Properties of context are called as methods if possible
5663							if ( isFunction( this[ match ] ) ) {
5664								this[ match ]( context[ match ] );
5665
5666							// ...and otherwise set as attributes
5667							} else {
5668								this.attr( match, context[ match ] );
5669							}
5670						}
5671					}
5672
5673					return this;
5674
5675				// HANDLE: $(#id)
5676				} else {
5677					elem = document.getElementById( match[ 2 ] );
5678
5679					if ( elem ) {
5680
5681						// Inject the element directly into the jQuery object
5682						this[ 0 ] = elem;
5683						this.length = 1;
5684					}
5685					return this;
5686				}
5687
5688			// HANDLE: $(expr, $(...))
5689			} else if ( !context || context.jquery ) {
5690				return ( context || root ).find( selector );
5691
5692			// HANDLE: $(expr, context)
5693			// (which is just equivalent to: $(context).find(expr)
5694			} else {
5695				return this.constructor( context ).find( selector );
5696			}
5697
5698		// HANDLE: $(DOMElement)
5699		} else if ( selector.nodeType ) {
5700			this[ 0 ] = selector;
5701			this.length = 1;
5702			return this;
5703
5704		// HANDLE: $(function)
5705		// Shortcut for document ready
5706		} else if ( isFunction( selector ) ) {
5707			return root.ready !== undefined ?
5708				root.ready( selector ) :
5709
5710				// Execute immediately if ready is not present
5711				selector( jQuery );
5712		}
5713
5714		return jQuery.makeArray( selector, this );
5715	};
5716
5717// Give the init function the jQuery prototype for later instantiation
5718init.prototype = jQuery.fn;
5719
5720// Initialize central reference
5721rootjQuery = jQuery( document );
5722
5723
5724var rparentsprev = /^(?:parents|prev(?:Until|All))/,
5725
5726	// Methods guaranteed to produce a unique set when starting from a unique set
5727	guaranteedUnique = {
5728		children: true,
5729		contents: true,
5730		next: true,
5731		prev: true
5732	};
5733
5734jQuery.fn.extend( {
5735	has: function( target ) {
5736		var targets = jQuery( target, this ),
5737			l = targets.length;
5738
5739		return this.filter( function() {
5740			var i = 0;
5741			for ( ; i < l; i++ ) {
5742				if ( jQuery.contains( this, targets[ i ] ) ) {
5743					return true;
5744				}
5745			}
5746		} );
5747	},
5748
5749	closest: function( selectors, context ) {
5750		var cur,
5751			i = 0,
5752			l = this.length,
5753			matched = [],
5754			targets = typeof selectors !== "string" && jQuery( selectors );
5755
5756		// Positional selectors never match, since there's no _selection_ context
5757		if ( !rneedsContext.test( selectors ) ) {
5758			for ( ; i < l; i++ ) {
5759				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
5760
5761					// Always skip document fragments
5762					if ( cur.nodeType < 11 && ( targets ?
5763						targets.index( cur ) > -1 :
5764
5765						// Don't pass non-elements to Sizzle
5766						cur.nodeType === 1 &&
5767							jQuery.find.matchesSelector( cur, selectors ) ) ) {
5768
5769						matched.push( cur );
5770						break;
5771					}
5772				}
5773			}
5774		}
5775
5776		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
5777	},
5778
5779	// Determine the position of an element within the set
5780	index: function( elem ) {
5781
5782		// No argument, return index in parent
5783		if ( !elem ) {
5784			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
5785		}
5786
5787		// Index in selector
5788		if ( typeof elem === "string" ) {
5789			return indexOf.call( jQuery( elem ), this[ 0 ] );
5790		}
5791
5792		// Locate the position of the desired element
5793		return indexOf.call( this,
5794
5795			// If it receives a jQuery object, the first element is used
5796			elem.jquery ? elem[ 0 ] : elem
5797		);
5798	},
5799
5800	add: function( selector, context ) {
5801		return this.pushStack(
5802			jQuery.uniqueSort(
5803				jQuery.merge( this.get(), jQuery( selector, context ) )
5804			)
5805		);
5806	},
5807
5808	addBack: function( selector ) {
5809		return this.add( selector == null ?
5810			this.prevObject : this.prevObject.filter( selector )
5811		);
5812	}
5813} );
5814
5815function sibling( cur, dir ) {
5816	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
5817	return cur;
5818}
5819
5820jQuery.each( {
5821	parent: function( elem ) {
5822		var parent = elem.parentNode;
5823		return parent && parent.nodeType !== 11 ? parent : null;
5824	},
5825	parents: function( elem ) {
5826		return dir( elem, "parentNode" );
5827	},
5828	parentsUntil: function( elem, _i, until ) {
5829		return dir( elem, "parentNode", until );
5830	},
5831	next: function( elem ) {
5832		return sibling( elem, "nextSibling" );
5833	},
5834	prev: function( elem ) {
5835		return sibling( elem, "previousSibling" );
5836	},
5837	nextAll: function( elem ) {
5838		return dir( elem, "nextSibling" );
5839	},
5840	prevAll: function( elem ) {
5841		return dir( elem, "previousSibling" );
5842	},
5843	nextUntil: function( elem, _i, until ) {
5844		return dir( elem, "nextSibling", until );
5845	},
5846	prevUntil: function( elem, _i, until ) {
5847		return dir( elem, "previousSibling", until );
5848	},
5849	siblings: function( elem ) {
5850		return siblings( ( elem.parentNode || {} ).firstChild, elem );
5851	},
5852	children: function( elem ) {
5853		return siblings( elem.firstChild );
5854	},
5855	contents: function( elem ) {
5856		if ( elem.contentDocument != null &&
5857
5858			// Support: IE 11+
5859			// <object> elements with no `data` attribute has an object
5860			// `contentDocument` with a `null` prototype.
5861			getProto( elem.contentDocument ) ) {
5862
5863			return elem.contentDocument;
5864		}
5865
5866		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
5867		// Treat the template element as a regular one in browsers that
5868		// don't support it.
5869		if ( nodeName( elem, "template" ) ) {
5870			elem = elem.content || elem;
5871		}
5872
5873		return jQuery.merge( [], elem.childNodes );
5874	}
5875}, function( name, fn ) {
5876	jQuery.fn[ name ] = function( until, selector ) {
5877		var matched = jQuery.map( this, fn, until );
5878
5879		if ( name.slice( -5 ) !== "Until" ) {
5880			selector = until;
5881		}
5882
5883		if ( selector && typeof selector === "string" ) {
5884			matched = jQuery.filter( selector, matched );
5885		}
5886
5887		if ( this.length > 1 ) {
5888
5889			// Remove duplicates
5890			if ( !guaranteedUnique[ name ] ) {
5891				jQuery.uniqueSort( matched );
5892			}
5893
5894			// Reverse order for parents* and prev-derivatives
5895			if ( rparentsprev.test( name ) ) {
5896				matched.reverse();
5897			}
5898		}
5899
5900		return this.pushStack( matched );
5901	};
5902} );
5903var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
5904
5905
5906
5907// Convert String-formatted options into Object-formatted ones
5908function createOptions( options ) {
5909	var object = {};
5910	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
5911		object[ flag ] = true;
5912	} );
5913	return object;
5914}
5915
5916/*
5917 * Create a callback list using the following parameters:
5918 *
5919 *	options: an optional list of space-separated options that will change how
5920 *			the callback list behaves or a more traditional option object
5921 *
5922 * By default a callback list will act like an event callback list and can be
5923 * "fired" multiple times.
5924 *
5925 * Possible options:
5926 *
5927 *	once:			will ensure the callback list can only be fired once (like a Deferred)
5928 *
5929 *	memory:			will keep track of previous values and will call any callback added
5930 *					after the list has been fired right away with the latest "memorized"
5931 *					values (like a Deferred)
5932 *
5933 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
5934 *
5935 *	stopOnFalse:	interrupt callings when a callback returns false
5936 *
5937 */
5938jQuery.Callbacks = function( options ) {
5939
5940	// Convert options from String-formatted to Object-formatted if needed
5941	// (we check in cache first)
5942	options = typeof options === "string" ?
5943		createOptions( options ) :
5944		jQuery.extend( {}, options );
5945
5946	var // Flag to know if list is currently firing
5947		firing,
5948
5949		// Last fire value for non-forgettable lists
5950		memory,
5951
5952		// Flag to know if list was already fired
5953		fired,
5954
5955		// Flag to prevent firing
5956		locked,
5957
5958		// Actual callback list
5959		list = [],
5960
5961		// Queue of execution data for repeatable lists
5962		queue = [],
5963
5964		// Index of currently firing callback (modified by add/remove as needed)
5965		firingIndex = -1,
5966
5967		// Fire callbacks
5968		fire = function() {
5969
5970			// Enforce single-firing
5971			locked = locked || options.once;
5972
5973			// Execute callbacks for all pending executions,
5974			// respecting firingIndex overrides and runtime changes
5975			fired = firing = true;
5976			for ( ; queue.length; firingIndex = -1 ) {
5977				memory = queue.shift();
5978				while ( ++firingIndex < list.length ) {
5979
5980					// Run callback and check for early termination
5981					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
5982						options.stopOnFalse ) {
5983
5984						// Jump to end and forget the data so .add doesn't re-fire
5985						firingIndex = list.length;
5986						memory = false;
5987					}
5988				}
5989			}
5990
5991			// Forget the data if we're done with it
5992			if ( !options.memory ) {
5993				memory = false;
5994			}
5995
5996			firing = false;
5997
5998			// Clean up if we're done firing for good
5999			if ( locked ) {
6000
6001				// Keep an empty list if we have data for future add calls
6002				if ( memory ) {
6003					list = [];
6004
6005				// Otherwise, this object is spent
6006				} else {
6007					list = "";
6008				}
6009			}
6010		},
6011
6012		// Actual Callbacks object
6013		self = {
6014
6015			// Add a callback or a collection of callbacks to the list
6016			add: function() {
6017				if ( list ) {
6018
6019					// If we have memory from a past run, we should fire after adding
6020					if ( memory && !firing ) {
6021						firingIndex = list.length - 1;
6022						queue.push( memory );
6023					}
6024
6025					( function add( args ) {
6026						jQuery.each( args, function( _, arg ) {
6027							if ( isFunction( arg ) ) {
6028								if ( !options.unique || !self.has( arg ) ) {
6029									list.push( arg );
6030								}
6031							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
6032
6033								// Inspect recursively
6034								add( arg );
6035							}
6036						} );
6037					} )( arguments );
6038
6039					if ( memory && !firing ) {
6040						fire();
6041					}
6042				}
6043				return this;
6044			},
6045
6046			// Remove a callback from the list
6047			remove: function() {
6048				jQuery.each( arguments, function( _, arg ) {
6049					var index;
6050					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
6051						list.splice( index, 1 );
6052
6053						// Handle firing indexes
6054						if ( index <= firingIndex ) {
6055							firingIndex--;
6056						}
6057					}
6058				} );
6059				return this;
6060			},
6061
6062			// Check if a given callback is in the list.
6063			// If no argument is given, return whether or not list has callbacks attached.
6064			has: function( fn ) {
6065				return fn ?
6066					jQuery.inArray( fn, list ) > -1 :
6067					list.length > 0;
6068			},
6069
6070			// Remove all callbacks from the list
6071			empty: function() {
6072				if ( list ) {
6073					list = [];
6074				}
6075				return this;
6076			},
6077
6078			// Disable .fire and .add
6079			// Abort any current/pending executions
6080			// Clear all callbacks and values
6081			disable: function() {
6082				locked = queue = [];
6083				list = memory = "";
6084				return this;
6085			},
6086			disabled: function() {
6087				return !list;
6088			},
6089
6090			// Disable .fire
6091			// Also disable .add unless we have memory (since it would have no effect)
6092			// Abort any pending executions
6093			lock: function() {
6094				locked = queue = [];
6095				if ( !memory && !firing ) {
6096					list = memory = "";
6097				}
6098				return this;
6099			},
6100			locked: function() {
6101				return !!locked;
6102			},
6103
6104			// Call all callbacks with the given context and arguments
6105			fireWith: function( context, args ) {
6106				if ( !locked ) {
6107					args = args || [];
6108					args = [ context, args.slice ? args.slice() : args ];
6109					queue.push( args );
6110					if ( !firing ) {
6111						fire();
6112					}
6113				}
6114				return this;
6115			},
6116
6117			// Call all the callbacks with the given arguments
6118			fire: function() {
6119				self.fireWith( this, arguments );
6120				return this;
6121			},
6122
6123			// To know if the callbacks have already been called at least once
6124			fired: function() {
6125				return !!fired;
6126			}
6127		};
6128
6129	return self;
6130};
6131
6132
6133function Identity( v ) {
6134	return v;
6135}
6136function Thrower( ex ) {
6137	throw ex;
6138}
6139
6140function adoptValue( value, resolve, reject, noValue ) {
6141	var method;
6142
6143	try {
6144
6145		// Check for promise aspect first to privilege synchronous behavior
6146		if ( value && isFunction( ( method = value.promise ) ) ) {
6147			method.call( value ).done( resolve ).fail( reject );
6148
6149		// Other thenables
6150		} else if ( value && isFunction( ( method = value.then ) ) ) {
6151			method.call( value, resolve, reject );
6152
6153		// Other non-thenables
6154		} else {
6155
6156			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
6157			// * false: [ value ].slice( 0 ) => resolve( value )
6158			// * true: [ value ].slice( 1 ) => resolve()
6159			resolve.apply( undefined, [ value ].slice( noValue ) );
6160		}
6161
6162	// For Promises/A+, convert exceptions into rejections
6163	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
6164	// Deferred#then to conditionally suppress rejection.
6165	} catch ( value ) {
6166
6167		// Support: Android 4.0 only
6168		// Strict mode functions invoked without .call/.apply get global-object context
6169		reject.apply( undefined, [ value ] );
6170	}
6171}
6172
6173jQuery.extend( {
6174
6175	Deferred: function( func ) {
6176		var tuples = [
6177
6178				// action, add listener, callbacks,
6179				// ... .then handlers, argument index, [final state]
6180				[ "notify", "progress", jQuery.Callbacks( "memory" ),
6181					jQuery.Callbacks( "memory" ), 2 ],
6182				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
6183					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
6184				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
6185					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
6186			],
6187			state = "pending",
6188			promise = {
6189				state: function() {
6190					return state;
6191				},
6192				always: function() {
6193					deferred.done( arguments ).fail( arguments );
6194					return this;
6195				},
6196				"catch": function( fn ) {
6197					return promise.then( null, fn );
6198				},
6199
6200				// Keep pipe for back-compat
6201				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
6202					var fns = arguments;
6203
6204					return jQuery.Deferred( function( newDefer ) {
6205						jQuery.each( tuples, function( _i, tuple ) {
6206
6207							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
6208							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
6209
6210							// deferred.progress(function() { bind to newDefer or newDefer.notify })
6211							// deferred.done(function() { bind to newDefer or newDefer.resolve })
6212							// deferred.fail(function() { bind to newDefer or newDefer.reject })
6213							deferred[ tuple[ 1 ] ]( function() {
6214								var returned = fn && fn.apply( this, arguments );
6215								if ( returned && isFunction( returned.promise ) ) {
6216									returned.promise()
6217										.progress( newDefer.notify )
6218										.done( newDefer.resolve )
6219										.fail( newDefer.reject );
6220								} else {
6221									newDefer[ tuple[ 0 ] + "With" ](
6222										this,
6223										fn ? [ returned ] : arguments
6224									);
6225								}
6226							} );
6227						} );
6228						fns = null;
6229					} ).promise();
6230				},
6231				then: function( onFulfilled, onRejected, onProgress ) {
6232					var maxDepth = 0;
6233					function resolve( depth, deferred, handler, special ) {
6234						return function() {
6235							var that = this,
6236								args = arguments,
6237								mightThrow = function() {
6238									var returned, then;
6239
6240									// Support: Promises/A+ section 2.3.3.3.3
6241									// https://promisesaplus.com/#point-59
6242									// Ignore double-resolution attempts
6243									if ( depth < maxDepth ) {
6244										return;
6245									}
6246
6247									returned = handler.apply( that, args );
6248
6249									// Support: Promises/A+ section 2.3.1
6250									// https://promisesaplus.com/#point-48
6251									if ( returned === deferred.promise() ) {
6252										throw new TypeError( "Thenable self-resolution" );
6253									}
6254
6255									// Support: Promises/A+ sections 2.3.3.1, 3.5
6256									// https://promisesaplus.com/#point-54
6257									// https://promisesaplus.com/#point-75
6258									// Retrieve `then` only once
6259									then = returned &&
6260
6261										// Support: Promises/A+ section 2.3.4
6262										// https://promisesaplus.com/#point-64
6263										// Only check objects and functions for thenability
6264										( typeof returned === "object" ||
6265											typeof returned === "function" ) &&
6266										returned.then;
6267
6268									// Handle a returned thenable
6269									if ( isFunction( then ) ) {
6270
6271										// Special processors (notify) just wait for resolution
6272										if ( special ) {
6273											then.call(
6274												returned,
6275												resolve( maxDepth, deferred, Identity, special ),
6276												resolve( maxDepth, deferred, Thrower, special )
6277											);
6278
6279										// Normal processors (resolve) also hook into progress
6280										} else {
6281
6282											// ...and disregard older resolution values
6283											maxDepth++;
6284
6285											then.call(
6286												returned,
6287												resolve( maxDepth, deferred, Identity, special ),
6288												resolve( maxDepth, deferred, Thrower, special ),
6289												resolve( maxDepth, deferred, Identity,
6290													deferred.notifyWith )
6291											);
6292										}
6293
6294									// Handle all other returned values
6295									} else {
6296
6297										// Only substitute handlers pass on context
6298										// and multiple values (non-spec behavior)
6299										if ( handler !== Identity ) {
6300											that = undefined;
6301											args = [ returned ];
6302										}
6303
6304										// Process the value(s)
6305										// Default process is resolve
6306										( special || deferred.resolveWith )( that, args );
6307									}
6308								},
6309
6310								// Only normal processors (resolve) catch and reject exceptions
6311								process = special ?
6312									mightThrow :
6313									function() {
6314										try {
6315											mightThrow();
6316										} catch ( e ) {
6317
6318											if ( jQuery.Deferred.exceptionHook ) {
6319												jQuery.Deferred.exceptionHook( e,
6320													process.stackTrace );
6321											}
6322
6323											// Support: Promises/A+ section 2.3.3.3.4.1
6324											// https://promisesaplus.com/#point-61
6325											// Ignore post-resolution exceptions
6326											if ( depth + 1 >= maxDepth ) {
6327
6328												// Only substitute handlers pass on context
6329												// and multiple values (non-spec behavior)
6330												if ( handler !== Thrower ) {
6331													that = undefined;
6332													args = [ e ];
6333												}
6334
6335												deferred.rejectWith( that, args );
6336											}
6337										}
6338									};
6339
vendor: 7,865 bytes, lines 6340-6658
6340							// Support: Promises/A+ section 2.3.3.3.1
6341							// https://promisesaplus.com/#point-57
6342							// Re-resolve promises immediately to dodge false rejection from
6343							// subsequent errors
6344							if ( depth ) {
6345								process();
6346							} else {
6347
6348								// Call an optional hook to record the stack, in case of exception
6349								// since it's otherwise lost when execution goes async
6350								if ( jQuery.Deferred.getStackHook ) {
6351									process.stackTrace = jQuery.Deferred.getStackHook();
6352								}
6353								window.setTimeout( process );
6354							}
6355						};
6356					}
6357
6358					return jQuery.Deferred( function( newDefer ) {
6359
6360						// progress_handlers.add( ... )
6361						tuples[ 0 ][ 3 ].add(
6362							resolve(
6363								0,
6364								newDefer,
6365								isFunction( onProgress ) ?
6366									onProgress :
6367									Identity,
6368								newDefer.notifyWith
6369							)
6370						);
6371
6372						// fulfilled_handlers.add( ... )
6373						tuples[ 1 ][ 3 ].add(
6374							resolve(
6375								0,
6376								newDefer,
6377								isFunction( onFulfilled ) ?
6378									onFulfilled :
6379									Identity
6380							)
6381						);
6382
6383						// rejected_handlers.add( ... )
6384						tuples[ 2 ][ 3 ].add(
6385							resolve(
6386								0,
6387								newDefer,
6388								isFunction( onRejected ) ?
6389									onRejected :
6390									Thrower
6391							)
6392						);
6393					} ).promise();
6394				},
6395
6396				// Get a promise for this deferred
6397				// If obj is provided, the promise aspect is added to the object
6398				promise: function( obj ) {
6399					return obj != null ? jQuery.extend( obj, promise ) : promise;
6400				}
6401			},
6402			deferred = {};
6403
6404		// Add list-specific methods
6405		jQuery.each( tuples, function( i, tuple ) {
6406			var list = tuple[ 2 ],
6407				stateString = tuple[ 5 ];
6408
6409			// promise.progress = list.add
6410			// promise.done = list.add
6411			// promise.fail = list.add
6412			promise[ tuple[ 1 ] ] = list.add;
6413
6414			// Handle state
6415			if ( stateString ) {
6416				list.add(
6417					function() {
6418
6419						// state = "resolved" (i.e., fulfilled)
6420						// state = "rejected"
6421						state = stateString;
6422					},
6423
6424					// rejected_callbacks.disable
6425					// fulfilled_callbacks.disable
6426					tuples[ 3 - i ][ 2 ].disable,
6427
6428					// rejected_handlers.disable
6429					// fulfilled_handlers.disable
6430					tuples[ 3 - i ][ 3 ].disable,
6431
6432					// progress_callbacks.lock
6433					tuples[ 0 ][ 2 ].lock,
6434
6435					// progress_handlers.lock
6436					tuples[ 0 ][ 3 ].lock
6437				);
6438			}
6439
6440			// progress_handlers.fire
6441			// fulfilled_handlers.fire
6442			// rejected_handlers.fire
6443			list.add( tuple[ 3 ].fire );
6444
6445			// deferred.notify = function() { deferred.notifyWith(...) }
6446			// deferred.resolve = function() { deferred.resolveWith(...) }
6447			// deferred.reject = function() { deferred.rejectWith(...) }
6448			deferred[ tuple[ 0 ] ] = function() {
6449				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
6450				return this;
6451			};
6452
6453			// deferred.notifyWith = list.fireWith
6454			// deferred.resolveWith = list.fireWith
6455			// deferred.rejectWith = list.fireWith
6456			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
6457		} );
6458
6459		// Make the deferred a promise
6460		promise.promise( deferred );
6461
6462		// Call given func if any
6463		if ( func ) {
6464			func.call( deferred, deferred );
6465		}
6466
6467		// All done!
6468		return deferred;
6469	},
6470
6471	// Deferred helper
6472	when: function( singleValue ) {
6473		var
6474
6475			// count of uncompleted subordinates
6476			remaining = arguments.length,
6477
6478			// count of unprocessed arguments
6479			i = remaining,
6480
6481			// subordinate fulfillment data
6482			resolveContexts = Array( i ),
6483			resolveValues = slice.call( arguments ),
6484
6485			// the master Deferred
6486			master = jQuery.Deferred(),
6487
6488			// subordinate callback factory
6489			updateFunc = function( i ) {
6490				return function( value ) {
6491					resolveContexts[ i ] = this;
6492					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
6493					if ( !( --remaining ) ) {
6494						master.resolveWith( resolveContexts, resolveValues );
6495					}
6496				};
6497			};
6498
6499		// Single- and empty arguments are adopted like Promise.resolve
6500		if ( remaining <= 1 ) {
6501			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
6502				!remaining );
6503
6504			// Use .then() to unwrap secondary thenables (cf. gh-3000)
6505			if ( master.state() === "pending" ||
6506				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
6507
6508				return master.then();
6509			}
6510		}
6511
6512		// Multiple arguments are aggregated like Promise.all array elements
6513		while ( i-- ) {
6514			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
6515		}
6516
6517		return master.promise();
6518	}
6519} );
6520
6521
6522// These usually indicate a programmer mistake during development,
6523// warn about them ASAP rather than swallowing them by default.
6524var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
6525
6526jQuery.Deferred.exceptionHook = function( error, stack ) {
6527
6528	// Support: IE 8 - 9 only
6529	// Console exists when dev tools are open, which can happen at any time
6530	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
6531		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
6532	}
6533};
6534
6535
6536
6537
6538jQuery.readyException = function( error ) {
6539	window.setTimeout( function() {
6540		throw error;
6541	} );
6542};
6543
6544
6545
6546
6547// The deferred used on DOM ready
6548var readyList = jQuery.Deferred();
6549
6550jQuery.fn.ready = function( fn ) {
6551
6552	readyList
6553		.then( fn )
6554
6555		// Wrap jQuery.readyException in a function so that the lookup
6556		// happens at the time of error handling instead of callback
6557		// registration.
6558		.catch( function( error ) {
6559			jQuery.readyException( error );
6560		} );
6561
6562	return this;
6563};
6564
6565jQuery.extend( {
6566
6567	// Is the DOM ready to be used? Set to true once it occurs.
6568	isReady: false,
6569
6570	// A counter to track how many items to wait for before
6571	// the ready event fires. See #6781
6572	readyWait: 1,
6573
6574	// Handle when the DOM is ready
6575	ready: function( wait ) {
6576
6577		// Abort if there are pending holds or we're already ready
6578		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
6579			return;
6580		}
6581
6582		// Remember that the DOM is ready
6583		jQuery.isReady = true;
6584
6585		// If a normal DOM Ready event fired, decrement, and wait if need be
6586		if ( wait !== true && --jQuery.readyWait > 0 ) {
6587			return;
6588		}
6589
6590		// If there are functions bound, to execute
6591		readyList.resolveWith( document, [ jQuery ] );
6592	}
6593} );
6594
6595jQuery.ready.then = readyList.then;
6596
6597// The ready event handler and self cleanup method
6598function completed() {
6599	document.removeEventListener( "DOMContentLoaded", completed );
6600	window.removeEventListener( "load", completed );
6601	jQuery.ready();
6602}
6603
6604// Catch cases where $(document).ready() is called
6605// after the browser event has already occurred.
6606// Support: IE <=9 - 10 only
6607// Older IE sometimes signals "interactive" too soon
6608if ( document.readyState === "complete" ||
6609	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
6610
6611	// Handle it asynchronously to allow scripts the opportunity to delay ready
6612	window.setTimeout( jQuery.ready );
6613
6614} else {
6615
6616	// Use the handy event callback
6617	document.addEventListener( "DOMContentLoaded", completed );
6618
6619	// A fallback to window.onload, that will always work
6620	window.addEventListener( "load", completed );
6621}
6622
6623
6624
6625
6626// Multifunctional method to get and set values of a collection
6627// The value/s can optionally be executed if it's a function
6628var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
6629	var i = 0,
6630		len = elems.length,
6631		bulk = key == null;
6632
6633	// Sets many values
6634	if ( toType( key ) === "object" ) {
6635		chainable = true;
6636		for ( i in key ) {
6637			access( elems, fn, i, key[ i ], true, emptyGet, raw );
6638		}
6639
6640	// Sets one value
6641	} else if ( value !== undefined ) {
6642		chainable = true;
6643
6644		if ( !isFunction( value ) ) {
6645			raw = true;
6646		}
6647
6648		if ( bulk ) {
6649
6650			// Bulk operations run against the entire set
6651			if ( raw ) {
6652				fn.call( elems, value );
6653				fn = null;
6654
6655			// ...except when executing function values
6656			} else {
6657				bulk = fn;
6658				fn = function( elem, 
6658_key, value ) {
6659					return bulk.call( jQuery( elem ), value );
6660				};
6661			}
6662		}
6663
6664		if ( fn ) {
6665			for ( ; i < len; i++ ) {
6666				fn(
6667					elems[ i ], key, raw ?
6668					value :
vendor: 22,305 bytes, lines 6669-7577
6669					value.call( elems[ i ], i, fn( elems[ i ], key ) )
6670				);
6671			}
6672		}
6673	}
6674
6675	if ( chainable ) {
6676		return elems;
6677	}
6678
6679	// Gets
6680	if ( bulk ) {
6681		return fn.call( elems );
6682	}
6683
6684	return len ? fn( elems[ 0 ], key ) : emptyGet;
6685};
6686
6687
6688// Matches dashed string for camelizing
6689var rmsPrefix = /^-ms-/,
6690	rdashAlpha = /-([a-z])/g;
6691
6692// Used by camelCase as callback to replace()
6693function fcamelCase( _all, letter ) {
6694	return letter.toUpperCase();
6695}
6696
6697// Convert dashed to camelCase; used by the css and data modules
6698// Support: IE <=9 - 11, Edge 12 - 15
6699// Microsoft forgot to hump their vendor prefix (#9572)
6700function camelCase( string ) {
6701	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
6702}
6703var acceptData = function( owner ) {
6704
6705	// Accepts only:
6706	//  - Node
6707	//    - Node.ELEMENT_NODE
6708	//    - Node.DOCUMENT_NODE
6709	//  - Object
6710	//    - Any
6711	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
6712};
6713
6714
6715
6716
6717function Data() {
6718	this.expando = jQuery.expando + Data.uid++;
6719}
6720
6721Data.uid = 1;
6722
6723Data.prototype = {
6724
6725	cache: function( owner ) {
6726
6727		// Check if the owner object already has a cache
6728		var value = owner[ this.expando ];
6729
6730		// If not, create one
6731		if ( !value ) {
6732			value = {};
6733
6734			// We can accept data for non-element nodes in modern browsers,
6735			// but we should not, see #8335.
6736			// Always return an empty object.
6737			if ( acceptData( owner ) ) {
6738
6739				// If it is a node unlikely to be stringify-ed or looped over
6740				// use plain assignment
6741				if ( owner.nodeType ) {
6742					owner[ this.expando ] = value;
6743
6744				// Otherwise secure it in a non-enumerable property
6745				// configurable must be true to allow the property to be
6746				// deleted when data is removed
6747				} else {
6748					Object.defineProperty( owner, this.expando, {
6749						value: value,
6750						configurable: true
6751					} );
6752				}
6753			}
6754		}
6755
6756		return value;
6757	},
6758	set: function( owner, data, value ) {
6759		var prop,
6760			cache = this.cache( owner );
6761
6762		// Handle: [ owner, key, value ] args
6763		// Always use camelCase key (gh-2257)
6764		if ( typeof data === "string" ) {
6765			cache[ camelCase( data ) ] = value;
6766
6767		// Handle: [ owner, { properties } ] args
6768		} else {
6769
6770			// Copy the properties one-by-one to the cache object
6771			for ( prop in data ) {
6772				cache[ camelCase( prop ) ] = data[ prop ];
6773			}
6774		}
6775		return cache;
6776	},
6777	get: function( owner, key ) {
6778		return key === undefined ?
6779			this.cache( owner ) :
6780
6781			// Always use camelCase key (gh-2257)
6782			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
6783	},
6784	access: function( owner, key, value ) {
6785
6786		// In cases where either:
6787		//
6788		//   1. No key was specified
6789		//   2. A string key was specified, but no value provided
6790		//
6791		// Take the "read" path and allow the get method to determine
6792		// which value to return, respectively either:
6793		//
6794		//   1. The entire cache object
6795		//   2. The data stored at the key
6796		//
6797		if ( key === undefined ||
6798				( ( key && typeof key === "string" ) && value === undefined ) ) {
6799
6800			return this.get( owner, key );
6801		}
6802
6803		// When the key is not a string, or both a key and value
6804		// are specified, set or extend (existing objects) with either:
6805		//
6806		//   1. An object of properties
6807		//   2. A key and value
6808		//
6809		this.set( owner, key, value );
6810
6811		// Since the "set" path can have two possible entry points
6812		// return the expected data based on which path was taken[*]
6813		return value !== undefined ? value : key;
6814	},
6815	remove: function( owner, key ) {
6816		var i,
6817			cache = owner[ this.expando ];
6818
6819		if ( cache === undefined ) {
6820			return;
6821		}
6822
6823		if ( key !== undefined ) {
6824
6825			// Support array or space separated string of keys
6826			if ( Array.isArray( key ) ) {
6827
6828				// If key is an array of keys...
6829				// We always set camelCase keys, so remove that.
6830				key = key.map( camelCase );
6831			} else {
6832				key = camelCase( key );
6833
6834				// If a key with the spaces exists, use it.
6835				// Otherwise, create an array by matching non-whitespace
6836				key = key in cache ?
6837					[ key ] :
6838					( key.match( rnothtmlwhite ) || [] );
6839			}
6840
6841			i = key.length;
6842
6843			while ( i-- ) {
6844				delete cache[ key[ i ] ];
6845			}
6846		}
6847
6848		// Remove the expando if there's no more data
6849		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
6850
6851			// Support: Chrome <=35 - 45
6852			// Webkit & Blink performance suffers when deleting properties
6853			// from DOM nodes, so set to undefined instead
6854			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
6855			if ( owner.nodeType ) {
6856				owner[ this.expando ] = undefined;
6857			} else {
6858				delete owner[ this.expando ];
6859			}
6860		}
6861	},
6862	hasData: function( owner ) {
6863		var cache = owner[ this.expando ];
6864		return cache !== undefined && !jQuery.isEmptyObject( cache );
6865	}
6866};
6867var dataPriv = new Data();
6868
6869var dataUser = new Data();
6870
6871
6872
6873//	Implementation Summary
6874//
6875//	1. Enforce API surface and semantic compatibility with 1.9.x branch
6876//	2. Improve the module's maintainability by reducing the storage
6877//		paths to a single mechanism.
6878//	3. Use the same single mechanism to support "private" and "user" data.
6879//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
6880//	5. Avoid exposing implementation details on user objects (eg. expando properties)
6881//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
6882
6883var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
6884	rmultiDash = /[A-Z]/g;
6885
6886function getData( data ) {
6887	if ( data === "true" ) {
6888		return true;
6889	}
6890
6891	if ( data === "false" ) {
6892		return false;
6893	}
6894
6895	if ( data === "null" ) {
6896		return null;
6897	}
6898
6899	// Only convert to a number if it doesn't change the string
6900	if ( data === +data + "" ) {
6901		return +data;
6902	}
6903
6904	if ( rbrace.test( data ) ) {
6905		return JSON.parse( data );
6906	}
6907
6908	return data;
6909}
6910
6911function dataAttr( elem, key, data ) {
6912	var name;
6913
6914	// If nothing was found internally, try to fetch any
6915	// data from the HTML5 data-* attribute
6916	if ( data === undefined && elem.nodeType === 1 ) {
6917		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
6918		data = elem.getAttribute( name );
6919
6920		if ( typeof data === "string" ) {
6921			try {
6922				data = getData( data );
6923			} catch ( e ) {}
6924
6925			// Make sure we set the data so it isn't changed later
6926			dataUser.set( elem, key, data );
6927		} else {
6928			data = undefined;
6929		}
6930	}
6931	return data;
6932}
6933
6934jQuery.extend( {
6935	hasData: function( elem ) {
6936		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
6937	},
6938
6939	data: function( elem, name, data ) {
6940		return dataUser.access( elem, name, data );
6941	},
6942
6943	removeData: function( elem, name ) {
6944		dataUser.remove( elem, name );
6945	},
6946
6947	// TODO: Now that all calls to _data and _removeData have been replaced
6948	// with direct calls to dataPriv methods, these can be deprecated.
6949	_data: function( elem, name, data ) {
6950		return dataPriv.access( elem, name, data );
6951	},
6952
6953	_removeData: function( elem, name ) {
6954		dataPriv.remove( elem, name );
6955	}
6956} );
6957
6958jQuery.fn.extend( {
6959	data: function( key, value ) {
6960		var i, name, data,
6961			elem = this[ 0 ],
6962			attrs = elem && elem.attributes;
6963
6964		// Gets all values
6965		if ( key === undefined ) {
6966			if ( this.length ) {
6967				data = dataUser.get( elem );
6968
6969				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
6970					i = attrs.length;
6971					while ( i-- ) {
6972
6973						// Support: IE 11 only
6974						// The attrs elements can be null (#14894)
6975						if ( attrs[ i ] ) {
6976							name = attrs[ i ].name;
6977							if ( name.indexOf( "data-" ) === 0 ) {
6978								name = camelCase( name.slice( 5 ) );
6979								dataAttr( elem, name, data[ name ] );
6980							}
6981						}
6982					}
6983					dataPriv.set( elem, "hasDataAttrs", true );
6984				}
6985			}
6986
6987			return data;
6988		}
6989
6990		// Sets multiple values
6991		if ( typeof key === "object" ) {
6992			return this.each( function() {
6993				dataUser.set( this, key );
6994			} );
6995		}
6996
6997		return access( this, function( value ) {
6998			var data;
6999
7000			// The calling jQuery object (element matches) is not empty
7001			// (and therefore has an element appears at this[ 0 ]) and the
7002			// `value` parameter was not undefined. An empty jQuery object
7003			// will result in `undefined` for elem = this[ 0 ] which will
7004			// throw an exception if an attempt to read a data cache is made.
7005			if ( elem && value === undefined ) {
7006
7007				// Attempt to get data from the cache
7008				// The key will always be camelCased in Data
7009				data = dataUser.get( elem, key );
7010				if ( data !== undefined ) {
7011					return data;
7012				}
7013
7014				// Attempt to "discover" the data in
7015				// HTML5 custom data-* attrs
7016				data = dataAttr( elem, key );
7017				if ( data !== undefined ) {
7018					return data;
7019				}
7020
7021				// We tried really hard, but the data doesn't exist.
7022				return;
7023			}
7024
7025			// Set the data...
7026			this.each( function() {
7027
7028				// We always store the camelCased key
7029				dataUser.set( this, key, value );
7030			} );
7031		}, null, value, arguments.length > 1, null, true );
7032	},
7033
7034	removeData: function( key ) {
7035		return this.each( function() {
7036			dataUser.remove( this, key );
7037		} );
7038	}
7039} );
7040
7041
7042jQuery.extend( {
7043	queue: function( elem, type, data ) {
7044		var queue;
7045
7046		if ( elem ) {
7047			type = ( type || "fx" ) + "queue";
7048			queue = dataPriv.get( elem, type );
7049
7050			// Speed up dequeue by getting out quickly if this is just a lookup
7051			if ( data ) {
7052				if ( !queue || Array.isArray( data ) ) {
7053					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
7054				} else {
7055					queue.push( data );
7056				}
7057			}
7058			return queue || [];
7059		}
7060	},
7061
7062	dequeue: function( elem, type ) {
7063		type = type || "fx";
7064
7065		var queue = jQuery.queue( elem, type ),
7066			startLength = queue.length,
7067			fn = queue.shift(),
7068			hooks = jQuery._queueHooks( elem, type ),
7069			next = function() {
7070				jQuery.dequeue( elem, type );
7071			};
7072
7073		// If the fx queue is dequeued, always remove the progress sentinel
7074		if ( fn === "inprogress" ) {
7075			fn = queue.shift();
7076			startLength--;
7077		}
7078
7079		if ( fn ) {
7080
7081			// Add a progress sentinel to prevent the fx queue from being
7082			// automatically dequeued
7083			if ( type === "fx" ) {
7084				queue.unshift( "inprogress" );
7085			}
7086
7087			// Clear up the last queue stop function
7088			delete hooks.stop;
7089			fn.call( elem, next, hooks );
7090		}
7091
7092		if ( !startLength && hooks ) {
7093			hooks.empty.fire();
7094		}
7095	},
7096
7097	// Not public - generate a queueHooks object, or return the current one
7098	_queueHooks: function( elem, type ) {
7099		var key = type + "queueHooks";
7100		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
7101			empty: jQuery.Callbacks( "once memory" ).add( function() {
7102				dataPriv.remove( elem, [ type + "queue", key ] );
7103			} )
7104		} );
7105	}
7106} );
7107
7108jQuery.fn.extend( {
7109	queue: function( type, data ) {
7110		var setter = 2;
7111
7112		if ( typeof type !== "string" ) {
7113			data = type;
7114			type = "fx";
7115			setter--;
7116		}
7117
7118		if ( arguments.length < setter ) {
7119			return jQuery.queue( this[ 0 ], type );
7120		}
7121
7122		return data === undefined ?
7123			this :
7124			this.each( function() {
7125				var queue = jQuery.queue( this, type, data );
7126
7127				// Ensure a hooks for this queue
7128				jQuery._queueHooks( this, type );
7129
7130				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
7131					jQuery.dequeue( this, type );
7132				}
7133			} );
7134	},
7135	dequeue: function( type ) {
7136		return this.each( function() {
7137			jQuery.dequeue( this, type );
7138		} );
7139	},
7140	clearQueue: function( type ) {
7141		return this.queue( type || "fx", [] );
7142	},
7143
7144	// Get a promise resolved when queues of a certain type
7145	// are emptied (fx is the type by default)
7146	promise: function( type, obj ) {
7147		var tmp,
7148			count = 1,
7149			defer = jQuery.Deferred(),
7150			elements = this,
7151			i = this.length,
7152			resolve = function() {
7153				if ( !( --count ) ) {
7154					defer.resolveWith( elements, [ elements ] );
7155				}
7156			};
7157
7158		if ( typeof type !== "string" ) {
7159			obj = type;
7160			type = undefined;
7161		}
7162		type = type || "fx";
7163
7164		while ( i-- ) {
7165			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
7166			if ( tmp && tmp.empty ) {
7167				count++;
7168				tmp.empty.add( resolve );
7169			}
7170		}
7171		resolve();
7172		return defer.promise( obj );
7173	}
7174} );
7175var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
7176
7177var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
7178
7179
7180var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
7181
7182var documentElement = document.documentElement;
7183
7184
7185
7186	var isAttached = function( elem ) {
7187			return jQuery.contains( elem.ownerDocument, elem );
7188		},
7189		composed = { composed: true };
7190
7191	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
7192	// Check attachment across shadow DOM boundaries when possible (gh-3504)
7193	// Support: iOS 10.0-10.2 only
7194	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
7195	// leading to errors. We need to check for `getRootNode`.
7196	if ( documentElement.getRootNode ) {
7197		isAttached = function( elem ) {
7198			return jQuery.contains( elem.ownerDocument, elem ) ||
7199				elem.getRootNode( composed ) === elem.ownerDocument;
7200		};
7201	}
7202var isHiddenWithinTree = function( elem, el ) {
7203
7204		// isHiddenWithinTree might be called from jQuery#filter function;
7205		// in that case, element will be second argument
7206		elem = el || elem;
7207
7208		// Inline style trumps all
7209		return elem.style.display === "none" ||
7210			elem.style.display === "" &&
7211
7212			// Otherwise, check computed style
7213			// Support: Firefox <=43 - 45
7214			// Disconnected elements can have computed display: none, so first confirm that elem is
7215			// in the document.
7216			isAttached( elem ) &&
7217
7218			jQuery.css( elem, "display" ) === "none";
7219	};
7220
7221
7222
7223function adjustCSS( elem, prop, valueParts, tween ) {
7224	var adjusted, scale,
7225		maxIterations = 20,
7226		currentValue = tween ?
7227			function() {
7228				return tween.cur();
7229			} :
7230			function() {
7231				return jQuery.css( elem, prop, "" );
7232			},
7233		initial = currentValue(),
7234		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
7235
7236		// Starting value computation is required for potential unit mismatches
7237		initialInUnit = elem.nodeType &&
7238			( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
7239			rcssNum.exec( jQuery.css( elem, prop ) );
7240
7241	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
7242
7243		// Support: Firefox <=54
7244		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
7245		initial = initial / 2;
7246
7247		// Trust units reported by jQuery.css
7248		unit = unit || initialInUnit[ 3 ];
7249
7250		// Iteratively approximate from a nonzero starting point
7251		initialInUnit = +initial || 1;
7252
7253		while ( maxIterations-- ) {
7254
7255			// Evaluate and update our best guess (doubling guesses that zero out).
7256			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
7257			jQuery.style( elem, prop, initialInUnit + unit );
7258			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
7259				maxIterations = 0;
7260			}
7261			initialInUnit = initialInUnit / scale;
7262
7263		}
7264
7265		initialInUnit = initialInUnit * 2;
7266		jQuery.style( elem, prop, initialInUnit + unit );
7267
7268		// Make sure we update the tween properties later on
7269		valueParts = valueParts || [];
7270	}
7271
7272	if ( valueParts ) {
7273		initialInUnit = +initialInUnit || +initial || 0;
7274
7275		// Apply relative offset (+=/-=) if specified
7276		adjusted = valueParts[ 1 ] ?
7277			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
7278			+valueParts[ 2 ];
7279		if ( tween ) {
7280			tween.unit = unit;
7281			tween.start = initialInUnit;
7282			tween.end = adjusted;
7283		}
7284	}
7285	return adjusted;
7286}
7287
7288
7289var defaultDisplayMap = {};
7290
7291function getDefaultDisplay( elem ) {
7292	var temp,
7293		doc = elem.ownerDocument,
7294		nodeName = elem.nodeName,
7295		display = defaultDisplayMap[ nodeName ];
7296
7297	if ( display ) {
7298		return display;
7299	}
7300
7301	temp = doc.body.appendChild( doc.createElement( nodeName ) );
7302	display = jQuery.css( temp, "display" );
7303
7304	temp.parentNode.removeChild( temp );
7305
7306	if ( display === "none" ) {
7307		display = "block";
7308	}
7309	defaultDisplayMap[ nodeName ] = display;
7310
7311	return display;
7312}
7313
7314function showHide( elements, show ) {
7315	var display, elem,
7316		values = [],
7317		index = 0,
7318		length = elements.length;
7319
7320	// Determine new display value for elements that need to change
7321	for ( ; index < length; index++ ) {
7322		elem = elements[ index ];
7323		if ( !elem.style ) {
7324			continue;
7325		}
7326
7327		display = elem.style.display;
7328		if ( show ) {
7329
7330			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
7331			// check is required in this first loop unless we have a nonempty display value (either
7332			// inline or about-to-be-restored)
7333			if ( display === "none" ) {
7334				values[ index ] = dataPriv.get( elem, "display" ) || null;
7335				if ( !values[ index ] ) {
7336					elem.style.display = "";
7337				}
7338			}
7339			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
7340				values[ index ] = getDefaultDisplay( elem );
7341			}
7342		} else {
7343			if ( display !== "none" ) {
7344				values[ index ] = "none";
7345
7346				// Remember what we're overwriting
7347				dataPriv.set( elem, "display", display );
7348			}
7349		}
7350	}
7351
7352	// Set the display of the elements in a second loop to avoid constant reflow
7353	for ( index = 0; index < length; index++ ) {
7354		if ( values[ index ] != null ) {
7355			elements[ index ].style.display = values[ index ];
7356		}
7357	}
7358
7359	return elements;
7360}
7361
7362jQuery.fn.extend( {
7363	show: function() {
7364		return showHide( this, true );
7365	},
7366	hide: function() {
7367		return showHide( this );
7368	},
7369	toggle: function( state ) {
7370		if ( typeof state === "boolean" ) {
7371			return state ? this.show() : this.hide();
7372		}
7373
7374		return this.each( function() {
7375			if ( isHiddenWithinTree( this ) ) {
7376				jQuery( this ).show();
7377			} else {
7378				jQuery( this ).hide();
7379			}
7380		} );
7381	}
7382} );
7383var rcheckableType = ( /^(?:checkbox|radio)$/i );
7384
7385var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
7386
7387var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
7388
7389
7390
7391( function() {
7392	var fragment = document.createDocumentFragment(),
7393		div = fragment.appendChild( document.createElement( "div" ) ),
7394		input = document.createElement( "input" );
7395
7396	// Support: Android 4.0 - 4.3 only
7397	// Check state lost if the name is set (#11217)
7398	// Support: Windows Web Apps (WWA)
7399	// `name` and `type` must use .setAttribute for WWA (#14901)
7400	input.setAttribute( "type", "radio" );
7401	input.setAttribute( "checked", "checked" );
7402	input.setAttribute( "name", "t" );
7403
7404	div.appendChild( input );
7405
7406	// Support: Android <=4.1 only
7407	// Older WebKit doesn't clone checked state correctly in fragments
7408	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
7409
7410	// Support: IE <=11 only
7411	// Make sure textarea (and checkbox) defaultValue is properly cloned
7412	div.innerHTML = "<textarea>x</textarea>";
7413	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
7414
7415	// Support: IE <=9 only
7416	// IE <=9 replaces <option> tags with their contents when inserted outside of
7417	// the select element.
7418	div.innerHTML = "<option></option>";
7419	support.option = !!div.lastChild;
7420} )();
7421
7422
7423// We have to close these tags to support XHTML (#13200)
7424var wrapMap = {
7425
7426	// XHTML parsers do not magically insert elements in the
7427	// same way that tag soup parsers do. So we cannot shorten
7428	// this by omitting <tbody> or other required elements.
7429	thead: [ 1, "<table>", "</table>" ],
7430	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
7431	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
7432	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
7433
7434	_default: [ 0, "", "" ]
7435};
7436
7437wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
7438wrapMap.th = wrapMap.td;
7439
7440// Support: IE <=9 only
7441if ( !support.option ) {
7442	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
7443}
7444
7445
7446function getAll( context, tag ) {
7447
7448	// Support: IE <=9 - 11 only
7449	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
7450	var ret;
7451
7452	if ( typeof context.getElementsByTagName !== "undefined" ) {
7453		ret = context.getElementsByTagName( tag || "*" );
7454
7455	} else if ( typeof context.querySelectorAll !== "undefined" ) {
7456		ret = context.querySelectorAll( tag || "*" );
7457
7458	} else {
7459		ret = [];
7460	}
7461
7462	if ( tag === undefined || tag && nodeName( context, tag ) ) {
7463		return jQuery.merge( [ context ], ret );
7464	}
7465
7466	return ret;
7467}
7468
7469
7470// Mark scripts as having already been evaluated
7471function setGlobalEval( elems, refElements ) {
7472	var i = 0,
7473		l = elems.length;
7474
7475	for ( ; i < l; i++ ) {
7476		dataPriv.set(
7477			elems[ i ],
7478			"globalEval",
7479			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
7480		);
7481	}
7482}
7483
7484
7485var rhtml = /<|&#?\w+;/;
7486
7487function buildFragment( elems, context, scripts, selection, ignored ) {
7488	var elem, tmp, tag, wrap, attached, j,
7489		fragment = context.createDocumentFragment(),
7490		nodes = [],
7491		i = 0,
7492		l = elems.length;
7493
7494	for ( ; i < l; i++ ) {
7495		elem = elems[ i ];
7496
7497		if ( elem || elem === 0 ) {
7498
7499			// Add nodes directly
7500			if ( toType( elem ) === "object" ) {
7501
7502				// Support: Android <=4.0 only, PhantomJS 1 only
7503				// push.apply(_, arraylike) throws on ancient WebKit
7504				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
7505
7506			// Convert non-html into a text node
7507			} else if ( !rhtml.test( elem ) ) {
7508				nodes.push( context.createTextNode( elem ) );
7509
7510			// Convert html into DOM nodes
7511			} else {
7512				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
7513
7514				// Deserialize a standard representation
7515				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
7516				wrap = wrapMap[ tag ] || wrapMap._default;
7517				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
7518
7519				// Descend through wrappers to the right content
7520				j = wrap[ 0 ];
7521				while ( j-- ) {
7522					tmp = tmp.lastChild;
7523				}
7524
7525				// Support: Android <=4.0 only, PhantomJS 1 only
7526				// push.apply(_, arraylike) throws on ancient WebKit
7527				jQuery.merge( nodes, tmp.childNodes );
7528
7529				// Remember the top-level container
7530				tmp = fragment.firstChild;
7531
7532				// Ensure the created nodes are orphaned (#12392)
7533				tmp.textContent = "";
7534			}
7535		}
7536	}
7537
7538	// Remove wrapper from fragment
7539	fragment.textContent = "";
7540
7541	i = 0;
7542	while ( ( elem = nodes[ i++ ] ) ) {
7543
7544		// Skip elements already in the context collection (trac-4087)
7545		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
7546			if ( ignored ) {
7547				ignored.push( elem );
7548			}
7549			continue;
7550		}
7551
7552		attached = isAttached( elem );
7553
7554		// Append to fragment
7555		tmp = getAll( fragment.appendChild( elem ), "script" );
7556
7557		// Preserve script evaluation history
7558		if ( attached ) {
7559			setGlobalEval( tmp );
7560		}
7561
7562		// Capture executables
7563		if ( scripts ) {
7564			j = 0;
7565			while ( ( elem = tmp[ j++ ] ) ) {
7566				if ( rscriptType.test( elem.type || "" ) ) {
7567					scripts.push( elem );
7568				}
7569			}
7570		}
7571	}
7572
7573	return fragment;
7574}
7575
7576
7577var
7577
vendor: 6,183 bytes, lines 7578-7803
7578	rkeyEvent = /^key/,
7579	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
7580	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
7581
7582function returnTrue() {
7583	return true;
7584}
7585
7586function returnFalse() {
7587	return false;
7588}
7589
7590// Support: IE <=9 - 11+
7591// focus() and blur() are asynchronous, except when they are no-op.
7592// So expect focus to be synchronous when the element is already active,
7593// and blur to be synchronous when the element is not already active.
7594// (focus and blur are always synchronous in other supported browsers,
7595// this just defines when we can count on it).
7596function expectSync( elem, type ) {
7597	return ( elem === safeActiveElement() ) === ( type === "focus" );
7598}
7599
7600// Support: IE <=9 only
7601// Accessing document.activeElement can throw unexpectedly
7602// https://bugs.jquery.com/ticket/13393
7603function safeActiveElement() {
7604	try {
7605		return document.activeElement;
7606	} catch ( err ) { }
7607}
7608
7609function on( elem, types, selector, data, fn, one ) {
7610	var origFn, type;
7611
7612	// Types can be a map of types/handlers
7613	if ( typeof types === "object" ) {
7614
7615		// ( types-Object, selector, data )
7616		if ( typeof selector !== "string" ) {
7617
7618			// ( types-Object, data )
7619			data = data || selector;
7620			selector = undefined;
7621		}
7622		for ( type in types ) {
7623			on( elem, type, selector, data, types[ type ], one );
7624		}
7625		return elem;
7626	}
7627
7628	if ( data == null && fn == null ) {
7629
7630		// ( types, fn )
7631		fn = selector;
7632		data = selector = undefined;
7633	} else if ( fn == null ) {
7634		if ( typeof selector === "string" ) {
7635
7636			// ( types, selector, fn )
7637			fn = data;
7638			data = undefined;
7639		} else {
7640
7641			// ( types, data, fn )
7642			fn = data;
7643			data = selector;
7644			selector = undefined;
7645		}
7646	}
7647	if ( fn === false ) {
7648		fn = returnFalse;
7649	} else if ( !fn ) {
7650		return elem;
7651	}
7652
7653	if ( one === 1 ) {
7654		origFn = fn;
7655		fn = function( event ) {
7656
7657			// Can use an empty set, since event contains the info
7658			jQuery().off( event );
7659			return origFn.apply( this, arguments );
7660		};
7661
7662		// Use same guid so caller can remove using origFn
7663		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
7664	}
7665	return elem.each( function() {
7666		jQuery.event.add( this, types, fn, data, selector );
7667	} );
7668}
7669
7670/*
7671 * Helper functions for managing events -- not part of the public interface.
7672 * Props to Dean Edwards' addEvent library for many of the ideas.
7673 */
7674jQuery.event = {
7675
7676	global: {},
7677
7678	add: function( elem, types, handler, data, selector ) {
7679
7680		var handleObjIn, eventHandle, tmp,
7681			events, t, handleObj,
7682			special, handlers, type, namespaces, origType,
7683			elemData = dataPriv.get( elem );
7684
7685		// Only attach events to objects that accept data
7686		if ( !acceptData( elem ) ) {
7687			return;
7688		}
7689
7690		// Caller can pass in an object of custom data in lieu of the handler
7691		if ( handler.handler ) {
7692			handleObjIn = handler;
7693			handler = handleObjIn.handler;
7694			selector = handleObjIn.selector;
7695		}
7696
7697		// Ensure that invalid selectors throw exceptions at attach time
7698		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
7699		if ( selector ) {
7700			jQuery.find.matchesSelector( documentElement, selector );
7701		}
7702
7703		// Make sure that the handler has a unique ID, used to find/remove it later
7704		if ( !handler.guid ) {
7705			handler.guid = jQuery.guid++;
7706		}
7707
7708		// Init the element's event structure and main handler, if this is the first
7709		if ( !( events = elemData.events ) ) {
7710			events = elemData.events = Object.create( null );
7711		}
7712		if ( !( eventHandle = elemData.handle ) ) {
7713			eventHandle = elemData.handle = function( e ) {
7714
7715				// Discard the second event of a jQuery.event.trigger() and
7716				// when an event is called after a page has unloaded
7717				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
7718					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
7719			};
7720		}
7721
7722		// Handle multiple events separated by a space
7723		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
7724		t = types.length;
7725		while ( t-- ) {
7726			tmp = rtypenamespace.exec( types[ t ] ) || [];
7727			type = origType = tmp[ 1 ];
7728			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
7729
7730			// There *must* be a type, no attaching namespace-only handlers
7731			if ( !type ) {
7732				continue;
7733			}
7734
7735			// If event changes its type, use the special event handlers for the changed type
7736			special = jQuery.event.special[ type ] || {};
7737
7738			// If selector defined, determine special event api type, otherwise given type
7739			type = ( selector ? special.delegateType : special.bindType ) || type;
7740
7741			// Update special based on newly reset type
7742			special = jQuery.event.special[ type ] || {};
7743
7744			// handleObj is passed to all event handlers
7745			handleObj = jQuery.extend( {
7746				type: type,
7747				origType: origType,
7748				data: data,
7749				handler: handler,
7750				guid: handler.guid,
7751				selector: selector,
7752				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
7753				namespace: namespaces.join( "." )
7754			}, handleObjIn );
7755
7756			// Init the event handler queue if we're the first
7757			if ( !( handlers = events[ type ] ) ) {
7758				handlers = events[ type ] = [];
7759				handlers.delegateCount = 0;
7760
7761				// Only use addEventListener if the special events handler returns false
7762				if ( !special.setup ||
7763					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
7764
7765					if ( elem.addEventListener ) {
7766						elem.addEventListener( type, eventHandle );
7767					}
7768				}
7769			}
7770
7771			if ( special.add ) {
7772				special.add.call( elem, handleObj );
7773
7774				if ( !handleObj.handler.guid ) {
7775					handleObj.handler.guid = handler.guid;
7776				}
7777			}
7778
7779			// Add to the element's handler list, delegates in front
7780			if ( selector ) {
7781				handlers.splice( handlers.delegateCount++, 0, handleObj );
7782			} else {
7783				handlers.push( handleObj );
7784			}
7785
7786			// Keep track of which events have ever been used, for event optimization
7787			jQuery.event.global[ type ] = true;
7788		}
7789
7790	},
7791
7792	// Detach an event or set of events from an element
7793	remove: function( elem, types, handler, selector, mappedTypes ) {
7794
7795		var j, origCount, tmp,
7796			events, t, handleObj,
7797			special, handlers, type, namespaces, origType,
7798			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
7799
7800		if ( !elemData || !( events = elemData.events ) ) {
7801			return;
7802		}
7803
vendor: 4,199 bytes, lines 7804-7942
7804		// Once for each type.namespace in types; type may be omitted
7805		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
7806		t = types.length;
7807		while ( t-- ) {
7808			tmp = rtypenamespace.exec( types[ t ] ) || [];
7809			type = origType = tmp[ 1 ];
7810			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
7811
7812			// Unbind all events (on this namespace, if provided) for the element
7813			if ( !type ) {
7814				for ( type in events ) {
7815					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
7816				}
7817				continue;
7818			}
7819
7820			special = jQuery.event.special[ type ] || {};
7821			type = ( selector ? special.delegateType : special.bindType ) || type;
7822			handlers = events[ type ] || [];
7823			tmp = tmp[ 2 ] &&
7824				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
7825
7826			// Remove matching events
7827			origCount = j = handlers.length;
7828			while ( j-- ) {
7829				handleObj = handlers[ j ];
7830
7831				if ( ( mappedTypes || origType === handleObj.origType ) &&
7832					( !handler || handler.guid === handleObj.guid ) &&
7833					( !tmp || tmp.test( handleObj.namespace ) ) &&
7834					( !selector || selector === handleObj.selector ||
7835						selector === "**" && handleObj.selector ) ) {
7836					handlers.splice( j, 1 );
7837
7838					if ( handleObj.selector ) {
7839						handlers.delegateCount--;
7840					}
7841					if ( special.remove ) {
7842						special.remove.call( elem, handleObj );
7843					}
7844				}
7845			}
7846
7847			// Remove generic event handler if we removed something and no more handlers exist
7848			// (avoids potential for endless recursion during removal of special event handlers)
7849			if ( origCount && !handlers.length ) {
7850				if ( !special.teardown ||
7851					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
7852
7853					jQuery.removeEvent( elem, type, elemData.handle );
7854				}
7855
7856				delete events[ type ];
7857			}
7858		}
7859
7860		// Remove data and the expando if it's no longer used
7861		if ( jQuery.isEmptyObject( events ) ) {
7862			dataPriv.remove( elem, "handle events" );
7863		}
7864	},
7865
7866	dispatch: function( nativeEvent ) {
7867
7868		var i, j, ret, matched, handleObj, handlerQueue,
7869			args = new Array( arguments.length ),
7870
7871			// Make a writable jQuery.Event from the native event object
7872			event = jQuery.event.fix( nativeEvent ),
7873
7874			handlers = (
7875					dataPriv.get( this, "events" ) || Object.create( null )
7876				)[ event.type ] || [],
7877			special = jQuery.event.special[ event.type ] || {};
7878
7879		// Use the fix-ed jQuery.Event rather than the (read-only) native event
7880		args[ 0 ] = event;
7881
7882		for ( i = 1; i < arguments.length; i++ ) {
7883			args[ i ] = arguments[ i ];
7884		}
7885
7886		event.delegateTarget = this;
7887
7888		// Call the preDispatch hook for the mapped type, and let it bail if desired
7889		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
7890			return;
7891		}
7892
7893		// Determine handlers
7894		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
7895
7896		// Run delegates first; they may want to stop propagation beneath us
7897		i = 0;
7898		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
7899			event.currentTarget = matched.elem;
7900
7901			j = 0;
7902			while ( ( handleObj = matched.handlers[ j++ ] ) &&
7903				!event.isImmediatePropagationStopped() ) {
7904
7905				// If the event is namespaced, then each handler is only invoked if it is
7906				// specially universal or its namespaces are a superset of the event's.
7907				if ( !event.rnamespace || handleObj.namespace === false ||
7908					event.rnamespace.test( handleObj.namespace ) ) {
7909
7910					event.handleObj = handleObj;
7911					event.data = handleObj.data;
7912
7913					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
7914						handleObj.handler ).apply( matched.elem, args );
7915
7916					if ( ret !== undefined ) {
7917						if ( ( event.result = ret ) === false ) {
7918							event.preventDefault();
7919							event.stopPropagation();
7920						}
7921					}
7922				}
7923			}
7924		}
7925
7926		// Call the postDispatch hook for the mapped type
7927		if ( special.postDispatch ) {
7928			special.postDispatch.call( this, event );
7929		}
7930
7931		return event.result;
7932	},
7933
7934	handlers: function( event, handlers ) {
7935		var i, handleObj, sel, matchedHandlers, matchedSelectors,
7936			handlerQueue = [],
7937			delegateCount = handlers.delegateCount,
7938			cur = event.target;
7939
7940		// Find delegate handlers
7941		if ( delegateCount &&
7942
vendor: 5,718 bytes, lines 7943-8128
7943			// Support: IE <=9
7944			// Black-hole SVG <use> instance trees (trac-13180)
7945			cur.nodeType &&
7946
7947			// Support: Firefox <=42
7948			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
7949			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
7950			// Support: IE 11 only
7951			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
7952			!( event.type === "click" && event.button >= 1 ) ) {
7953
7954			for ( ; cur !== this; cur = cur.parentNode || this ) {
7955
7956				// Don't check non-elements (#13208)
7957				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
7958				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
7959					matchedHandlers = [];
7960					matchedSelectors = {};
7961					for ( i = 0; i < delegateCount; i++ ) {
7962						handleObj = handlers[ i ];
7963
7964						// Don't conflict with Object.prototype properties (#13203)
7965						sel = handleObj.selector + " ";
7966
7967						if ( matchedSelectors[ sel ] === undefined ) {
7968							matchedSelectors[ sel ] = handleObj.needsContext ?
7969								jQuery( sel, this ).index( cur ) > -1 :
7970								jQuery.find( sel, this, null, [ cur ] ).length;
7971						}
7972						if ( matchedSelectors[ sel ] ) {
7973							matchedHandlers.push( handleObj );
7974						}
7975					}
7976					if ( matchedHandlers.length ) {
7977						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
7978					}
7979				}
7980			}
7981		}
7982
7983		// Add the remaining (directly-bound) handlers
7984		cur = this;
7985		if ( delegateCount < handlers.length ) {
7986			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
7987		}
7988
7989		return handlerQueue;
7990	},
7991
7992	addProp: function( name, hook ) {
7993		Object.defineProperty( jQuery.Event.prototype, name, {
7994			enumerable: true,
7995			configurable: true,
7996
7997			get: isFunction( hook ) ?
7998				function() {
7999					if ( this.originalEvent ) {
8000							return hook( this.originalEvent );
8001					}
8002				} :
8003				function() {
8004					if ( this.originalEvent ) {
8005							return this.originalEvent[ name ];
8006					}
8007				},
8008
8009			set: function( value ) {
8010				Object.defineProperty( this, name, {
8011					enumerable: true,
8012					configurable: true,
8013					writable: true,
8014					value: value
8015				} );
8016			}
8017		} );
8018	},
8019
8020	fix: function( originalEvent ) {
8021		return originalEvent[ jQuery.expando ] ?
8022			originalEvent :
8023			new jQuery.Event( originalEvent );
8024	},
8025
8026	special: {
8027		load: {
8028
8029			// Prevent triggered image.load events from bubbling to window.load
8030			noBubble: true
8031		},
8032		click: {
8033
8034			// Utilize native event to ensure correct state for checkable inputs
8035			setup: function( data ) {
8036
8037				// For mutual compressibility with _default, replace `this` access with a local var.
8038				// `|| data` is dead code meant only to preserve the variable through minification.
8039				var el = this || data;
8040
8041				// Claim the first handler
8042				if ( rcheckableType.test( el.type ) &&
8043					el.click && nodeName( el, "input" ) ) {
8044
8045					// dataPriv.set( el, "click", ... )
8046					leverageNative( el, "click", returnTrue );
8047				}
8048
8049				// Return false to allow normal processing in the caller
8050				return false;
8051			},
8052			trigger: function( data ) {
8053
8054				// For mutual compressibility with _default, replace `this` access with a local var.
8055				// `|| data` is dead code meant only to preserve the variable through minification.
8056				var el = this || data;
8057
8058				// Force setup before triggering a click
8059				if ( rcheckableType.test( el.type ) &&
8060					el.click && nodeName( el, "input" ) ) {
8061
8062					leverageNative( el, "click" );
8063				}
8064
8065				// Return non-false to allow normal event-path propagation
8066				return true;
8067			},
8068
8069			// For cross-browser consistency, suppress native .click() on links
8070			// Also prevent it if we're currently inside a leveraged native-event stack
8071			_default: function( event ) {
8072				var target = event.target;
8073				return rcheckableType.test( target.type ) &&
8074					target.click && nodeName( target, "input" ) &&
8075					dataPriv.get( target, "click" ) ||
8076					nodeName( target, "a" );
8077			}
8078		},
8079
8080		beforeunload: {
8081			postDispatch: function( event ) {
8082
8083				// Support: Firefox 20+
8084				// Firefox doesn't alert if the returnValue field is not set.
8085				if ( event.result !== undefined && event.originalEvent ) {
8086					event.originalEvent.returnValue = event.result;
8087				}
8088			}
8089		}
8090	}
8091};
8092
8093// Ensure the presence of an event listener that handles manually-triggered
8094// synthetic events by interrupting progress until reinvoked in response to
8095// *native* events that it fires directly, ensuring that state changes have
8096// already occurred before other listeners are invoked.
8097function leverageNative( el, type, expectSync ) {
8098
8099	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
8100	if ( !expectSync ) {
8101		if ( dataPriv.get( el, type ) === undefined ) {
8102			jQuery.event.add( el, type, returnTrue );
8103		}
8104		return;
8105	}
8106
8107	// Register the controller as a special universal handler for all event namespaces
8108	dataPriv.set( el, type, false );
8109	jQuery.event.add( el, type, {
8110		namespace: false,
8111		handler: function( event ) {
8112			var notAsync, result,
8113				saved = dataPriv.get( this, type );
8114
8115			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
8116
8117				// Interrupt processing of the outer synthetic .trigger()ed event
8118				// Saved data should be false in such cases, but might be a leftover capture object
8119				// from an async native handler (gh-4350)
8120				if ( !saved.length ) {
8121
8122					// Store arguments for use when handling the inner native event
8123					// There will always be at least one argument (an event object), so this array
8124					// will not be confused with a leftover capture object.
8125					saved = slice.call( arguments );
8126					dataPriv.set( this, type, saved );
8127
8128					// Trigger the native event and capture its result
8129					// Support: IE <=9 - 11+
8130					// focus() and blur() are asynchronous
8131					notAsync = expectSync( this, type );
8132					this[ type ]();
8133					result = dataPriv.get( this, type );
8134					if ( saved !== result || notAsync ) {
8135						dataPriv.set( this, type, false );
8136					} else {
8137						result = {};
8138					}
8139					if ( saved !== result ) {
8140
8141						// Cancel the outer synthetic event
8142						event.stopImmediatePropagation();
8143						event.preventDefault();
8144						return result.value;
8145					}
8146
8147				// If this is an inner synthetic event for an event with a bubbling surrogate
8148				// (focus or blur), assume that the surrogate already propagated from triggering the
8149				// native event and prevent that from happening again here.
8150				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
8151				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
8152				// less bad than duplication.
8153				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
8154					event.stopPropagation();
8155				}
8156
8157			// If this is a native event triggered above, everything is now in order
8158			// Fire an inner synthetic event with the original arguments
8159			} else if ( saved.length ) {
8160
8161				// ...and capture the result
8162				dataPriv.set( this, type, {
8163					value: jQuery.event.trigger(
8164
8165						// Support: IE <=9 - 11+
8166						// Extend with the prototype to reset the above stopImmediatePropagation()
8167						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
8168						saved.slice( 1 ),
8169						this
8170					)
8171				} );
8172
8173				// Abort handling of the native event
8174				event.stopImmediatePropagation();
8175			}
8176		}
8177	} );
8178}
8179
8180jQuery.removeEvent = function( elem, type, handle ) {
8181
8182	// This "if" is needed for plain objects
8183	if ( elem.removeEventListener ) {
8184		elem.removeEventListener( type, handle );
8185	}
8186};
8187
8188jQuery.Event = function( src, props ) {
8189
8190	// Allow instantiation without the 'new' keyword
8191	if ( !( this instanceof jQuery.Event ) ) {
8192		return new jQuery.Event( src, props );
8193	}
8194
8195	// Event object
8196	if ( src && src.type ) {
8197		this.originalEvent = src;
8198		this.type = src.type;
8199
8200		// Events bubbling up the document may have been marked as prevented
8201		// by a handler lower down the tree; reflect the correct value.
8202		this.isDefaultPrevented = src.defaultPrevented ||
8203				src.defaultPrevented === undefined &&
8204
8205				// Support: Android <=2.3 only
8206				src.returnValue === false ?
8207			returnTrue :
8208			returnFalse;
8209
8210		// Create target properties
8211		// Support: Safari <=6 - 7 only
8212		// Target should not be a text node (#504, #13143)
8213		this.target = ( src.target && src.target.nodeType === 3 ) ?
8214			src.target.parentNode :
8215			src.target;
8216
8217		this.currentTarget = src.currentTarget;
8218		this.relatedTarget = src.relatedTarget;
8219
8220	// Event type
8221	} else {
8222		this.type = src;
8223	}
8224
8225	// Put explicitly provided properties onto the event object
8226	if ( props ) {
8227		jQuery.extend( this, props );
8228	}
8229
8230	// Create a timestamp if incoming event doesn't have one
8231	this.timeStamp = src && src.timeStamp || Date.now();
8232
8233	// Mark it as fixed
8234	this[ jQuery.expando ] = true;
8235};
8236
8237// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
8238// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
8239jQuery.Event.prototype = {
8240	constructor: jQuery.Event,
8241	isDefaultPrevented: returnFalse,
8242	isPropagationStopped: returnFalse,
8243	isImmediatePropagationStopped: returnFalse,
8244	isSimulated: false,
8245
8246	preventDefault: function() {
8247		var e = this.originalEvent;
8248
8249		this.isDefaultPrevented = returnTrue;
8250
8251		if ( e && !this.isSimulated ) {
8252			e.preventDefault();
8253		}
8254	},
8255	stopPropagation: function() {
8256		var e = this.originalEvent;
8257
8258		this.isPropagationStopped = returnTrue;
8259
8260		if ( e && !this.isSimulated ) {
8261			e.stopPropagation();
8262		}
8263	},
8264	stopImmediatePropagation: function() {
8265		var e = this.originalEvent;
8266
8267		this.isImmediatePropagationStopped = returnTrue;
8268
8269		if ( e && !this.isSimulated ) {
8270			e.stopImmediatePropagation();
8271		}
8272
8273		this.stopPropagation();
8274	}
8275};
8276
8277// Includes all common event props including KeyEvent and MouseEvent specific props
8278jQuery.each( {
8279	altKey: true,
8280	bubbles: true,
8281	cancelable: true,
8282	changedTouches: true,
8283	ctrlKey: true,
8284	detail: true,
8285	eventPhase: true,
8286	metaKey: true,
8287	pageX: true,
8288	pageY: true,
8289	shiftKey: true,
8290	view: true,
8291	"char": true,
8292	code: true,
8293	charCode: true,
8294	key: true,
8295	keyCode: true,
8296	button: true,
8297	buttons: true,
8298	clientX: true,
8299	clientY: true,
8300	offsetX: true,
8301	offsetY: true,
8302	pointerId: true,
8303	pointerType: true,
8304	screenX: true,
8305	screenY: true,
8306	targetTouches: true,
8307	toElement: true,
8308	touches: true,
8309
8310	which: function( event ) {
8311		var button = event.button;
8312
8313		// Add which for key events
8314		if ( event.which == null && rkeyEvent.test( event.type ) ) {
8315			return event.charCode != null ? event.charCode : event.keyCode;
8316		}
8317
8318		// Add which for click: 1 === left; 2 === middle; 3 === right
8319		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
8320			if ( button & 1 ) {
8321				return 1;
8322			}
8323
8324			if ( button & 2 ) {
8325				return 3;
8326			}
8327
8328			if ( button & 4 ) {
8329				return 2;
8330			}
8331
8332			return 0;
8333		}
8334
8335		return event.which;
8336	}
8337}, jQuery.event.addProp );
8338
8339jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
8340	jQuery.event.special[ type ] = {
8341
8342		// Utilize native event if possible so blur/focus sequence is correct
8343		setup: function() {
8344
8345			// Claim the first handler
8346			// dataPriv.set( this, "focus", ... )
8347			// dataPriv.set( this, "blur", ... )
8348			leverageNative( this, type, expectSync );
8349
8350			// Return false to allow normal processing in the caller
8351			return false;
8352		},
8353		trigger: function() {
8354
8355			// Force setup before trigger
8356			leverageNative( this, type );
8357
8358			// Return non-false to allow normal event-path propagation
vendor: 17,941 bytes, lines 8358-9029
8358
8359			return true;
8360		},
8361
8362		delegateType: delegateType
8363	};
8364} );
8365
8366// Create mouseenter/leave events using mouseover/out and event-time checks
8367// so that event delegation works in jQuery.
8368// Do the same for pointerenter/pointerleave and pointerover/pointerout
8369//
8370// Support: Safari 7 only
8371// Safari sends mouseenter too often; see:
8372// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
8373// for the description of the bug (it existed in older Chrome versions as well).
8374jQuery.each( {
8375	mouseenter: "mouseover",
8376	mouseleave: "mouseout",
8377	pointerenter: "pointerover",
8378	pointerleave: "pointerout"
8379}, function( orig, fix ) {
8380	jQuery.event.special[ orig ] = {
8381		delegateType: fix,
8382		bindType: fix,
8383
8384		handle: function( event ) {
8385			var ret,
8386				target = this,
8387				related = event.relatedTarget,
8388				handleObj = event.handleObj;
8389
8390			// For mouseenter/leave call the handler if related is outside the target.
8391			// NB: No relatedTarget if the mouse left/entered the browser window
8392			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
8393				event.type = handleObj.origType;
8394				ret = handleObj.handler.apply( this, arguments );
8395				event.type = fix;
8396			}
8397			return ret;
8398		}
8399	};
8400} );
8401
8402jQuery.fn.extend( {
8403
8404	on: function( types, selector, data, fn ) {
8405		return on( this, types, selector, data, fn );
8406	},
8407	one: function( types, selector, data, fn ) {
8408		return on( this, types, selector, data, fn, 1 );
8409	},
8410	off: function( types, selector, fn ) {
8411		var handleObj, type;
8412		if ( types && types.preventDefault && types.handleObj ) {
8413
8414			// ( event )  dispatched jQuery.Event
8415			handleObj = types.handleObj;
8416			jQuery( types.delegateTarget ).off(
8417				handleObj.namespace ?
8418					handleObj.origType + "." + handleObj.namespace :
8419					handleObj.origType,
8420				handleObj.selector,
8421				handleObj.handler
8422			);
8423			return this;
8424		}
8425		if ( typeof types === "object" ) {
8426
8427			// ( types-object [, selector] )
8428			for ( type in types ) {
8429				this.off( type, selector, types[ type ] );
8430			}
8431			return this;
8432		}
8433		if ( selector === false || typeof selector === "function" ) {
8434
8435			// ( types [, fn] )
8436			fn = selector;
8437			selector = undefined;
8438		}
8439		if ( fn === false ) {
8440			fn = returnFalse;
8441		}
8442		return this.each( function() {
8443			jQuery.event.remove( this, types, fn, selector );
8444		} );
8445	}
8446} );
8447
8448
8449var
8450
8451	// Support: IE <=10 - 11, Edge 12 - 13 only
8452	// In IE/Edge using regex groups here causes severe slowdowns.
8453	// See https://connect.microsoft.com/IE/feedback/details/1736512/
8454	rnoInnerhtml = /<script|<style|<link/i,
8455
8456	// checked="checked" or checked
8457	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
8458	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
8459
8460// Prefer a tbody over its parent table for containing new rows
8461function manipulationTarget( elem, content ) {
8462	if ( nodeName( elem, "table" ) &&
8463		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
8464
8465		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
8466	}
8467
8468	return elem;
8469}
8470
8471// Replace/restore the type attribute of script elements for safe DOM manipulation
8472function disableScript( elem ) {
8473	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
8474	return elem;
8475}
8476function restoreScript( elem ) {
8477	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
8478		elem.type = elem.type.slice( 5 );
8479	} else {
8480		elem.removeAttribute( "type" );
8481	}
8482
8483	return elem;
8484}
8485
8486function cloneCopyEvent( src, dest ) {
8487	var i, l, type, pdataOld, udataOld, udataCur, events;
8488
8489	if ( dest.nodeType !== 1 ) {
8490		return;
8491	}
8492
8493	// 1. Copy private data: events, handlers, etc.
8494	if ( dataPriv.hasData( src ) ) {
8495		pdataOld = dataPriv.get( src );
8496		events = pdataOld.events;
8497
8498		if ( events ) {
8499			dataPriv.remove( dest, "handle events" );
8500
8501			for ( type in events ) {
8502				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
8503					jQuery.event.add( dest, type, events[ type ][ i ] );
8504				}
8505			}
8506		}
8507	}
8508
8509	// 2. Copy user data
8510	if ( dataUser.hasData( src ) ) {
8511		udataOld = dataUser.access( src );
8512		udataCur = jQuery.extend( {}, udataOld );
8513
8514		dataUser.set( dest, udataCur );
8515	}
8516}
8517
8518// Fix IE bugs, see support tests
8519function fixInput( src, dest ) {
8520	var nodeName = dest.nodeName.toLowerCase();
8521
8522	// Fails to persist the checked state of a cloned checkbox or radio button.
8523	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
8524		dest.checked = src.checked;
8525
8526	// Fails to return the selected option to the default selected state when cloning options
8527	} else if ( nodeName === "input" || nodeName === "textarea" ) {
8528		dest.defaultValue = src.defaultValue;
8529	}
8530}
8531
8532function domManip( collection, args, callback, ignored ) {
8533
8534	// Flatten any nested arrays
8535	args = flat( args );
8536
8537	var fragment, first, scripts, hasScripts, node, doc,
8538		i = 0,
8539		l = collection.length,
8540		iNoClone = l - 1,
8541		value = args[ 0 ],
8542		valueIsFunction = isFunction( value );
8543
8544	// We can't cloneNode fragments that contain checked, in WebKit
8545	if ( valueIsFunction ||
8546			( l > 1 && typeof value === "string" &&
8547				!support.checkClone && rchecked.test( value ) ) ) {
8548		return collection.each( function( index ) {
8549			var self = collection.eq( index );
8550			if ( valueIsFunction ) {
8551				args[ 0 ] = value.call( this, index, self.html() );
8552			}
8553			domManip( self, args, callback, ignored );
8554		} );
8555	}
8556
8557	if ( l ) {
8558		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
8559		first = fragment.firstChild;
8560
8561		if ( fragment.childNodes.length === 1 ) {
8562			fragment = first;
8563		}
8564
8565		// Require either new content or an interest in ignored elements to invoke the callback
8566		if ( first || ignored ) {
8567			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
8568			hasScripts = scripts.length;
8569
8570			// Use the original fragment for the last item
8571			// instead of the first because it can end up
8572			// being emptied incorrectly in certain situations (#8070).
8573			for ( ; i < l; i++ ) {
8574				node = fragment;
8575
8576				if ( i !== iNoClone ) {
8577					node = jQuery.clone( node, true, true );
8578
8579					// Keep references to cloned scripts for later restoration
8580					if ( hasScripts ) {
8581
8582						// Support: Android <=4.0 only, PhantomJS 1 only
8583						// push.apply(_, arraylike) throws on ancient WebKit
8584						jQuery.merge( scripts, getAll( node, "script" ) );
8585					}
8586				}
8587
8588				callback.call( collection[ i ], node, i );
8589			}
8590
8591			if ( hasScripts ) {
8592				doc = scripts[ scripts.length - 1 ].ownerDocument;
8593
8594				// Reenable scripts
8595				jQuery.map( scripts, restoreScript );
8596
8597				// Evaluate executable scripts on first document insertion
8598				for ( i = 0; i < hasScripts; i++ ) {
8599					node = scripts[ i ];
8600					if ( rscriptType.test( node.type || "" ) &&
8601						!dataPriv.access( node, "globalEval" ) &&
8602						jQuery.contains( doc, node ) ) {
8603
8604						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
8605
8606							// Optional AJAX dependency, but won't run scripts if not present
8607							if ( jQuery._evalUrl && !node.noModule ) {
8608								jQuery._evalUrl( node.src, {
8609									nonce: node.nonce || node.getAttribute( "nonce" )
8610								}, doc );
8611							}
8612						} else {
8613							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
8614						}
8615					}
8616				}
8617			}
8618		}
8619	}
8620
8621	return collection;
8622}
8623
8624function remove( elem, selector, keepData ) {
8625	var node,
8626		nodes = selector ? jQuery.filter( selector, elem ) : elem,
8627		i = 0;
8628
8629	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
8630		if ( !keepData && node.nodeType === 1 ) {
8631			jQuery.cleanData( getAll( node ) );
8632		}
8633
8634		if ( node.parentNode ) {
8635			if ( keepData && isAttached( node ) ) {
8636				setGlobalEval( getAll( node, "script" ) );
8637			}
8638			node.parentNode.removeChild( node );
8639		}
8640	}
8641
8642	return elem;
8643}
8644
8645jQuery.extend( {
8646	htmlPrefilter: function( html ) {
8647		return html;
8648	},
8649
8650	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
8651		var i, l, srcElements, destElements,
8652			clone = elem.cloneNode( true ),
8653			inPage = isAttached( elem );
8654
8655		// Fix IE cloning issues
8656		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
8657				!jQuery.isXMLDoc( elem ) ) {
8658
8659			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
8660			destElements = getAll( clone );
8661			srcElements = getAll( elem );
8662
8663			for ( i = 0, l = srcElements.length; i < l; i++ ) {
8664				fixInput( srcElements[ i ], destElements[ i ] );
8665			}
8666		}
8667
8668		// Copy the events from the original to the clone
8669		if ( dataAndEvents ) {
8670			if ( deepDataAndEvents ) {
8671				srcElements = srcElements || getAll( elem );
8672				destElements = destElements || getAll( clone );
8673
8674				for ( i = 0, l = srcElements.length; i < l; i++ ) {
8675					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
8676				}
8677			} else {
8678				cloneCopyEvent( elem, clone );
8679			}
8680		}
8681
8682		// Preserve script evaluation history
8683		destElements = getAll( clone, "script" );
8684		if ( destElements.length > 0 ) {
8685			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
8686		}
8687
8688		// Return the cloned set
8689		return clone;
8690	},
8691
8692	cleanData: function( elems ) {
8693		var data, elem, type,
8694			special = jQuery.event.special,
8695			i = 0;
8696
8697		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
8698			if ( acceptData( elem ) ) {
8699				if ( ( data = elem[ dataPriv.expando ] ) ) {
8700					if ( data.events ) {
8701						for ( type in data.events ) {
8702							if ( special[ type ] ) {
8703								jQuery.event.remove( elem, type );
8704
8705							// This is a shortcut to avoid jQuery.event.remove's overhead
8706							} else {
8707								jQuery.removeEvent( elem, type, data.handle );
8708							}
8709						}
8710					}
8711
8712					// Support: Chrome <=35 - 45+
8713					// Assign undefined instead of using delete, see Data#remove
8714					elem[ dataPriv.expando ] = undefined;
8715				}
8716				if ( elem[ dataUser.expando ] ) {
8717
8718					// Support: Chrome <=35 - 45+
8719					// Assign undefined instead of using delete, see Data#remove
8720					elem[ dataUser.expando ] = undefined;
8721				}
8722			}
8723		}
8724	}
8725} );
8726
8727jQuery.fn.extend( {
8728	detach: function( selector ) {
8729		return remove( this, selector, true );
8730	},
8731
8732	remove: function( selector ) {
8733		return remove( this, selector );
8734	},
8735
8736	text: function( value ) {
8737		return access( this, function( value ) {
8738			return value === undefined ?
8739				jQuery.text( this ) :
8740				this.empty().each( function() {
8741					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
8742						this.textContent = value;
8743					}
8744				} );
8745		}, null, value, arguments.length );
8746	},
8747
8748	append: function() {
8749		return domManip( this, arguments, function( elem ) {
8750			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
8751				var target = manipulationTarget( this, elem );
8752				target.appendChild( elem );
8753			}
8754		} );
8755	},
8756
8757	prepend: function() {
8758		return domManip( this, arguments, function( elem ) {
8759			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
8760				var target = manipulationTarget( this, elem );
8761				target.insertBefore( elem, target.firstChild );
8762			}
8763		} );
8764	},
8765
8766	before: function() {
8767		return domManip( this, arguments, function( elem ) {
8768			if ( this.parentNode ) {
8769				this.parentNode.insertBefore( elem, this );
8770			}
8771		} );
8772	},
8773
8774	after: function() {
8775		return domManip( this, arguments, function( elem ) {
8776			if ( this.parentNode ) {
8777				this.parentNode.insertBefore( elem, this.nextSibling );
8778			}
8779		} );
8780	},
8781
8782	empty: function() {
8783		var elem,
8784			i = 0;
8785
8786		for ( ; ( elem = this[ i ] ) != null; i++ ) {
8787			if ( elem.nodeType === 1 ) {
8788
8789				// Prevent memory leaks
8790				jQuery.cleanData( getAll( elem, false ) );
8791
8792				// Remove any remaining nodes
8793				elem.textContent = "";
8794			}
8795		}
8796
8797		return this;
8798	},
8799
8800	clone: function( dataAndEvents, deepDataAndEvents ) {
8801		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
8802		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
8803
8804		return this.map( function() {
8805			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
8806		} );
8807	},
8808
8809	html: function( value ) {
8810		return access( this, function( value ) {
8811			var elem = this[ 0 ] || {},
8812				i = 0,
8813				l = this.length;
8814
8815			if ( value === undefined && elem.nodeType === 1 ) {
8816				return elem.innerHTML;
8817			}
8818
8819			// See if we can take a shortcut and just use innerHTML
8820			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
8821				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
8822
8823				value = jQuery.htmlPrefilter( value );
8824
8825				try {
8826					for ( ; i < l; i++ ) {
8827						elem = this[ i ] || {};
8828
8829						// Remove element nodes and prevent memory leaks
8830						if ( elem.nodeType === 1 ) {
8831							jQuery.cleanData( getAll( elem, false ) );
8832							elem.innerHTML = value;
8833						}
8834					}
8835
8836					elem = 0;
8837
8838				// If using innerHTML throws an exception, use the fallback method
8839				} catch ( e ) {}
8840			}
8841
8842			if ( elem ) {
8843				this.empty().append( value );
8844			}
8845		}, null, value, arguments.length );
8846	},
8847
8848	replaceWith: function() {
8849		var ignored = [];
8850
8851		// Make the changes, replacing each non-ignored context element with the new content
8852		return domManip( this, arguments, function( elem ) {
8853			var parent = this.parentNode;
8854
8855			if ( jQuery.inArray( this, ignored ) < 0 ) {
8856				jQuery.cleanData( getAll( this ) );
8857				if ( parent ) {
8858					parent.replaceChild( elem, this );
8859				}
8860			}
8861
8862		// Force callback invocation
8863		}, ignored );
8864	}
8865} );
8866
8867jQuery.each( {
8868	appendTo: "append",
8869	prependTo: "prepend",
8870	insertBefore: "before",
8871	insertAfter: "after",
8872	replaceAll: "replaceWith"
8873}, function( name, original ) {
8874	jQuery.fn[ name ] = function( selector ) {
8875		var elems,
8876			ret = [],
8877			insert = jQuery( selector ),
8878			last = insert.length - 1,
8879			i = 0;
8880
8881		for ( ; i <= last; i++ ) {
8882			elems = i === last ? this : this.clone( true );
8883			jQuery( insert[ i ] )[ original ]( elems );
8884
8885			// Support: Android <=4.0 only, PhantomJS 1 only
8886			// .get() because push.apply(_, arraylike) throws on ancient WebKit
8887			push.apply( ret, elems.get() );
8888		}
8889
8890		return this.pushStack( ret );
8891	};
8892} );
8893var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
8894
8895var getStyles = function( elem ) {
8896
8897		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
8898		// IE throws on elements created in popups
8899		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
8900		var view = elem.ownerDocument.defaultView;
8901
8902		if ( !view || !view.opener ) {
8903			view = window;
8904		}
8905
8906		return view.getComputedStyle( elem );
8907	};
8908
8909var swap = function( elem, options, callback ) {
8910	var ret, name,
8911		old = {};
8912
8913	// Remember the old values, and insert the new ones
8914	for ( name in options ) {
8915		old[ name ] = elem.style[ name ];
8916		elem.style[ name ] = options[ name ];
8917	}
8918
8919	ret = callback.call( elem );
8920
8921	// Revert the old values
8922	for ( name in options ) {
8923		elem.style[ name ] = old[ name ];
8924	}
8925
8926	return ret;
8927};
8928
8929
8930var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
8931
8932
8933
8934( function() {
8935
8936	// Executing both pixelPosition & boxSizingReliable tests require only one layout
8937	// so they're executed at the same time to save the second computation.
8938	function computeStyleTests() {
8939
8940		// This is a singleton, we need to execute it only once
8941		if ( !div ) {
8942			return;
8943		}
8944
8945		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
8946			"margin-top:1px;padding:0;border:0";
8947		div.style.cssText =
8948			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
8949			"margin:auto;border:1px;padding:1px;" +
8950			"width:60%;top:1%";
8951		documentElement.appendChild( container ).appendChild( div );
8952
8953		var divStyle = window.getComputedStyle( div );
8954		pixelPositionVal = divStyle.top !== "1%";
8955
8956		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
8957		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
8958
8959		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
8960		// Some styles come back with percentage values, even though they shouldn't
8961		div.style.right = "60%";
8962		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
8963
8964		// Support: IE 9 - 11 only
8965		// Detect misreporting of content dimensions for box-sizing:border-box elements
8966		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
8967
8968		// Support: IE 9 only
8969		// Detect overflow:scroll screwiness (gh-3699)
8970		// Support: Chrome <=64
8971		// Don't get tricked when zoom affects offsetWidth (gh-4029)
8972		div.style.position = "absolute";
8973		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
8974
8975		documentElement.removeChild( container );
8976
8977		// Nullify the div so it wouldn't be stored in the memory and
8978		// it will also be a sign that checks already performed
8979		div = null;
8980	}
8981
8982	function roundPixelMeasures( measure ) {
8983		return Math.round( parseFloat( measure ) );
8984	}
8985
8986	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
8987		reliableTrDimensionsVal, reliableMarginLeftVal,
8988		container = document.createElement( "div" ),
8989		div = document.createElement( "div" );
8990
8991	// Finish early in limited (non-browser) environments
8992	if ( !div.style ) {
8993		return;
8994	}
8995
8996	// Support: IE <=9 - 11 only
8997	// Style of cloned element affects source element cloned (#8908)
8998	div.style.backgroundClip = "content-box";
8999	div.cloneNode( true ).style.backgroundClip = "";
9000	support.clearCloneStyle = div.style.backgroundClip === "content-box";
9001
9002	jQuery.extend( support, {
9003		boxSizingReliable: function() {
9004			computeStyleTests();
9005			return boxSizingReliableVal;
9006		},
9007		pixelBoxStyles: function() {
9008			computeStyleTests();
9009			return pixelBoxStylesVal;
9010		},
9011		pixelPosition: function() {
9012			computeStyleTests();
9013			return pixelPositionVal;
9014		},
9015		reliableMarginLeft: function() {
9016			computeStyleTests();
9017			return reliableMarginLeftVal;
9018		},
9019		scrollboxSize: function() {
9020			computeStyleTests();
9021			return scrollboxSizeVal;
9022		},
9023
9024		// Support: IE 9 - 11+, Edge 15 - 18+
9025		// IE/Edge misreport `getComputedStyle` of table rows with width/height
9026		// set in CSS while `offset*` properties report correct values.
9027		// Behavior in IE 9 is more subtle than in newer versions & it passes
9028		// some versions of this test; make sure not to make it pass there!
9029		
9029reliableTrDimensions: function() {
9030			var table, tr, trChild, trStyle;
9031			if ( reliableTrDimensionsVal == null ) {
9032				table = document.createElement( "table" );
9033				tr = document.createElement( "tr" );
9034				trChild = document.createElement( "div" );
9035
9036				table.style.cssText = "position:absolute;left:-11111px";
9037				tr.style.height = "1px";
9038				trChild.style.height = "9px";
9039
9040				documentElement
9041					.appendChild( table )
9042					.appendChild( tr )
9043					.appendChild( trChild );
9044
9045				trStyle = window.getComputedStyle( tr );
9046				reliableTrDimensionsVal = parseInt( trStyle.height ) > 3
vendor: 13,297 bytes, lines 9046-9510
9046;
9047
9048				documentElement.removeChild( table );
9049			}
9050			return reliableTrDimensionsVal;
9051		}
9052	} );
9053} )();
9054
9055
9056function curCSS( elem, name, computed ) {
9057	var width, minWidth, maxWidth, ret,
9058
9059		// Support: Firefox 51+
9060		// Retrieving style before computed somehow
9061		// fixes an issue with getting wrong values
9062		// on detached elements
9063		style = elem.style;
9064
9065	computed = computed || getStyles( elem );
9066
9067	// getPropertyValue is needed for:
9068	//   .css('filter') (IE 9 only, #12537)
9069	//   .css('--customProperty) (#3144)
9070	if ( computed ) {
9071		ret = computed.getPropertyValue( name ) || computed[ name ];
9072
9073		if ( ret === "" && !isAttached( elem ) ) {
9074			ret = jQuery.style( elem, name );
9075		}
9076
9077		// A tribute to the "awesome hack by Dean Edwards"
9078		// Android Browser returns percentage for some values,
9079		// but width seems to be reliably pixels.
9080		// This is against the CSSOM draft spec:
9081		// https://drafts.csswg.org/cssom/#resolved-values
9082		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
9083
9084			// Remember the original values
9085			width = style.width;
9086			minWidth = style.minWidth;
9087			maxWidth = style.maxWidth;
9088
9089			// Put in the new values to get a computed value out
9090			style.minWidth = style.maxWidth = style.width = ret;
9091			ret = computed.width;
9092
9093			// Revert the changed values
9094			style.width = width;
9095			style.minWidth = minWidth;
9096			style.maxWidth = maxWidth;
9097		}
9098	}
9099
9100	return ret !== undefined ?
9101
9102		// Support: IE <=9 - 11 only
9103		// IE returns zIndex value as an integer.
9104		ret + "" :
9105		ret;
9106}
9107
9108
9109function addGetHookIf( conditionFn, hookFn ) {
9110
9111	// Define the hook, we'll check on the first run if it's really needed.
9112	return {
9113		get: function() {
9114			if ( conditionFn() ) {
9115
9116				// Hook not needed (or it's not possible to use it due
9117				// to missing dependency), remove it.
9118				delete this.get;
9119				return;
9120			}
9121
9122			// Hook needed; redefine it so that the support test is not executed again.
9123			return ( this.get = hookFn ).apply( this, arguments );
9124		}
9125	};
9126}
9127
9128
9129var cssPrefixes = [ "Webkit", "Moz", "ms" ],
9130	emptyStyle = document.createElement( "div" ).style,
9131	vendorProps = {};
9132
9133// Return a vendor-prefixed property or undefined
9134function vendorPropName( name ) {
9135
9136	// Check for vendor prefixed names
9137	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
9138		i = cssPrefixes.length;
9139
9140	while ( i-- ) {
9141		name = cssPrefixes[ i ] + capName;
9142		if ( name in emptyStyle ) {
9143			return name;
9144		}
9145	}
9146}
9147
9148// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
9149function finalPropName( name ) {
9150	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
9151
9152	if ( final ) {
9153		return final;
9154	}
9155	if ( name in emptyStyle ) {
9156		return name;
9157	}
9158	return vendorProps[ name ] = vendorPropName( name ) || name;
9159}
9160
9161
9162var
9163
9164	// Swappable if display is none or starts with table
9165	// except "table", "table-cell", or "table-caption"
9166	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
9167	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
9168	rcustomProp = /^--/,
9169	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
9170	cssNormalTransform = {
9171		letterSpacing: "0",
9172		fontWeight: "400"
9173	};
9174
9175function setPositiveNumber( _elem, value, subtract ) {
9176
9177	// Any relative (+/-) values have already been
9178	// normalized at this point
9179	var matches = rcssNum.exec( value );
9180	return matches ?
9181
9182		// Guard against undefined "subtract", e.g., when used as in cssHooks
9183		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
9184		value;
9185}
9186
9187function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
9188	var i = dimension === "width" ? 1 : 0,
9189		extra = 0,
9190		delta = 0;
9191
9192	// Adjustment may not be necessary
9193	if ( box === ( isBorderBox ? "border" : "content" ) ) {
9194		return 0;
9195	}
9196
9197	for ( ; i < 4; i += 2 ) {
9198
9199		// Both box models exclude margin
9200		if ( box === "margin" ) {
9201			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
9202		}
9203
9204		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
9205		if ( !isBorderBox ) {
9206
9207			// Add padding
9208			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
9209
9210			// For "border" or "margin", add border
9211			if ( box !== "padding" ) {
9212				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
9213
9214			// But still keep track of it otherwise
9215			} else {
9216				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
9217			}
9218
9219		// If we get here with a border-box (content + padding + border), we're seeking "content" or
9220		// "padding" or "margin"
9221		} else {
9222
9223			// For "content", subtract padding
9224			if ( box === "content" ) {
9225				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
9226			}
9227
9228			// For "content" or "padding", subtract border
9229			if ( box !== "margin" ) {
9230				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
9231			}
9232		}
9233	}
9234
9235	// Account for positive content-box scroll gutter when requested by providing computedVal
9236	if ( !isBorderBox && computedVal >= 0 ) {
9237
9238		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
9239		// Assuming integer scroll gutter, subtract the rest and round down
9240		delta += Math.max( 0, Math.ceil(
9241			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
9242			computedVal -
9243			delta -
9244			extra -
9245			0.5
9246
9247		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
9248		// Use an explicit zero to avoid NaN (gh-3964)
9249		) ) || 0;
9250	}
9251
9252	return delta;
9253}
9254
9255function getWidthOrHeight( elem, dimension, extra ) {
9256
9257	// Start with computed style
9258	var styles = getStyles( elem ),
9259
9260		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
9261		// Fake content-box until we know it's needed to know the true value.
9262		boxSizingNeeded = !support.boxSizingReliable() || extra,
9263		isBorderBox = boxSizingNeeded &&
9264			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
9265		valueIsBorderBox = isBorderBox,
9266
9267		val = curCSS( elem, dimension, styles ),
9268		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
9269
9270	// Support: Firefox <=54
9271	// Return a confounding non-pixel value or feign ignorance, as appropriate.
9272	if ( rnumnonpx.test( val ) ) {
9273		if ( !extra ) {
9274			return val;
9275		}
9276		val = "auto";
9277	}
9278
9279
9280	// Support: IE 9 - 11 only
9281	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
9282	// In those cases, the computed value can be trusted to be border-box.
9283	if ( ( !support.boxSizingReliable() && isBorderBox ||
9284
9285		// Support: IE 10 - 11+, Edge 15 - 18+
9286		// IE/Edge misreport `getComputedStyle` of table rows with width/height
9287		// set in CSS while `offset*` properties report correct values.
9288		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
9289		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
9290
9291		// Fall back to offsetWidth/offsetHeight when value is "auto"
9292		// This happens for inline elements with no explicit setting (gh-3571)
9293		val === "auto" ||
9294
9295		// Support: Android <=4.1 - 4.3 only
9296		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
9297		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
9298
9299		// Make sure the element is visible & connected
9300		elem.getClientRects().length ) {
9301
9302		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
9303
9304		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
9305		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
9306		// retrieved value as a content box dimension.
9307		valueIsBorderBox = offsetProp in elem;
9308		if ( valueIsBorderBox ) {
9309			val = elem[ offsetProp ];
9310		}
9311	}
9312
9313	// Normalize "" and auto
9314	val = parseFloat( val ) || 0;
9315
9316	// Adjust for the element's box model
9317	return ( val +
9318		boxModelAdjustment(
9319			elem,
9320			dimension,
9321			extra || ( isBorderBox ? "border" : "content" ),
9322			valueIsBorderBox,
9323			styles,
9324
9325			// Provide the current computed size to request scroll gutter calculation (gh-3589)
9326			val
9327		)
9328	) + "px";
9329}
9330
9331jQuery.extend( {
9332
9333	// Add in style property hooks for overriding the default
9334	// behavior of getting and setting a style property
9335	cssHooks: {
9336		opacity: {
9337			get: function( elem, computed ) {
9338				if ( computed ) {
9339
9340					// We should always get a number back from opacity
9341					var ret = curCSS( elem, "opacity" );
9342					return ret === "" ? "1" : ret;
9343				}
9344			}
9345		}
9346	},
9347
9348	// Don't automatically add "px" to these possibly-unitless properties
9349	cssNumber: {
9350		"animationIterationCount": true,
9351		"columnCount": true,
9352		"fillOpacity": true,
9353		"flexGrow": true,
9354		"flexShrink": true,
9355		"fontWeight": true,
9356		"gridArea": true,
9357		"gridColumn": true,
9358		"gridColumnEnd": true,
9359		"gridColumnStart": true,
9360		"gridRow": true,
9361		"gridRowEnd": true,
9362		"gridRowStart": true,
9363		"lineHeight": true,
9364		"opacity": true,
9365		"order": true,
9366		"orphans": true,
9367		"widows": true,
9368		"zIndex": true,
9369		"zoom": true
9370	},
9371
9372	// Add in properties whose names you wish to fix before
9373	// setting or getting the value
9374	cssProps: {},
9375
9376	// Get and set the style property on a DOM Node
9377	style: function( elem, name, value, extra ) {
9378
9379		// Don't set styles on text and comment nodes
9380		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
9381			return;
9382		}
9383
9384		// Make sure that we're working with the right name
9385		var ret, type, hooks,
9386			origName = camelCase( name ),
9387			isCustomProp = rcustomProp.test( name ),
9388			style = elem.style;
9389
9390		// Make sure that we're working with the right name. We don't
9391		// want to query the value if it is a CSS custom property
9392		// since they are user-defined.
9393		if ( !isCustomProp ) {
9394			name = finalPropName( origName );
9395		}
9396
9397		// Gets hook for the prefixed version, then unprefixed version
9398		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
9399
9400		// Check if we're setting a value
9401		if ( value !== undefined ) {
9402			type = typeof value;
9403
9404			// Convert "+=" or "-=" to relative numbers (#7345)
9405			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
9406				value = adjustCSS( elem, name, ret );
9407
9408				// Fixes bug #9237
9409				type = "number";
9410			}
9411
9412			// Make sure that null and NaN values aren't set (#7116)
9413			if ( value == null || value !== value ) {
9414				return;
9415			}
9416
9417			// If a number was passed in, add the unit (except for certain CSS properties)
9418			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
9419			// "px" to a few hardcoded values.
9420			if ( type === "number" && !isCustomProp ) {
9421				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
9422			}
9423
9424			// background-* props affect original clone's values
9425			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
9426				style[ name ] = "inherit";
9427			}
9428
9429			// If a hook was provided, use that value, otherwise just set the specified value
9430			if ( !hooks || !( "set" in hooks ) ||
9431				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
9432
9433				if ( isCustomProp ) {
9434					style.setProperty( name, value );
9435				} else {
9436					style[ name ] = value;
9437				}
9438			}
9439
9440		} else {
9441
9442			// If a hook was provided get the non-computed value from there
9443			if ( hooks && "get" in hooks &&
9444				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
9445
9446				return ret;
9447			}
9448
9449			// Otherwise just get the value from the style object
9450			return style[ name ];
9451		}
9452	},
9453
9454	css: function( elem, name, extra, styles ) {
9455		var val, num, hooks,
9456			origName = camelCase( name ),
9457			isCustomProp = rcustomProp.test( name );
9458
9459		// Make sure that we're working with the right name. We don't
9460		// want to modify the value if it is a CSS custom property
9461		// since they are user-defined.
9462		if ( !isCustomProp ) {
9463			name = finalPropName( origName );
9464		}
9465
9466		// Try prefixed name followed by the unprefixed name
9467		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
9468
9469		// If a hook was provided get the computed value from there
9470		if ( hooks && "get" in hooks ) {
9471			val = hooks.get( elem, true, extra );
9472		}
9473
9474		// Otherwise, if a way to get the computed value exists, use that
9475		if ( val === undefined ) {
9476			val = curCSS( elem, name, styles );
9477		}
9478
9479		// Convert "normal" to computed value
9480		if ( val === "normal" && name in cssNormalTransform ) {
9481			val = cssNormalTransform[ name ];
9482		}
9483
9484		// Make numeric if forced or a qualifier was provided and val looks numeric
9485		if ( extra === "" || extra ) {
9486			num = parseFloat( val );
9487			return extra === true || isFinite( num ) ? num || 0 : val;
9488		}
9489
9490		return val;
9491	}
9492} );
9493
9494jQuery.each( [ "height", "width" ], function( _i, dimension ) {
9495	jQuery.cssHooks[ dimension ] = {
9496		get: function( elem, computed, extra ) {
9497			if ( computed ) {
9498
9499				// Certain elements can have dimension info if we invisibly show them
9500				// but it must have a current display style that would benefit
9501				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
9502
9503					// Support: Safari 8+
9504					// Table columns in Safari have non-zero offsetWidth & zero
9505					// getBoundingClientRect().width unless display is changed.
9506					// Support: IE <=11 only
9507					// Running getBoundingClientRect on a disconnected node
9508					// in IE throws an error.
9509					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
9510					
vendor: 5,577 bytes, lines 9510-9712
9510	swap( elem, cssShow, function() {
9511							return getWidthOrHeight( elem, dimension, extra );
9512						} ) :
9513						getWidthOrHeight( elem, dimension, extra );
9514			}
9515		},
9516
9517		set: function( elem, value, extra ) {
9518			var matches,
9519				styles = getStyles( elem ),
9520
9521				// Only read styles.position if the test has a chance to fail
9522				// to avoid forcing a reflow.
9523				scrollboxSizeBuggy = !support.scrollboxSize() &&
9524					styles.position === "absolute",
9525
9526				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
9527				boxSizingNeeded = scrollboxSizeBuggy || extra,
9528				isBorderBox = boxSizingNeeded &&
9529					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
9530				subtract = extra ?
9531					boxModelAdjustment(
9532						elem,
9533						dimension,
9534						extra,
9535						isBorderBox,
9536						styles
9537					) :
9538					0;
9539
9540			// Account for unreliable border-box dimensions by comparing offset* to computed and
9541			// faking a content-box to get border and padding (gh-3699)
9542			if ( isBorderBox && scrollboxSizeBuggy ) {
9543				subtract -= Math.ceil(
9544					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
9545					parseFloat( styles[ dimension ] ) -
9546					boxModelAdjustment( elem, dimension, "border", false, styles ) -
9547					0.5
9548				);
9549			}
9550
9551			// Convert to pixels if value adjustment is needed
9552			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
9553				( matches[ 3 ] || "px" ) !== "px" ) {
9554
9555				elem.style[ dimension ] = value;
9556				value = jQuery.css( elem, dimension );
9557			}
9558
9559			return setPositiveNumber( elem, value, subtract );
9560		}
9561	};
9562} );
9563
9564jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
9565	function( elem, computed ) {
9566		if ( computed ) {
9567			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
9568				elem.getBoundingClientRect().left -
9569					swap( elem, { marginLeft: 0 }, function() {
9570						return elem.getBoundingClientRect().left;
9571					} )
9572				) + "px";
9573		}
9574	}
9575);
9576
9577// These hooks are used by animate to expand properties
9578jQuery.each( {
9579	margin: "",
9580	padding: "",
9581	border: "Width"
9582}, function( prefix, suffix ) {
9583	jQuery.cssHooks[ prefix + suffix ] = {
9584		expand: function( value ) {
9585			var i = 0,
9586				expanded = {},
9587
9588				// Assumes a single number if not a string
9589				parts = typeof value === "string" ? value.split( " " ) : [ value ];
9590
9591			for ( ; i < 4; i++ ) {
9592				expanded[ prefix + cssExpand[ i ] + suffix ] =
9593					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
9594			}
9595
9596			return expanded;
9597		}
9598	};
9599
9600	if ( prefix !== "margin" ) {
9601		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
9602	}
9603} );
9604
9605jQuery.fn.extend( {
9606	css: function( name, value ) {
9607		return access( this, function( elem, name, value ) {
9608			var styles, len,
9609				map = {},
9610				i = 0;
9611
9612			if ( Array.isArray( name ) ) {
9613				styles = getStyles( elem );
9614				len = name.length;
9615
9616				for ( ; i < len; i++ ) {
9617					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
9618				}
9619
9620				return map;
9621			}
9622
9623			return value !== undefined ?
9624				jQuery.style( elem, name, value ) :
9625				jQuery.css( elem, name );
9626		}, name, value, arguments.length > 1 );
9627	}
9628} );
9629
9630
9631function Tween( elem, options, prop, end, easing ) {
9632	return new Tween.prototype.init( elem, options, prop, end, easing );
9633}
9634jQuery.Tween = Tween;
9635
9636Tween.prototype = {
9637	constructor: Tween,
9638	init: function( elem, options, prop, end, easing, unit ) {
9639		this.elem = elem;
9640		this.prop = prop;
9641		this.easing = easing || jQuery.easing._default;
9642		this.options = options;
9643		this.start = this.now = this.cur();
9644		this.end = end;
9645		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
9646	},
9647	cur: function() {
9648		var hooks = Tween.propHooks[ this.prop ];
9649
9650		return hooks && hooks.get ?
9651			hooks.get( this ) :
9652			Tween.propHooks._default.get( this );
9653	},
9654	run: function( percent ) {
9655		var eased,
9656			hooks = Tween.propHooks[ this.prop ];
9657
9658		if ( this.options.duration ) {
9659			this.pos = eased = jQuery.easing[ this.easing ](
9660				percent, this.options.duration * percent, 0, 1, this.options.duration
9661			);
9662		} else {
9663			this.pos = eased = percent;
9664		}
9665		this.now = ( this.end - this.start ) * eased + this.start;
9666
9667		if ( this.options.step ) {
9668			this.options.step.call( this.elem, this.now, this );
9669		}
9670
9671		if ( hooks && hooks.set ) {
9672			hooks.set( this );
9673		} else {
9674			Tween.propHooks._default.set( this );
9675		}
9676		return this;
9677	}
9678};
9679
9680Tween.prototype.init.prototype = Tween.prototype;
9681
9682Tween.propHooks = {
9683	_default: {
9684		get: function( tween ) {
9685			var result;
9686
9687			// Use a property on the element directly when it is not a DOM element,
9688			// or when there is no matching style property that exists.
9689			if ( tween.elem.nodeType !== 1 ||
9690				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
9691				return tween.elem[ tween.prop ];
9692			}
9693
9694			// Passing an empty string as a 3rd parameter to .css will automatically
9695			// attempt a parseFloat and fallback to a string if the parse fails.
9696			// Simple values such as "10px" are parsed to Float;
9697			// complex values such as "rotate(1rad)" are returned as-is.
9698			result = jQuery.css( tween.elem, tween.prop, "" );
9699
9700			// Empty strings, null, undefined and "auto" are converted to 0.
9701			return !result || result === "auto" ? 0 : result;
9702		},
9703		set: function( tween ) {
9704
9705			// Use step hook for back compat.
9706			// Use cssHook if its there.
9707			// Use .style if available and use plain properties where available.
9708			if ( jQuery.fx.step[ tween.prop ] ) {
9709				jQuery.fx.step[ tween.prop ]( tween );
9710			} else if ( tween.elem.nodeType === 1 && (
9711					jQuery.cssHooks[ tween.prop ] ||
9712					tween.elem.style[ finalPropName( tween.prop ) ] != null
vendor: 14,002 bytes, lines 9712-10267
9712 ) ) {
9713				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
9714			} else {
9715				tween.elem[ tween.prop ] = tween.now;
9716			}
9717		}
9718	}
9719};
9720
9721// Support: IE <=9 only
9722// Panic based approach to setting things on disconnected nodes
9723Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
9724	set: function( tween ) {
9725		if ( tween.elem.nodeType && tween.elem.parentNode ) {
9726			tween.elem[ tween.prop ] = tween.now;
9727		}
9728	}
9729};
9730
9731jQuery.easing = {
9732	linear: function( p ) {
9733		return p;
9734	},
9735	swing: function( p ) {
9736		return 0.5 - Math.cos( p * Math.PI ) / 2;
9737	},
9738	_default: "swing"
9739};
9740
9741jQuery.fx = Tween.prototype.init;
9742
9743// Back compat <1.8 extension point
9744jQuery.fx.step = {};
9745
9746
9747
9748
9749var
9750	fxNow, inProgress,
9751	rfxtypes = /^(?:toggle|show|hide)$/,
9752	rrun = /queueHooks$/;
9753
9754function schedule() {
9755	if ( inProgress ) {
9756		if ( document.hidden === false && window.requestAnimationFrame ) {
9757			window.requestAnimationFrame( schedule );
9758		} else {
9759			window.setTimeout( schedule, jQuery.fx.interval );
9760		}
9761
9762		jQuery.fx.tick();
9763	}
9764}
9765
9766// Animations created synchronously will run synchronously
9767function createFxNow() {
9768	window.setTimeout( function() {
9769		fxNow = undefined;
9770	} );
9771	return ( fxNow = Date.now() );
9772}
9773
9774// Generate parameters to create a standard animation
9775function genFx( type, includeWidth ) {
9776	var which,
9777		i = 0,
9778		attrs = { height: type };
9779
9780	// If we include width, step value is 1 to do all cssExpand values,
9781	// otherwise step value is 2 to skip over Left and Right
9782	includeWidth = includeWidth ? 1 : 0;
9783	for ( ; i < 4; i += 2 - includeWidth ) {
9784		which = cssExpand[ i ];
9785		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
9786	}
9787
9788	if ( includeWidth ) {
9789		attrs.opacity = attrs.width = type;
9790	}
9791
9792	return attrs;
9793}
9794
9795function createTween( value, prop, animation ) {
9796	var tween,
9797		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
9798		index = 0,
9799		length = collection.length;
9800	for ( ; index < length; index++ ) {
9801		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
9802
9803			// We're done with this property
9804			return tween;
9805		}
9806	}
9807}
9808
9809function defaultPrefilter( elem, props, opts ) {
9810	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
9811		isBox = "width" in props || "height" in props,
9812		anim = this,
9813		orig = {},
9814		style = elem.style,
9815		hidden = elem.nodeType && isHiddenWithinTree( elem ),
9816		dataShow = dataPriv.get( elem, "fxshow" );
9817
9818	// Queue-skipping animations hijack the fx hooks
9819	if ( !opts.queue ) {
9820		hooks = jQuery._queueHooks( elem, "fx" );
9821		if ( hooks.unqueued == null ) {
9822			hooks.unqueued = 0;
9823			oldfire = hooks.empty.fire;
9824			hooks.empty.fire = function() {
9825				if ( !hooks.unqueued ) {
9826					oldfire();
9827				}
9828			};
9829		}
9830		hooks.unqueued++;
9831
9832		anim.always( function() {
9833
9834			// Ensure the complete handler is called before this completes
9835			anim.always( function() {
9836				hooks.unqueued--;
9837				if ( !jQuery.queue( elem, "fx" ).length ) {
9838					hooks.empty.fire();
9839				}
9840			} );
9841		} );
9842	}
9843
9844	// Detect show/hide animations
9845	for ( prop in props ) {
9846		value = props[ prop ];
9847		if ( rfxtypes.test( value ) ) {
9848			delete props[ prop ];
9849			toggle = toggle || value === "toggle";
9850			if ( value === ( hidden ? "hide" : "show" ) ) {
9851
9852				// Pretend to be hidden if this is a "show" and
9853				// there is still data from a stopped show/hide
9854				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
9855					hidden = true;
9856
9857				// Ignore all other no-op show/hide data
9858				} else {
9859					continue;
9860				}
9861			}
9862			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
9863		}
9864	}
9865
9866	// Bail out if this is a no-op like .hide().hide()
9867	propTween = !jQuery.isEmptyObject( props );
9868	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
9869		return;
9870	}
9871
9872	// Restrict "overflow" and "display" styles during box animations
9873	if ( isBox && elem.nodeType === 1 ) {
9874
9875		// Support: IE <=9 - 11, Edge 12 - 15
9876		// Record all 3 overflow attributes because IE does not infer the shorthand
9877		// from identically-valued overflowX and overflowY and Edge just mirrors
9878		// the overflowX value there.
9879		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
9880
9881		// Identify a display type, preferring old show/hide data over the CSS cascade
9882		restoreDisplay = dataShow && dataShow.display;
9883		if ( restoreDisplay == null ) {
9884			restoreDisplay = dataPriv.get( elem, "display" );
9885		}
9886		display = jQuery.css( elem, "display" );
9887		if ( display === "none" ) {
9888			if ( restoreDisplay ) {
9889				display = restoreDisplay;
9890			} else {
9891
9892				// Get nonempty value(s) by temporarily forcing visibility
9893				showHide( [ elem ], true );
9894				restoreDisplay = elem.style.display || restoreDisplay;
9895				display = jQuery.css( elem, "display" );
9896				showHide( [ elem ] );
9897			}
9898		}
9899
9900		// Animate inline elements as inline-block
9901		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
9902			if ( jQuery.css( elem, "float" ) === "none" ) {
9903
9904				// Restore the original display value at the end of pure show/hide animations
9905				if ( !propTween ) {
9906					anim.done( function() {
9907						style.display = restoreDisplay;
9908					} );
9909					if ( restoreDisplay == null ) {
9910						display = style.display;
9911						restoreDisplay = display === "none" ? "" : display;
9912					}
9913				}
9914				style.display = "inline-block";
9915			}
9916		}
9917	}
9918
9919	if ( opts.overflow ) {
9920		style.overflow = "hidden";
9921		anim.always( function() {
9922			style.overflow = opts.overflow[ 0 ];
9923			style.overflowX = opts.overflow[ 1 ];
9924			style.overflowY = opts.overflow[ 2 ];
9925		} );
9926	}
9927
9928	// Implement show/hide animations
9929	propTween = false;
9930	for ( prop in orig ) {
9931
9932		// General show/hide setup for this element animation
9933		if ( !propTween ) {
9934			if ( dataShow ) {
9935				if ( "hidden" in dataShow ) {
9936					hidden = dataShow.hidden;
9937				}
9938			} else {
9939				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
9940			}
9941
9942			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
9943			if ( toggle ) {
9944				dataShow.hidden = !hidden;
9945			}
9946
9947			// Show elements before animating them
9948			if ( hidden ) {
9949				showHide( [ elem ], true );
9950			}
9951
9952			/* eslint-disable no-loop-func */
9953
9954			anim.done( function() {
9955
9956			/* eslint-enable no-loop-func */
9957
9958				// The final step of a "hide" animation is actually hiding the element
9959				if ( !hidden ) {
9960					showHide( [ elem ] );
9961				}
9962				dataPriv.remove( elem, "fxshow" );
9963				for ( prop in orig ) {
9964					jQuery.style( elem, prop, orig[ prop ] );
9965				}
9966			} );
9967		}
9968
9969		// Per-property setup
9970		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
9971		if ( !( prop in dataShow ) ) {
9972			dataShow[ prop ] = propTween.start;
9973			if ( hidden ) {
9974				propTween.end = propTween.start;
9975				propTween.start = 0;
9976			}
9977		}
9978	}
9979}
9980
9981function propFilter( props, specialEasing ) {
9982	var index, name, easing, value, hooks;
9983
9984	// camelCase, specialEasing and expand cssHook pass
9985	for ( index in props ) {
9986		name = camelCase( index );
9987		easing = specialEasing[ name ];
9988		value = props[ index ];
9989		if ( Array.isArray( value ) ) {
9990			easing = value[ 1 ];
9991			value = props[ index ] = value[ 0 ];
9992		}
9993
9994		if ( index !== name ) {
9995			props[ name ] = value;
9996			delete props[ index ];
9997		}
9998
9999		hooks = jQuery.cssHooks[ name ];
10000		if ( hooks && "expand" in hooks ) {
10001			value = hooks.expand( value );
10002			delete props[ name ];
10003
10004			// Not quite $.extend, this won't overwrite existing keys.
10005			// Reusing 'index' because we have the correct "name"
10006			for ( index in value ) {
10007				if ( !( index in props ) ) {
10008					props[ index ] = value[ index ];
10009					specialEasing[ index ] = easing;
10010				}
10011			}
10012		} else {
10013			specialEasing[ name ] = easing;
10014		}
10015	}
10016}
10017
10018function Animation( elem, properties, options ) {
10019	var result,
10020		stopped,
10021		index = 0,
10022		length = Animation.prefilters.length,
10023		deferred = jQuery.Deferred().always( function() {
10024
10025			// Don't match elem in the :animated selector
10026			delete tick.elem;
10027		} ),
10028		tick = function() {
10029			if ( stopped ) {
10030				return false;
10031			}
10032			var currentTime = fxNow || createFxNow(),
10033				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
10034
10035				// Support: Android 2.3 only
10036				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
10037				temp = remaining / animation.duration || 0,
10038				percent = 1 - temp,
10039				index = 0,
10040				length = animation.tweens.length;
10041
10042			for ( ; index < length; index++ ) {
10043				animation.tweens[ index ].run( percent );
10044			}
10045
10046			deferred.notifyWith( elem, [ animation, percent, remaining ] );
10047
10048			// If there's more to do, yield
10049			if ( percent < 1 && length ) {
10050				return remaining;
10051			}
10052
10053			// If this was an empty animation, synthesize a final progress notification
10054			if ( !length ) {
10055				deferred.notifyWith( elem, [ animation, 1, 0 ] );
10056			}
10057
10058			// Resolve the animation and report its conclusion
10059			deferred.resolveWith( elem, [ animation ] );
10060			return false;
10061		},
10062		animation = deferred.promise( {
10063			elem: elem,
10064			props: jQuery.extend( {}, properties ),
10065			opts: jQuery.extend( true, {
10066				specialEasing: {},
10067				easing: jQuery.easing._default
10068			}, options ),
10069			originalProperties: properties,
10070			originalOptions: options,
10071			startTime: fxNow || createFxNow(),
10072			duration: options.duration,
10073			tweens: [],
10074			createTween: function( prop, end ) {
10075				var tween = jQuery.Tween( elem, animation.opts, prop, end,
10076						animation.opts.specialEasing[ prop ] || animation.opts.easing );
10077				animation.tweens.push( tween );
10078				return tween;
10079			},
10080			stop: function( gotoEnd ) {
10081				var index = 0,
10082
10083					// If we are going to the end, we want to run all the tweens
10084					// otherwise we skip this part
10085					length = gotoEnd ? animation.tweens.length : 0;
10086				if ( stopped ) {
10087					return this;
10088				}
10089				stopped = true;
10090				for ( ; index < length; index++ ) {
10091					animation.tweens[ index ].run( 1 );
10092				}
10093
10094				// Resolve when we played the last frame; otherwise, reject
10095				if ( gotoEnd ) {
10096					deferred.notifyWith( elem, [ animation, 1, 0 ] );
10097					deferred.resolveWith( elem, [ animation, gotoEnd ] );
10098				} else {
10099					deferred.rejectWith( elem, [ animation, gotoEnd ] );
10100				}
10101				return this;
10102			}
10103		} ),
10104		props = animation.props;
10105
10106	propFilter( props, animation.opts.specialEasing );
10107
10108	for ( ; index < length; index++ ) {
10109		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
10110		if ( result ) {
10111			if ( isFunction( result.stop ) ) {
10112				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
10113					result.stop.bind( result );
10114			}
10115			return result;
10116		}
10117	}
10118
10119	jQuery.map( props, createTween, animation );
10120
10121	if ( isFunction( animation.opts.start ) ) {
10122		animation.opts.start.call( elem, animation );
10123	}
10124
10125	// Attach callbacks from options
10126	animation
10127		.progress( animation.opts.progress )
10128		.done( animation.opts.done, animation.opts.complete )
10129		.fail( animation.opts.fail )
10130		.always( animation.opts.always );
10131
10132	jQuery.fx.timer(
10133		jQuery.extend( tick, {
10134			elem: elem,
10135			anim: animation,
10136			queue: animation.opts.queue
10137		} )
10138	);
10139
10140	return animation;
10141}
10142
10143jQuery.Animation = jQuery.extend( Animation, {
10144
10145	tweeners: {
10146		"*": [ function( prop, value ) {
10147			var tween = this.createTween( prop, value );
10148			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
10149			return tween;
10150		} ]
10151	},
10152
10153	tweener: function( props, callback ) {
10154		if ( isFunction( props ) ) {
10155			callback = props;
10156			props = [ "*" ];
10157		} else {
10158			props = props.match( rnothtmlwhite );
10159		}
10160
10161		var prop,
10162			index = 0,
10163			length = props.length;
10164
10165		for ( ; index < length; index++ ) {
10166			prop = props[ index ];
10167			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
10168			Animation.tweeners[ prop ].unshift( callback );
10169		}
10170	},
10171
10172	prefilters: [ defaultPrefilter ],
10173
10174	prefilter: function( callback, prepend ) {
10175		if ( prepend ) {
10176			Animation.prefilters.unshift( callback );
10177		} else {
10178			Animation.prefilters.push( callback );
10179		}
10180	}
10181} );
10182
10183jQuery.speed = function( speed, easing, fn ) {
10184	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
10185		complete: fn || !fn && easing ||
10186			isFunction( speed ) && speed,
10187		duration: speed,
10188		easing: fn && easing || easing && !isFunction( easing ) && easing
10189	};
10190
10191	// Go to the end state if fx are off
10192	if ( jQuery.fx.off ) {
10193		opt.duration = 0;
10194
10195	} else {
10196		if ( typeof opt.duration !== "number" ) {
10197			if ( opt.duration in jQuery.fx.speeds ) {
10198				opt.duration = jQuery.fx.speeds[ opt.duration ];
10199
10200			} else {
10201				opt.duration = jQuery.fx.speeds._default;
10202			}
10203		}
10204	}
10205
10206	// Normalize opt.queue - true/undefined/null -> "fx"
10207	if ( opt.queue == null || opt.queue === true ) {
10208		opt.queue = "fx";
10209	}
10210
10211	// Queueing
10212	opt.old = opt.complete;
10213
10214	opt.complete = function() {
10215		if ( isFunction( opt.old ) ) {
10216			opt.old.call( this );
10217		}
10218
10219		if ( opt.queue ) {
10220			jQuery.dequeue( this, opt.queue );
10221		}
10222	};
10223
10224	return opt;
10225};
10226
10227jQuery.fn.extend( {
10228	fadeTo: function( speed, to, easing, callback ) {
10229
10230		// Show any hidden elements after setting opacity to 0
10231		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
10232
10233			// Animate to the value specified
10234			.end().animate( { opacity: to }, speed, easing, callback );
10235	},
10236	animate: function( prop, speed, easing, callback ) {
10237		var empty = jQuery.isEmptyObject( prop ),
10238			optall = jQuery.speed( speed, easing, callback ),
10239			doAnimation = function() {
10240
10241				// Operate on a copy of prop so per-property easing won't be lost
10242				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
10243
10244				// Empty animations, or finishing resolves immediately
10245				if ( empty || dataPriv.get( this, "finish" ) ) {
10246					anim.stop( true );
10247				}
10248			};
10249			doAnimation.finish = doAnimation;
10250
10251		return empty || optall.queue === false ?
10252			this.each( doAnimation ) :
10253			this.queue( optall.queue, doAnimation );
10254	},
10255	stop: function( type, clearQueue, gotoEnd ) {
10256		var stopQueue = function( hooks ) {
10257			var stop = hooks.stop;
10258			delete hooks.stop;
10259			stop( gotoEnd );
10260		};
10261
10262		if ( typeof type !== "string" ) {
10263			gotoEnd = clearQueue;
10264			clearQueue = type;
10265			type = undefined;
10266		}
10267		if ( clearQueue 
vendor: 3,719 bytes, lines 10267-10425
10267) {
10268			this.queue( type || "fx", [] );
10269		}
10270
10271		return this.each( function() {
10272			var dequeue = true,
10273				index = type != null && type + "queueHooks",
10274				timers = jQuery.timers,
10275				data = dataPriv.get( this );
10276
10277			if ( index ) {
10278				if ( data[ index ] && data[ index ].stop ) {
10279					stopQueue( data[ index ] );
10280				}
10281			} else {
10282				for ( index in data ) {
10283					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
10284						stopQueue( data[ index ] );
10285					}
10286				}
10287			}
10288
10289			for ( index = timers.length; index--; ) {
10290				if ( timers[ index ].elem === this &&
10291					( type == null || timers[ index ].queue === type ) ) {
10292
10293					timers[ index ].anim.stop( gotoEnd );
10294					dequeue = false;
10295					timers.splice( index, 1 );
10296				}
10297			}
10298
10299			// Start the next in the queue if the last step wasn't forced.
10300			// Timers currently will call their complete callbacks, which
10301			// will dequeue but only if they were gotoEnd.
10302			if ( dequeue || !gotoEnd ) {
10303				jQuery.dequeue( this, type );
10304			}
10305		} );
10306	},
10307	finish: function( type ) {
10308		if ( type !== false ) {
10309			type = type || "fx";
10310		}
10311		return this.each( function() {
10312			var index,
10313				data = dataPriv.get( this ),
10314				queue = data[ type + "queue" ],
10315				hooks = data[ type + "queueHooks" ],
10316				timers = jQuery.timers,
10317				length = queue ? queue.length : 0;
10318
10319			// Enable finishing flag on private data
10320			data.finish = true;
10321
10322			// Empty the queue first
10323			jQuery.queue( this, type, [] );
10324
10325			if ( hooks && hooks.stop ) {
10326				hooks.stop.call( this, true );
10327			}
10328
10329			// Look for any active animations, and finish them
10330			for ( index = timers.length; index--; ) {
10331				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
10332					timers[ index ].anim.stop( true );
10333					timers.splice( index, 1 );
10334				}
10335			}
10336
10337			// Look for any animations in the old queue and finish them
10338			for ( index = 0; index < length; index++ ) {
10339				if ( queue[ index ] && queue[ index ].finish ) {
10340					queue[ index ].finish.call( this );
10341				}
10342			}
10343
10344			// Turn off finishing flag
10345			delete data.finish;
10346		} );
10347	}
10348} );
10349
10350jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
10351	var cssFn = jQuery.fn[ name ];
10352	jQuery.fn[ name ] = function( speed, easing, callback ) {
10353		return speed == null || typeof speed === "boolean" ?
10354			cssFn.apply( this, arguments ) :
10355			this.animate( genFx( name, true ), speed, easing, callback );
10356	};
10357} );
10358
10359// Generate shortcuts for custom animations
10360jQuery.each( {
10361	slideDown: genFx( "show" ),
10362	slideUp: genFx( "hide" ),
10363	slideToggle: genFx( "toggle" ),
10364	fadeIn: { opacity: "show" },
10365	fadeOut: { opacity: "hide" },
10366	fadeToggle: { opacity: "toggle" }
10367}, function( name, props ) {
10368	jQuery.fn[ name ] = function( speed, easing, callback ) {
10369		return this.animate( props, speed, easing, callback );
10370	};
10371} );
10372
10373jQuery.timers = [];
10374jQuery.fx.tick = function() {
10375	var timer,
10376		i = 0,
10377		timers = jQuery.timers;
10378
10379	fxNow = Date.now();
10380
10381	for ( ; i < timers.length; i++ ) {
10382		timer = timers[ i ];
10383
10384		// Run the timer and safely remove it when done (allowing for external removal)
10385		if ( !timer() && timers[ i ] === timer ) {
10386			timers.splice( i--, 1 );
10387		}
10388	}
10389
10390	if ( !timers.length ) {
10391		jQuery.fx.stop();
10392	}
10393	fxNow = undefined;
10394};
10395
10396jQuery.fx.timer = function( timer ) {
10397	jQuery.timers.push( timer );
10398	jQuery.fx.start();
10399};
10400
10401jQuery.fx.interval = 13;
10402jQuery.fx.start = function() {
10403	if ( inProgress ) {
10404		return;
10405	}
10406
10407	inProgress = true;
10408	schedule();
10409};
10410
10411jQuery.fx.stop = function() {
10412	inProgress = null;
10413};
10414
10415jQuery.fx.speeds = {
10416	slow: 600,
10417	fast: 200,
10418
10419	// Default speed
10420	_default: 400
10421};
10422
10423
10424// Based off of the plugin by Clint Helfers, with permission.
10425// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
vendor: 5,177 bytes, lines 10426-10646
10426jQuery.fn.delay = function( time, type ) {
10427	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
10428	type = type || "fx";
10429
10430	return this.queue( type, function( next, hooks ) {
10431		var timeout = window.setTimeout( next, time );
10432		hooks.stop = function() {
10433			window.clearTimeout( timeout );
10434		};
10435	} );
10436};
10437
10438
10439( function() {
10440	var input = document.createElement( "input" ),
10441		select = document.createElement( "select" ),
10442		opt = select.appendChild( document.createElement( "option" ) );
10443
10444	input.type = "checkbox";
10445
10446	// Support: Android <=4.3 only
10447	// Default value for a checkbox should be "on"
10448	support.checkOn = input.value !== "";
10449
10450	// Support: IE <=11 only
10451	// Must access selectedIndex to make default options select
10452	support.optSelected = opt.selected;
10453
10454	// Support: IE <=11 only
10455	// An input loses its value after becoming a radio
10456	input = document.createElement( "input" );
10457	input.value = "t";
10458	input.type = "radio";
10459	support.radioValue = input.value === "t";
10460} )();
10461
10462
10463var boolHook,
10464	attrHandle = jQuery.expr.attrHandle;
10465
10466jQuery.fn.extend( {
10467	attr: function( name, value ) {
10468		return access( this, jQuery.attr, name, value, arguments.length > 1 );
10469	},
10470
10471	removeAttr: function( name ) {
10472		return this.each( function() {
10473			jQuery.removeAttr( this, name );
10474		} );
10475	}
10476} );
10477
10478jQuery.extend( {
10479	attr: function( elem, name, value ) {
10480		var ret, hooks,
10481			nType = elem.nodeType;
10482
10483		// Don't get/set attributes on text, comment and attribute nodes
10484		if ( nType === 3 || nType === 8 || nType === 2 ) {
10485			return;
10486		}
10487
10488		// Fallback to prop when attributes are not supported
10489		if ( typeof elem.getAttribute === "undefined" ) {
10490			return jQuery.prop( elem, name, value );
10491		}
10492
10493		// Attribute hooks are determined by the lowercase version
10494		// Grab necessary hook if one is defined
10495		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
10496			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
10497				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
10498		}
10499
10500		if ( value !== undefined ) {
10501			if ( value === null ) {
10502				jQuery.removeAttr( elem, name );
10503				return;
10504			}
10505
10506			if ( hooks && "set" in hooks &&
10507				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
10508				return ret;
10509			}
10510
10511			elem.setAttribute( name, value + "" );
10512			return value;
10513		}
10514
10515		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
10516			return ret;
10517		}
10518
10519		ret = jQuery.find.attr( elem, name );
10520
10521		// Non-existent attributes return null, we normalize to undefined
10522		return ret == null ? undefined : ret;
10523	},
10524
10525	attrHooks: {
10526		type: {
10527			set: function( elem, value ) {
10528				if ( !support.radioValue && value === "radio" &&
10529					nodeName( elem, "input" ) ) {
10530					var val = elem.value;
10531					elem.setAttribute( "type", value );
10532					if ( val ) {
10533						elem.value = val;
10534					}
10535					return value;
10536				}
10537			}
10538		}
10539	},
10540
10541	removeAttr: function( elem, value ) {
10542		var name,
10543			i = 0,
10544
10545			// Attribute names can contain non-HTML whitespace characters
10546			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
10547			attrNames = value && value.match( rnothtmlwhite );
10548
10549		if ( attrNames && elem.nodeType === 1 ) {
10550			while ( ( name = attrNames[ i++ ] ) ) {
10551				elem.removeAttribute( name );
10552			}
10553		}
10554	}
10555} );
10556
10557// Hooks for boolean attributes
10558boolHook = {
10559	set: function( elem, value, name ) {
10560		if ( value === false ) {
10561
10562			// Remove boolean attributes when set to false
10563			jQuery.removeAttr( elem, name );
10564		} else {
10565			elem.setAttribute( name, name );
10566		}
10567		return name;
10568	}
10569};
10570
10571jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
10572	var getter = attrHandle[ name ] || jQuery.find.attr;
10573
10574	attrHandle[ name ] = function( elem, name, isXML ) {
10575		var ret, handle,
10576			lowercaseName = name.toLowerCase();
10577
10578		if ( !isXML ) {
10579
10580			// Avoid an infinite loop by temporarily removing this function from the getter
10581			handle = attrHandle[ lowercaseName ];
10582			attrHandle[ lowercaseName ] = ret;
10583			ret = getter( elem, name, isXML ) != null ?
10584				lowercaseName :
10585				null;
10586			attrHandle[ lowercaseName ] = handle;
10587		}
10588		return ret;
10589	};
10590} );
10591
10592
10593
10594
10595var rfocusable = /^(?:input|select|textarea|button)$/i,
10596	rclickable = /^(?:a|area)$/i;
10597
10598jQuery.fn.extend( {
10599	prop: function( name, value ) {
10600		return access( this, jQuery.prop, name, value, arguments.length > 1 );
10601	},
10602
10603	removeProp: function( name ) {
10604		return this.each( function() {
10605			delete this[ jQuery.propFix[ name ] || name ];
10606		} );
10607	}
10608} );
10609
10610jQuery.extend( {
10611	prop: function( elem, name, value ) {
10612		var ret, hooks,
10613			nType = elem.nodeType;
10614
10615		// Don't get/set properties on text, comment and attribute nodes
10616		if ( nType === 3 || nType === 8 || nType === 2 ) {
10617			return;
10618		}
10619
10620		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
10621
10622			// Fix name and attach hooks
10623			name = jQuery.propFix[ name ] || name;
10624			hooks = jQuery.propHooks[ name ];
10625		}
10626
10627		if ( value !== undefined ) {
10628			if ( hooks && "set" in hooks &&
10629				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
10630				return ret;
10631			}
10632
10633			return ( elem[ name ] = value );
10634		}
10635
10636		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
10637			return ret;
10638		}
10639
10640		return elem[ name ];
10641	},
10642
10643	propHooks: {
10644		tabIndex: {
10645			get: function( elem ) {
10646
vendor: 6,193 bytes, lines 10647-10909
10647				// Support: IE <=9 - 11 only
10648				// elem.tabIndex doesn't always return the
10649				// correct value when it hasn't been explicitly set
10650				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
10651				// Use proper attribute retrieval(#12072)
10652				var tabindex = jQuery.find.attr( elem, "tabindex" );
10653
10654				if ( tabindex ) {
10655					return parseInt( tabindex, 10 );
10656				}
10657
10658				if (
10659					rfocusable.test( elem.nodeName ) ||
10660					rclickable.test( elem.nodeName ) &&
10661					elem.href
10662				) {
10663					return 0;
10664				}
10665
10666				return -1;
10667			}
10668		}
10669	},
10670
10671	propFix: {
10672		"for": "htmlFor",
10673		"class": "className"
10674	}
10675} );
10676
10677// Support: IE <=11 only
10678// Accessing the selectedIndex property
10679// forces the browser to respect setting selected
10680// on the option
10681// The getter ensures a default option is selected
10682// when in an optgroup
10683// eslint rule "no-unused-expressions" is disabled for this code
10684// since it considers such accessions noop
10685if ( !support.optSelected ) {
10686	jQuery.propHooks.selected = {
10687		get: function( elem ) {
10688
10689			/* eslint no-unused-expressions: "off" */
10690
10691			var parent = elem.parentNode;
10692			if ( parent && parent.parentNode ) {
10693				parent.parentNode.selectedIndex;
10694			}
10695			return null;
10696		},
10697		set: function( elem ) {
10698
10699			/* eslint no-unused-expressions: "off" */
10700
10701			var parent = elem.parentNode;
10702			if ( parent ) {
10703				parent.selectedIndex;
10704
10705				if ( parent.parentNode ) {
10706					parent.parentNode.selectedIndex;
10707				}
10708			}
10709		}
10710	};
10711}
10712
10713jQuery.each( [
10714	"tabIndex",
10715	"readOnly",
10716	"maxLength",
10717	"cellSpacing",
10718	"cellPadding",
10719	"rowSpan",
10720	"colSpan",
10721	"useMap",
10722	"frameBorder",
10723	"contentEditable"
10724], function() {
10725	jQuery.propFix[ this.toLowerCase() ] = this;
10726} );
10727
10728
10729
10730
10731	// Strip and collapse whitespace according to HTML spec
10732	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
10733	function stripAndCollapse( value ) {
10734		var tokens = value.match( rnothtmlwhite ) || [];
10735		return tokens.join( " " );
10736	}
10737
10738
10739function getClass( elem ) {
10740	return elem.getAttribute && elem.getAttribute( "class" ) || "";
10741}
10742
10743function classesToArray( value ) {
10744	if ( Array.isArray( value ) ) {
10745		return value;
10746	}
10747	if ( typeof value === "string" ) {
10748		return value.match( rnothtmlwhite ) || [];
10749	}
10750	return [];
10751}
10752
10753jQuery.fn.extend( {
10754	addClass: function( value ) {
10755		var classes, elem, cur, curValue, clazz, j, finalValue,
10756			i = 0;
10757
10758		if ( isFunction( value ) ) {
10759			return this.each( function( j ) {
10760				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
10761			} );
10762		}
10763
10764		classes = classesToArray( value );
10765
10766		if ( classes.length ) {
10767			while ( ( elem = this[ i++ ] ) ) {
10768				curValue = getClass( elem );
10769				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
10770
10771				if ( cur ) {
10772					j = 0;
10773					while ( ( clazz = classes[ j++ ] ) ) {
10774						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
10775							cur += clazz + " ";
10776						}
10777					}
10778
10779					// Only assign if different to avoid unneeded rendering.
10780					finalValue = stripAndCollapse( cur );
10781					if ( curValue !== finalValue ) {
10782						elem.setAttribute( "class", finalValue );
10783					}
10784				}
10785			}
10786		}
10787
10788		return this;
10789	},
10790
10791	removeClass: function( value ) {
10792		var classes, elem, cur, curValue, clazz, j, finalValue,
10793			i = 0;
10794
10795		if ( isFunction( value ) ) {
10796			return this.each( function( j ) {
10797				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
10798			} );
10799		}
10800
10801		if ( !arguments.length ) {
10802			return this.attr( "class", "" );
10803		}
10804
10805		classes = classesToArray( value );
10806
10807		if ( classes.length ) {
10808			while ( ( elem = this[ i++ ] ) ) {
10809				curValue = getClass( elem );
10810
10811				// This expression is here for better compressibility (see addClass)
10812				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
10813
10814				if ( cur ) {
10815					j = 0;
10816					while ( ( clazz = classes[ j++ ] ) ) {
10817
10818						// Remove *all* instances
10819						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
10820							cur = cur.replace( " " + clazz + " ", " " );
10821						}
10822					}
10823
10824					// Only assign if different to avoid unneeded rendering.
10825					finalValue = stripAndCollapse( cur );
10826					if ( curValue !== finalValue ) {
10827						elem.setAttribute( "class", finalValue );
10828					}
10829				}
10830			}
10831		}
10832
10833		return this;
10834	},
10835
10836	toggleClass: function( value, stateVal ) {
10837		var type = typeof value,
10838			isValidValue = type === "string" || Array.isArray( value );
10839
10840		if ( typeof stateVal === "boolean" && isValidValue ) {
10841			return stateVal ? this.addClass( value ) : this.removeClass( value );
10842		}
10843
10844		if ( isFunction( value ) ) {
10845			return this.each( function( i ) {
10846				jQuery( this ).toggleClass(
10847					value.call( this, i, getClass( this ), stateVal ),
10848					stateVal
10849				);
10850			} );
10851		}
10852
10853		return this.each( function() {
10854			var className, i, self, classNames;
10855
10856			if ( isValidValue ) {
10857
10858				// Toggle individual class names
10859				i = 0;
10860				self = jQuery( this );
10861				classNames = classesToArray( value );
10862
10863				while ( ( className = classNames[ i++ ] ) ) {
10864
10865					// Check each className given, space separated list
10866					if ( self.hasClass( className ) ) {
10867						self.removeClass( className );
10868					} else {
10869						self.addClass( className );
10870					}
10871				}
10872
10873			// Toggle whole class name
10874			} else if ( value === undefined || type === "boolean" ) {
10875				className = getClass( this );
10876				if ( className ) {
10877
10878					// Store className if set
10879					dataPriv.set( this, "__className__", className );
10880				}
10881
10882				// If the element has a class name or if we're passed `false`,
10883				// then remove the whole classname (if there was one, the above saved it).
10884				// Otherwise bring back whatever was previously saved (if anything),
10885				// falling back to the empty string if nothing was stored.
10886				if ( this.setAttribute ) {
10887					this.setAttribute( "class",
10888						className || value === false ?
10889						"" :
10890						dataPriv.get( this, "__className__" ) || ""
10891					);
10892				}
10893			}
10894		} );
10895	},
10896
10897	hasClass: function( selector ) {
10898		var className, elem,
10899			i = 0;
10900
10901		className = " " + selector + " ";
10902		while ( ( elem = this[ i++ ] ) ) {
10903			if ( elem.nodeType === 1 &&
10904				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
10905					return true;
10906			}
10907		}
10908
10909		return false;
vendor: 7,091 bytes, lines 10910-11195
10910	}
10911} );
10912
10913
10914
10915
10916var rreturn = /\r/g;
10917
10918jQuery.fn.extend( {
10919	val: function( value ) {
10920		var hooks, ret, valueIsFunction,
10921			elem = this[ 0 ];
10922
10923		if ( !arguments.length ) {
10924			if ( elem ) {
10925				hooks = jQuery.valHooks[ elem.type ] ||
10926					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
10927
10928				if ( hooks &&
10929					"get" in hooks &&
10930					( ret = hooks.get( elem, "value" ) ) !== undefined
10931				) {
10932					return ret;
10933				}
10934
10935				ret = elem.value;
10936
10937				// Handle most common string cases
10938				if ( typeof ret === "string" ) {
10939					return ret.replace( rreturn, "" );
10940				}
10941
10942				// Handle cases where value is null/undef or number
10943				return ret == null ? "" : ret;
10944			}
10945
10946			return;
10947		}
10948
10949		valueIsFunction = isFunction( value );
10950
10951		return this.each( function( i ) {
10952			var val;
10953
10954			if ( this.nodeType !== 1 ) {
10955				return;
10956			}
10957
10958			if ( valueIsFunction ) {
10959				val = value.call( this, i, jQuery( this ).val() );
10960			} else {
10961				val = value;
10962			}
10963
10964			// Treat null/undefined as ""; convert numbers to string
10965			if ( val == null ) {
10966				val = "";
10967
10968			} else if ( typeof val === "number" ) {
10969				val += "";
10970
10971			} else if ( Array.isArray( val ) ) {
10972				val = jQuery.map( val, function( value ) {
10973					return value == null ? "" : value + "";
10974				} );
10975			}
10976
10977			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
10978
10979			// If set returns undefined, fall back to normal setting
10980			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
10981				this.value = val;
10982			}
10983		} );
10984	}
10985} );
10986
10987jQuery.extend( {
10988	valHooks: {
10989		option: {
10990			get: function( elem ) {
10991
10992				var val = jQuery.find.attr( elem, "value" );
10993				return val != null ?
10994					val :
10995
10996					// Support: IE <=10 - 11 only
10997					// option.text throws exceptions (#14686, #14858)
10998					// Strip and collapse whitespace
10999					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
11000					stripAndCollapse( jQuery.text( elem ) );
11001			}
11002		},
11003		select: {
11004			get: function( elem ) {
11005				var value, option, i,
11006					options = elem.options,
11007					index = elem.selectedIndex,
11008					one = elem.type === "select-one",
11009					values = one ? null : [],
11010					max = one ? index + 1 : options.length;
11011
11012				if ( index < 0 ) {
11013					i = max;
11014
11015				} else {
11016					i = one ? index : 0;
11017				}
11018
11019				// Loop through all the selected options
11020				for ( ; i < max; i++ ) {
11021					option = options[ i ];
11022
11023					// Support: IE <=9 only
11024					// IE8-9 doesn't update selected after form reset (#2551)
11025					if ( ( option.selected || i === index ) &&
11026
11027							// Don't return options that are disabled or in a disabled optgroup
11028							!option.disabled &&
11029							( !option.parentNode.disabled ||
11030								!nodeName( option.parentNode, "optgroup" ) ) ) {
11031
11032						// Get the specific value for the option
11033						value = jQuery( option ).val();
11034
11035						// We don't need an array for one selects
11036						if ( one ) {
11037							return value;
11038						}
11039
11040						// Multi-Selects return an array
11041						values.push( value );
11042					}
11043				}
11044
11045				return values;
11046			},
11047
11048			set: function( elem, value ) {
11049				var optionSet, option,
11050					options = elem.options,
11051					values = jQuery.makeArray( value ),
11052					i = options.length;
11053
11054				while ( i-- ) {
11055					option = options[ i ];
11056
11057					/* eslint-disable no-cond-assign */
11058
11059					if ( option.selected =
11060						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
11061					) {
11062						optionSet = true;
11063					}
11064
11065					/* eslint-enable no-cond-assign */
11066				}
11067
11068				// Force browsers to behave consistently when non-matching value is set
11069				if ( !optionSet ) {
11070					elem.selectedIndex = -1;
11071				}
11072				return values;
11073			}
11074		}
11075	}
11076} );
11077
11078// Radios and checkboxes getter/setter
11079jQuery.each( [ "radio", "checkbox" ], function() {
11080	jQuery.valHooks[ this ] = {
11081		set: function( elem, value ) {
11082			if ( Array.isArray( value ) ) {
11083				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
11084			}
11085		}
11086	};
11087	if ( !support.checkOn ) {
11088		jQuery.valHooks[ this ].get = function( elem ) {
11089			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
11090		};
11091	}
11092} );
11093
11094
11095
11096
11097// Return jQuery for attributes-only inclusion
11098
11099
11100support.focusin = "onfocusin" in window;
11101
11102
11103var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
11104	stopPropagationCallback = function( e ) {
11105		e.stopPropagation();
11106	};
11107
11108jQuery.extend( jQuery.event, {
11109
11110	trigger: function( event, data, elem, onlyHandlers ) {
11111
11112		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
11113			eventPath = [ elem || document ],
11114			type = hasOwn.call( event, "type" ) ? event.type : event,
11115			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
11116
11117		cur = lastElement = tmp = elem = elem || document;
11118
11119		// Don't do events on text and comment nodes
11120		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
11121			return;
11122		}
11123
11124		// focus/blur morphs to focusin/out; ensure we're not firing them right now
11125		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
11126			return;
11127		}
11128
11129		if ( type.indexOf( "." ) > -1 ) {
11130
11131			// Namespaced trigger; create a regexp to match event type in handle()
11132			namespaces = type.split( "." );
11133			type = namespaces.shift();
11134			namespaces.sort();
11135		}
11136		ontype = type.indexOf( ":" ) < 0 && "on" + type;
11137
11138		// Caller can pass in a jQuery.Event object, Object, or just an event type string
11139		event = event[ jQuery.expando ] ?
11140			event :
11141			new jQuery.Event( type, typeof event === "object" && event );
11142
11143		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
11144		event.isTrigger = onlyHandlers ? 2 : 3;
11145		event.namespace = namespaces.join( "." );
11146		event.rnamespace = event.namespace ?
11147			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
11148			null;
11149
11150		// Clean up the event in case it is being reused
11151		event.result = undefined;
11152		if ( !event.target ) {
11153			event.target = elem;
11154		}
11155
11156		// Clone any incoming data and prepend the event, creating the handler arg list
11157		data = data == null ?
11158			[ event ] :
11159			jQuery.makeArray( data, [ event ] );
11160
11161		// Allow special events to draw outside the lines
11162		special = jQuery.event.special[ type ] || {};
11163		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
11164			return;
11165		}
11166
11167		// Determine event propagation path in advance, per W3C events spec (#9951)
11168		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
11169		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
11170
11171			bubbleType = special.delegateType || type;
11172			if ( !rfocusMorph.test( bubbleType + type ) ) {
11173				cur = cur.parentNode;
11174			}
11175			for ( ; cur; cur = cur.parentNode ) {
11176				eventPath.push( cur );
11177				tmp = cur;
11178			}
11179
11180			// Only add window if we got to document (e.g., not plain obj or detached DOM)
11181			if ( tmp === ( elem.ownerDocument || document ) ) {
11182				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
11183			}
11184		}
11185
11186		// Fire handlers on the event path
11187		i = 0;
11188		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
11189			lastElement = cur;
11190			event.type = i > 1 ?
11191				bubbleType :
11192				special.bindType || type;
11193
11194			// jQuery handler
11195			handle = (
vendor: 2,548 bytes, lines 11195-11296
11195
11196					dataPriv.get( cur, "events" ) || Object.create( null )
11197				)[ event.type ] &&
11198				dataPriv.get( cur, "handle" );
11199			if ( handle ) {
11200				handle.apply( cur, data );
11201			}
11202
11203			// Native handler
11204			handle = ontype && cur[ ontype ];
11205			if ( handle && handle.apply && acceptData( cur ) ) {
11206				event.result = handle.apply( cur, data );
11207				if ( event.result === false ) {
11208					event.preventDefault();
11209				}
11210			}
11211		}
11212		event.type = type;
11213
11214		// If nobody prevented the default action, do it now
11215		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
11216
11217			if ( ( !special._default ||
11218				special._default.apply( eventPath.pop(), data ) === false ) &&
11219				acceptData( elem ) ) {
11220
11221				// Call a native DOM method on the target with the same name as the event.
11222				// Don't do default actions on window, that's where global variables be (#6170)
11223				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
11224
11225					// Don't re-trigger an onFOO event when we call its FOO() method
11226					tmp = elem[ ontype ];
11227
11228					if ( tmp ) {
11229						elem[ ontype ] = null;
11230					}
11231
11232					// Prevent re-triggering of the same event, since we already bubbled it above
11233					jQuery.event.triggered = type;
11234
11235					if ( event.isPropagationStopped() ) {
11236						lastElement.addEventListener( type, stopPropagationCallback );
11237					}
11238
11239					elem[ type ]();
11240
11241					if ( event.isPropagationStopped() ) {
11242						lastElement.removeEventListener( type, stopPropagationCallback );
11243					}
11244
11245					jQuery.event.triggered = undefined;
11246
11247					if ( tmp ) {
11248						elem[ ontype ] = tmp;
11249					}
11250				}
11251			}
11252		}
11253
11254		return event.result;
11255	},
11256
11257	// Piggyback on a donor event to simulate a different one
11258	// Used only for `focus(in | out)` events
11259	simulate: function( type, elem, event ) {
11260		var e = jQuery.extend(
11261			new jQuery.Event(),
11262			event,
11263			{
11264				type: type,
11265				isSimulated: true
11266			}
11267		);
11268
11269		jQuery.event.trigger( e, null, elem );
11270	}
11271
11272} );
11273
11274jQuery.fn.extend( {
11275
11276	trigger: function( type, data ) {
11277		return this.each( function() {
11278			jQuery.event.trigger( type, data, this );
11279		} );
11280	},
11281	triggerHandler: function( type, data ) {
11282		var elem = this[ 0 ];
11283		if ( elem ) {
11284			return jQuery.event.trigger( type, data, elem, true );
11285		}
11286	}
11287} );
11288
11289
11290// Support: Firefox <=44
11291// Firefox doesn't have focus(in | out) events
11292// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
11293//
11294// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
11295// focus(in | out) events fire after focus & blur events,
11296// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
vendor: 4,078 bytes, lines 11297-11462
11297// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
11298if ( !support.focusin ) {
11299	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
11300
11301		// Attach a single capturing handler on the document while someone wants focusin/focusout
11302		var handler = function( event ) {
11303			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
11304		};
11305
11306		jQuery.event.special[ fix ] = {
11307			setup: function() {
11308
11309				// Handle: regular nodes (via `this.ownerDocument`), window
11310				// (via `this.document`) & document (via `this`).
11311				var doc = this.ownerDocument || this.document || this,
11312					attaches = dataPriv.access( doc, fix );
11313
11314				if ( !attaches ) {
11315					doc.addEventListener( orig, handler, true );
11316				}
11317				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
11318			},
11319			teardown: function() {
11320				var doc = this.ownerDocument || this.document || this,
11321					attaches = dataPriv.access( doc, fix ) - 1;
11322
11323				if ( !attaches ) {
11324					doc.removeEventListener( orig, handler, true );
11325					dataPriv.remove( doc, fix );
11326
11327				} else {
11328					dataPriv.access( doc, fix, attaches );
11329				}
11330			}
11331		};
11332	} );
11333}
11334var location = window.location;
11335
11336var nonce = { guid: Date.now() };
11337
11338var rquery = ( /\?/ );
11339
11340
11341
11342// Cross-browser xml parsing
11343jQuery.parseXML = function( data ) {
11344	var xml;
11345	if ( !data || typeof data !== "string" ) {
11346		return null;
11347	}
11348
11349	// Support: IE 9 - 11 only
11350	// IE throws on parseFromString with invalid input.
11351	try {
11352		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
11353	} catch ( e ) {
11354		xml = undefined;
11355	}
11356
11357	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
11358		jQuery.error( "Invalid XML: " + data );
11359	}
11360	return xml;
11361};
11362
11363
11364var
11365	rbracket = /\[\]$/,
11366	rCRLF = /\r?\n/g,
11367	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
11368	rsubmittable = /^(?:input|select|textarea|keygen)/i;
11369
11370function buildParams( prefix, obj, traditional, add ) {
11371	var name;
11372
11373	if ( Array.isArray( obj ) ) {
11374
11375		// Serialize array item.
11376		jQuery.each( obj, function( i, v ) {
11377			if ( traditional || rbracket.test( prefix ) ) {
11378
11379				// Treat each array item as a scalar.
11380				add( prefix, v );
11381
11382			} else {
11383
11384				// Item is non-scalar (array or object), encode its numeric index.
11385				buildParams(
11386					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
11387					v,
11388					traditional,
11389					add
11390				);
11391			}
11392		} );
11393
11394	} else if ( !traditional && toType( obj ) === "object" ) {
11395
11396		// Serialize object item.
11397		for ( name in obj ) {
11398			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
11399		}
11400
11401	} else {
11402
11403		// Serialize scalar item.
11404		add( prefix, obj );
11405	}
11406}
11407
11408// Serialize an array of form elements or a set of
11409// key/values into a query string
11410jQuery.param = function( a, traditional ) {
11411	var prefix,
11412		s = [],
11413		add = function( key, valueOrFunction ) {
11414
11415			// If value is a function, invoke it and use its return value
11416			var value = isFunction( valueOrFunction ) ?
11417				valueOrFunction() :
11418				valueOrFunction;
11419
11420			s[ s.length ] = encodeURIComponent( key ) + "=" +
11421				encodeURIComponent( value == null ? "" : value );
11422		};
11423
11424	if ( a == null ) {
11425		return "";
11426	}
11427
11428	// If an array was passed in, assume that it is an array of form elements.
11429	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
11430
11431		// Serialize the form elements
11432		jQuery.each( a, function() {
11433			add( this.name, this.value );
11434		} );
11435
11436	} else {
11437
11438		// If traditional, encode the "old" way (the way 1.3.2 or older
11439		// did it), otherwise encode params recursively.
11440		for ( prefix in a ) {
11441			buildParams( prefix, a[ prefix ], traditional, add );
11442		}
11443	}
11444
11445	// Return the resulting serialization
11446	return s.join( "&" );
11447};
11448
11449jQuery.fn.extend( {
11450	serialize: function() {
11451		return jQuery.param( this.serializeArray() );
11452	},
11453	serializeArray: function() {
11454		return this.map( function() {
11455
11456			// Can add propHook for "elements" to filter or add form elements
11457			var elements = jQuery.prop( this, "elements" );
11458			return elements ? jQuery.makeArray( elements ) : this;
11459		} )
11460		.filter( function() {
11461			var type = this.type;
11462
vendor: 4,933 bytes, lines 11463-11635
11463			// Use .is( ":disabled" ) so that fieldset[disabled] works
11464			return this.name && !jQuery( this ).is( ":disabled" ) &&
11465				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
11466				( this.checked || !rcheckableType.test( type ) );
11467		} )
11468		.map( function( _i, elem ) {
11469			var val = jQuery( this ).val();
11470
11471			if ( val == null ) {
11472				return null;
11473			}
11474
11475			if ( Array.isArray( val ) ) {
11476				return jQuery.map( val, function( val ) {
11477					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
11478				} );
11479			}
11480
11481			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
11482		} ).get();
11483	}
11484} );
11485
11486
11487var
11488	r20 = /%20/g,
11489	rhash = /#.*$/,
11490	rantiCache = /([?&])_=[^&]*/,
11491	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
11492
11493	// #7653, #8125, #8152: local protocol detection
11494	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
11495	rnoContent = /^(?:GET|HEAD)$/,
11496	rprotocol = /^\/\//,
11497
11498	/* Prefilters
11499	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
11500	 * 2) These are called:
11501	 *    - BEFORE asking for a transport
11502	 *    - AFTER param serialization (s.data is a string if s.processData is true)
11503	 * 3) key is the dataType
11504	 * 4) the catchall symbol "*" can be used
11505	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
11506	 */
11507	prefilters = {},
11508
11509	/* Transports bindings
11510	 * 1) key is the dataType
11511	 * 2) the catchall symbol "*" can be used
11512	 * 3) selection will start with transport dataType and THEN go to "*" if needed
11513	 */
11514	transports = {},
11515
11516	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
11517	allTypes = "*/".concat( "*" ),
11518
11519	// Anchor tag for parsing the document origin
11520	originAnchor = document.createElement( "a" );
11521	originAnchor.href = location.href;
11522
11523// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
11524function addToPrefiltersOrTransports( structure ) {
11525
11526	// dataTypeExpression is optional and defaults to "*"
11527	return function( dataTypeExpression, func ) {
11528
11529		if ( typeof dataTypeExpression !== "string" ) {
11530			func = dataTypeExpression;
11531			dataTypeExpression = "*";
11532		}
11533
11534		var dataType,
11535			i = 0,
11536			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
11537
11538		if ( isFunction( func ) ) {
11539
11540			// For each dataType in the dataTypeExpression
11541			while ( ( dataType = dataTypes[ i++ ] ) ) {
11542
11543				// Prepend if requested
11544				if ( dataType[ 0 ] === "+" ) {
11545					dataType = dataType.slice( 1 ) || "*";
11546					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
11547
11548				// Otherwise append
11549				} else {
11550					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
11551				}
11552			}
11553		}
11554	};
11555}
11556
11557// Base inspection function for prefilters and transports
11558function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
11559
11560	var inspected = {},
11561		seekingTransport = ( structure === transports );
11562
11563	function inspect( dataType ) {
11564		var selected;
11565		inspected[ dataType ] = true;
11566		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
11567			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
11568			if ( typeof dataTypeOrTransport === "string" &&
11569				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
11570
11571				options.dataTypes.unshift( dataTypeOrTransport );
11572				inspect( dataTypeOrTransport );
11573				return false;
11574			} else if ( seekingTransport ) {
11575				return !( selected = dataTypeOrTransport );
11576			}
11577		} );
11578		return selected;
11579	}
11580
11581	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
11582}
11583
11584// A special extend for ajax options
11585// that takes "flat" options (not to be deep extended)
11586// Fixes #9887
11587function ajaxExtend( target, src ) {
11588	var key, deep,
11589		flatOptions = jQuery.ajaxSettings.flatOptions || {};
11590
11591	for ( key in src ) {
11592		if ( src[ key ] !== undefined ) {
11593			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
11594		}
11595	}
11596	if ( deep ) {
11597		jQuery.extend( true, target, deep );
11598	}
11599
11600	return target;
11601}
11602
11603/* Handles responses to an ajax request:
11604 * - finds the right dataType (mediates between content-type and expected dataType)
11605 * - returns the corresponding response
11606 */
11607function ajaxHandleResponses( s, jqXHR, responses ) {
11608
11609	var ct, type, finalDataType, firstDataType,
11610		contents = s.contents,
11611		dataTypes = s.dataTypes;
11612
11613	// Remove auto dataType and get content-type in the process
11614	while ( dataTypes[ 0 ] === "*" ) {
11615		dataTypes.shift();
11616		if ( ct === undefined ) {
11617			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
11618		}
11619	}
11620
11621	// Check if we're dealing with a known content-type
11622	if ( ct ) {
11623		for ( type in contents ) {
11624			if ( contents[ type ] && contents[ type ].test( ct ) ) {
11625				dataTypes.unshift( type );
11626				break;
11627			}
11628		}
11629	}
11630
11631	// Check to see if we have a response for the expected dataType
11632	if ( dataTypes[ 0 ] in responses ) {
11633		finalDataType = dataTypes[ 0 ];
11634	} else {
11635
vendor: 6,163 bytes, lines 11636-11903
11636		// Try convertible dataTypes
11637		for ( type in responses ) {
11638			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
11639				finalDataType = type;
11640				break;
11641			}
11642			if ( !firstDataType ) {
11643				firstDataType = type;
11644			}
11645		}
11646
11647		// Or just use first one
11648		finalDataType = finalDataType || firstDataType;
11649	}
11650
11651	// If we found a dataType
11652	// We add the dataType to the list if needed
11653	// and return the corresponding response
11654	if ( finalDataType ) {
11655		if ( finalDataType !== dataTypes[ 0 ] ) {
11656			dataTypes.unshift( finalDataType );
11657		}
11658		return responses[ finalDataType ];
11659	}
11660}
11661
11662/* Chain conversions given the request and the original response
11663 * Also sets the responseXXX fields on the jqXHR instance
11664 */
11665function ajaxConvert( s, response, jqXHR, isSuccess ) {
11666	var conv2, current, conv, tmp, prev,
11667		converters = {},
11668
11669		// Work with a copy of dataTypes in case we need to modify it for conversion
11670		dataTypes = s.dataTypes.slice();
11671
11672	// Create converters map with lowercased keys
11673	if ( dataTypes[ 1 ] ) {
11674		for ( conv in s.converters ) {
11675			converters[ conv.toLowerCase() ] = s.converters[ conv ];
11676		}
11677	}
11678
11679	current = dataTypes.shift();
11680
11681	// Convert to each sequential dataType
11682	while ( current ) {
11683
11684		if ( s.responseFields[ current ] ) {
11685			jqXHR[ s.responseFields[ current ] ] = response;
11686		}
11687
11688		// Apply the dataFilter if provided
11689		if ( !prev && isSuccess && s.dataFilter ) {
11690			response = s.dataFilter( response, s.dataType );
11691		}
11692
11693		prev = current;
11694		current = dataTypes.shift();
11695
11696		if ( current ) {
11697
11698			// There's only work to do if current dataType is non-auto
11699			if ( current === "*" ) {
11700
11701				current = prev;
11702
11703			// Convert response if prev dataType is non-auto and differs from current
11704			} else if ( prev !== "*" && prev !== current ) {
11705
11706				// Seek a direct converter
11707				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
11708
11709				// If none found, seek a pair
11710				if ( !conv ) {
11711					for ( conv2 in converters ) {
11712
11713						// If conv2 outputs current
11714						tmp = conv2.split( " " );
11715						if ( tmp[ 1 ] === current ) {
11716
11717							// If prev can be converted to accepted input
11718							conv = converters[ prev + " " + tmp[ 0 ] ] ||
11719								converters[ "* " + tmp[ 0 ] ];
11720							if ( conv ) {
11721
11722								// Condense equivalence converters
11723								if ( conv === true ) {
11724									conv = converters[ conv2 ];
11725
11726								// Otherwise, insert the intermediate dataType
11727								} else if ( converters[ conv2 ] !== true ) {
11728									current = tmp[ 0 ];
11729									dataTypes.unshift( tmp[ 1 ] );
11730								}
11731								break;
11732							}
11733						}
11734					}
11735				}
11736
11737				// Apply converter (if not an equivalence)
11738				if ( conv !== true ) {
11739
11740					// Unless errors are allowed to bubble, catch and return them
11741					if ( conv && s.throws ) {
11742						response = conv( response );
11743					} else {
11744						try {
11745							response = conv( response );
11746						} catch ( e ) {
11747							return {
11748								state: "parsererror",
11749								error: conv ? e : "No conversion from " + prev + " to " + current
11750							};
11751						}
11752					}
11753				}
11754			}
11755		}
11756	}
11757
11758	return { state: "success", data: response };
11759}
11760
11761jQuery.extend( {
11762
11763	// Counter for holding the number of active queries
11764	active: 0,
11765
11766	// Last-Modified header cache for next request
11767	lastModified: {},
11768	etag: {},
11769
11770	ajaxSettings: {
11771		url: location.href,
11772		type: "GET",
11773		isLocal: rlocalProtocol.test( location.protocol ),
11774		global: true,
11775		processData: true,
11776		async: true,
11777		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
11778
11779		/*
11780		timeout: 0,
11781		data: null,
11782		dataType: null,
11783		username: null,
11784		password: null,
11785		cache: null,
11786		throws: false,
11787		traditional: false,
11788		headers: {},
11789		*/
11790
11791		accepts: {
11792			"*": allTypes,
11793			text: "text/plain",
11794			html: "text/html",
11795			xml: "application/xml, text/xml",
11796			json: "application/json, text/javascript"
11797		},
11798
11799		contents: {
11800			xml: /\bxml\b/,
11801			html: /\bhtml/,
11802			json: /\bjson\b/
11803		},
11804
11805		responseFields: {
11806			xml: "responseXML",
11807			text: "responseText",
11808			json: "responseJSON"
11809		},
11810
11811		// Data converters
11812		// Keys separate source (or catchall "*") and destination types with a single space
11813		converters: {
11814
11815			// Convert anything to text
11816			"* text": String,
11817
11818			// Text to html (true = no transformation)
11819			"text html": true,
11820
11821			// Evaluate text as a json expression
11822			"text json": JSON.parse,
11823
11824			// Parse text as xml
11825			"text xml": jQuery.parseXML
11826		},
11827
11828		// For options that shouldn't be deep extended:
11829		// you can add your own custom options here if
11830		// and when you create one that shouldn't be
11831		// deep extended (see ajaxExtend)
11832		flatOptions: {
11833			url: true,
11834			context: true
11835		}
11836	},
11837
11838	// Creates a full fledged settings object into target
11839	// with both ajaxSettings and settings fields.
11840	// If target is omitted, writes into ajaxSettings.
11841	ajaxSetup: function( target, settings ) {
11842		return settings ?
11843
11844			// Building a settings object
11845			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
11846
11847			// Extending ajaxSettings
11848			ajaxExtend( jQuery.ajaxSettings, target );
11849	},
11850
11851	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
11852	ajaxTransport: addToPrefiltersOrTransports( transports ),
11853
11854	// Main method
11855	ajax: function( url, options ) {
11856
11857		// If url is an object, simulate pre-1.5 signature
11858		if ( typeof url === "object" ) {
11859			options = url;
11860			url = undefined;
11861		}
11862
11863		// Force options to be an object
11864		options = options || {};
11865
11866		var transport,
11867
11868			// URL without anti-cache param
11869			cacheURL,
11870
11871			// Response headers
11872			responseHeadersString,
11873			responseHeaders,
11874
11875			// timeout handle
11876			timeoutTimer,
11877
11878			// Url cleanup var
11879			urlAnchor,
11880
11881			// Request state (becomes false upon send and true upon completion)
11882			completed,
11883
11884			// To know if global events are to be dispatched
11885			fireGlobals,
11886
11887			// Loop variable
11888			i,
11889
11890			// uncached part of the url
11891			uncached,
11892
11893			// Create the final options object
11894			s = jQuery.ajaxSetup( {}, options ),
11895
11896			// Callbacks context
11897			callbackContext = s.context || s,
11898
11899			// Context for global events is callbackContext if it is a DOM node or jQuery collection
11900			globalEventContext = s.context &&
11901				( callbackContext.nodeType || callbackContext.jquery ) ?
11902					jQuery( callbackContext ) :
11903	
vendor: 8,850 bytes, lines 11903-12215
11903				jQuery.event,
11904
11905			// Deferreds
11906			deferred = jQuery.Deferred(),
11907			completeDeferred = jQuery.Callbacks( "once memory" ),
11908
11909			// Status-dependent callbacks
11910			statusCode = s.statusCode || {},
11911
11912			// Headers (they are sent all at once)
11913			requestHeaders = {},
11914			requestHeadersNames = {},
11915
11916			// Default abort message
11917			strAbort = "canceled",
11918
11919			// Fake xhr
11920			jqXHR = {
11921				readyState: 0,
11922
11923				// Builds headers hashtable if needed
11924				getResponseHeader: function( key ) {
11925					var match;
11926					if ( completed ) {
11927						if ( !responseHeaders ) {
11928							responseHeaders = {};
11929							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
11930								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
11931									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
11932										.concat( match[ 2 ] );
11933							}
11934						}
11935						match = responseHeaders[ key.toLowerCase() + " " ];
11936					}
11937					return match == null ? null : match.join( ", " );
11938				},
11939
11940				// Raw string
11941				getAllResponseHeaders: function() {
11942					return completed ? responseHeadersString : null;
11943				},
11944
11945				// Caches the header
11946				setRequestHeader: function( name, value ) {
11947					if ( completed == null ) {
11948						name = requestHeadersNames[ name.toLowerCase() ] =
11949							requestHeadersNames[ name.toLowerCase() ] || name;
11950						requestHeaders[ name ] = value;
11951					}
11952					return this;
11953				},
11954
11955				// Overrides response content-type header
11956				overrideMimeType: function( type ) {
11957					if ( completed == null ) {
11958						s.mimeType = type;
11959					}
11960					return this;
11961				},
11962
11963				// Status-dependent callbacks
11964				statusCode: function( map ) {
11965					var code;
11966					if ( map ) {
11967						if ( completed ) {
11968
11969							// Execute the appropriate callbacks
11970							jqXHR.always( map[ jqXHR.status ] );
11971						} else {
11972
11973							// Lazy-add the new callbacks in a way that preserves old ones
11974							for ( code in map ) {
11975								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
11976							}
11977						}
11978					}
11979					return this;
11980				},
11981
11982				// Cancel the request
11983				abort: function( statusText ) {
11984					var finalText = statusText || strAbort;
11985					if ( transport ) {
11986						transport.abort( finalText );
11987					}
11988					done( 0, finalText );
11989					return this;
11990				}
11991			};
11992
11993		// Attach deferreds
11994		deferred.promise( jqXHR );
11995
11996		// Add protocol if not provided (prefilters might expect it)
11997		// Handle falsy url in the settings object (#10093: consistency with old signature)
11998		// We also use the url parameter if available
11999		s.url = ( ( url || s.url || location.href ) + "" )
12000			.replace( rprotocol, location.protocol + "//" );
12001
12002		// Alias method option to type as per ticket #12004
12003		s.type = options.method || options.type || s.method || s.type;
12004
12005		// Extract dataTypes list
12006		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
12007
12008		// A cross-domain request is in order when the origin doesn't match the current origin.
12009		if ( s.crossDomain == null ) {
12010			urlAnchor = document.createElement( "a" );
12011
12012			// Support: IE <=8 - 11, Edge 12 - 15
12013			// IE throws exception on accessing the href property if url is malformed,
12014			// e.g. http://example.com:80x/
12015			try {
12016				urlAnchor.href = s.url;
12017
12018				// Support: IE <=8 - 11 only
12019				// Anchor's host property isn't correctly set when s.url is relative
12020				urlAnchor.href = urlAnchor.href;
12021				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
12022					urlAnchor.protocol + "//" + urlAnchor.host;
12023			} catch ( e ) {
12024
12025				// If there is an error parsing the URL, assume it is crossDomain,
12026				// it can be rejected by the transport if it is invalid
12027				s.crossDomain = true;
12028			}
12029		}
12030
12031		// Convert data if not already a string
12032		if ( s.data && s.processData && typeof s.data !== "string" ) {
12033			s.data = jQuery.param( s.data, s.traditional );
12034		}
12035
12036		// Apply prefilters
12037		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
12038
12039		// If request was aborted inside a prefilter, stop there
12040		if ( completed ) {
12041			return jqXHR;
12042		}
12043
12044		// We can fire global events as of now if asked to
12045		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
12046		fireGlobals = jQuery.event && s.global;
12047
12048		// Watch for a new set of requests
12049		if ( fireGlobals && jQuery.active++ === 0 ) {
12050			jQuery.event.trigger( "ajaxStart" );
12051		}
12052
12053		// Uppercase the type
12054		s.type = s.type.toUpperCase();
12055
12056		// Determine if request has content
12057		s.hasContent = !rnoContent.test( s.type );
12058
12059		// Save the URL in case we're toying with the If-Modified-Since
12060		// and/or If-None-Match header later on
12061		// Remove hash to simplify url manipulation
12062		cacheURL = s.url.replace( rhash, "" );
12063
12064		// More options handling for requests with no content
12065		if ( !s.hasContent ) {
12066
12067			// Remember the hash so we can put it back
12068			uncached = s.url.slice( cacheURL.length );
12069
12070			// If data is available and should be processed, append data to url
12071			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
12072				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
12073
12074				// #9682: remove data so that it's not used in an eventual retry
12075				delete s.data;
12076			}
12077
12078			// Add or update anti-cache param if needed
12079			if ( s.cache === false ) {
12080				cacheURL = cacheURL.replace( rantiCache, "$1" );
12081				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
12082					uncached;
12083			}
12084
12085			// Put hash and anti-cache on the URL that will be requested (gh-1732)
12086			s.url = cacheURL + uncached;
12087
12088		// Change '%20' to '+' if this is encoded form body content (gh-2658)
12089		} else if ( s.data && s.processData &&
12090			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
12091			s.data = s.data.replace( r20, "+" );
12092		}
12093
12094		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
12095		if ( s.ifModified ) {
12096			if ( jQuery.lastModified[ cacheURL ] ) {
12097				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
12098			}
12099			if ( jQuery.etag[ cacheURL ] ) {
12100				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
12101			}
12102		}
12103
12104		// Set the correct header, if data is being sent
12105		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
12106			jqXHR.setRequestHeader( "Content-Type", s.contentType );
12107		}
12108
12109		// Set the Accepts header for the server, depending on the dataType
12110		jqXHR.setRequestHeader(
12111			"Accept",
12112			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
12113				s.accepts[ s.dataTypes[ 0 ] ] +
12114					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
12115				s.accepts[ "*" ]
12116		);
12117
12118		// Check for headers option
12119		for ( i in s.headers ) {
12120			jqXHR.setRequestHeader( i, s.headers[ i ] );
12121		}
12122
12123		// Allow custom headers/mimetypes and early abort
12124		if ( s.beforeSend &&
12125			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
12126
12127			// Abort if not done already and return
12128			return jqXHR.abort();
12129		}
12130
12131		// Aborting is no longer a cancellation
12132		strAbort = "abort";
12133
12134		// Install callbacks on deferreds
12135		completeDeferred.add( s.complete );
12136		jqXHR.done( s.success );
12137		jqXHR.fail( s.error );
12138
12139		// Get transport
12140		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
12141
12142		// If no transport, we auto-abort
12143		if ( !transport ) {
12144			done( -1, "No Transport" );
12145		} else {
12146			jqXHR.readyState = 1;
12147
12148			// Send global event
12149			if ( fireGlobals ) {
12150				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
12151			}
12152
12153			// If request was aborted inside ajaxSend, stop there
12154			if ( completed ) {
12155				return jqXHR;
12156			}
12157
12158			// Timeout
12159			if ( s.async && s.timeout > 0 ) {
12160				timeoutTimer = window.setTimeout( function() {
12161					jqXHR.abort( "timeout" );
12162				}, s.timeout );
12163			}
12164
12165			try {
12166				completed = false;
12167				transport.send( requestHeaders, done );
12168			} catch ( e ) {
12169
12170				// Rethrow post-completion exceptions
12171				if ( completed ) {
12172					throw e;
12173				}
12174
12175				// Propagate others as results
12176				done( -1, e );
12177			}
12178		}
12179
12180		// Callback for when everything is done
12181		function done( status, nativeStatusText, responses, headers ) {
12182			var isSuccess, success, error, response, modified,
12183				statusText = nativeStatusText;
12184
12185			// Ignore repeat invocations
12186			if ( completed ) {
12187				return;
12188			}
12189
12190			completed = true;
12191
12192			// Clear timeout if it exists
12193			if ( timeoutTimer ) {
12194				window.clearTimeout( timeoutTimer );
12195			}
12196
12197			// Dereference transport for early garbage collection
12198			// (no matter how long the jqXHR object will be used)
12199			transport = undefined;
12200
12201			// Cache response headers
12202			responseHeadersString = headers || "";
12203
12204			// Set readyState
12205			jqXHR.readyState = status > 0 ? 4 : 0;
12206
12207			// Determine if successful
12208			isSuccess = status >= 200 && status < 300 || status === 304;
12209
12210			// Get response data
12211			if ( responses ) {
12212				response = ajaxHandleResponses( s, jqXHR, responses );
12213			}
12214
12215			// Use a noop converter for missing script
12215
12216			if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1
vendor: 18,647 bytes, lines 12216-12954
12216 ) {
12217				s.converters[ "text script" ] = function() {};
12218			}
12219
12220			// Convert no matter what (that way responseXXX fields are always set)
12221			response = ajaxConvert( s, response, jqXHR, isSuccess );
12222
12223			// If successful, handle type chaining
12224			if ( isSuccess ) {
12225
12226				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
12227				if ( s.ifModified ) {
12228					modified = jqXHR.getResponseHeader( "Last-Modified" );
12229					if ( modified ) {
12230						jQuery.lastModified[ cacheURL ] = modified;
12231					}
12232					modified = jqXHR.getResponseHeader( "etag" );
12233					if ( modified ) {
12234						jQuery.etag[ cacheURL ] = modified;
12235					}
12236				}
12237
12238				// if no content
12239				if ( status === 204 || s.type === "HEAD" ) {
12240					statusText = "nocontent";
12241
12242				// if not modified
12243				} else if ( status === 304 ) {
12244					statusText = "notmodified";
12245
12246				// If we have data, let's convert it
12247				} else {
12248					statusText = response.state;
12249					success = response.data;
12250					error = response.error;
12251					isSuccess = !error;
12252				}
12253			} else {
12254
12255				// Extract error from statusText and normalize for non-aborts
12256				error = statusText;
12257				if ( status || !statusText ) {
12258					statusText = "error";
12259					if ( status < 0 ) {
12260						status = 0;
12261					}
12262				}
12263			}
12264
12265			// Set data for the fake xhr object
12266			jqXHR.status = status;
12267			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
12268
12269			// Success/Error
12270			if ( isSuccess ) {
12271				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
12272			} else {
12273				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
12274			}
12275
12276			// Status-dependent callbacks
12277			jqXHR.statusCode( statusCode );
12278			statusCode = undefined;
12279
12280			if ( fireGlobals ) {
12281				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
12282					[ jqXHR, s, isSuccess ? success : error ] );
12283			}
12284
12285			// Complete
12286			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
12287
12288			if ( fireGlobals ) {
12289				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
12290
12291				// Handle the global AJAX counter
12292				if ( !( --jQuery.active ) ) {
12293					jQuery.event.trigger( "ajaxStop" );
12294				}
12295			}
12296		}
12297
12298		return jqXHR;
12299	},
12300
12301	getJSON: function( url, data, callback ) {
12302		return jQuery.get( url, data, callback, "json" );
12303	},
12304
12305	getScript: function( url, callback ) {
12306		return jQuery.get( url, undefined, callback, "script" );
12307	}
12308} );
12309
12310jQuery.each( [ "get", "post" ], function( _i, method ) {
12311	jQuery[ method ] = function( url, data, callback, type ) {
12312
12313		// Shift arguments if data argument was omitted
12314		if ( isFunction( data ) ) {
12315			type = type || callback;
12316			callback = data;
12317			data = undefined;
12318		}
12319
12320		// The url can be an options object (which then must have .url)
12321		return jQuery.ajax( jQuery.extend( {
12322			url: url,
12323			type: method,
12324			dataType: type,
12325			data: data,
12326			success: callback
12327		}, jQuery.isPlainObject( url ) && url ) );
12328	};
12329} );
12330
12331jQuery.ajaxPrefilter( function( s ) {
12332	var i;
12333	for ( i in s.headers ) {
12334		if ( i.toLowerCase() === "content-type" ) {
12335			s.contentType = s.headers[ i ] || "";
12336		}
12337	}
12338} );
12339
12340
12341jQuery._evalUrl = function( url, options, doc ) {
12342	return jQuery.ajax( {
12343		url: url,
12344
12345		// Make this explicit, since user can override this through ajaxSetup (#11264)
12346		type: "GET",
12347		dataType: "script",
12348		cache: true,
12349		async: false,
12350		global: false,
12351
12352		// Only evaluate the response if it is successful (gh-4126)
12353		// dataFilter is not invoked for failure responses, so using it instead
12354		// of the default converter is kludgy but it works.
12355		converters: {
12356			"text script": function() {}
12357		},
12358		dataFilter: function( response ) {
12359			jQuery.globalEval( response, options, doc );
12360		}
12361	} );
12362};
12363
12364
12365jQuery.fn.extend( {
12366	wrapAll: function( html ) {
12367		var wrap;
12368
12369		if ( this[ 0 ] ) {
12370			if ( isFunction( html ) ) {
12371				html = html.call( this[ 0 ] );
12372			}
12373
12374			// The elements to wrap the target around
12375			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
12376
12377			if ( this[ 0 ].parentNode ) {
12378				wrap.insertBefore( this[ 0 ] );
12379			}
12380
12381			wrap.map( function() {
12382				var elem = this;
12383
12384				while ( elem.firstElementChild ) {
12385					elem = elem.firstElementChild;
12386				}
12387
12388				return elem;
12389			} ).append( this );
12390		}
12391
12392		return this;
12393	},
12394
12395	wrapInner: function( html ) {
12396		if ( isFunction( html ) ) {
12397			return this.each( function( i ) {
12398				jQuery( this ).wrapInner( html.call( this, i ) );
12399			} );
12400		}
12401
12402		return this.each( function() {
12403			var self = jQuery( this ),
12404				contents = self.contents();
12405
12406			if ( contents.length ) {
12407				contents.wrapAll( html );
12408
12409			} else {
12410				self.append( html );
12411			}
12412		} );
12413	},
12414
12415	wrap: function( html ) {
12416		var htmlIsFunction = isFunction( html );
12417
12418		return this.each( function( i ) {
12419			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
12420		} );
12421	},
12422
12423	unwrap: function( selector ) {
12424		this.parent( selector ).not( "body" ).each( function() {
12425			jQuery( this ).replaceWith( this.childNodes );
12426		} );
12427		return this;
12428	}
12429} );
12430
12431
12432jQuery.expr.pseudos.hidden = function( elem ) {
12433	return !jQuery.expr.pseudos.visible( elem );
12434};
12435jQuery.expr.pseudos.visible = function( elem ) {
12436	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
12437};
12438
12439
12440
12441
12442jQuery.ajaxSettings.xhr = function() {
12443	try {
12444		return new window.XMLHttpRequest();
12445	} catch ( e ) {}
12446};
12447
12448var xhrSuccessStatus = {
12449
12450		// File protocol always yields status code 0, assume 200
12451		0: 200,
12452
12453		// Support: IE <=9 only
12454		// #1450: sometimes IE returns 1223 when it should be 204
12455		1223: 204
12456	},
12457	xhrSupported = jQuery.ajaxSettings.xhr();
12458
12459support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
12460support.ajax = xhrSupported = !!xhrSupported;
12461
12462jQuery.ajaxTransport( function( options ) {
12463	var callback, errorCallback;
12464
12465	// Cross domain only allowed if supported through XMLHttpRequest
12466	if ( support.cors || xhrSupported && !options.crossDomain ) {
12467		return {
12468			send: function( headers, complete ) {
12469				var i,
12470					xhr = options.xhr();
12471
12472				xhr.open(
12473					options.type,
12474					options.url,
12475					options.async,
12476					options.username,
12477					options.password
12478				);
12479
12480				// Apply custom fields if provided
12481				if ( options.xhrFields ) {
12482					for ( i in options.xhrFields ) {
12483						xhr[ i ] = options.xhrFields[ i ];
12484					}
12485				}
12486
12487				// Override mime type if needed
12488				if ( options.mimeType && xhr.overrideMimeType ) {
12489					xhr.overrideMimeType( options.mimeType );
12490				}
12491
12492				// X-Requested-With header
12493				// For cross-domain requests, seeing as conditions for a preflight are
12494				// akin to a jigsaw puzzle, we simply never set it to be sure.
12495				// (it can always be set on a per-request basis or even using ajaxSetup)
12496				// For same-domain requests, won't change header if already provided.
12497				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
12498					headers[ "X-Requested-With" ] = "XMLHttpRequest";
12499				}
12500
12501				// Set headers
12502				for ( i in headers ) {
12503					xhr.setRequestHeader( i, headers[ i ] );
12504				}
12505
12506				// Callback
12507				callback = function( type ) {
12508					return function() {
12509						if ( callback ) {
12510							callback = errorCallback = xhr.onload =
12511								xhr.onerror = xhr.onabort = xhr.ontimeout =
12512									xhr.onreadystatechange = null;
12513
12514							if ( type === "abort" ) {
12515								xhr.abort();
12516							} else if ( type === "error" ) {
12517
12518								// Support: IE <=9 only
12519								// On a manual native abort, IE9 throws
12520								// errors on any property access that is not readyState
12521								if ( typeof xhr.status !== "number" ) {
12522									complete( 0, "error" );
12523								} else {
12524									complete(
12525
12526										// File: protocol always yields status 0; see #8605, #14207
12527										xhr.status,
12528										xhr.statusText
12529									);
12530								}
12531							} else {
12532								complete(
12533									xhrSuccessStatus[ xhr.status ] || xhr.status,
12534									xhr.statusText,
12535
12536									// Support: IE <=9 only
12537									// IE9 has no XHR2 but throws on binary (trac-11426)
12538									// For XHR2 non-text, let the caller handle it (gh-2498)
12539									( xhr.responseType || "text" ) !== "text"  ||
12540									typeof xhr.responseText !== "string" ?
12541										{ binary: xhr.response } :
12542										{ text: xhr.responseText },
12543									xhr.getAllResponseHeaders()
12544								);
12545							}
12546						}
12547					};
12548				};
12549
12550				// Listen to events
12551				xhr.onload = callback();
12552				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
12553
12554				// Support: IE 9 only
12555				// Use onreadystatechange to replace onabort
12556				// to handle uncaught aborts
12557				if ( xhr.onabort !== undefined ) {
12558					xhr.onabort = errorCallback;
12559				} else {
12560					xhr.onreadystatechange = function() {
12561
12562						// Check readyState before timeout as it changes
12563						if ( xhr.readyState === 4 ) {
12564
12565							// Allow onerror to be called first,
12566							// but that will not handle a native abort
12567							// Also, save errorCallback to a variable
12568							// as xhr.onerror cannot be accessed
12569							window.setTimeout( function() {
12570								if ( callback ) {
12571									errorCallback();
12572								}
12573							} );
12574						}
12575					};
12576				}
12577
12578				// Create the abort callback
12579				callback = callback( "abort" );
12580
12581				try {
12582
12583					// Do send the request (this may raise an exception)
12584					xhr.send( options.hasContent && options.data || null );
12585				} catch ( e ) {
12586
12587					// #14683: Only rethrow if this hasn't been notified as an error yet
12588					if ( callback ) {
12589						throw e;
12590					}
12591				}
12592			},
12593
12594			abort: function() {
12595				if ( callback ) {
12596					callback();
12597				}
12598			}
12599		};
12600	}
12601} );
12602
12603
12604
12605
12606// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
12607jQuery.ajaxPrefilter( function( s ) {
12608	if ( s.crossDomain ) {
12609		s.contents.script = false;
12610	}
12611} );
12612
12613// Install script dataType
12614jQuery.ajaxSetup( {
12615	accepts: {
12616		script: "text/javascript, application/javascript, " +
12617			"application/ecmascript, application/x-ecmascript"
12618	},
12619	contents: {
12620		script: /\b(?:java|ecma)script\b/
12621	},
12622	converters: {
12623		"text script": function( text ) {
12624			jQuery.globalEval( text );
12625			return text;
12626		}
12627	}
12628} );
12629
12630// Handle cache's special case and crossDomain
12631jQuery.ajaxPrefilter( "script", function( s ) {
12632	if ( s.cache === undefined ) {
12633		s.cache = false;
12634	}
12635	if ( s.crossDomain ) {
12636		s.type = "GET";
12637	}
12638} );
12639
12640// Bind script tag hack transport
12641jQuery.ajaxTransport( "script", function( s ) {
12642
12643	// This transport only deals with cross domain or forced-by-attrs requests
12644	if ( s.crossDomain || s.scriptAttrs ) {
12645		var script, callback;
12646		return {
12647			send: function( _, complete ) {
12648				script = jQuery( "<script>" )
12649					.attr( s.scriptAttrs || {} )
12650					.prop( { charset: s.scriptCharset, src: s.url } )
12651					.on( "load error", callback = function( evt ) {
12652						script.remove();
12653						callback = null;
12654						if ( evt ) {
12655							complete( evt.type === "error" ? 404 : 200, evt.type );
12656						}
12657					} );
12658
12659				// Use native DOM manipulation to avoid our domManip AJAX trickery
12660				document.head.appendChild( script[ 0 ] );
12661			},
12662			abort: function() {
12663				if ( callback ) {
12664					callback();
12665				}
12666			}
12667		};
12668	}
12669} );
12670
12671
12672
12673
12674var oldCallbacks = [],
12675	rjsonp = /(=)\?(?=&|$)|\?\?/;
12676
12677// Default jsonp settings
12678jQuery.ajaxSetup( {
12679	jsonp: "callback",
12680	jsonpCallback: function() {
12681		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
12682		this[ callback ] = true;
12683		return callback;
12684	}
12685} );
12686
12687// Detect, normalize options and install callbacks for jsonp requests
12688jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
12689
12690	var callbackName, overwritten, responseContainer,
12691		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
12692			"url" :
12693			typeof s.data === "string" &&
12694				( s.contentType || "" )
12695					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
12696				rjsonp.test( s.data ) && "data"
12697		);
12698
12699	// Handle iff the expected data type is "jsonp" or we have a parameter to set
12700	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
12701
12702		// Get callback name, remembering preexisting value associated with it
12703		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
12704			s.jsonpCallback() :
12705			s.jsonpCallback;
12706
12707		// Insert callback into url or form data
12708		if ( jsonProp ) {
12709			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
12710		} else if ( s.jsonp !== false ) {
12711			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
12712		}
12713
12714		// Use data converter to retrieve json after script execution
12715		s.converters[ "script json" ] = function() {
12716			if ( !responseContainer ) {
12717				jQuery.error( callbackName + " was not called" );
12718			}
12719			return responseContainer[ 0 ];
12720		};
12721
12722		// Force json dataType
12723		s.dataTypes[ 0 ] = "json";
12724
12725		// Install callback
12726		overwritten = window[ callbackName ];
12727		window[ callbackName ] = function() {
12728			responseContainer = arguments;
12729		};
12730
12731		// Clean-up function (fires after converters)
12732		jqXHR.always( function() {
12733
12734			// If previous value didn't exist - remove it
12735			if ( overwritten === undefined ) {
12736				jQuery( window ).removeProp( callbackName );
12737
12738			// Otherwise restore preexisting value
12739			} else {
12740				window[ callbackName ] = overwritten;
12741			}
12742
12743			// Save back as free
12744			if ( s[ callbackName ] ) {
12745
12746				// Make sure that re-using the options doesn't screw things around
12747				s.jsonpCallback = originalSettings.jsonpCallback;
12748
12749				// Save the callback name for future use
12750				oldCallbacks.push( callbackName );
12751			}
12752
12753			// Call if it was a function and we have a response
12754			if ( responseContainer && isFunction( overwritten ) ) {
12755				overwritten( responseContainer[ 0 ] );
12756			}
12757
12758			responseContainer = overwritten = undefined;
12759		} );
12760
12761		// Delegate to script
12762		return "script";
12763	}
12764} );
12765
12766
12767
12768
12769// Support: Safari 8 only
12770// In Safari 8 documents created via document.implementation.createHTMLDocument
12771// collapse sibling forms: the second one becomes a child of the first one.
12772// Because of that, this security measure has to be disabled in Safari 8.
12773// https://bugs.webkit.org/show_bug.cgi?id=137337
12774support.createHTMLDocument = ( function() {
12775	var body = document.implementation.createHTMLDocument( "" ).body;
12776	body.innerHTML = "<form></form><form></form>";
12777	return body.childNodes.length === 2;
12778} )();
12779
12780
12781// Argument "data" should be string of html
12782// context (optional): If specified, the fragment will be created in this context,
12783// defaults to document
12784// keepScripts (optional): If true, will include scripts passed in the html string
12785jQuery.parseHTML = function( data, context, keepScripts ) {
12786	if ( typeof data !== "string" ) {
12787		return [];
12788	}
12789	if ( typeof context === "boolean" ) {
12790		keepScripts = context;
12791		context = false;
12792	}
12793
12794	var base, parsed, scripts;
12795
12796	if ( !context ) {
12797
12798		// Stop scripts or inline event handlers from being executed immediately
12799		// by using document.implementation
12800		if ( support.createHTMLDocument ) {
12801			context = document.implementation.createHTMLDocument( "" );
12802
12803			// Set the base href for the created document
12804			// so any parsed elements with URLs
12805			// are based on the document's URL (gh-2965)
12806			base = context.createElement( "base" );
12807			base.href = document.location.href;
12808			context.head.appendChild( base );
12809		} else {
12810			context = document;
12811		}
12812	}
12813
12814	parsed = rsingleTag.exec( data );
12815	scripts = !keepScripts && [];
12816
12817	// Single tag
12818	if ( parsed ) {
12819		return [ context.createElement( parsed[ 1 ] ) ];
12820	}
12821
12822	parsed = buildFragment( [ data ], context, scripts );
12823
12824	if ( scripts && scripts.length ) {
12825		jQuery( scripts ).remove();
12826	}
12827
12828	return jQuery.merge( [], parsed.childNodes );
12829};
12830
12831
12832/**
12833 * Load a url into a page
12834 */
12835jQuery.fn.load = function( url, params, callback ) {
12836	var selector, type, response,
12837		self = this,
12838		off = url.indexOf( " " );
12839
12840	if ( off > -1 ) {
12841		selector = stripAndCollapse( url.slice( off ) );
12842		url = url.slice( 0, off );
12843	}
12844
12845	// If it's a function
12846	if ( isFunction( params ) ) {
12847
12848		// We assume that it's the callback
12849		callback = params;
12850		params = undefined;
12851
12852	// Otherwise, build a param string
12853	} else if ( params && typeof params === "object" ) {
12854		type = "POST";
12855	}
12856
12857	// If we have elements to modify, make the request
12858	if ( self.length > 0 ) {
12859		jQuery.ajax( {
12860			url: url,
12861
12862			// If "type" variable is undefined, then "GET" method will be used.
12863			// Make value of this field explicit since
12864			// user can override it through ajaxSetup method
12865			type: type || "GET",
12866			dataType: "html",
12867			data: params
12868		} ).done( function( responseText ) {
12869
12870			// Save response for use in complete callback
12871			response = arguments;
12872
12873			self.html( selector ?
12874
12875				// If a selector was specified, locate the right elements in a dummy div
12876				// Exclude scripts to avoid IE 'Permission Denied' errors
12877				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
12878
12879				// Otherwise use the full result
12880				responseText );
12881
12882		// If the request succeeds, this function gets "data", "status", "jqXHR"
12883		// but they are ignored because response was set above.
12884		// If it fails, this function gets "jqXHR", "status", "error"
12885		} ).always( callback && function( jqXHR, status ) {
12886			self.each( function() {
12887				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
12888			} );
12889		} );
12890	}
12891
12892	return this;
12893};
12894
12895
12896
12897
12898jQuery.expr.pseudos.animated = function( elem ) {
12899	return jQuery.grep( jQuery.timers, function( fn ) {
12900		return elem === fn.elem;
12901	} ).length;
12902};
12903
12904
12905
12906
12907jQuery.offset = {
12908	setOffset: function( elem, options, i ) {
12909		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
12910			position = jQuery.css( elem, "position" ),
12911			curElem = jQuery( elem ),
12912			props = {};
12913
12914		// Set position first, in-case top/left are set even on static elem
12915		if ( position === "static" ) {
12916			elem.style.position = "relative";
12917		}
12918
12919		curOffset = curElem.offset();
12920		curCSSTop = jQuery.css( elem, "top" );
12921		curCSSLeft = jQuery.css( elem, "left" );
12922		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
12923			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
12924
12925		// Need to be able to calculate position if either
12926		// top or left is auto and position is either absolute or fixed
12927		if ( calculatePosition ) {
12928			curPosition = curElem.position();
12929			curTop = curPosition.top;
12930			curLeft = curPosition.left;
12931
12932		} else {
12933			curTop = parseFloat( curCSSTop ) || 0;
12934			curLeft = parseFloat( curCSSLeft ) || 0;
12935		}
12936
12937		if ( isFunction( options ) ) {
12938
12939			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
12940			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
12941		}
12942
12943		if ( options.top != null ) {
12944			props.top = ( options.top - curOffset.top ) + curTop;
12945		}
12946		if ( options.left != null ) {
12947			props.left = ( options.left - curOffset.left ) + curLeft;
12948		}
12949
12950		if ( "using" in options ) {
12951			options.using.call( elem, props );
12952
12953		} else {
12954			
vendor: 2,160 bytes, lines 12954-13032
12954if ( typeof props.top === "number" ) {
12955				props.top += "px";
12956			}
12957			if ( typeof props.left === "number" ) {
12958				props.left += "px";
12959			}
12960			curElem.css( props );
12961		}
12962	}
12963};
12964
12965jQuery.fn.extend( {
12966
12967	// offset() relates an element's border box to the document origin
12968	offset: function( options ) {
12969
12970		// Preserve chaining for setter
12971		if ( arguments.length ) {
12972			return options === undefined ?
12973				this :
12974				this.each( function( i ) {
12975					jQuery.offset.setOffset( this, options, i );
12976				} );
12977		}
12978
12979		var rect, win,
12980			elem = this[ 0 ];
12981
12982		if ( !elem ) {
12983			return;
12984		}
12985
12986		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
12987		// Support: IE <=11 only
12988		// Running getBoundingClientRect on a
12989		// disconnected node in IE throws an error
12990		if ( !elem.getClientRects().length ) {
12991			return { top: 0, left: 0 };
12992		}
12993
12994		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
12995		rect = elem.getBoundingClientRect();
12996		win = elem.ownerDocument.defaultView;
12997		return {
12998			top: rect.top + win.pageYOffset,
12999			left: rect.left + win.pageXOffset
13000		};
13001	},
13002
13003	// position() relates an element's margin box to its offset parent's padding box
13004	// This corresponds to the behavior of CSS absolute positioning
13005	position: function() {
13006		if ( !this[ 0 ] ) {
13007			return;
13008		}
13009
13010		var offsetParent, offset, doc,
13011			elem = this[ 0 ],
13012			parentOffset = { top: 0, left: 0 };
13013
13014		// position:fixed elements are offset from the viewport, which itself always has zero offset
13015		if ( jQuery.css( elem, "position" ) === "fixed" ) {
13016
13017			// Assume position:fixed implies availability of getBoundingClientRect
13018			offset = elem.getBoundingClientRect();
13019
13020		} else {
13021			offset = this.offset();
13022
13023			// Account for the *real* offset parent, which can be the document or its root element
13024			// when a statically positioned element is identified
13025			doc = elem.ownerDocument;
13026			offsetParent = elem.offsetParent || doc.documentElement;
13027			while ( offsetParent &&
13028				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
13029				jQuery.css( offsetParent, "position" ) === "static" ) {
13030
13031				offsetParent = offsetParent.parentNode;
13032			}
vendor: 7,719 bytes, lines 13033-13298
13033			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
13034
13035				// Incorporate borders into its offset, since they are outside its content origin
13036				parentOffset = jQuery( offsetParent ).offset();
13037				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
13038				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
13039			}
13040		}
13041
13042		// Subtract parent offsets and element margins
13043		return {
13044			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
13045			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
13046		};
13047	},
13048
13049	// This method will return documentElement in the following cases:
13050	// 1) For the element inside the iframe without offsetParent, this method will return
13051	//    documentElement of the parent window
13052	// 2) For the hidden or detached element
13053	// 3) For body or html element, i.e. in case of the html node - it will return itself
13054	//
13055	// but those exceptions were never presented as a real life use-cases
13056	// and might be considered as more preferable results.
13057	//
13058	// This logic, however, is not guaranteed and can change at any point in the future
13059	offsetParent: function() {
13060		return this.map( function() {
13061			var offsetParent = this.offsetParent;
13062
13063			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
13064				offsetParent = offsetParent.offsetParent;
13065			}
13066
13067			return offsetParent || documentElement;
13068		} );
13069	}
13070} );
13071
13072// Create scrollLeft and scrollTop methods
13073jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
13074	var top = "pageYOffset" === prop;
13075
13076	jQuery.fn[ method ] = function( val ) {
13077		return access( this, function( elem, method, val ) {
13078
13079			// Coalesce documents and windows
13080			var win;
13081			if ( isWindow( elem ) ) {
13082				win = elem;
13083			} else if ( elem.nodeType === 9 ) {
13084				win = elem.defaultView;
13085			}
13086
13087			if ( val === undefined ) {
13088				return win ? win[ prop ] : elem[ method ];
13089			}
13090
13091			if ( win ) {
13092				win.scrollTo(
13093					!top ? val : win.pageXOffset,
13094					top ? val : win.pageYOffset
13095				);
13096
13097			} else {
13098				elem[ method ] = val;
13099			}
13100		}, method, val, arguments.length );
13101	};
13102} );
13103
13104// Support: Safari <=7 - 9.1, Chrome <=37 - 49
13105// Add the top/left cssHooks using jQuery.fn.position
13106// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
13107// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
13108// getComputedStyle returns percent when specified for top/left/bottom/right;
13109// rather than make the css module depend on the offset module, just check for it here
13110jQuery.each( [ "top", "left" ], function( _i, prop ) {
13111	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
13112		function( elem, computed ) {
13113			if ( computed ) {
13114				computed = curCSS( elem, prop );
13115
13116				// If curCSS returns percentage, fallback to offset
13117				return rnumnonpx.test( computed ) ?
13118					jQuery( elem ).position()[ prop ] + "px" :
13119					computed;
13120			}
13121		}
13122	);
13123} );
13124
13125
13126// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
13127jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
13128	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
13129		function( defaultExtra, funcName ) {
13130
13131		// Margin is only for outerHeight, outerWidth
13132		jQuery.fn[ funcName ] = function( margin, value ) {
13133			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
13134				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
13135
13136			return access( this, function( elem, type, value ) {
13137				var doc;
13138
13139				if ( isWindow( elem ) ) {
13140
13141					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
13142					return funcName.indexOf( "outer" ) === 0 ?
13143						elem[ "inner" + name ] :
13144						elem.document.documentElement[ "client" + name ];
13145				}
13146
13147				// Get document width or height
13148				if ( elem.nodeType === 9 ) {
13149					doc = elem.documentElement;
13150
13151					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
13152					// whichever is greatest
13153					return Math.max(
13154						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
13155						elem.body[ "offset" + name ], doc[ "offset" + name ],
13156						doc[ "client" + name ]
13157					);
13158				}
13159
13160				return value === undefined ?
13161
13162					// Get width or height on the element, requesting but not forcing parseFloat
13163					jQuery.css( elem, type, extra ) :
13164
13165					// Set width or height on the element
13166					jQuery.style( elem, type, value, extra );
13167			}, type, chainable ? margin : undefined, chainable );
13168		};
13169	} );
13170} );
13171
13172
13173jQuery.each( [
13174	"ajaxStart",
13175	"ajaxStop",
13176	"ajaxComplete",
13177	"ajaxError",
13178	"ajaxSuccess",
13179	"ajaxSend"
13180], function( _i, type ) {
13181	jQuery.fn[ type ] = function( fn ) {
13182		return this.on( type, fn );
13183	};
13184} );
13185
13186
13187
13188
13189jQuery.fn.extend( {
13190
13191	bind: function( types, data, fn ) {
13192		return this.on( types, null, data, fn );
13193	},
13194	unbind: function( types, fn ) {
13195		return this.off( types, null, fn );
13196	},
13197
13198	delegate: function( selector, types, data, fn ) {
13199		return this.on( types, selector, data, fn );
13200	},
13201	undelegate: function( selector, types, fn ) {
13202
13203		// ( namespace ) or ( selector, types [, fn] )
13204		return arguments.length === 1 ?
13205			this.off( selector, "**" ) :
13206			this.off( types, selector || "**", fn );
13207	},
13208
13209	hover: function( fnOver, fnOut ) {
13210		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
13211	}
13212} );
13213
13214jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
13215	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
13216	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
13217	function( _i, name ) {
13218
13219		// Handle event binding
13220		jQuery.fn[ name ] = function( data, fn ) {
13221			return arguments.length > 0 ?
13222				this.on( name, null, data, fn ) :
13223				this.trigger( name );
13224		};
13225	} );
13226
13227
13228
13229
13230// Support: Android <=4.0 only
13231// Make sure we trim BOM and NBSP
13232var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
13233
13234// Bind a function to a context, optionally partially applying any
13235// arguments.
13236// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
13237// However, it is not slated for removal any time soon
13238jQuery.proxy = function( fn, context ) {
13239	var tmp, args, proxy;
13240
13241	if ( typeof context === "string" ) {
13242		tmp = fn[ context ];
13243		context = fn;
13244		fn = tmp;
13245	}
13246
13247	// Quick check to determine if target is callable, in the spec
13248	// this throws a TypeError, but we will just return undefined.
13249	if ( !isFunction( fn ) ) {
13250		return undefined;
13251	}
13252
13253	// Simulated bind
13254	args = slice.call( arguments, 2 );
13255	proxy = function() {
13256		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
13257	};
13258
13259	// Set the guid of unique handler to the same of original handler, so it can be removed
13260	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
13261
13262	return proxy;
13263};
13264
13265jQuery.holdReady = function( hold ) {
13266	if ( hold ) {
13267		jQuery.readyWait++;
13268	} else {
13269		jQuery.ready( true );
13270	}
13271};
13272jQuery.isArray = Array.isArray;
13273jQuery.parseJSON = JSON.parse;
13274jQuery.nodeName = nodeName;
13275jQuery.isFunction = isFunction;
13276jQuery.isWindow = isWindow;
13277jQuery.camelCase = camelCase;
13278jQuery.type = toType;
13279
13280jQuery.now = Date.now;
13281
13282jQuery.isNumeric = function( obj ) {
13283
13284	// As of jQuery 3.0, isNumeric is limited to
13285	// strings and numbers (primitives or objects)
13286	// that can be coerced to finite numbers (gh-2662)
13287	var type = jQuery.type( obj );
13288	return ( type === "number" || type === "string" ) &&
13289
13290		// parseFloat NaNs numeric-cast false positives ("")
13291		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
13292		// subtraction forces infinities to NaN
13293		!isNaN( obj - parseFloat( obj ) );
13294};
13295
13296jQuery.trim = function( text ) {
13297	return text == null ?
13298		"" :
13299		( text + "" ).replace( rtrim, "" );
13300};
13301
13302
13303
13304// Register as a named AMD module, since jQuery can be concatenated with other
13305// files that may use define, but not via a proper concatenation script that
13306// understands anonymous AMD modules. A named AMD is safest and most robust
13307// way to register. Lowercase jquery is used because AMD module names are
13308// derived from file names, and jQuery is normally delivered in a lowercase
13309// file name. Do this after creating the global so that if an AMD module wants
13310// to call noConflict to hide this version of jQuery, it will work.
13311
13312// Note that for maximum portability, libraries that are not jQuery should
13313// declare themselves as anonymous modules, and avoid setting a global if an
13314// AMD loader is present. jQuery is a special case. For more information, see
13315// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
13316
13317if ( typeof define === "function" && define.amd ) {
13318	define( "jquery", [], function() {
13319		return jQuery;
13320	} );
13321}
13322
13323
13324
13325
13326var
13327
13328	// Map over jQuery in case of overwrite
13329	_jQuery = window.jQuery,
13330
13331	// Map over the $ in case of overwrite
13332	_$ = window.$;
13333
13334jQuery.noConflict = function( deep ) {
13335	if ( window.$ === jQuery ) {
13336		window.$ = _$;
13337	}
13338
13339	if ( deep && window.jQuery === jQuery ) {
13340		window.jQuery = _jQuery;
13341	}
13342
13343	return jQuery;
13344};
13345
13346// Expose jQuery and $ identifiers, even in AMD
13347// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
13348// and CommonJS for browser emulators (#13566)
13349if ( typeof noGlobal === "undefined" ) {
13350	window.jQuery = window.$ = jQuery;
13351}
13352
13353
13354
13355
13356return jQuery;
13357} );
13358
13359},{}],28:[function(require,module,exports){
13360(function (global){(function (){
13361/**
13362 * @license
13363 * Lodash <https://lodash.com/>
13364 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
13365 * Released under MIT license <https://lodash.com/license>
13366 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
13367 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
13368 */
13369;(function() {
13370
13371  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
13372  var undefined
vendor: 12,195 bytes, lines 13372-13675
13372;
13373
13374  /** Used as the semantic version number. */
13375  var VERSION = '4.17.21';
13376
13377  /** Used as the size to enable large array optimizations. */
13378  var LARGE_ARRAY_SIZE = 200;
13379
13380  /** Error message constants. */
13381  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
13382      FUNC_ERROR_TEXT = 'Expected a function',
13383      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';
13384
13385  /** Used to stand-in for `undefined` hash values. */
13386  var HASH_UNDEFINED = '__lodash_hash_undefined__';
13387
13388  /** Used as the maximum memoize cache size. */
13389  var MAX_MEMOIZE_SIZE = 500;
13390
13391  /** Used as the internal argument placeholder. */
13392  var PLACEHOLDER = '__lodash_placeholder__';
13393
13394  /** Used to compose bitmasks for cloning. */
13395  var CLONE_DEEP_FLAG = 1,
13396      CLONE_FLAT_FLAG = 2,
13397      CLONE_SYMBOLS_FLAG = 4;
13398
13399  /** Used to compose bitmasks for value comparisons. */
13400  var COMPARE_PARTIAL_FLAG = 1,
13401      COMPARE_UNORDERED_FLAG = 2;
13402
13403  /** Used to compose bitmasks for function metadata. */
13404  var WRAP_BIND_FLAG = 1,
13405      WRAP_BIND_KEY_FLAG = 2,
13406      WRAP_CURRY_BOUND_FLAG = 4,
13407      WRAP_CURRY_FLAG = 8,
13408      WRAP_CURRY_RIGHT_FLAG = 16,
13409      WRAP_PARTIAL_FLAG = 32,
13410      WRAP_PARTIAL_RIGHT_FLAG = 64,
13411      WRAP_ARY_FLAG = 128,
13412      WRAP_REARG_FLAG = 256,
13413      WRAP_FLIP_FLAG = 512;
13414
13415  /** Used as default options for `_.truncate`. */
13416  var DEFAULT_TRUNC_LENGTH = 30,
13417      DEFAULT_TRUNC_OMISSION = '...';
13418
13419  /** Used to detect hot functions by number of calls within a span of milliseconds. */
13420  var HOT_COUNT = 800,
13421      HOT_SPAN = 16;
13422
13423  /** Used to indicate the type of lazy iteratees. */
13424  var LAZY_FILTER_FLAG = 1,
13425      LAZY_MAP_FLAG = 2,
13426      LAZY_WHILE_FLAG = 3;
13427
13428  /** Used as references for various `Number` constants. */
13429  var INFINITY = 1 / 0,
13430      MAX_SAFE_INTEGER = 9007199254740991,
13431      MAX_INTEGER = 1.7976931348623157e+308,
13432      NAN = 0 / 0;
13433
13434  /** Used as references for the maximum length and index of an array. */
13435  var MAX_ARRAY_LENGTH = 4294967295,
13436      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
13437      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
13438
13439  /** Used to associate wrap methods with their bit flags. */
13440  var wrapFlags = [
13441    ['ary', WRAP_ARY_FLAG],
13442    ['bind', WRAP_BIND_FLAG],
13443    ['bindKey', WRAP_BIND_KEY_FLAG],
13444    ['curry', WRAP_CURRY_FLAG],
13445    ['curryRight', WRAP_CURRY_RIGHT_FLAG],
13446    ['flip', WRAP_FLIP_FLAG],
13447    ['partial', WRAP_PARTIAL_FLAG],
13448    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
13449    ['rearg', WRAP_REARG_FLAG]
13450  ];
13451
13452  /** `Object#toString` result references. */
13453  var argsTag = '[object Arguments]',
13454      arrayTag = '[object Array]',
13455      asyncTag = '[object AsyncFunction]',
13456      boolTag = '[object Boolean]',
13457      dateTag = '[object Date]',
13458      domExcTag = '[object DOMException]',
13459      errorTag = '[object Error]',
13460      funcTag = '[object Function]',
13461      genTag = '[object GeneratorFunction]',
13462      mapTag = '[object Map]',
13463      numberTag = '[object Number]',
13464      nullTag = '[object Null]',
13465      objectTag = '[object Object]',
13466      promiseTag = '[object Promise]',
13467      proxyTag = '[object Proxy]',
13468      regexpTag = '[object RegExp]',
13469      setTag = '[object Set]',
13470      stringTag = '[object String]',
13471      symbolTag = '[object Symbol]',
13472      undefinedTag = '[object Undefined]',
13473      weakMapTag = '[object WeakMap]',
13474      weakSetTag = '[object WeakSet]';
13475
13476  var arrayBufferTag = '[object ArrayBuffer]',
13477      dataViewTag = '[object DataView]',
13478      float32Tag = '[object Float32Array]',
13479      float64Tag = '[object Float64Array]',
13480      int8Tag = '[object Int8Array]',
13481      int16Tag = '[object Int16Array]',
13482      int32Tag = '[object Int32Array]',
13483      uint8Tag = '[object Uint8Array]',
13484      uint8ClampedTag = '[object Uint8ClampedArray]',
13485      uint16Tag = '[object Uint16Array]',
13486      uint32Tag = '[object Uint32Array]';
13487
13488  /** Used to match empty string literals in compiled template source. */
13489  var reEmptyStringLeading = /\b__p \+= '';/g,
13490      reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
13491      reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
13492
13493  /** Used to match HTML entities and HTML characters. */
13494  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
13495      reUnescapedHtml = /[&<>"']/g,
13496      reHasEscapedHtml = RegExp(reEscapedHtml.source),
13497      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
13498
13499  /** Used to match template delimiters. */
13500  var reEscape = /<%-([\s\S]+?)%>/g,
13501      reEvaluate = /<%([\s\S]+?)%>/g,
13502      reInterpolate = /<%=([\s\S]+?)%>/g;
13503
13504  /** Used to match property names within property paths. */
13505  var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
13506      reIsPlainProp = /^\w*$/,
13507      rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
13508
13509  /**
13510   * Used to match `RegExp`
13511   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
13512   */
13513  var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
13514      reHasRegExpChar = RegExp(reRegExpChar.source);
13515
13516  /** Used to match leading whitespace. */
13517  var reTrimStart = /^\s+/;
13518
13519  /** Used to match a single whitespace character. */
13520  var reWhitespace = /\s/;
13521
13522  /** Used to match wrap detail comments. */
13523  var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
13524      reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
13525      reSplitDetails = /,? & /;
13526
13527  /** Used to match words composed of alphanumeric characters. */
13528  var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
13529
13530  /**
13531   * Used to validate the `validate` option in `_.template` variable.
13532   *
13533   * Forbids characters which could potentially change the meaning of the function argument definition:
13534   * - "()," (modification of function parameters)
13535   * - "=" (default value)
13536   * - "[]{}" (destructuring of function parameters)
13537   * - "/" (beginning of a comment)
13538   * - whitespace
13539   */
13540  var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;
13541
13542  /** Used to match backslashes in property paths. */
13543  var reEscapeChar = /\\(\\)?/g;
13544
13545  /**
13546   * Used to match
13547   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
13548   */
13549  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
13550
13551  /** Used to match `RegExp` flags from their coerced string values. */
13552  var reFlags = /\w*$/;
13553
13554  /** Used to detect bad signed hexadecimal string values. */
13555  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
13556
13557  /** Used to detect binary string values. */
13558  var reIsBinary = /^0b[01]+$/i;
13559
13560  /** Used to detect host constructors (Safari). */
13561  var reIsHostCtor = /^\[object .+?Constructor\]$/;
13562
13563  /** Used to detect octal string values. */
13564  var reIsOctal = /^0o[0-7]+$/i;
13565
13566  /** Used to detect unsigned integer values. */
13567  var reIsUint = /^(?:0|[1-9]\d*)$/;
13568
13569  /** Used to match Latin Unicode letters (excluding mathematical operators). */
13570  var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
13571
13572  /** Used to ensure capturing order of template delimiters. */
13573  var reNoMatch = /($^)/;
13574
13575  /** Used to match unescaped characters in compiled string literals. */
13576  var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
13577
13578  /** Used to compose unicode character classes. */
13579  var rsAstralRange = '\\ud800-\\udfff',
13580      rsComboMarksRange = '\\u0300-\\u036f',
13581      reComboHalfMarksRange = '\\ufe20-\\ufe2f',
13582      rsComboSymbolsRange = '\\u20d0-\\u20ff',
13583      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
13584      rsDingbatRange = '\\u2700-\\u27bf',
13585      rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
13586      rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
13587      rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
13588      rsPunctuationRange = '\\u2000-\\u206f',
13589      rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
13590      rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
13591      rsVarRange = '\\ufe0e\\ufe0f',
13592      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
13593
13594  /** Used to compose unicode capture groups. */
13595  var rsApos = "['\u2019]",
13596      rsAstral = '[' + rsAstralRange + ']',
13597      rsBreak = '[' + rsBreakRange + ']',
13598      rsCombo = '[' + rsComboRange + ']',
13599      rsDigits = '\\d+',
13600      rsDingbat = '[' + rsDingbatRange + ']',
13601      rsLower = '[' + rsLowerRange + ']',
13602      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
13603      rsFitz = '\\ud83c[\\udffb-\\udfff]',
13604      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
13605      rsNonAstral = '[^' + rsAstralRange + ']',
13606      rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
13607      rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
13608      rsUpper = '[' + rsUpperRange + ']',
13609      rsZWJ = '\\u200d';
13610
13611  /** Used to compose unicode regexes. */
13612  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
13613      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
13614      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
13615      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
13616      reOptMod = rsModifier + '?',
13617      rsOptVar = '[' + rsVarRange + ']?',
13618      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
13619      rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
13620      rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
13621      rsSeq = rsOptVar + reOptMod + rsOptJoin,
13622      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
13623      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
13624
13625  /** Used to match apostrophes. */
13626  var reApos = RegExp(rsApos, 'g');
13627
13628  /**
13629   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
13630   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
13631   */
13632  var reComboMark = RegExp(rsCombo, 'g');
13633
13634  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
13635  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
13636
13637  /** Used to match complex or compound words. */
13638  var reUnicodeWord = RegExp([
13639    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
13640    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
13641    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
13642    rsUpper + '+' + rsOptContrUpper,
13643    rsOrdUpper,
13644    rsOrdLower,
13645    rsDigits,
13646    rsEmoji
13647  ].join('|'), 'g');
13648
13649  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
13650  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');
13651
13652  /** Used to detect strings that need a more robust regexp to match words. */
13653  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
13654
13655  /** Used to assign default `context` object properties. */
13656  var contextProps = [
13657    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
13658    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
13659    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
13660    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
13661    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
13662  ];
13663
13664  /** Used to make template sourceURLs easier to identify. */
13665  var templateCounter = -1;
13666
13667  /** Used to identify `toStringTag` values of typed arrays. */
13668  var typedArrayTags = {};
13669  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
13670  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
13671  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
13672  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
13673  typedArrayTags[uint32Tag] = true;
13674  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
13675  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
vendor: 5,923 bytes, lines 13676-13810
13676  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
13677  typedArrayTags[errorTag] = typedArrayTags[funcTag] =
13678  typedArrayTags[mapTag] = typedArrayTags[numberTag] =
13679  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
13680  typedArrayTags[setTag] = typedArrayTags[stringTag] =
13681  typedArrayTags[weakMapTag] = false;
13682
13683  /** Used to identify `toStringTag` values supported by `_.clone`. */
13684  var cloneableTags = {};
13685  cloneableTags[argsTag] = cloneableTags[arrayTag] =
13686  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
13687  cloneableTags[boolTag] = cloneableTags[dateTag] =
13688  cloneableTags[float32Tag] = cloneableTags[float64Tag] =
13689  cloneableTags[int8Tag] = cloneableTags[int16Tag] =
13690  cloneableTags[int32Tag] = cloneableTags[mapTag] =
13691  cloneableTags[numberTag] = cloneableTags[objectTag] =
13692  cloneableTags[regexpTag] = cloneableTags[setTag] =
13693  cloneableTags[stringTag] = cloneableTags[symbolTag] =
13694  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
13695  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
13696  cloneableTags[errorTag] = cloneableTags[funcTag] =
13697  cloneableTags[weakMapTag] = false;
13698
13699  /** Used to map Latin Unicode letters to basic Latin letters. */
13700  var deburredLetters = {
13701    // Latin-1 Supplement block.
13702    '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
13703    '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
13704    '\xc7': 'C',  '\xe7': 'c',
13705    '\xd0': 'D',  '\xf0': 'd',
13706    '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
13707    '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
13708    '\xcc': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
13709    '\xec': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
13710    '\xd1': 'N',  '\xf1': 'n',
13711    '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
13712    '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
13713    '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
13714    '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
13715    '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
13716    '\xc6': 'Ae', '\xe6': 'ae',
13717    '\xde': 'Th', '\xfe': 'th',
13718    '\xdf': 'ss',
13719    // Latin Extended-A block.
13720    '\u0100': 'A',  '\u0102': 'A', '\u0104': 'A',
13721    '\u0101': 'a',  '\u0103': 'a', '\u0105': 'a',
13722    '\u0106': 'C',  '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
13723    '\u0107': 'c',  '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
13724    '\u010e': 'D',  '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
13725    '\u0112': 'E',  '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
13726    '\u0113': 'e',  '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
13727    '\u011c': 'G',  '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
13728    '\u011d': 'g',  '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
13729    '\u0124': 'H',  '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
13730    '\u0128': 'I',  '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
13731    '\u0129': 'i',  '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
13732    '\u0134': 'J',  '\u0135': 'j',
13733    '\u0136': 'K',  '\u0137': 'k', '\u0138': 'k',
13734    '\u0139': 'L',  '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
13735    '\u013a': 'l',  '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
13736    '\u0143': 'N',  '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
13737    '\u0144': 'n',  '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
13738    '\u014c': 'O',  '\u014e': 'O', '\u0150': 'O',
13739    '\u014d': 'o',  '\u014f': 'o', '\u0151': 'o',
13740    '\u0154': 'R',  '\u0156': 'R', '\u0158': 'R',
13741    '\u0155': 'r',  '\u0157': 'r', '\u0159': 'r',
13742    '\u015a': 'S',  '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
13743    '\u015b': 's',  '\u015d': 's', '\u015f': 's', '\u0161': 's',
13744    '\u0162': 'T',  '\u0164': 'T', '\u0166': 'T',
13745    '\u0163': 't',  '\u0165': 't', '\u0167': 't',
13746    '\u0168': 'U',  '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
13747    '\u0169': 'u',  '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
13748    '\u0174': 'W',  '\u0175': 'w',
13749    '\u0176': 'Y',  '\u0177': 'y', '\u0178': 'Y',
13750    '\u0179': 'Z',  '\u017b': 'Z', '\u017d': 'Z',
13751    '\u017a': 'z',  '\u017c': 'z', '\u017e': 'z',
13752    '\u0132': 'IJ', '\u0133': 'ij',
13753    '\u0152': 'Oe', '\u0153': 'oe',
13754    '\u0149': "'n", '\u017f': 's'
13755  };
13756
13757  /** Used to map characters to HTML entities. */
13758  var htmlEscapes = {
13759    '&': '&amp;',
13760    '<': '&lt;',
13761    '>': '&gt;',
13762    '"': '&quot;',
13763    "'": '&#39;'
13764  };
13765
13766  /** Used to map HTML entities to characters. */
13767  var htmlUnescapes = {
13768    '&amp;': '&',
13769    '&lt;': '<',
13770    '&gt;': '>',
13771    '&quot;': '"',
13772    '&#39;': "'"
13773  };
13774
13775  /** Used to escape characters for inclusion in compiled string literals. */
13776  var stringEscapes = {
13777    '\\': '\\',
13778    "'": "'",
13779    '\n': 'n',
13780    '\r': 'r',
13781    '\u2028': 'u2028',
13782    '\u2029': 'u2029'
13783  };
13784
13785  /** Built-in method references without a dependency on `root`. */
13786  var freeParseFloat = parseFloat,
13787      freeParseInt = parseInt;
13788
13789  /** Detect free variable `global` from Node.js. */
13790  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
13791
13792  /** Detect free variable `self`. */
13793  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
13794
13795  /** Used as a reference to the global object. */
13796  var root = freeGlobal || freeSelf || Function('return this')();
13797
13798  /** Detect free variable `exports`. */
13799  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
13800
13801  /** Detect free variable `module`. */
13802  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
13803
13804  /** Detect the popular CommonJS extension `module.exports`. */
13805  var moduleExports = freeModule && freeModule.exports === freeExports;
13806
13807  /** Detect free variable `process` from Node.js. */
13808  var freeProcess = moduleExports && freeGlobal.process;
13809
13810  /** Used to access faster Node.js helpers. */
vendor: 8,860 bytes, lines 13811-14104
13811  var nodeUtil = (function() {
13812    try {
13813      // Use `util.types` for Node.js 10+.
13814      var types = freeModule && freeModule.require && freeModule.require('util').types;
13815
13816      if (types) {
13817        return types;
13818      }
13819
13820      // Legacy `process.binding('util')` for Node.js < 10.
13821      return freeProcess && freeProcess.binding && freeProcess.binding('util');
13822    } catch (e) {}
13823  }());
13824
13825  /* Node.js helper references. */
13826  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
13827      nodeIsDate = nodeUtil && nodeUtil.isDate,
13828      nodeIsMap = nodeUtil && nodeUtil.isMap,
13829      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
13830      nodeIsSet = nodeUtil && nodeUtil.isSet,
13831      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
13832
13833  /*--------------------------------------------------------------------------*/
13834
13835  /**
13836   * A faster alternative to `Function#apply`, this function invokes `func`
13837   * with the `this` binding of `thisArg` and the arguments of `args`.
13838   *
13839   * @private
13840   * @param {Function} func The function to invoke.
13841   * @param {*} thisArg The `this` binding of `func`.
13842   * @param {Array} args The arguments to invoke `func` with.
13843   * @returns {*} Returns the result of `func`.
13844   */
13845  function apply(func, thisArg, args) {
13846    switch (args.length) {
13847      case 0: return func.call(thisArg);
13848      case 1: return func.call(thisArg, args[0]);
13849      case 2: return func.call(thisArg, args[0], args[1]);
13850      case 3: return func.call(thisArg, args[0], args[1], args[2]);
13851    }
13852    return func.apply(thisArg, args);
13853  }
13854
13855  /**
13856   * A specialized version of `baseAggregator` for arrays.
13857   *
13858   * @private
13859   * @param {Array} [array] The array to iterate over.
13860   * @param {Function} setter The function to set `accumulator` values.
13861   * @param {Function} iteratee The iteratee to transform keys.
13862   * @param {Object} accumulator The initial aggregated object.
13863   * @returns {Function} Returns `accumulator`.
13864   */
13865  function arrayAggregator(array, setter, iteratee, accumulator) {
13866    var index = -1,
13867        length = array == null ? 0 : array.length;
13868
13869    while (++index < length) {
13870      var value = array[index];
13871      setter(accumulator, value, iteratee(value), array);
13872    }
13873    return accumulator;
13874  }
13875
13876  /**
13877   * A specialized version of `_.forEach` for arrays without support for
13878   * iteratee shorthands.
13879   *
13880   * @private
13881   * @param {Array} [array] The array to iterate over.
13882   * @param {Function} iteratee The function invoked per iteration.
13883   * @returns {Array} Returns `array`.
13884   */
13885  function arrayEach(array, iteratee) {
13886    var index = -1,
13887        length = array == null ? 0 : array.length;
13888
13889    while (++index < length) {
13890      if (iteratee(array[index], index, array) === false) {
13891        break;
13892      }
13893    }
13894    return array;
13895  }
13896
13897  /**
13898   * A specialized version of `_.forEachRight` for arrays without support for
13899   * iteratee shorthands.
13900   *
13901   * @private
13902   * @param {Array} [array] The array to iterate over.
13903   * @param {Function} iteratee The function invoked per iteration.
13904   * @returns {Array} Returns `array`.
13905   */
13906  function arrayEachRight(array, iteratee) {
13907    var length = array == null ? 0 : array.length;
13908
13909    while (length--) {
13910      if (iteratee(array[length], length, array) === false) {
13911        break;
13912      }
13913    }
13914    return array;
13915  }
13916
13917  /**
13918   * A specialized version of `_.every` for arrays without support for
13919   * iteratee shorthands.
13920   *
13921   * @private
13922   * @param {Array} [array] The array to iterate over.
13923   * @param {Function} predicate The function invoked per iteration.
13924   * @returns {boolean} Returns `true` if all elements pass the predicate check,
13925   *  else `false`.
13926   */
13927  function arrayEvery(array, predicate) {
13928    var index = -1,
13929        length = array == null ? 0 : array.length;
13930
13931    while (++index < length) {
13932      if (!predicate(array[index], index, array)) {
13933        return false;
13934      }
13935    }
13936    return true;
13937  }
13938
13939  /**
13940   * A specialized version of `_.filter` for arrays without support for
13941   * iteratee shorthands.
13942   *
13943   * @private
13944   * @param {Array} [array] The array to iterate over.
13945   * @param {Function} predicate The function invoked per iteration.
13946   * @returns {Array} Returns the new filtered array.
13947   */
13948  function arrayFilter(array, predicate) {
13949    var index = -1,
13950        length = array == null ? 0 : array.length,
13951        resIndex = 0,
13952        result = [];
13953
13954    while (++index < length) {
13955      var value = array[index];
13956      if (predicate(value, index, array)) {
13957        result[resIndex++] = value;
13958      }
13959    }
13960    return result;
13961  }
13962
13963  /**
13964   * A specialized version of `_.includes` for arrays without support for
13965   * specifying an index to search from.
13966   *
13967   * @private
13968   * @param {Array} [array] The array to inspect.
13969   * @param {*} target The value to search for.
13970   * @returns {boolean} Returns `true` if `target` is found, else `false`.
13971   */
13972  function arrayIncludes(array, value) {
13973    var length = array == null ? 0 : array.length;
13974    return !!length && baseIndexOf(array, value, 0) > -1;
13975  }
13976
13977  /**
13978   * This function is like `arrayIncludes` except that it accepts a comparator.
13979   *
13980   * @private
13981   * @param {Array} [array] The array to inspect.
13982   * @param {*} target The value to search for.
13983   * @param {Function} comparator The comparator invoked per element.
13984   * @returns {boolean} Returns `true` if `target` is found, else `false`.
13985   */
13986  function arrayIncludesWith(array, value, comparator) {
13987    var index = -1,
13988        length = array == null ? 0 : array.length;
13989
13990    while (++index < length) {
13991      if (comparator(value, array[index])) {
13992        return true;
13993      }
13994    }
13995    return false;
13996  }
13997
13998  /**
13999   * A specialized version of `_.map` for arrays without support for iteratee
14000   * shorthands.
14001   *
14002   * @private
14003   * @param {Array} [array] The array to iterate over.
14004   * @param {Function} iteratee The function invoked per iteration.
14005   * @returns {Array} Returns the new mapped array.
14006   */
14007  function arrayMap(array, iteratee) {
14008    var index = -1,
14009        length = array == null ? 0 : array.length,
14010        result = Array(length);
14011
14012    while (++index < length) {
14013      result[index] = iteratee(array[index], index, array);
14014    }
14015    return result;
14016  }
14017
14018  /**
14019   * Appends the elements of `values` to `array`.
14020   *
14021   * @private
14022   * @param {Array} array The array to modify.
14023   * @param {Array} values The values to append.
14024   * @returns {Array} Returns `array`.
14025   */
14026  function arrayPush(array, values) {
14027    var index = -1,
14028        length = values.length,
14029        offset = array.length;
14030
14031    while (++index < length) {
14032      array[offset + index] = values[index];
14033    }
14034    return array;
14035  }
14036
14037  /**
14038   * A specialized version of `_.reduce` for arrays without support for
14039   * iteratee shorthands.
14040   *
14041   * @private
14042   * @param {Array} [array] The array to iterate over.
14043   * @param {Function} iteratee The function invoked per iteration.
14044   * @param {*} [accumulator] The initial value.
14045   * @param {boolean} [initAccum] Specify using the first element of `array` as
14046   *  the initial value.
14047   * @returns {*} Returns the accumulated value.
14048   */
14049  function arrayReduce(array, iteratee, accumulator, initAccum) {
14050    var index = -1,
14051        length = array == null ? 0 : array.length;
14052
14053    if (initAccum && length) {
14054      accumulator = array[++index];
14055    }
14056    while (++index < length) {
14057      accumulator = iteratee(accumulator, array[index], index, array);
14058    }
14059    return accumulator;
14060  }
14061
14062  /**
14063   * A specialized version of `_.reduceRight` for arrays without support for
14064   * iteratee shorthands.
14065   *
14066   * @private
14067   * @param {Array} [array] The array to iterate over.
14068   * @param {Function} iteratee The function invoked per iteration.
14069   * @param {*} [accumulator] The initial value.
14070   * @param {boolean} [initAccum] Specify using the last element of `array` as
14071   *  the initial value.
14072   * @returns {*} Returns the accumulated value.
14073   */
14074  function arrayReduceRight(array, iteratee, accumulator, initAccum) {
14075    var length = array == null ? 0 : array.length;
14076    if (initAccum && length) {
14077      accumulator = array[--length];
14078    }
14079    while (length--) {
14080      accumulator = iteratee(accumulator, array[length], length, array);
14081    }
14082    return accumulator;
14083  }
14084
14085  /**
14086   * A specialized version of `_.some` for arrays without support for iteratee
14087   * shorthands.
14088   *
14089   * @private
14090   * @param {Array} [array] The array to iterate over.
14091   * @param {Function} predicate The function invoked per iteration.
14092   * @returns {boolean} Returns `true` if any element passes the predicate check,
14093   *  else `false`.
14094   */
14095  function arraySome(array, predicate) {
14096    var index = -1,
14097        length = array == null ? 0 : array.length;
14098
14099    while (++index < length) {
14100      if (predicate(array[index], index, array)) {
14101        return true;
14102      }
14103    }
14104    return false;
vendor: 12,899 bytes, lines 14105-14542
14105  }
14106
14107  /**
14108   * Gets the size of an ASCII `string`.
14109   *
14110   * @private
14111   * @param {string} string The string inspect.
14112   * @returns {number} Returns the string size.
14113   */
14114  var asciiSize = baseProperty('length');
14115
14116  /**
14117   * Converts an ASCII `string` to an array.
14118   *
14119   * @private
14120   * @param {string} string The string to convert.
14121   * @returns {Array} Returns the converted array.
14122   */
14123  function asciiToArray(string) {
14124    return string.split('');
14125  }
14126
14127  /**
14128   * Splits an ASCII `string` into an array of its words.
14129   *
14130   * @private
14131   * @param {string} The string to inspect.
14132   * @returns {Array} Returns the words of `string`.
14133   */
14134  function asciiWords(string) {
14135    return string.match(reAsciiWord) || [];
14136  }
14137
14138  /**
14139   * The base implementation of methods like `_.findKey` and `_.findLastKey`,
14140   * without support for iteratee shorthands, which iterates over `collection`
14141   * using `eachFunc`.
14142   *
14143   * @private
14144   * @param {Array|Object} collection The collection to inspect.
14145   * @param {Function} predicate The function invoked per iteration.
14146   * @param {Function} eachFunc The function to iterate over `collection`.
14147   * @returns {*} Returns the found element or its key, else `undefined`.
14148   */
14149  function baseFindKey(collection, predicate, eachFunc) {
14150    var result;
14151    eachFunc(collection, function(value, key, collection) {
14152      if (predicate(value, key, collection)) {
14153        result = key;
14154        return false;
14155      }
14156    });
14157    return result;
14158  }
14159
14160  /**
14161   * The base implementation of `_.findIndex` and `_.findLastIndex` without
14162   * support for iteratee shorthands.
14163   *
14164   * @private
14165   * @param {Array} array The array to inspect.
14166   * @param {Function} predicate The function invoked per iteration.
14167   * @param {number} fromIndex The index to search from.
14168   * @param {boolean} [fromRight] Specify iterating from right to left.
14169   * @returns {number} Returns the index of the matched value, else `-1`.
14170   */
14171  function baseFindIndex(array, predicate, fromIndex, fromRight) {
14172    var length = array.length,
14173        index = fromIndex + (fromRight ? 1 : -1);
14174
14175    while ((fromRight ? index-- : ++index < length)) {
14176      if (predicate(array[index], index, array)) {
14177        return index;
14178      }
14179    }
14180    return -1;
14181  }
14182
14183  /**
14184   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
14185   *
14186   * @private
14187   * @param {Array} array The array to inspect.
14188   * @param {*} value The value to search for.
14189   * @param {number} fromIndex The index to search from.
14190   * @returns {number} Returns the index of the matched value, else `-1`.
14191   */
14192  function baseIndexOf(array, value, fromIndex) {
14193    return value === value
14194      ? strictIndexOf(array, value, fromIndex)
14195      : baseFindIndex(array, baseIsNaN, fromIndex);
14196  }
14197
14198  /**
14199   * This function is like `baseIndexOf` except that it accepts a comparator.
14200   *
14201   * @private
14202   * @param {Array} array The array to inspect.
14203   * @param {*} value The value to search for.
14204   * @param {number} fromIndex The index to search from.
14205   * @param {Function} comparator The comparator invoked per element.
14206   * @returns {number} Returns the index of the matched value, else `-1`.
14207   */
14208  function baseIndexOfWith(array, value, fromIndex, comparator) {
14209    var index = fromIndex - 1,
14210        length = array.length;
14211
14212    while (++index < length) {
14213      if (comparator(array[index], value)) {
14214        return index;
14215      }
14216    }
14217    return -1;
14218  }
14219
14220  /**
14221   * The base implementation of `_.isNaN` without support for number objects.
14222   *
14223   * @private
14224   * @param {*} value The value to check.
14225   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
14226   */
14227  function baseIsNaN(value) {
14228    return value !== value;
14229  }
14230
14231  /**
14232   * The base implementation of `_.mean` and `_.meanBy` without support for
14233   * iteratee shorthands.
14234   *
14235   * @private
14236   * @param {Array} array The array to iterate over.
14237   * @param {Function} iteratee The function invoked per iteration.
14238   * @returns {number} Returns the mean.
14239   */
14240  function baseMean(array, iteratee) {
14241    var length = array == null ? 0 : array.length;
14242    return length ? (baseSum(array, iteratee) / length) : NAN;
14243  }
14244
14245  /**
14246   * The base implementation of `_.property` without support for deep paths.
14247   *
14248   * @private
14249   * @param {string} key The key of the property to get.
14250   * @returns {Function} Returns the new accessor function.
14251   */
14252  function baseProperty(key) {
14253    return function(object) {
14254      return object == null ? undefined : object[key];
14255    };
14256  }
14257
14258  /**
14259   * The base implementation of `_.propertyOf` without support for deep paths.
14260   *
14261   * @private
14262   * @param {Object} object The object to query.
14263   * @returns {Function} Returns the new accessor function.
14264   */
14265  function basePropertyOf(object) {
14266    return function(key) {
14267      return object == null ? undefined : object[key];
14268    };
14269  }
14270
14271  /**
14272   * The base implementation of `_.reduce` and `_.reduceRight`, without support
14273   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
14274   *
14275   * @private
14276   * @param {Array|Object} collection The collection to iterate over.
14277   * @param {Function} iteratee The function invoked per iteration.
14278   * @param {*} accumulator The initial value.
14279   * @param {boolean} initAccum Specify using the first or last element of
14280   *  `collection` as the initial value.
14281   * @param {Function} eachFunc The function to iterate over `collection`.
14282   * @returns {*} Returns the accumulated value.
14283   */
14284  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
14285    eachFunc(collection, function(value, index, collection) {
14286      accumulator = initAccum
14287        ? (initAccum = false, value)
14288        : iteratee(accumulator, value, index, collection);
14289    });
14290    return accumulator;
14291  }
14292
14293  /**
14294   * The base implementation of `_.sortBy` which uses `comparer` to define the
14295   * sort order of `array` and replaces criteria objects with their corresponding
14296   * values.
14297   *
14298   * @private
14299   * @param {Array} array The array to sort.
14300   * @param {Function} comparer The function to define sort order.
14301   * @returns {Array} Returns `array`.
14302   */
14303  function baseSortBy(array, comparer) {
14304    var length = array.length;
14305
14306    array.sort(comparer);
14307    while (length--) {
14308      array[length] = array[length].value;
14309    }
14310    return array;
14311  }
14312
14313  /**
14314   * The base implementation of `_.sum` and `_.sumBy` without support for
14315   * iteratee shorthands.
14316   *
14317   * @private
14318   * @param {Array} array The array to iterate over.
14319   * @param {Function} iteratee The function invoked per iteration.
14320   * @returns {number} Returns the sum.
14321   */
14322  function baseSum(array, iteratee) {
14323    var result,
14324        index = -1,
14325        length = array.length;
14326
14327    while (++index < length) {
14328      var current = iteratee(array[index]);
14329      if (current !== undefined) {
14330        result = result === undefined ? current : (result + current);
14331      }
14332    }
14333    return result;
14334  }
14335
14336  /**
14337   * The base implementation of `_.times` without support for iteratee shorthands
14338   * or max array length checks.
14339   *
14340   * @private
14341   * @param {number} n The number of times to invoke `iteratee`.
14342   * @param {Function} iteratee The function invoked per iteration.
14343   * @returns {Array} Returns the array of results.
14344   */
14345  function baseTimes(n, iteratee) {
14346    var index = -1,
14347        result = Array(n);
14348
14349    while (++index < n) {
14350      result[index] = iteratee(index);
14351    }
14352    return result;
14353  }
14354
14355  /**
14356   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
14357   * of key-value pairs for `object` corresponding to the property names of `props`.
14358   *
14359   * @private
14360   * @param {Object} object The object to query.
14361   * @param {Array} props The property names to get values for.
14362   * @returns {Object} Returns the key-value pairs.
14363   */
14364  function baseToPairs(object, props) {
14365    return arrayMap(props, function(key) {
14366      return [key, object[key]];
14367    });
14368  }
14369
14370  /**
14371   * The base implementation of `_.trim`.
14372   *
14373   * @private
14374   * @param {string} string The string to trim.
14375   * @returns {string} Returns the trimmed string.
14376   */
14377  function baseTrim(string) {
14378    return string
14379      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')
14380      : string;
14381  }
14382
14383  /**
14384   * The base implementation of `_.unary` without support for storing metadata.
14385   *
14386   * @private
14387   * @param {Function} func The function to cap arguments for.
14388   * @returns {Function} Returns the new capped function.
14389   */
14390  function baseUnary(func) {
14391    return function(value) {
14392      return func(value);
14393    };
14394  }
14395
14396  /**
14397   * The base implementation of `_.values` and `_.valuesIn` which creates an
14398   * array of `object` property values corresponding to the property names
14399   * of `props`.
14400   *
14401   * @private
14402   * @param {Object} object The object to query.
14403   * @param {Array} props The property names to get values for.
14404   * @returns {Object} Returns the array of property values.
14405   */
14406  function baseValues(object, props) {
14407    return arrayMap(props, function(key) {
14408      return object[key];
14409    });
14410  }
14411
14412  /**
14413   * Checks if a `cache` value for `key` exists.
14414   *
14415   * @private
14416   * @param {Object} cache The cache to query.
14417   * @param {string} key The key of the entry to check.
14418   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
14419   */
14420  function cacheHas(cache, key) {
14421    return cache.has(key);
14422  }
14423
14424  /**
14425   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
14426   * that is not found in the character symbols.
14427   *
14428   * @private
14429   * @param {Array} strSymbols The string symbols to inspect.
14430   * @param {Array} chrSymbols The character symbols to find.
14431   * @returns {number} Returns the index of the first unmatched string symbol.
14432   */
14433  function charsStartIndex(strSymbols, chrSymbols) {
14434    var index = -1,
14435        length = strSymbols.length;
14436
14437    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
14438    return index;
14439  }
14440
14441  /**
14442   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
14443   * that is not found in the character symbols.
14444   *
14445   * @private
14446   * @param {Array} strSymbols The string symbols to inspect.
14447   * @param {Array} chrSymbols The character symbols to find.
14448   * @returns {number} Returns the index of the last unmatched string symbol.
14449   */
14450  function charsEndIndex(strSymbols, chrSymbols) {
14451    var index = strSymbols.length;
14452
14453    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
14454    return index;
14455  }
14456
14457  /**
14458   * Gets the number of `placeholder` occurrences in `array`.
14459   *
14460   * @private
14461   * @param {Array} array The array to inspect.
14462   * @param {*} placeholder The placeholder to search for.
14463   * @returns {number} Returns the placeholder count.
14464   */
14465  function countHolders(array, placeholder) {
14466    var length = array.length,
14467        result = 0;
14468
14469    while (length--) {
14470      if (array[length] === placeholder) {
14471        ++result;
14472      }
14473    }
14474    return result;
14475  }
14476
14477  /**
14478   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
14479   * letters to basic Latin letters.
14480   *
14481   * @private
14482   * @param {string} letter The matched letter to deburr.
14483   * @returns {string} Returns the deburred letter.
14484   */
14485  var deburrLetter = basePropertyOf(deburredLetters);
14486
14487  /**
14488   * Used by `_.escape` to convert characters to HTML entities.
14489   *
14490   * @private
14491   * @param {string} chr The matched character to escape.
14492   * @returns {string} Returns the escaped character.
14493   */
14494  var escapeHtmlChar = basePropertyOf(htmlEscapes);
14495
14496  /**
14497   * Used by `_.template` to escape characters for inclusion in compiled string literals.
14498   *
14499   * @private
14500   * @param {string} chr The matched character to escape.
14501   * @returns {string} Returns the escaped character.
14502   */
14503  function escapeStringChar(chr) {
14504    return '\\' + stringEscapes[chr];
14505  }
14506
14507  /**
14508   * Gets the value at `key` of `object`.
14509   *
14510   * @private
14511   * @param {Object} [object] The object to query.
14512   * @param {string} key The key of the property to get.
14513   * @returns {*} Returns the property value.
14514   */
14515  function getValue(object, key) {
14516    return object == null ? undefined : object[key];
14517  }
14518
14519  /**
14520   * Checks if `string` contains Unicode symbols.
14521   *
14522   * @private
14523   * @param {string} string The string to inspect.
14524   * @returns {boolean} Returns `true` if a symbol is found, else `false`.
14525   */
14526  function hasUnicode(string) {
14527    return reHasUnicode.test(string);
14528  }
14529
14530  /**
14531   * Checks if `string` contains a word composed of Unicode symbols.
14532   *
14533   * @private
14534   * @param {string} string The string to inspect.
14535   * @returns {boolean} Returns `true` if a word is found, else `false`.
14536   */
14537  function hasUnicodeWord(string) {
14538    return reHasUnicodeWord.test(string);
14539  }
14540
14541  /**
14542   * Converts `iterator` to an array.
vendor: 8,214 bytes, lines 14543-14852
14543   *
14544   * @private
14545   * @param {Object} iterator The iterator to convert.
14546   * @returns {Array} Returns the converted array.
14547   */
14548  function iteratorToArray(iterator) {
14549    var data,
14550        result = [];
14551
14552    while (!(data = iterator.next()).done) {
14553      result.push(data.value);
14554    }
14555    return result;
14556  }
14557
14558  /**
14559   * Converts `map` to its key-value pairs.
14560   *
14561   * @private
14562   * @param {Object} map The map to convert.
14563   * @returns {Array} Returns the key-value pairs.
14564   */
14565  function mapToArray(map) {
14566    var index = -1,
14567        result = Array(map.size);
14568
14569    map.forEach(function(value, key) {
14570      result[++index] = [key, value];
14571    });
14572    return result;
14573  }
14574
14575  /**
14576   * Creates a unary function that invokes `func` with its argument transformed.
14577   *
14578   * @private
14579   * @param {Function} func The function to wrap.
14580   * @param {Function} transform The argument transform.
14581   * @returns {Function} Returns the new function.
14582   */
14583  function overArg(func, transform) {
14584    return function(arg) {
14585      return func(transform(arg));
14586    };
14587  }
14588
14589  /**
14590   * Replaces all `placeholder` elements in `array` with an internal placeholder
14591   * and returns an array of their indexes.
14592   *
14593   * @private
14594   * @param {Array} array The array to modify.
14595   * @param {*} placeholder The placeholder to replace.
14596   * @returns {Array} Returns the new array of placeholder indexes.
14597   */
14598  function replaceHolders(array, placeholder) {
14599    var index = -1,
14600        length = array.length,
14601        resIndex = 0,
14602        result = [];
14603
14604    while (++index < length) {
14605      var value = array[index];
14606      if (value === placeholder || value === PLACEHOLDER) {
14607        array[index] = PLACEHOLDER;
14608        result[resIndex++] = index;
14609      }
14610    }
14611    return result;
14612  }
14613
14614  /**
14615   * Converts `set` to an array of its values.
14616   *
14617   * @private
14618   * @param {Object} set The set to convert.
14619   * @returns {Array} Returns the values.
14620   */
14621  function setToArray(set) {
14622    var index = -1,
14623        result = Array(set.size);
14624
14625    set.forEach(function(value) {
14626      result[++index] = value;
14627    });
14628    return result;
14629  }
14630
14631  /**
14632   * Converts `set` to its value-value pairs.
14633   *
14634   * @private
14635   * @param {Object} set The set to convert.
14636   * @returns {Array} Returns the value-value pairs.
14637   */
14638  function setToPairs(set) {
14639    var index = -1,
14640        result = Array(set.size);
14641
14642    set.forEach(function(value) {
14643      result[++index] = [value, value];
14644    });
14645    return result;
14646  }
14647
14648  /**
14649   * A specialized version of `_.indexOf` which performs strict equality
14650   * comparisons of values, i.e. `===`.
14651   *
14652   * @private
14653   * @param {Array} array The array to inspect.
14654   * @param {*} value The value to search for.
14655   * @param {number} fromIndex The index to search from.
14656   * @returns {number} Returns the index of the matched value, else `-1`.
14657   */
14658  function strictIndexOf(array, value, fromIndex) {
14659    var index = fromIndex - 1,
14660        length = array.length;
14661
14662    while (++index < length) {
14663      if (array[index] === value) {
14664        return index;
14665      }
14666    }
14667    return -1;
14668  }
14669
14670  /**
14671   * A specialized version of `_.lastIndexOf` which performs strict equality
14672   * comparisons of values, i.e. `===`.
14673   *
14674   * @private
14675   * @param {Array} array The array to inspect.
14676   * @param {*} value The value to search for.
14677   * @param {number} fromIndex The index to search from.
14678   * @returns {number} Returns the index of the matched value, else `-1`.
14679   */
14680  function strictLastIndexOf(array, value, fromIndex) {
14681    var index = fromIndex + 1;
14682    while (index--) {
14683      if (array[index] === value) {
14684        return index;
14685      }
14686    }
14687    return index;
14688  }
14689
14690  /**
14691   * Gets the number of symbols in `string`.
14692   *
14693   * @private
14694   * @param {string} string The string to inspect.
14695   * @returns {number} Returns the string size.
14696   */
14697  function stringSize(string) {
14698    return hasUnicode(string)
14699      ? unicodeSize(string)
14700      : asciiSize(string);
14701  }
14702
14703  /**
14704   * Converts `string` to an array.
14705   *
14706   * @private
14707   * @param {string} string The string to convert.
14708   * @returns {Array} Returns the converted array.
14709   */
14710  function stringToArray(string) {
14711    return hasUnicode(string)
14712      ? unicodeToArray(string)
14713      : asciiToArray(string);
14714  }
14715
14716  /**
14717   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
14718   * character of `string`.
14719   *
14720   * @private
14721   * @param {string} string The string to inspect.
14722   * @returns {number} Returns the index of the last non-whitespace character.
14723   */
14724  function trimmedEndIndex(string) {
14725    var index = string.length;
14726
14727    while (index-- && reWhitespace.test(string.charAt(index))) {}
14728    return index;
14729  }
14730
14731  /**
14732   * Used by `_.unescape` to convert HTML entities to characters.
14733   *
14734   * @private
14735   * @param {string} chr The matched character to unescape.
14736   * @returns {string} Returns the unescaped character.
14737   */
14738  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
14739
14740  /**
14741   * Gets the size of a Unicode `string`.
14742   *
14743   * @private
14744   * @param {string} string The string inspect.
14745   * @returns {number} Returns the string size.
14746   */
14747  function unicodeSize(string) {
14748    var result = reUnicode.lastIndex = 0;
14749    while (reUnicode.test(string)) {
14750      ++result;
14751    }
14752    return result;
14753  }
14754
14755  /**
14756   * Converts a Unicode `string` to an array.
14757   *
14758   * @private
14759   * @param {string} string The string to convert.
14760   * @returns {Array} Returns the converted array.
14761   */
14762  function unicodeToArray(string) {
14763    return string.match(reUnicode) || [];
14764  }
14765
14766  /**
14767   * Splits a Unicode `string` into an array of its words.
14768   *
14769   * @private
14770   * @param {string} The string to inspect.
14771   * @returns {Array} Returns the words of `string`.
14772   */
14773  function unicodeWords(string) {
14774    return string.match(reUnicodeWord) || [];
14775  }
14776
14777  /*--------------------------------------------------------------------------*/
14778
14779  /**
14780   * Create a new pristine `lodash` function using the `context` object.
14781   *
14782   * @static
14783   * @memberOf _
14784   * @since 1.1.0
14785   * @category Util
14786   * @param {Object} [context=root] The context object.
14787   * @returns {Function} Returns a new `lodash` function.
14788   * @example
14789   *
14790   * _.mixin({ 'foo': _.constant('foo') });
14791   *
14792   * var lodash = _.runInContext();
14793   * lodash.mixin({ 'bar': lodash.constant('bar') });
14794   *
14795   * _.isFunction(_.foo);
14796   * // => true
14797   * _.isFunction(_.bar);
14798   * // => false
14799   *
14800   * lodash.isFunction(lodash.foo);
14801   * // => false
14802   * lodash.isFunction(lodash.bar);
14803   * // => true
14804   *
14805   * // Create a suped-up `defer` in Node.js.
14806   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
14807   */
14808  var runInContext = (function runInContext(context) {
14809    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
14810
14811    /** Built-in constructor references. */
14812    var Array = context.Array,
14813        Date = context.Date,
14814        Error = context.Error,
14815        Function = context.Function,
14816        Math = context.Math,
14817        Object = context.Object,
14818        RegExp = context.RegExp,
14819        String = context.String,
14820        TypeError = context.TypeError;
14821
14822    /** Used for built-in method references. */
14823    var arrayProto = Array.prototype,
14824        funcProto = Function.prototype,
14825        objectProto = Object.prototype;
14826
14827    /** Used to detect overreaching core-js shims. */
14828    var coreJsData = context['__core-js_shared__'];
14829
14830    /** Used to resolve the decompiled source of functions. */
14831    var funcToString = funcProto.toString;
14832
14833    /** Used to check objects for own properties. */
14834    var hasOwnProperty = objectProto.hasOwnProperty;
14835
14836    /** Used to generate unique IDs. */
14837    var idCounter = 0;
14838
14839    /** Used to detect methods masquerading as native. */
14840    var maskSrcKey = (function() {
14841      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
14842      return uid ? ('Symbol(src)_1.' + uid) : '';
14843    }());
14844
14845    /**
14846     * Used to resolve the
14847     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
14848     * of values.
14849     */
14850    var nativeObjectToString = objectProto.toString;
14851
14852    /** Used to infer the `Object` constructor. */
vendor: 25,659 bytes, lines 14853-15650
14853    var objectCtorString = funcToString.call(Object);
14854
14855    /** Used to restore the original `_` reference in `_.noConflict`. */
14856    var oldDash = root._;
14857
14858    /** Used to detect if a method is native. */
14859    var reIsNative = RegExp('^' +
14860      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
14861      .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
14862    );
14863
14864    /** Built-in value references. */
14865    var Buffer = moduleExports ? context.Buffer : undefined,
14866        Symbol = context.Symbol,
14867        Uint8Array = context.Uint8Array,
14868        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
14869        getPrototype = overArg(Object.getPrototypeOf, Object),
14870        objectCreate = Object.create,
14871        propertyIsEnumerable = objectProto.propertyIsEnumerable,
14872        splice = arrayProto.splice,
14873        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
14874        symIterator = Symbol ? Symbol.iterator : undefined,
14875        symToStringTag = Symbol ? Symbol.toStringTag : undefined;
14876
14877    var defineProperty = (function() {
14878      try {
14879        var func = getNative(Object, 'defineProperty');
14880        func({}, '', {});
14881        return func;
14882      } catch (e) {}
14883    }());
14884
14885    /** Mocked built-ins. */
14886    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
14887        ctxNow = Date && Date.now !== root.Date.now && Date.now,
14888        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
14889
14890    /* Built-in method references for those with the same name as other `lodash` methods. */
14891    var nativeCeil = Math.ceil,
14892        nativeFloor = Math.floor,
14893        nativeGetSymbols = Object.getOwnPropertySymbols,
14894        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
14895        nativeIsFinite = context.isFinite,
14896        nativeJoin = arrayProto.join,
14897        nativeKeys = overArg(Object.keys, Object),
14898        nativeMax = Math.max,
14899        nativeMin = Math.min,
14900        nativeNow = Date.now,
14901        nativeParseInt = context.parseInt,
14902        nativeRandom = Math.random,
14903        nativeReverse = arrayProto.reverse;
14904
14905    /* Built-in method references that are verified to be native. */
14906    var DataView = getNative(context, 'DataView'),
14907        Map = getNative(context, 'Map'),
14908        Promise = getNative(context, 'Promise'),
14909        Set = getNative(context, 'Set'),
14910        WeakMap = getNative(context, 'WeakMap'),
14911        nativeCreate = getNative(Object, 'create');
14912
14913    /** Used to store function metadata. */
14914    var metaMap = WeakMap && new WeakMap;
14915
14916    /** Used to lookup unminified function names. */
14917    var realNames = {};
14918
14919    /** Used to detect maps, sets, and weakmaps. */
14920    var dataViewCtorString = toSource(DataView),
14921        mapCtorString = toSource(Map),
14922        promiseCtorString = toSource(Promise),
14923        setCtorString = toSource(Set),
14924        weakMapCtorString = toSource(WeakMap);
14925
14926    /** Used to convert symbols to primitives and strings. */
14927    var symbolProto = Symbol ? Symbol.prototype : undefined,
14928        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
14929        symbolToString = symbolProto ? symbolProto.toString : undefined;
14930
14931    /*------------------------------------------------------------------------*/
14932
14933    /**
14934     * Creates a `lodash` object which wraps `value` to enable implicit method
14935     * chain sequences. Methods that operate on and return arrays, collections,
14936     * and functions can be chained together. Methods that retrieve a single value
14937     * or may return a primitive value will automatically end the chain sequence
14938     * and return the unwrapped value. Otherwise, the value must be unwrapped
14939     * with `_#value`.
14940     *
14941     * Explicit chain sequences, which must be unwrapped with `_#value`, may be
14942     * enabled using `_.chain`.
14943     *
14944     * The execution of chained methods is lazy, that is, it's deferred until
14945     * `_#value` is implicitly or explicitly called.
14946     *
14947     * Lazy evaluation allows several methods to support shortcut fusion.
14948     * Shortcut fusion is an optimization to merge iteratee calls; this avoids
14949     * the creation of intermediate arrays and can greatly reduce the number of
14950     * iteratee executions. Sections of a chain sequence qualify for shortcut
14951     * fusion if the section is applied to an array and iteratees accept only
14952     * one argument. The heuristic for whether a section qualifies for shortcut
14953     * fusion is subject to change.
14954     *
14955     * Chaining is supported in custom builds as long as the `_#value` method is
14956     * directly or indirectly included in the build.
14957     *
14958     * In addition to lodash methods, wrappers have `Array` and `String` methods.
14959     *
14960     * The wrapper `Array` methods are:
14961     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
14962     *
14963     * The wrapper `String` methods are:
14964     * `replace` and `split`
14965     *
14966     * The wrapper methods that support shortcut fusion are:
14967     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
14968     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
14969     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
14970     *
14971     * The chainable wrapper methods are:
14972     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
14973     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
14974     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
14975     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
14976     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
14977     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
14978     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
14979     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
14980     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
14981     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
14982     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
14983     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
14984     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
14985     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
14986     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
14987     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
14988     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
14989     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
14990     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
14991     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
14992     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
14993     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
14994     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
14995     * `zipObject`, `zipObjectDeep`, and `zipWith`
14996     *
14997     * The wrapper methods that are **not** chainable by default are:
14998     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
14999     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
15000     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
15001     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
15002     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
15003     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
15004     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
15005     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
15006     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
15007     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
15008     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
15009     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
15010     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
15011     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
15012     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
15013     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
15014     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
15015     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
15016     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
15017     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
15018     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
15019     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
15020     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
15021     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
15022     * `upperFirst`, `value`, and `words`
15023     *
15024     * @name _
15025     * @constructor
15026     * @category Seq
15027     * @param {*} value The value to wrap in a `lodash` instance.
15028     * @returns {Object} Returns the new `lodash` wrapper instance.
15029     * @example
15030     *
15031     * function square(n) {
15032     *   return n * n;
15033     * }
15034     *
15035     * var wrapped = _([1, 2, 3]);
15036     *
15037     * // Returns an unwrapped value.
15038     * wrapped.reduce(_.add);
15039     * // => 6
15040     *
15041     * // Returns a wrapped value.
15042     * var squares = wrapped.map(square);
15043     *
15044     * _.isArray(squares);
15045     * // => false
15046     *
15047     * _.isArray(squares.value());
15048     * // => true
15049     */
15050    function lodash(value) {
15051      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
15052        if (value instanceof LodashWrapper) {
15053          return value;
15054        }
15055        if (hasOwnProperty.call(value, '__wrapped__')) {
15056          return wrapperClone(value);
15057        }
15058      }
15059      return new LodashWrapper(value);
15060    }
15061
15062    /**
15063     * The base implementation of `_.create` without support for assigning
15064     * properties to the created object.
15065     *
15066     * @private
15067     * @param {Object} proto The object to inherit from.
15068     * @returns {Object} Returns the new object.
15069     */
15070    var baseCreate = (function() {
15071      function object() {}
15072      return function(proto) {
15073        if (!isObject(proto)) {
15074          return {};
15075        }
15076        if (objectCreate) {
15077          return objectCreate(proto);
15078        }
15079        object.prototype = proto;
15080        var result = new object;
15081        object.prototype = undefined;
15082        return result;
15083      };
15084    }());
15085
15086    /**
15087     * The function whose prototype chain sequence wrappers inherit from.
15088     *
15089     * @private
15090     */
15091    function baseLodash() {
15092      // No operation performed.
15093    }
15094
15095    /**
15096     * The base constructor for creating `lodash` wrapper objects.
15097     *
15098     * @private
15099     * @param {*} value The value to wrap.
15100     * @param {boolean} [chainAll] Enable explicit method chain sequences.
15101     */
15102    function LodashWrapper(value, chainAll) {
15103      this.__wrapped__ = value;
15104      this.__actions__ = [];
15105      this.__chain__ = !!chainAll;
15106      this.__index__ = 0;
15107      this.__values__ = undefined;
15108    }
15109
15110    /**
15111     * By default, the template delimiters used by lodash are like those in
15112     * embedded Ruby (ERB) as well as ES2015 template strings. Change the
15113     * following template settings to use alternative delimiters.
15114     *
15115     * @static
15116     * @memberOf _
15117     * @type {Object}
15118     */
15119    lodash.templateSettings = {
15120
15121      /**
15122       * Used to detect `data` property values to be HTML-escaped.
15123       *
15124       * @memberOf _.templateSettings
15125       * @type {RegExp}
15126       */
15127      'escape': reEscape,
15128
15129      /**
15130       * Used to detect code to be evaluated.
15131       *
15132       * @memberOf _.templateSettings
15133       * @type {RegExp}
15134       */
15135      'evaluate': reEvaluate,
15136
15137      /**
15138       * Used to detect `data` property values to inject.
15139       *
15140       * @memberOf _.templateSettings
15141       * @type {RegExp}
15142       */
15143      'interpolate': reInterpolate,
15144
15145      /**
15146       * Used to reference the data object in the template text.
15147       *
15148       * @memberOf _.templateSettings
15149       * @type {string}
15150       */
15151      'variable': '',
15152
15153      /**
15154       * Used to import variables into the compiled template.
15155       *
15156       * @memberOf _.templateSettings
15157       * @type {Object}
15158       */
15159      'imports': {
15160
15161        /**
15162         * A reference to the `lodash` function.
15163         *
15164         * @memberOf _.templateSettings.imports
15165         * @type {Function}
15166         */
15167        '_': lodash
15168      }
15169    };
15170
15171    // Ensure wrappers are instances of `baseLodash`.
15172    lodash.prototype = baseLodash.prototype;
15173    lodash.prototype.constructor = lodash;
15174
15175    LodashWrapper.prototype = baseCreate(baseLodash.prototype);
15176    LodashWrapper.prototype.constructor = LodashWrapper;
15177
15178    /*------------------------------------------------------------------------*/
15179
15180    /**
15181     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
15182     *
15183     * @private
15184     * @constructor
15185     * @param {*} value The value to wrap.
15186     */
15187    function LazyWrapper(value) {
15188      this.__wrapped__ = value;
15189      this.__actions__ = [];
15190      this.__dir__ = 1;
15191      this.__filtered__ = false;
15192      this.__iteratees__ = [];
15193      this.__takeCount__ = MAX_ARRAY_LENGTH;
15194      this.__views__ = [];
15195    }
15196
15197    /**
15198     * Creates a clone of the lazy wrapper object.
15199     *
15200     * @private
15201     * @name clone
15202     * @memberOf LazyWrapper
15203     * @returns {Object} Returns the cloned `LazyWrapper` object.
15204     */
15205    function lazyClone() {
15206      var result = new LazyWrapper(this.__wrapped__);
15207      result.__actions__ = copyArray(this.__actions__);
15208      result.__dir__ = this.__dir__;
15209      result.__filtered__ = this.__filtered__;
15210      result.__iteratees__ = copyArray(this.__iteratees__);
15211      result.__takeCount__ = this.__takeCount__;
15212      result.__views__ = copyArray(this.__views__);
15213      return result;
15214    }
15215
15216    /**
15217     * Reverses the direction of lazy iteration.
15218     *
15219     * @private
15220     * @name reverse
15221     * @memberOf LazyWrapper
15222     * @returns {Object} Returns the new reversed `LazyWrapper` object.
15223     */
15224    function lazyReverse() {
15225      if (this.__filtered__) {
15226        var result = new LazyWrapper(this);
15227        result.__dir__ = -1;
15228        result.__filtered__ = true;
15229      } else {
15230        result = this.clone();
15231        result.__dir__ *= -1;
15232      }
15233      return result;
15234    }
15235
15236    /**
15237     * Extracts the unwrapped value from its lazy wrapper.
15238     *
15239     * @private
15240     * @name value
15241     * @memberOf LazyWrapper
15242     * @returns {*} Returns the unwrapped value.
15243     */
15244    function lazyValue() {
15245      var array = this.__wrapped__.value(),
15246          dir = this.__dir__,
15247          isArr = isArray(array),
15248          isRight = dir < 0,
15249          arrLength = isArr ? array.length : 0,
15250          view = getView(0, arrLength, this.__views__),
15251          start = view.start,
15252          end = view.end,
15253          length = end - start,
15254          index = isRight ? end : (start - 1),
15255          iteratees = this.__iteratees__,
15256          iterLength = iteratees.length,
15257          resIndex = 0,
15258          takeCount = nativeMin(length, this.__takeCount__);
15259
15260      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
15261        return baseWrapperValue(array, this.__actions__);
15262      }
15263      var result = [];
15264
15265      outer:
15266      while (length-- && resIndex < takeCount) {
15267        index += dir;
15268
15269        var iterIndex = -1,
15270            value = array[index];
15271
15272        while (++iterIndex < iterLength) {
15273          var data = iteratees[iterIndex],
15274              iteratee = data.iteratee,
15275              type = data.type,
15276              computed = iteratee(value);
15277
15278          if (type == LAZY_MAP_FLAG) {
15279            value = computed;
15280          } else if (!computed) {
15281            if (type == LAZY_FILTER_FLAG) {
15282              continue outer;
15283            } else {
15284              break outer;
15285            }
15286          }
15287        }
15288        result[resIndex++] = value;
15289      }
15290      return result;
15291    }
15292
15293    // Ensure `LazyWrapper` is an instance of `baseLodash`.
15294    LazyWrapper.prototype = baseCreate(baseLodash.prototype);
15295    LazyWrapper.prototype.constructor = LazyWrapper;
15296
15297    /*------------------------------------------------------------------------*/
15298
15299    /**
15300     * Creates a hash object.
15301     *
15302     * @private
15303     * @constructor
15304     * @param {Array} [entries] The key-value pairs to cache.
15305     */
15306    function Hash(entries) {
15307      var index = -1,
15308          length = entries == null ? 0 : entries.length;
15309
15310      this.clear();
15311      while (++index < length) {
15312        var entry = entries[index];
15313        this.set(entry[0], entry[1]);
15314      }
15315    }
15316
15317    /**
15318     * Removes all key-value entries from the hash.
15319     *
15320     * @private
15321     * @name clear
15322     * @memberOf Hash
15323     */
15324    function hashClear() {
15325      this.__data__ = nativeCreate ? nativeCreate(null) : {};
15326      this.size = 0;
15327    }
15328
15329    /**
15330     * Removes `key` and its value from the hash.
15331     *
15332     * @private
15333     * @name delete
15334     * @memberOf Hash
15335     * @param {Object} hash The hash to modify.
15336     * @param {string} key The key of the value to remove.
15337     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
15338     */
15339    function hashDelete(key) {
15340      var result = this.has(key) && delete this.__data__[key];
15341      this.size -= result ? 1 : 0;
15342      return result;
15343    }
15344
15345    /**
15346     * Gets the hash value for `key`.
15347     *
15348     * @private
15349     * @name get
15350     * @memberOf Hash
15351     * @param {string} key The key of the value to get.
15352     * @returns {*} Returns the entry value.
15353     */
15354    function hashGet(key) {
15355      var data = this.__data__;
15356      if (nativeCreate) {
15357        var result = data[key];
15358        return result === HASH_UNDEFINED ? undefined : result;
15359      }
15360      return hasOwnProperty.call(data, key) ? data[key] : undefined;
15361    }
15362
15363    /**
15364     * Checks if a hash value for `key` exists.
15365     *
15366     * @private
15367     * @name has
15368     * @memberOf Hash
15369     * @param {string} key The key of the entry to check.
15370     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
15371     */
15372    function hashHas(key) {
15373      var data = this.__data__;
15374      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
15375    }
15376
15377    /**
15378     * Sets the hash `key` to `value`.
15379     *
15380     * @private
15381     * @name set
15382     * @memberOf Hash
15383     * @param {string} key The key of the value to set.
15384     * @param {*} value The value to set.
15385     * @returns {Object} Returns the hash instance.
15386     */
15387    function hashSet(key, value) {
15388      var data = this.__data__;
15389      this.size += this.has(key) ? 0 : 1;
15390      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
15391      return this;
15392    }
15393
15394    // Add methods to `Hash`.
15395    Hash.prototype.clear = hashClear;
15396    Hash.prototype['delete'] = hashDelete;
15397    Hash.prototype.get = hashGet;
15398    Hash.prototype.has = hashHas;
15399    Hash.prototype.set = hashSet;
15400
15401    /*------------------------------------------------------------------------*/
15402
15403    /**
15404     * Creates an list cache object.
15405     *
15406     * @private
15407     * @constructor
15408     * @param {Array} [entries] The key-value pairs to cache.
15409     */
15410    function ListCache(entries) {
15411      var index = -1,
15412          length = entries == null ? 0 : entries.length;
15413
15414      this.clear();
15415      while (++index < length) {
15416        var entry = entries[index];
15417        this.set(entry[0], entry[1]);
15418      }
15419    }
15420
15421    /**
15422     * Removes all key-value entries from the list cache.
15423     *
15424     * @private
15425     * @name clear
15426     * @memberOf ListCache
15427     */
15428    function listCacheClear() {
15429      this.__data__ = [];
15430      this.size = 0;
15431    }
15432
15433    /**
15434     * Removes `key` and its value from the list cache.
15435     *
15436     * @private
15437     * @name delete
15438     * @memberOf ListCache
15439     * @param {string} key The key of the value to remove.
15440     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
15441     */
15442    function listCacheDelete(key) {
15443      var data = this.__data__,
15444          index = assocIndexOf(data, key);
15445
15446      if (index < 0) {
15447        return false;
15448      }
15449      var lastIndex = data.length - 1;
15450      if (index == lastIndex) {
15451        data.pop();
15452      } else {
15453        splice.call(data, index, 1);
15454      }
15455      --this.size;
15456      return true;
15457    }
15458
15459    /**
15460     * Gets the list cache value for `key`.
15461     *
15462     * @private
15463     * @name get
15464     * @memberOf ListCache
15465     * @param {string} key The key of the value to get.
15466     * @returns {*} Returns the entry value.
15467     */
15468    function listCacheGet(key) {
15469      var data = this.__data__,
15470          index = assocIndexOf(data, key);
15471
15472      return index < 0 ? undefined : data[index][1];
15473    }
15474
15475    /**
15476     * Checks if a list cache value for `key` exists.
15477     *
15478     * @private
15479     * @name has
15480     * @memberOf ListCache
15481     * @param {string} key The key of the entry to check.
15482     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
15483     */
15484    function listCacheHas(key) {
15485      return assocIndexOf(this.__data__, key) > -1;
15486    }
15487
15488    /**
15489     * Sets the list cache `key` to `value`.
15490     *
15491     * @private
15492     * @name set
15493     * @memberOf ListCache
15494     * @param {string} key The key of the value to set.
15495     * @param {*} value The value to set.
15496     * @returns {Object} Returns the list cache instance.
15497     */
15498    function listCacheSet(key, value) {
15499      var data = this.__data__,
15500          index = assocIndexOf(data, key);
15501
15502      if (index < 0) {
15503        ++this.size;
15504        data.push([key, value]);
15505      } else {
15506        data[index][1] = value;
15507      }
15508      return this;
15509    }
15510
15511    // Add methods to `ListCache`.
15512    ListCache.prototype.clear = listCacheClear;
15513    ListCache.prototype['delete'] = listCacheDelete;
15514    ListCache.prototype.get = listCacheGet;
15515    ListCache.prototype.has = listCacheHas;
15516    ListCache.prototype.set = listCacheSet;
15517
15518    /*------------------------------------------------------------------------*/
15519
15520    /**
15521     * Creates a map cache object to store key-value pairs.
15522     *
15523     * @private
15524     * @constructor
15525     * @param {Array} [entries] The key-value pairs to cache.
15526     */
15527    function MapCache(entries) {
15528      var index = -1,
15529          length = entries == null ? 0 : entries.length;
15530
15531      this.clear();
15532      while (++index < length) {
15533        var entry = entries[index];
15534        this.set(entry[0], entry[1]);
15535      }
15536    }
15537
15538    /**
15539     * Removes all key-value entries from the map.
15540     *
15541     * @private
15542     * @name clear
15543     * @memberOf MapCache
15544     */
15545    function mapCacheClear() {
15546      this.size = 0;
15547      this.__data__ = {
15548        'hash': new Hash,
15549        'map': new (Map || ListCache),
15550        'string': new Hash
15551      };
15552    }
15553
15554    /**
15555     * Removes `key` and its value from the map.
15556     *
15557     * @private
15558     * @name delete
15559     * @memberOf MapCache
15560     * @param {string} key The key of the value to remove.
15561     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
15562     */
15563    function mapCacheDelete(key) {
15564      var result = getMapData(this, key)['delete'](key);
15565      this.size -= result ? 1 : 0;
15566      return result;
15567    }
15568
15569    /**
15570     * Gets the map value for `key`.
15571     *
15572     * @private
15573     * @name get
15574     * @memberOf MapCache
15575     * @param {string} key The key of the value to get.
15576     * @returns {*} Returns the entry value.
15577     */
15578    function mapCacheGet(key) {
15579      return getMapData(this, key).get(key);
15580    }
15581
15582    /**
15583     * Checks if a map value for `key` exists.
15584     *
15585     * @private
15586     * @name has
15587     * @memberOf MapCache
15588     * @param {string} key The key of the entry to check.
15589     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
15590     */
15591    function mapCacheHas(key) {
15592      return getMapData(this, key).has(key);
15593    }
15594
15595    /**
15596     * Sets the map `key` to `value`.
15597     *
15598     * @private
15599     * @name set
15600     * @memberOf MapCache
15601     * @param {string} key The key of the value to set.
15602     * @param {*} value The value to set.
15603     * @returns {Object} Returns the map cache instance.
15604     */
15605    function mapCacheSet(key, value) {
15606      var data = getMapData(this, key),
15607          size = data.size;
15608
15609      data.set(key, value);
15610      this.size += data.size == size ? 0 : 1;
15611      return this;
15612    }
15613
15614    // Add methods to `MapCache`.
15615    MapCache.prototype.clear = mapCacheClear;
15616    MapCache.prototype['delete'] = mapCacheDelete;
15617    MapCache.prototype.get = mapCacheGet;
15618    MapCache.prototype.has = mapCacheHas;
15619    MapCache.prototype.set = mapCacheSet;
15620
15621    /*------------------------------------------------------------------------*/
15622
15623    /**
15624     *
15625     * Creates an array cache object to store unique values.
15626     *
15627     * @private
15628     * @constructor
15629     * @param {Array} [values] The values to cache.
15630     */
15631    function SetCache(values) {
15632      var index = -1,
15633          length = values == null ? 0 : values.length;
15634
15635      this.__data__ = new MapCache;
15636      while (++index < length) {
15637        this.add(values[index]);
15638      }
15639    }
15640
15641    /**
15642     * Adds `value` to the array cache.
15643     *
15644     * @private
15645     * @name add
15646     * @memberOf SetCache
15647     * @alias push
15648     * @param {*} value The value to cache.
15649     * @returns {Object} Returns the cache instance.
15650     */
vendor: 3,741 bytes, lines 15651-15787
15651    function setCacheAdd(value) {
15652      this.__data__.set(value, HASH_UNDEFINED);
15653      return this;
15654    }
15655
15656    /**
15657     * Checks if `value` is in the array cache.
15658     *
15659     * @private
15660     * @name has
15661     * @memberOf SetCache
15662     * @param {*} value The value to search for.
15663     * @returns {number} Returns `true` if `value` is found, else `false`.
15664     */
15665    function setCacheHas(value) {
15666      return this.__data__.has(value);
15667    }
15668
15669    // Add methods to `SetCache`.
15670    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
15671    SetCache.prototype.has = setCacheHas;
15672
15673    /*------------------------------------------------------------------------*/
15674
15675    /**
15676     * Creates a stack cache object to store key-value pairs.
15677     *
15678     * @private
15679     * @constructor
15680     * @param {Array} [entries] The key-value pairs to cache.
15681     */
15682    function Stack(entries) {
15683      var data = this.__data__ = new ListCache(entries);
15684      this.size = data.size;
15685    }
15686
15687    /**
15688     * Removes all key-value entries from the stack.
15689     *
15690     * @private
15691     * @name clear
15692     * @memberOf Stack
15693     */
15694    function stackClear() {
15695      this.__data__ = new ListCache;
15696      this.size = 0;
15697    }
15698
15699    /**
15700     * Removes `key` and its value from the stack.
15701     *
15702     * @private
15703     * @name delete
15704     * @memberOf Stack
15705     * @param {string} key The key of the value to remove.
15706     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
15707     */
15708    function stackDelete(key) {
15709      var data = this.__data__,
15710          result = data['delete'](key);
15711
15712      this.size = data.size;
15713      return result;
15714    }
15715
15716    /**
15717     * Gets the stack value for `key`.
15718     *
15719     * @private
15720     * @name get
15721     * @memberOf Stack
15722     * @param {string} key The key of the value to get.
15723     * @returns {*} Returns the entry value.
15724     */
15725    function stackGet(key) {
15726      return this.__data__.get(key);
15727    }
15728
15729    /**
15730     * Checks if a stack value for `key` exists.
15731     *
15732     * @private
15733     * @name has
15734     * @memberOf Stack
15735     * @param {string} key The key of the entry to check.
15736     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
15737     */
15738    function stackHas(key) {
15739      return this.__data__.has(key);
15740    }
15741
15742    /**
15743     * Sets the stack `key` to `value`.
15744     *
15745     * @private
15746     * @name set
15747     * @memberOf Stack
15748     * @param {string} key The key of the value to set.
15749     * @param {*} value The value to set.
15750     * @returns {Object} Returns the stack cache instance.
15751     */
15752    function stackSet(key, value) {
15753      var data = this.__data__;
15754      if (data instanceof ListCache) {
15755        var pairs = data.__data__;
15756        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
15757          pairs.push([key, value]);
15758          this.size = ++data.size;
15759          return this;
15760        }
15761        data = this.__data__ = new MapCache(pairs);
15762      }
15763      data.set(key, value);
15764      this.size = data.size;
15765      return this;
15766    }
15767
15768    // Add methods to `Stack`.
15769    Stack.prototype.clear = stackClear;
15770    Stack.prototype['delete'] = stackDelete;
15771    Stack.prototype.get = stackGet;
15772    Stack.prototype.has = stackHas;
15773    Stack.prototype.set = stackSet;
15774
15775    /*------------------------------------------------------------------------*/
15776
15777    /**
15778     * Creates an array of the enumerable property names of the array-like `value`.
15779     *
15780     * @private
15781     * @param {*} value The value to query.
15782     * @param {boolean} inherited Specify returning inherited property names.
15783     * @returns {Array} Returns the array of property names.
15784     */
15785    function arrayLikeKeys(value, inherited) {
15786      var isArr = isArray(value),
15787          isArg = !isArr && isArguments(value),
vendor: 111,524 bytes, lines 15788-19081
15788          isBuff = !isArr && !isArg && isBuffer(value),
15789          isType = !isArr && !isArg && !isBuff && isTypedArray(value),
15790          skipIndexes = isArr || isArg || isBuff || isType,
15791          result = skipIndexes ? baseTimes(value.length, String) : [],
15792          length = result.length;
15793
15794      for (var key in value) {
15795        if ((inherited || hasOwnProperty.call(value, key)) &&
15796            !(skipIndexes && (
15797               // Safari 9 has enumerable `arguments.length` in strict mode.
15798               key == 'length' ||
15799               // Node.js 0.10 has enumerable non-index properties on buffers.
15800               (isBuff && (key == 'offset' || key == 'parent')) ||
15801               // PhantomJS 2 has enumerable non-index properties on typed arrays.
15802               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
15803               // Skip index properties.
15804               isIndex(key, length)
15805            ))) {
15806          result.push(key);
15807        }
15808      }
15809      return result;
15810    }
15811
15812    /**
15813     * A specialized version of `_.sample` for arrays.
15814     *
15815     * @private
15816     * @param {Array} array The array to sample.
15817     * @returns {*} Returns the random element.
15818     */
15819    function arraySample(array) {
15820      var length = array.length;
15821      return length ? array[baseRandom(0, length - 1)] : undefined;
15822    }
15823
15824    /**
15825     * A specialized version of `_.sampleSize` for arrays.
15826     *
15827     * @private
15828     * @param {Array} array The array to sample.
15829     * @param {number} n The number of elements to sample.
15830     * @returns {Array} Returns the random elements.
15831     */
15832    function arraySampleSize(array, n) {
15833      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
15834    }
15835
15836    /**
15837     * A specialized version of `_.shuffle` for arrays.
15838     *
15839     * @private
15840     * @param {Array} array The array to shuffle.
15841     * @returns {Array} Returns the new shuffled array.
15842     */
15843    function arrayShuffle(array) {
15844      return shuffleSelf(copyArray(array));
15845    }
15846
15847    /**
15848     * This function is like `assignValue` except that it doesn't assign
15849     * `undefined` values.
15850     *
15851     * @private
15852     * @param {Object} object The object to modify.
15853     * @param {string} key The key of the property to assign.
15854     * @param {*} value The value to assign.
15855     */
15856    function assignMergeValue(object, key, value) {
15857      if ((value !== undefined && !eq(object[key], value)) ||
15858          (value === undefined && !(key in object))) {
15859        baseAssignValue(object, key, value);
15860      }
15861    }
15862
15863    /**
15864     * Assigns `value` to `key` of `object` if the existing value is not equivalent
15865     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
15866     * for equality comparisons.
15867     *
15868     * @private
15869     * @param {Object} object The object to modify.
15870     * @param {string} key The key of the property to assign.
15871     * @param {*} value The value to assign.
15872     */
15873    function assignValue(object, key, value) {
15874      var objValue = object[key];
15875      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
15876          (value === undefined && !(key in object))) {
15877        baseAssignValue(object, key, value);
15878      }
15879    }
15880
15881    /**
15882     * Gets the index at which the `key` is found in `array` of key-value pairs.
15883     *
15884     * @private
15885     * @param {Array} array The array to inspect.
15886     * @param {*} key The key to search for.
15887     * @returns {number} Returns the index of the matched value, else `-1`.
15888     */
15889    function assocIndexOf(array, key) {
15890      var length = array.length;
15891      while (length--) {
15892        if (eq(array[length][0], key)) {
15893          return length;
15894        }
15895      }
15896      return -1;
15897    }
15898
15899    /**
15900     * Aggregates elements of `collection` on `accumulator` with keys transformed
15901     * by `iteratee` and values set by `setter`.
15902     *
15903     * @private
15904     * @param {Array|Object} collection The collection to iterate over.
15905     * @param {Function} setter The function to set `accumulator` values.
15906     * @param {Function} iteratee The iteratee to transform keys.
15907     * @param {Object} accumulator The initial aggregated object.
15908     * @returns {Function} Returns `accumulator`.
15909     */
15910    function baseAggregator(collection, setter, iteratee, accumulator) {
15911      baseEach(collection, function(value, key, collection) {
15912        setter(accumulator, value, iteratee(value), collection);
15913      });
15914      return accumulator;
15915    }
15916
15917    /**
15918     * The base implementation of `_.assign` without support for multiple sources
15919     * or `customizer` functions.
15920     *
15921     * @private
15922     * @param {Object} object The destination object.
15923     * @param {Object} source The source object.
15924     * @returns {Object} Returns `object`.
15925     */
15926    function baseAssign(object, source) {
15927      return object && copyObject(source, keys(source), object);
15928    }
15929
15930    /**
15931     * The base implementation of `_.assignIn` without support for multiple sources
15932     * or `customizer` functions.
15933     *
15934     * @private
15935     * @param {Object} object The destination object.
15936     * @param {Object} source The source object.
15937     * @returns {Object} Returns `object`.
15938     */
15939    function baseAssignIn(object, source) {
15940      return object && copyObject(source, keysIn(source), object);
15941    }
15942
15943    /**
15944     * The base implementation of `assignValue` and `assignMergeValue` without
15945     * value checks.
15946     *
15947     * @private
15948     * @param {Object} object The object to modify.
15949     * @param {string} key The key of the property to assign.
15950     * @param {*} value The value to assign.
15951     */
15952    function baseAssignValue(object, key, value) {
15953      if (key == '__proto__' && defineProperty) {
15954        defineProperty(object, key, {
15955          'configurable': true,
15956          'enumerable': true,
15957          'value': value,
15958          'writable': true
15959        });
15960      } else {
15961        object[key] = value;
15962      }
15963    }
15964
15965    /**
15966     * The base implementation of `_.at` without support for individual paths.
15967     *
15968     * @private
15969     * @param {Object} object The object to iterate over.
15970     * @param {string[]} paths The property paths to pick.
15971     * @returns {Array} Returns the picked elements.
15972     */
15973    function baseAt(object, paths) {
15974      var index = -1,
15975          length = paths.length,
15976          result = Array(length),
15977          skip = object == null;
15978
15979      while (++index < length) {
15980        result[index] = skip ? undefined : get(object, paths[index]);
15981      }
15982      return result;
15983    }
15984
15985    /**
15986     * The base implementation of `_.clamp` which doesn't coerce arguments.
15987     *
15988     * @private
15989     * @param {number} number The number to clamp.
15990     * @param {number} [lower] The lower bound.
15991     * @param {number} upper The upper bound.
15992     * @returns {number} Returns the clamped number.
15993     */
15994    function baseClamp(number, lower, upper) {
15995      if (number === number) {
15996        if (upper !== undefined) {
15997          number = number <= upper ? number : upper;
15998        }
15999        if (lower !== undefined) {
16000          number = number >= lower ? number : lower;
16001        }
16002      }
16003      return number;
16004    }
16005
16006    /**
16007     * The base implementation of `_.clone` and `_.cloneDeep` which tracks
16008     * traversed objects.
16009     *
16010     * @private
16011     * @param {*} value The value to clone.
16012     * @param {boolean} bitmask The bitmask flags.
16013     *  1 - Deep clone
16014     *  2 - Flatten inherited properties
16015     *  4 - Clone symbols
16016     * @param {Function} [customizer] The function to customize cloning.
16017     * @param {string} [key] The key of `value`.
16018     * @param {Object} [object] The parent object of `value`.
16019     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
16020     * @returns {*} Returns the cloned value.
16021     */
16022    function baseClone(value, bitmask, customizer, key, object, stack) {
16023      var result,
16024          isDeep = bitmask & CLONE_DEEP_FLAG,
16025          isFlat = bitmask & CLONE_FLAT_FLAG,
16026          isFull = bitmask & CLONE_SYMBOLS_FLAG;
16027
16028      if (customizer) {
16029        result = object ? customizer(value, key, object, stack) : customizer(value);
16030      }
16031      if (result !== undefined) {
16032        return result;
16033      }
16034      if (!isObject(value)) {
16035        return value;
16036      }
16037      var isArr = isArray(value);
16038      if (isArr) {
16039        result = initCloneArray(value);
16040        if (!isDeep) {
16041          return copyArray(value, result);
16042        }
16043      } else {
16044        var tag = getTag(value),
16045            isFunc = tag == funcTag || tag == genTag;
16046
16047        if (isBuffer(value)) {
16048          return cloneBuffer(value, isDeep);
16049        }
16050        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
16051          result = (isFlat || isFunc) ? {} : initCloneObject(value);
16052          if (!isDeep) {
16053            return isFlat
16054              ? copySymbolsIn(value, baseAssignIn(result, value))
16055              : copySymbols(value, baseAssign(result, value));
16056          }
16057        } else {
16058          if (!cloneableTags[tag]) {
16059            return object ? value : {};
16060          }
16061          result = initCloneByTag(value, tag, isDeep);
16062        }
16063      }
16064      // Check for circular references and return its corresponding clone.
16065      stack || (stack = new Stack);
16066      var stacked = stack.get(value);
16067      if (stacked) {
16068        return stacked;
16069      }
16070      stack.set(value, result);
16071
16072      if (isSet(value)) {
16073        value.forEach(function(subValue) {
16074          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
16075        });
16076      } else if (isMap(value)) {
16077        value.forEach(function(subValue, key) {
16078          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
16079        });
16080      }
16081
16082      var keysFunc = isFull
16083        ? (isFlat ? getAllKeysIn : getAllKeys)
16084        : (isFlat ? keysIn : keys);
16085
16086      var props = isArr ? undefined : keysFunc(value);
16087      arrayEach(props || value, function(subValue, key) {
16088        if (props) {
16089          key = subValue;
16090          subValue = value[key];
16091        }
16092        // Recursively populate clone (susceptible to call stack limits).
16093        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
16094      });
16095      return result;
16096    }
16097
16098    /**
16099     * The base implementation of `_.conforms` which doesn't clone `source`.
16100     *
16101     * @private
16102     * @param {Object} source The object of property predicates to conform to.
16103     * @returns {Function} Returns the new spec function.
16104     */
16105    function baseConforms(source) {
16106      var props = keys(source);
16107      return function(object) {
16108        return baseConformsTo(object, source, props);
16109      };
16110    }
16111
16112    /**
16113     * The base implementation of `_.conformsTo` which accepts `props` to check.
16114     *
16115     * @private
16116     * @param {Object} object The object to inspect.
16117     * @param {Object} source The object of property predicates to conform to.
16118     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
16119     */
16120    function baseConformsTo(object, source, props) {
16121      var length = props.length;
16122      if (object == null) {
16123        return !length;
16124      }
16125      object = Object(object);
16126      while (length--) {
16127        var key = props[length],
16128            predicate = source[key],
16129            value = object[key];
16130
16131        if ((value === undefined && !(key in object)) || !predicate(value)) {
16132          return false;
16133        }
16134      }
16135      return true;
16136    }
16137
16138    /**
16139     * The base implementation of `_.delay` and `_.defer` which accepts `args`
16140     * to provide to `func`.
16141     *
16142     * @private
16143     * @param {Function} func The function to delay.
16144     * @param {number} wait The number of milliseconds to delay invocation.
16145     * @param {Array} args The arguments to provide to `func`.
16146     * @returns {number|Object} Returns the timer id or timeout object.
16147     */
16148    function baseDelay(func, wait, args) {
16149      if (typeof func != 'function') {
16150        throw new TypeError(FUNC_ERROR_TEXT);
16151      }
16152      return setTimeout(function() { func.apply(undefined, args); }, wait);
16153    }
16154
16155    /**
16156     * The base implementation of methods like `_.difference` without support
16157     * for excluding multiple arrays or iteratee shorthands.
16158     *
16159     * @private
16160     * @param {Array} array The array to inspect.
16161     * @param {Array} values The values to exclude.
16162     * @param {Function} [iteratee] The iteratee invoked per element.
16163     * @param {Function} [comparator] The comparator invoked per element.
16164     * @returns {Array} Returns the new array of filtered values.
16165     */
16166    function baseDifference(array, values, iteratee, comparator) {
16167      var index = -1,
16168          includes = arrayIncludes,
16169          isCommon = true,
16170          length = array.length,
16171          result = [],
16172          valuesLength = values.length;
16173
16174      if (!length) {
16175        return result;
16176      }
16177      if (iteratee) {
16178        values = arrayMap(values, baseUnary(iteratee));
16179      }
16180      if (comparator) {
16181        includes = arrayIncludesWith;
16182        isCommon = false;
16183      }
16184      else if (values.length >= LARGE_ARRAY_SIZE) {
16185        includes = cacheHas;
16186        isCommon = false;
16187        values = new SetCache(values);
16188      }
16189      outer:
16190      while (++index < length) {
16191        var value = array[index],
16192            computed = iteratee == null ? value : iteratee(value);
16193
16194        value = (comparator || value !== 0) ? value : 0;
16195        if (isCommon && computed === computed) {
16196          var valuesIndex = valuesLength;
16197          while (valuesIndex--) {
16198            if (values[valuesIndex] === computed) {
16199              continue outer;
16200            }
16201          }
16202          result.push(value);
16203        }
16204        else if (!includes(values, computed, comparator)) {
16205          result.push(value);
16206        }
16207      }
16208      return result;
16209    }
16210
16211    /**
16212     * The base implementation of `_.forEach` without support for iteratee shorthands.
16213     *
16214     * @private
16215     * @param {Array|Object} collection The collection to iterate over.
16216     * @param {Function} iteratee The function invoked per iteration.
16217     * @returns {Array|Object} Returns `collection`.
16218     */
16219    var baseEach = createBaseEach(baseForOwn);
16220
16221    /**
16222     * The base implementation of `_.forEachRight` without support for iteratee shorthands.
16223     *
16224     * @private
16225     * @param {Array|Object} collection The collection to iterate over.
16226     * @param {Function} iteratee The function invoked per iteration.
16227     * @returns {Array|Object} Returns `collection`.
16228     */
16229    var baseEachRight = createBaseEach(baseForOwnRight, true);
16230
16231    /**
16232     * The base implementation of `_.every` without support for iteratee shorthands.
16233     *
16234     * @private
16235     * @param {Array|Object} collection The collection to iterate over.
16236     * @param {Function} predicate The function invoked per iteration.
16237     * @returns {boolean} Returns `true` if all elements pass the predicate check,
16238     *  else `false`
16239     */
16240    function baseEvery(collection, predicate) {
16241      var result = true;
16242      baseEach(collection, function(value, index, collection) {
16243        result = !!predicate(value, index, collection);
16244        return result;
16245      });
16246      return result;
16247    }
16248
16249    /**
16250     * The base implementation of methods like `_.max` and `_.min` which accepts a
16251     * `comparator` to determine the extremum value.
16252     *
16253     * @private
16254     * @param {Array} array The array to iterate over.
16255     * @param {Function} iteratee The iteratee invoked per iteration.
16256     * @param {Function} comparator The comparator used to compare values.
16257     * @returns {*} Returns the extremum value.
16258     */
16259    function baseExtremum(array, iteratee, comparator) {
16260      var index = -1,
16261          length = array.length;
16262
16263      while (++index < length) {
16264        var value = array[index],
16265            current = iteratee(value);
16266
16267        if (current != null && (computed === undefined
16268              ? (current === current && !isSymbol(current))
16269              : comparator(current, computed)
16270            )) {
16271          var computed = current,
16272              result = value;
16273        }
16274      }
16275      return result;
16276    }
16277
16278    /**
16279     * The base implementation of `_.fill` without an iteratee call guard.
16280     *
16281     * @private
16282     * @param {Array} array The array to fill.
16283     * @param {*} value The value to fill `array` with.
16284     * @param {number} [start=0] The start position.
16285     * @param {number} [end=array.length] The end position.
16286     * @returns {Array} Returns `array`.
16287     */
16288    function baseFill(array, value, start, end) {
16289      var length = array.length;
16290
16291      start = toInteger(start);
16292      if (start < 0) {
16293        start = -start > length ? 0 : (length + start);
16294      }
16295      end = (end === undefined || end > length) ? length : toInteger(end);
16296      if (end < 0) {
16297        end += length;
16298      }
16299      end = start > end ? 0 : toLength(end);
16300      while (start < end) {
16301        array[start++] = value;
16302      }
16303      return array;
16304    }
16305
16306    /**
16307     * The base implementation of `_.filter` without support for iteratee shorthands.
16308     *
16309     * @private
16310     * @param {Array|Object} collection The collection to iterate over.
16311     * @param {Function} predicate The function invoked per iteration.
16312     * @returns {Array} Returns the new filtered array.
16313     */
16314    function baseFilter(collection, predicate) {
16315      var result = [];
16316      baseEach(collection, function(value, index, collection) {
16317        if (predicate(value, index, collection)) {
16318          result.push(value);
16319        }
16320      });
16321      return result;
16322    }
16323
16324    /**
16325     * The base implementation of `_.flatten` with support for restricting flattening.
16326     *
16327     * @private
16328     * @param {Array} array The array to flatten.
16329     * @param {number} depth The maximum recursion depth.
16330     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
16331     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
16332     * @param {Array} [result=[]] The initial result value.
16333     * @returns {Array} Returns the new flattened array.
16334     */
16335    function baseFlatten(array, depth, predicate, isStrict, result) {
16336      var index = -1,
16337          length = array.length;
16338
16339      predicate || (predicate = isFlattenable);
16340      result || (result = []);
16341
16342      while (++index < length) {
16343        var value = array[index];
16344        if (depth > 0 && predicate(value)) {
16345          if (depth > 1) {
16346            // Recursively flatten arrays (susceptible to call stack limits).
16347            baseFlatten(value, depth - 1, predicate, isStrict, result);
16348          } else {
16349            arrayPush(result, value);
16350          }
16351        } else if (!isStrict) {
16352          result[result.length] = value;
16353        }
16354      }
16355      return result;
16356    }
16357
16358    /**
16359     * The base implementation of `baseForOwn` which iterates over `object`
16360     * properties returned by `keysFunc` and invokes `iteratee` for each property.
16361     * Iteratee functions may exit iteration early by explicitly returning `false`.
16362     *
16363     * @private
16364     * @param {Object} object The object to iterate over.
16365     * @param {Function} iteratee The function invoked per iteration.
16366     * @param {Function} keysFunc The function to get the keys of `object`.
16367     * @returns {Object} Returns `object`.
16368     */
16369    var baseFor = createBaseFor();
16370
16371    /**
16372     * This function is like `baseFor` except that it iterates over properties
16373     * in the opposite order.
16374     *
16375     * @private
16376     * @param {Object} object The object to iterate over.
16377     * @param {Function} iteratee The function invoked per iteration.
16378     * @param {Function} keysFunc The function to get the keys of `object`.
16379     * @returns {Object} Returns `object`.
16380     */
16381    var baseForRight = createBaseFor(true);
16382
16383    /**
16384     * The base implementation of `_.forOwn` without support for iteratee shorthands.
16385     *
16386     * @private
16387     * @param {Object} object The object to iterate over.
16388     * @param {Function} iteratee The function invoked per iteration.
16389     * @returns {Object} Returns `object`.
16390     */
16391    function baseForOwn(object, iteratee) {
16392      return object && baseFor(object, iteratee, keys);
16393    }
16394
16395    /**
16396     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
16397     *
16398     * @private
16399     * @param {Object} object The object to iterate over.
16400     * @param {Function} iteratee The function invoked per iteration.
16401     * @returns {Object} Returns `object`.
16402     */
16403    function baseForOwnRight(object, iteratee) {
16404      return object && baseForRight(object, iteratee, keys);
16405    }
16406
16407    /**
16408     * The base implementation of `_.functions` which creates an array of
16409     * `object` function property names filtered from `props`.
16410     *
16411     * @private
16412     * @param {Object} object The object to inspect.
16413     * @param {Array} props The property names to filter.
16414     * @returns {Array} Returns the function names.
16415     */
16416    function baseFunctions(object, props) {
16417      return arrayFilter(props, function(key) {
16418        return isFunction(object[key]);
16419      });
16420    }
16421
16422    /**
16423     * The base implementation of `_.get` without support for default values.
16424     *
16425     * @private
16426     * @param {Object} object The object to query.
16427     * @param {Array|string} path The path of the property to get.
16428     * @returns {*} Returns the resolved value.
16429     */
16430    function baseGet(object, path) {
16431      path = castPath(path, object);
16432
16433      var index = 0,
16434          length = path.length;
16435
16436      while (object != null && index < length) {
16437        object = object[toKey(path[index++])];
16438      }
16439      return (index && index == length) ? object : undefined;
16440    }
16441
16442    /**
16443     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
16444     * `keysFunc` and `symbolsFunc` to get the enumerable property names and
16445     * symbols of `object`.
16446     *
16447     * @private
16448     * @param {Object} object The object to query.
16449     * @param {Function} keysFunc The function to get the keys of `object`.
16450     * @param {Function} symbolsFunc The function to get the symbols of `object`.
16451     * @returns {Array} Returns the array of property names and symbols.
16452     */
16453    function baseGetAllKeys(object, keysFunc, symbolsFunc) {
16454      var result = keysFunc(object);
16455      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
16456    }
16457
16458    /**
16459     * The base implementation of `getTag` without fallbacks for buggy environments.
16460     *
16461     * @private
16462     * @param {*} value The value to query.
16463     * @returns {string} Returns the `toStringTag`.
16464     */
16465    function baseGetTag(value) {
16466      if (value == null) {
16467        return value === undefined ? undefinedTag : nullTag;
16468      }
16469      return (symToStringTag && symToStringTag in Object(value))
16470        ? getRawTag(value)
16471        : objectToString(value);
16472    }
16473
16474    /**
16475     * The base implementation of `_.gt` which doesn't coerce arguments.
16476     *
16477     * @private
16478     * @param {*} value The value to compare.
16479     * @param {*} other The other value to compare.
16480     * @returns {boolean} Returns `true` if `value` is greater than `other`,
16481     *  else `false`.
16482     */
16483    function baseGt(value, other) {
16484      return value > other;
16485    }
16486
16487    /**
16488     * The base implementation of `_.has` without support for deep paths.
16489     *
16490     * @private
16491     * @param {Object} [object] The object to query.
16492     * @param {Array|string} key The key to check.
16493     * @returns {boolean} Returns `true` if `key` exists, else `false`.
16494     */
16495    function baseHas(object, key) {
16496      return object != null && hasOwnProperty.call(object, key);
16497    }
16498
16499    /**
16500     * The base implementation of `_.hasIn` without support for deep paths.
16501     *
16502     * @private
16503     * @param {Object} [object] The object to query.
16504     * @param {Array|string} key The key to check.
16505     * @returns {boolean} Returns `true` if `key` exists, else `false`.
16506     */
16507    function baseHasIn(object, key) {
16508      return object != null && key in Object(object);
16509    }
16510
16511    /**
16512     * The base implementation of `_.inRange` which doesn't coerce arguments.
16513     *
16514     * @private
16515     * @param {number} number The number to check.
16516     * @param {number} start The start of the range.
16517     * @param {number} end The end of the range.
16518     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
16519     */
16520    function baseInRange(number, start, end) {
16521      return number >= nativeMin(start, end) && number < nativeMax(start, end);
16522    }
16523
16524    /**
16525     * The base implementation of methods like `_.intersection`, without support
16526     * for iteratee shorthands, that accepts an array of arrays to inspect.
16527     *
16528     * @private
16529     * @param {Array} arrays The arrays to inspect.
16530     * @param {Function} [iteratee] The iteratee invoked per element.
16531     * @param {Function} [comparator] The comparator invoked per element.
16532     * @returns {Array} Returns the new array of shared values.
16533     */
16534    function baseIntersection(arrays, iteratee, comparator) {
16535      var includes = comparator ? arrayIncludesWith : arrayIncludes,
16536          length = arrays[0].length,
16537          othLength = arrays.length,
16538          othIndex = othLength,
16539          caches = Array(othLength),
16540          maxLength = Infinity,
16541          result = [];
16542
16543      while (othIndex--) {
16544        var array = arrays[othIndex];
16545        if (othIndex && iteratee) {
16546          array = arrayMap(array, baseUnary(iteratee));
16547        }
16548        maxLength = nativeMin(array.length, maxLength);
16549        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
16550          ? new SetCache(othIndex && array)
16551          : undefined;
16552      }
16553      array = arrays[0];
16554
16555      var index = -1,
16556          seen = caches[0];
16557
16558      outer:
16559      while (++index < length && result.length < maxLength) {
16560        var value = array[index],
16561            computed = iteratee ? iteratee(value) : value;
16562
16563        value = (comparator || value !== 0) ? value : 0;
16564        if (!(seen
16565              ? cacheHas(seen, computed)
16566              : includes(result, computed, comparator)
16567            )) {
16568          othIndex = othLength;
16569          while (--othIndex) {
16570            var cache = caches[othIndex];
16571            if (!(cache
16572                  ? cacheHas(cache, computed)
16573                  : includes(arrays[othIndex], computed, comparator))
16574                ) {
16575              continue outer;
16576            }
16577          }
16578          if (seen) {
16579            seen.push(computed);
16580          }
16581          result.push(value);
16582        }
16583      }
16584      return result;
16585    }
16586
16587    /**
16588     * The base implementation of `_.invert` and `_.invertBy` which inverts
16589     * `object` with values transformed by `iteratee` and set by `setter`.
16590     *
16591     * @private
16592     * @param {Object} object The object to iterate over.
16593     * @param {Function} setter The function to set `accumulator` values.
16594     * @param {Function} iteratee The iteratee to transform values.
16595     * @param {Object} accumulator The initial inverted object.
16596     * @returns {Function} Returns `accumulator`.
16597     */
16598    function baseInverter(object, setter, iteratee, accumulator) {
16599      baseForOwn(object, function(value, key, object) {
16600        setter(accumulator, iteratee(value), key, object);
16601      });
16602      return accumulator;
16603    }
16604
16605    /**
16606     * The base implementation of `_.invoke` without support for individual
16607     * method arguments.
16608     *
16609     * @private
16610     * @param {Object} object The object to query.
16611     * @param {Array|string} path The path of the method to invoke.
16612     * @param {Array} args The arguments to invoke the method with.
16613     * @returns {*} Returns the result of the invoked method.
16614     */
16615    function baseInvoke(object, path, args) {
16616      path = castPath(path, object);
16617      object = parent(object, path);
16618      var func = object == null ? object : object[toKey(last(path))];
16619      return func == null ? undefined : apply(func, object, args);
16620    }
16621
16622    /**
16623     * The base implementation of `_.isArguments`.
16624     *
16625     * @private
16626     * @param {*} value The value to check.
16627     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
16628     */
16629    function baseIsArguments(value) {
16630      return isObjectLike(value) && baseGetTag(value) == argsTag;
16631    }
16632
16633    /**
16634     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
16635     *
16636     * @private
16637     * @param {*} value The value to check.
16638     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
16639     */
16640    function baseIsArrayBuffer(value) {
16641      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
16642    }
16643
16644    /**
16645     * The base implementation of `_.isDate` without Node.js optimizations.
16646     *
16647     * @private
16648     * @param {*} value The value to check.
16649     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
16650     */
16651    function baseIsDate(value) {
16652      return isObjectLike(value) && baseGetTag(value) == dateTag;
16653    }
16654
16655    /**
16656     * The base implementation of `_.isEqual` which supports partial comparisons
16657     * and tracks traversed objects.
16658     *
16659     * @private
16660     * @param {*} value The value to compare.
16661     * @param {*} other The other value to compare.
16662     * @param {boolean} bitmask The bitmask flags.
16663     *  1 - Unordered comparison
16664     *  2 - Partial comparison
16665     * @param {Function} [customizer] The function to customize comparisons.
16666     * @param {Object} [stack] Tracks traversed `value` and `other` objects.
16667     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
16668     */
16669    function baseIsEqual(value, other, bitmask, customizer, stack) {
16670      if (value === other) {
16671        return true;
16672      }
16673      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
16674        return value !== value && other !== other;
16675      }
16676      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
16677    }
16678
16679    /**
16680     * A specialized version of `baseIsEqual` for arrays and objects which performs
16681     * deep comparisons and tracks traversed objects enabling objects with circular
16682     * references to be compared.
16683     *
16684     * @private
16685     * @param {Object} object The object to compare.
16686     * @param {Object} other The other object to compare.
16687     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
16688     * @param {Function} customizer The function to customize comparisons.
16689     * @param {Function} equalFunc The function to determine equivalents of values.
16690     * @param {Object} [stack] Tracks traversed `object` and `other` objects.
16691     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
16692     */
16693    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
16694      var objIsArr = isArray(object),
16695          othIsArr = isArray(other),
16696          objTag = objIsArr ? arrayTag : getTag(object),
16697          othTag = othIsArr ? arrayTag : getTag(other);
16698
16699      objTag = objTag == argsTag ? objectTag : objTag;
16700      othTag = othTag == argsTag ? objectTag : othTag;
16701
16702      var objIsObj = objTag == objectTag,
16703          othIsObj = othTag == objectTag,
16704          isSameTag = objTag == othTag;
16705
16706      if (isSameTag && isBuffer(object)) {
16707        if (!isBuffer(other)) {
16708          return false;
16709        }
16710        objIsArr = true;
16711        objIsObj = false;
16712      }
16713      if (isSameTag && !objIsObj) {
16714        stack || (stack = new Stack);
16715        return (objIsArr || isTypedArray(object))
16716          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
16717          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
16718      }
16719      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
16720        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
16721            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
16722
16723        if (objIsWrapped || othIsWrapped) {
16724          var objUnwrapped = objIsWrapped ? object.value() : object,
16725              othUnwrapped = othIsWrapped ? other.value() : other;
16726
16727          stack || (stack = new Stack);
16728          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
16729        }
16730      }
16731      if (!isSameTag) {
16732        return false;
16733      }
16734      stack || (stack = new Stack);
16735      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
16736    }
16737
16738    /**
16739     * The base implementation of `_.isMap` without Node.js optimizations.
16740     *
16741     * @private
16742     * @param {*} value The value to check.
16743     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
16744     */
16745    function baseIsMap(value) {
16746      return isObjectLike(value) && getTag(value) == mapTag;
16747    }
16748
16749    /**
16750     * The base implementation of `_.isMatch` without support for iteratee shorthands.
16751     *
16752     * @private
16753     * @param {Object} object The object to inspect.
16754     * @param {Object} source The object of property values to match.
16755     * @param {Array} matchData The property names, values, and compare flags to match.
16756     * @param {Function} [customizer] The function to customize comparisons.
16757     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
16758     */
16759    function baseIsMatch(object, source, matchData, customizer) {
16760      var index = matchData.length,
16761          length = index,
16762          noCustomizer = !customizer;
16763
16764      if (object == null) {
16765        return !length;
16766      }
16767      object = Object(object);
16768      while (index--) {
16769        var data = matchData[index];
16770        if ((noCustomizer && data[2])
16771              ? data[1] !== object[data[0]]
16772              : !(data[0] in object)
16773            ) {
16774          return false;
16775        }
16776      }
16777      while (++index < length) {
16778        data = matchData[index];
16779        var key = data[0],
16780            objValue = object[key],
16781            srcValue = data[1];
16782
16783        if (noCustomizer && data[2]) {
16784          if (objValue === undefined && !(key in object)) {
16785            return false;
16786          }
16787        } else {
16788          var stack = new Stack;
16789          if (customizer) {
16790            var result = customizer(objValue, srcValue, key, object, source, stack);
16791          }
16792          if (!(result === undefined
16793                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
16794                : result
16795              )) {
16796            return false;
16797          }
16798        }
16799      }
16800      return true;
16801    }
16802
16803    /**
16804     * The base implementation of `_.isNative` without bad shim checks.
16805     *
16806     * @private
16807     * @param {*} value The value to check.
16808     * @returns {boolean} Returns `true` if `value` is a native function,
16809     *  else `false`.
16810     */
16811    function baseIsNative(value) {
16812      if (!isObject(value) || isMasked(value)) {
16813        return false;
16814      }
16815      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
16816      return pattern.test(toSource(value));
16817    }
16818
16819    /**
16820     * The base implementation of `_.isRegExp` without Node.js optimizations.
16821     *
16822     * @private
16823     * @param {*} value The value to check.
16824     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
16825     */
16826    function baseIsRegExp(value) {
16827      return isObjectLike(value) && baseGetTag(value) == regexpTag;
16828    }
16829
16830    /**
16831     * The base implementation of `_.isSet` without Node.js optimizations.
16832     *
16833     * @private
16834     * @param {*} value The value to check.
16835     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
16836     */
16837    function baseIsSet(value) {
16838      return isObjectLike(value) && getTag(value) == setTag;
16839    }
16840
16841    /**
16842     * The base implementation of `_.isTypedArray` without Node.js optimizations.
16843     *
16844     * @private
16845     * @param {*} value The value to check.
16846     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
16847     */
16848    function baseIsTypedArray(value) {
16849      return isObjectLike(value) &&
16850        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
16851    }
16852
16853    /**
16854     * The base implementation of `_.iteratee`.
16855     *
16856     * @private
16857     * @param {*} [value=_.identity] The value to convert to an iteratee.
16858     * @returns {Function} Returns the iteratee.
16859     */
16860    function baseIteratee(value) {
16861      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
16862      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
16863      if (typeof value == 'function') {
16864        return value;
16865      }
16866      if (value == null) {
16867        return identity;
16868      }
16869      if (typeof value == 'object') {
16870        return isArray(value)
16871          ? baseMatchesProperty(value[0], value[1])
16872          : baseMatches(value);
16873      }
16874      return property(value);
16875    }
16876
16877    /**
16878     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
16879     *
16880     * @private
16881     * @param {Object} object The object to query.
16882     * @returns {Array} Returns the array of property names.
16883     */
16884    function baseKeys(object) {
16885      if (!isPrototype(object)) {
16886        return nativeKeys(object);
16887      }
16888      var result = [];
16889      for (var key in Object(object)) {
16890        if (hasOwnProperty.call(object, key) && key != 'constructor') {
16891          result.push(key);
16892        }
16893      }
16894      return result;
16895    }
16896
16897    /**
16898     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
16899     *
16900     * @private
16901     * @param {Object} object The object to query.
16902     * @returns {Array} Returns the array of property names.
16903     */
16904    function baseKeysIn(object) {
16905      if (!isObject(object)) {
16906        return nativeKeysIn(object);
16907      }
16908      var isProto = isPrototype(object),
16909          result = [];
16910
16911      for (var key in object) {
16912        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
16913          result.push(key);
16914        }
16915      }
16916      return result;
16917    }
16918
16919    /**
16920     * The base implementation of `_.lt` which doesn't coerce arguments.
16921     *
16922     * @private
16923     * @param {*} value The value to compare.
16924     * @param {*} other The other value to compare.
16925     * @returns {boolean} Returns `true` if `value` is less than `other`,
16926     *  else `false`.
16927     */
16928    function baseLt(value, other) {
16929      return value < other;
16930    }
16931
16932    /**
16933     * The base implementation of `_.map` without support for iteratee shorthands.
16934     *
16935     * @private
16936     * @param {Array|Object} collection The collection to iterate over.
16937     * @param {Function} iteratee The function invoked per iteration.
16938     * @returns {Array} Returns the new mapped array.
16939     */
16940    function baseMap(collection, iteratee) {
16941      var index = -1,
16942          result = isArrayLike(collection) ? Array(collection.length) : [];
16943
16944      baseEach(collection, function(value, key, collection) {
16945        result[++index] = iteratee(value, key, collection);
16946      });
16947      return result;
16948    }
16949
16950    /**
16951     * The base implementation of `_.matches` which doesn't clone `source`.
16952     *
16953     * @private
16954     * @param {Object} source The object of property values to match.
16955     * @returns {Function} Returns the new spec function.
16956     */
16957    function baseMatches(source) {
16958      var matchData = getMatchData(source);
16959      if (matchData.length == 1 && matchData[0][2]) {
16960        return matchesStrictComparable(matchData[0][0], matchData[0][1]);
16961      }
16962      return function(object) {
16963        return object === source || baseIsMatch(object, source, matchData);
16964      };
16965    }
16966
16967    /**
16968     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
16969     *
16970     * @private
16971     * @param {string} path The path of the property to get.
16972     * @param {*} srcValue The value to match.
16973     * @returns {Function} Returns the new spec function.
16974     */
16975    function baseMatchesProperty(path, srcValue) {
16976      if (isKey(path) && isStrictComparable(srcValue)) {
16977        return matchesStrictComparable(toKey(path), srcValue);
16978      }
16979      return function(object) {
16980        var objValue = get(object, path);
16981        return (objValue === undefined && objValue === srcValue)
16982          ? hasIn(object, path)
16983          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
16984      };
16985    }
16986
16987    /**
16988     * The base implementation of `_.merge` without support for multiple sources.
16989     *
16990     * @private
16991     * @param {Object} object The destination object.
16992     * @param {Object} source The source object.
16993     * @param {number} srcIndex The index of `source`.
16994     * @param {Function} [customizer] The function to customize merged values.
16995     * @param {Object} [stack] Tracks traversed source values and their merged
16996     *  counterparts.
16997     */
16998    function baseMerge(object, source, srcIndex, customizer, stack) {
16999      if (object === source) {
17000        return;
17001      }
17002      baseFor(source, function(srcValue, key) {
17003        stack || (stack = new Stack);
17004        if (isObject(srcValue)) {
17005          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
17006        }
17007        else {
17008          var newValue = customizer
17009            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)
17010            : undefined;
17011
17012          if (newValue === undefined) {
17013            newValue = srcValue;
17014          }
17015          assignMergeValue(object, key, newValue);
17016        }
17017      }, keysIn);
17018    }
17019
17020    /**
17021     * A specialized version of `baseMerge` for arrays and objects which performs
17022     * deep merges and tracks traversed objects enabling objects with circular
17023     * references to be merged.
17024     *
17025     * @private
17026     * @param {Object} object The destination object.
17027     * @param {Object} source The source object.
17028     * @param {string} key The key of the value to merge.
17029     * @param {number} srcIndex The index of `source`.
17030     * @param {Function} mergeFunc The function to merge values.
17031     * @param {Function} [customizer] The function to customize assigned values.
17032     * @param {Object} [stack] Tracks traversed source values and their merged
17033     *  counterparts.
17034     */
17035    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
17036      var objValue = safeGet(object, key),
17037          srcValue = safeGet(source, key),
17038          stacked = stack.get(srcValue);
17039
17040      if (stacked) {
17041        assignMergeValue(object, key, stacked);
17042        return;
17043      }
17044      var newValue = customizer
17045        ? customizer(objValue, srcValue, (key + ''), object, source, stack)
17046        : undefined;
17047
17048      var isCommon = newValue === undefined;
17049
17050      if (isCommon) {
17051        var isArr = isArray(srcValue),
17052            isBuff = !isArr && isBuffer(srcValue),
17053            isTyped = !isArr && !isBuff && isTypedArray(srcValue);
17054
17055        newValue = srcValue;
17056        if (isArr || isBuff || isTyped) {
17057          if (isArray(objValue)) {
17058            newValue = objValue;
17059          }
17060          else if (isArrayLikeObject(objValue)) {
17061            newValue = copyArray(objValue);
17062          }
17063          else if (isBuff) {
17064            isCommon = false;
17065            newValue = cloneBuffer(srcValue, true);
17066          }
17067          else if (isTyped) {
17068            isCommon = false;
17069            newValue = cloneTypedArray(srcValue, true);
17070          }
17071          else {
17072            newValue = [];
17073          }
17074        }
17075        else if (isPlainObject(srcValue) || isArguments(srcValue)) {
17076          newValue = objValue;
17077          if (isArguments(objValue)) {
17078            newValue = toPlainObject(objValue);
17079          }
17080          else if (!isObject(objValue) || isFunction(objValue)) {
17081            newValue = initCloneObject(srcValue);
17082          }
17083        }
17084        else {
17085          isCommon = false;
17086        }
17087      }
17088      if (isCommon) {
17089        // Recursively merge objects and arrays (susceptible to call stack limits).
17090        stack.set(srcValue, newValue);
17091        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
17092        stack['delete'](srcValue);
17093      }
17094      assignMergeValue(object, key, newValue);
17095    }
17096
17097    /**
17098     * The base implementation of `_.nth` which doesn't coerce arguments.
17099     *
17100     * @private
17101     * @param {Array} array The array to query.
17102     * @param {number} n The index of the element to return.
17103     * @returns {*} Returns the nth element of `array`.
17104     */
17105    function baseNth(array, n) {
17106      var length = array.length;
17107      if (!length) {
17108        return;
17109      }
17110      n += n < 0 ? length : 0;
17111      return isIndex(n, length) ? array[n] : undefined;
17112    }
17113
17114    /**
17115     * The base implementation of `_.orderBy` without param guards.
17116     *
17117     * @private
17118     * @param {Array|Object} collection The collection to iterate over.
17119     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
17120     * @param {string[]} orders The sort orders of `iteratees`.
17121     * @returns {Array} Returns the new sorted array.
17122     */
17123    function baseOrderBy(collection, iteratees, orders) {
17124      if (iteratees.length) {
17125        iteratees = arrayMap(iteratees, function(iteratee) {
17126          if (isArray(iteratee)) {
17127            return function(value) {
17128              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
17129            }
17130          }
17131          return iteratee;
17132        });
17133      } else {
17134        iteratees = [identity];
17135      }
17136
17137      var index = -1;
17138      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
17139
17140      var result = baseMap(collection, function(value, key, collection) {
17141        var criteria = arrayMap(iteratees, function(iteratee) {
17142          return iteratee(value);
17143        });
17144        return { 'criteria': criteria, 'index': ++index, 'value': value };
17145      });
17146
17147      return baseSortBy(result, function(object, other) {
17148        return compareMultiple(object, other, orders);
17149      });
17150    }
17151
17152    /**
17153     * The base implementation of `_.pick` without support for individual
17154     * property identifiers.
17155     *
17156     * @private
17157     * @param {Object} object The source object.
17158     * @param {string[]} paths The property paths to pick.
17159     * @returns {Object} Returns the new object.
17160     */
17161    function basePick(object, paths) {
17162      return basePickBy(object, paths, function(value, path) {
17163        return hasIn(object, path);
17164      });
17165    }
17166
17167    /**
17168     * The base implementation of  `_.pickBy` without support for iteratee shorthands.
17169     *
17170     * @private
17171     * @param {Object} object The source object.
17172     * @param {string[]} paths The property paths to pick.
17173     * @param {Function} predicate The function invoked per property.
17174     * @returns {Object} Returns the new object.
17175     */
17176    function basePickBy(object, paths, predicate) {
17177      var index = -1,
17178          length = paths.length,
17179          result = {};
17180
17181      while (++index < length) {
17182        var path = paths[index],
17183            value = baseGet(object, path);
17184
17185        if (predicate(value, path)) {
17186          baseSet(result, castPath(path, object), value);
17187        }
17188      }
17189      return result;
17190    }
17191
17192    /**
17193     * A specialized version of `baseProperty` which supports deep paths.
17194     *
17195     * @private
17196     * @param {Array|string} path The path of the property to get.
17197     * @returns {Function} Returns the new accessor function.
17198     */
17199    function basePropertyDeep(path) {
17200      return function(object) {
17201        return baseGet(object, path);
17202      };
17203    }
17204
17205    /**
17206     * The base implementation of `_.pullAllBy` without support for iteratee
17207     * shorthands.
17208     *
17209     * @private
17210     * @param {Array} array The array to modify.
17211     * @param {Array} values The values to remove.
17212     * @param {Function} [iteratee] The iteratee invoked per element.
17213     * @param {Function} [comparator] The comparator invoked per element.
17214     * @returns {Array} Returns `array`.
17215     */
17216    function basePullAll(array, values, iteratee, comparator) {
17217      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
17218          index = -1,
17219          length = values.length,
17220          seen = array;
17221
17222      if (array === values) {
17223        values = copyArray(values);
17224      }
17225      if (iteratee) {
17226        seen = arrayMap(array, baseUnary(iteratee));
17227      }
17228      while (++index < length) {
17229        var fromIndex = 0,
17230            value = values[index],
17231            computed = iteratee ? iteratee(value) : value;
17232
17233        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
17234          if (seen !== array) {
17235            splice.call(seen, fromIndex, 1);
17236          }
17237          splice.call(array, fromIndex, 1);
17238        }
17239      }
17240      return array;
17241    }
17242
17243    /**
17244     * The base implementation of `_.pullAt` without support for individual
17245     * indexes or capturing the removed elements.
17246     *
17247     * @private
17248     * @param {Array} array The array to modify.
17249     * @param {number[]} indexes The indexes of elements to remove.
17250     * @returns {Array} Returns `array`.
17251     */
17252    function basePullAt(array, indexes) {
17253      var length = array ? indexes.length : 0,
17254          lastIndex = length - 1;
17255
17256      while (length--) {
17257        var index = indexes[length];
17258        if (length == lastIndex || index !== previous) {
17259          var previous = index;
17260          if (isIndex(index)) {
17261            splice.call(array, index, 1);
17262          } else {
17263            baseUnset(array, index);
17264          }
17265        }
17266      }
17267      return array;
17268    }
17269
17270    /**
17271     * The base implementation of `_.random` without support for returning
17272     * floating-point numbers.
17273     *
17274     * @private
17275     * @param {number} lower The lower bound.
17276     * @param {number} upper The upper bound.
17277     * @returns {number} Returns the random number.
17278     */
17279    function baseRandom(lower, upper) {
17280      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
17281    }
17282
17283    /**
17284     * The base implementation of `_.range` and `_.rangeRight` which doesn't
17285     * coerce arguments.
17286     *
17287     * @private
17288     * @param {number} start The start of the range.
17289     * @param {number} end The end of the range.
17290     * @param {number} step The value to increment or decrement by.
17291     * @param {boolean} [fromRight] Specify iterating from right to left.
17292     * @returns {Array} Returns the range of numbers.
17293     */
17294    function baseRange(start, end, step, fromRight) {
17295      var index = -1,
17296          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
17297          result = Array(length);
17298
17299      while (length--) {
17300        result[fromRight ? length : ++index] = start;
17301        start += step;
17302      }
17303      return result;
17304    }
17305
17306    /**
17307     * The base implementation of `_.repeat` which doesn't coerce arguments.
17308     *
17309     * @private
17310     * @param {string} string The string to repeat.
17311     * @param {number} n The number of times to repeat the string.
17312     * @returns {string} Returns the repeated string.
17313     */
17314    function baseRepeat(string, n) {
17315      var result = '';
17316      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
17317        return result;
17318      }
17319      // Leverage the exponentiation by squaring algorithm for a faster repeat.
17320      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
17321      do {
17322        if (n % 2) {
17323          result += string;
17324        }
17325        n = nativeFloor(n / 2);
17326        if (n) {
17327          string += string;
17328        }
17329      } while (n);
17330
17331      return result;
17332    }
17333
17334    /**
17335     * The base implementation of `_.rest` which doesn't validate or coerce arguments.
17336     *
17337     * @private
17338     * @param {Function} func The function to apply a rest parameter to.
17339     * @param {number} [start=func.length-1] The start position of the rest parameter.
17340     * @returns {Function} Returns the new function.
17341     */
17342    function baseRest(func, start) {
17343      return setToString(overRest(func, start, identity), func + '');
17344    }
17345
17346    /**
17347     * The base implementation of `_.sample`.
17348     *
17349     * @private
17350     * @param {Array|Object} collection The collection to sample.
17351     * @returns {*} Returns the random element.
17352     */
17353    function baseSample(collection) {
17354      return arraySample(values(collection));
17355    }
17356
17357    /**
17358     * The base implementation of `_.sampleSize` without param guards.
17359     *
17360     * @private
17361     * @param {Array|Object} collection The collection to sample.
17362     * @param {number} n The number of elements to sample.
17363     * @returns {Array} Returns the random elements.
17364     */
17365    function baseSampleSize(collection, n) {
17366      var array = values(collection);
17367      return shuffleSelf(array, baseClamp(n, 0, array.length));
17368    }
17369
17370    /**
17371     * The base implementation of `_.set`.
17372     *
17373     * @private
17374     * @param {Object} object The object to modify.
17375     * @param {Array|string} path The path of the property to set.
17376     * @param {*} value The value to set.
17377     * @param {Function} [customizer] The function to customize path creation.
17378     * @returns {Object} Returns `object`.
17379     */
17380    function baseSet(object, path, value, customizer) {
17381      if (!isObject(object)) {
17382        return object;
17383      }
17384      path = castPath(path, object);
17385
17386      var index = -1,
17387          length = path.length,
17388          lastIndex = length - 1,
17389          nested = object;
17390
17391      while (nested != null && ++index < length) {
17392        var key = toKey(path[index]),
17393            newValue = value;
17394
17395        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
17396          return object;
17397        }
17398
17399        if (index != lastIndex) {
17400          var objValue = nested[key];
17401          newValue = customizer ? customizer(objValue, key, nested) : undefined;
17402          if (newValue === undefined) {
17403            newValue = isObject(objValue)
17404              ? objValue
17405              : (isIndex(path[index + 1]) ? [] : {});
17406          }
17407        }
17408        assignValue(nested, key, newValue);
17409        nested = nested[key];
17410      }
17411      return object;
17412    }
17413
17414    /**
17415     * The base implementation of `setData` without support for hot loop shorting.
17416     *
17417     * @private
17418     * @param {Function} func The function to associate metadata with.
17419     * @param {*} data The metadata.
17420     * @returns {Function} Returns `func`.
17421     */
17422    var baseSetData = !metaMap ? identity : function(func, data) {
17423      metaMap.set(func, data);
17424      return func;
17425    };
17426
17427    /**
17428     * The base implementation of `setToString` without support for hot loop shorting.
17429     *
17430     * @private
17431     * @param {Function} func The function to modify.
17432     * @param {Function} string The `toString` result.
17433     * @returns {Function} Returns `func`.
17434     */
17435    var baseSetToString = !defineProperty ? identity : function(func, string) {
17436      return defineProperty(func, 'toString', {
17437        'configurable': true,
17438        'enumerable': false,
17439        'value': constant(string),
17440        'writable': true
17441      });
17442    };
17443
17444    /**
17445     * The base implementation of `_.shuffle`.
17446     *
17447     * @private
17448     * @param {Array|Object} collection The collection to shuffle.
17449     * @returns {Array} Returns the new shuffled array.
17450     */
17451    function baseShuffle(collection) {
17452      return shuffleSelf(values(collection));
17453    }
17454
17455    /**
17456     * The base implementation of `_.slice` without an iteratee call guard.
17457     *
17458     * @private
17459     * @param {Array} array The array to slice.
17460     * @param {number} [start=0] The start position.
17461     * @param {number} [end=array.length] The end position.
17462     * @returns {Array} Returns the slice of `array`.
17463     */
17464    function baseSlice(array, start, end) {
17465      var index = -1,
17466          length = array.length;
17467
17468      if (start < 0) {
17469        start = -start > length ? 0 : (length + start);
17470      }
17471      end = end > length ? length : end;
17472      if (end < 0) {
17473        end += length;
17474      }
17475      length = start > end ? 0 : ((end - start) >>> 0);
17476      start >>>= 0;
17477
17478      var result = Array(length);
17479      while (++index < length) {
17480        result[index] = array[index + start];
17481      }
17482      return result;
17483    }
17484
17485    /**
17486     * The base implementation of `_.some` without support for iteratee shorthands.
17487     *
17488     * @private
17489     * @param {Array|Object} collection The collection to iterate over.
17490     * @param {Function} predicate The function invoked per iteration.
17491     * @returns {boolean} Returns `true` if any element passes the predicate check,
17492     *  else `false`.
17493     */
17494    function baseSome(collection, predicate) {
17495      var result;
17496
17497      baseEach(collection, function(value, index, collection) {
17498        result = predicate(value, index, collection);
17499        return !result;
17500      });
17501      return !!result;
17502    }
17503
17504    /**
17505     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
17506     * performs a binary search of `array` to determine the index at which `value`
17507     * should be inserted into `array` in order to maintain its sort order.
17508     *
17509     * @private
17510     * @param {Array} array The sorted array to inspect.
17511     * @param {*} value The value to evaluate.
17512     * @param {boolean} [retHighest] Specify returning the highest qualified index.
17513     * @returns {number} Returns the index at which `value` should be inserted
17514     *  into `array`.
17515     */
17516    function baseSortedIndex(array, value, retHighest) {
17517      var low = 0,
17518          high = array == null ? low : array.length;
17519
17520      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
17521        while (low < high) {
17522          var mid = (low + high) >>> 1,
17523              computed = array[mid];
17524
17525          if (computed !== null && !isSymbol(computed) &&
17526              (retHighest ? (computed <= value) : (computed < value))) {
17527            low = mid + 1;
17528          } else {
17529            high = mid;
17530          }
17531        }
17532        return high;
17533      }
17534      return baseSortedIndexBy(array, value, identity, retHighest);
17535    }
17536
17537    /**
17538     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
17539     * which invokes `iteratee` for `value` and each element of `array` to compute
17540     * their sort ranking. The iteratee is invoked with one argument; (value).
17541     *
17542     * @private
17543     * @param {Array} array The sorted array to inspect.
17544     * @param {*} value The value to evaluate.
17545     * @param {Function} iteratee The iteratee invoked per element.
17546     * @param {boolean} [retHighest] Specify returning the highest qualified index.
17547     * @returns {number} Returns the index at which `value` should be inserted
17548     *  into `array`.
17549     */
17550    function baseSortedIndexBy(array, value, iteratee, retHighest) {
17551      var low = 0,
17552          high = array == null ? 0 : array.length;
17553      if (high === 0) {
17554        return 0;
17555      }
17556
17557      value = iteratee(value);
17558      var valIsNaN = value !== value,
17559          valIsNull = value === null,
17560          valIsSymbol = isSymbol(value),
17561          valIsUndefined = value === undefined;
17562
17563      while (low < high) {
17564        var mid = nativeFloor((low + high) / 2),
17565            computed = iteratee(array[mid]),
17566            othIsDefined = computed !== undefined,
17567            othIsNull = computed === null,
17568            othIsReflexive = computed === computed,
17569            othIsSymbol = isSymbol(computed);
17570
17571        if (valIsNaN) {
17572          var setLow = retHighest || othIsReflexive;
17573        } else if (valIsUndefined) {
17574          setLow = othIsReflexive && (retHighest || othIsDefined);
17575        } else if (valIsNull) {
17576          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
17577        } else if (valIsSymbol) {
17578          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
17579        } else if (othIsNull || othIsSymbol) {
17580          setLow = false;
17581        } else {
17582          setLow = retHighest ? (computed <= value) : (computed < value);
17583        }
17584        if (setLow) {
17585          low = mid + 1;
17586        } else {
17587          high = mid;
17588        }
17589      }
17590      return nativeMin(high, MAX_ARRAY_INDEX);
17591    }
17592
17593    /**
17594     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
17595     * support for iteratee shorthands.
17596     *
17597     * @private
17598     * @param {Array} array The array to inspect.
17599     * @param {Function} [iteratee] The iteratee invoked per element.
17600     * @returns {Array} Returns the new duplicate free array.
17601     */
17602    function baseSortedUniq(array, iteratee) {
17603      var index = -1,
17604          length = array.length,
17605          resIndex = 0,
17606          result = [];
17607
17608      while (++index < length) {
17609        var value = array[index],
17610            computed = iteratee ? iteratee(value) : value;
17611
17612        if (!index || !eq(computed, seen)) {
17613          var seen = computed;
17614          result[resIndex++] = value === 0 ? 0 : value;
17615        }
17616      }
17617      return result;
17618    }
17619
17620    /**
17621     * The base implementation of `_.toNumber` which doesn't ensure correct
17622     * conversions of binary, hexadecimal, or octal string values.
17623     *
17624     * @private
17625     * @param {*} value The value to process.
17626     * @returns {number} Returns the number.
17627     */
17628    function baseToNumber(value) {
17629      if (typeof value == 'number') {
17630        return value;
17631      }
17632      if (isSymbol(value)) {
17633        return NAN;
17634      }
17635      return +value;
17636    }
17637
17638    /**
17639     * The base implementation of `_.toString` which doesn't convert nullish
17640     * values to empty strings.
17641     *
17642     * @private
17643     * @param {*} value The value to process.
17644     * @returns {string} Returns the string.
17645     */
17646    function baseToString(value) {
17647      // Exit early for strings to avoid a performance hit in some environments.
17648      if (typeof value == 'string') {
17649        return value;
17650      }
17651      if (isArray(value)) {
17652        // Recursively convert values (susceptible to call stack limits).
17653        return arrayMap(value, baseToString) + '';
17654      }
17655      if (isSymbol(value)) {
17656        return symbolToString ? symbolToString.call(value) : '';
17657      }
17658      var result = (value + '');
17659      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
17660    }
17661
17662    /**
17663     * The base implementation of `_.uniqBy` without support for iteratee shorthands.
17664     *
17665     * @private
17666     * @param {Array} array The array to inspect.
17667     * @param {Function} [iteratee] The iteratee invoked per element.
17668     * @param {Function} [comparator] The comparator invoked per element.
17669     * @returns {Array} Returns the new duplicate free array.
17670     */
17671    function baseUniq(array, iteratee, comparator) {
17672      var index = -1,
17673          includes = arrayIncludes,
17674          length = array.length,
17675          isCommon = true,
17676          result = [],
17677          seen = result;
17678
17679      if (comparator) {
17680        isCommon = false;
17681        includes = arrayIncludesWith;
17682      }
17683      else if (length >= LARGE_ARRAY_SIZE) {
17684        var set = iteratee ? null : createSet(array);
17685        if (set) {
17686          return setToArray(set);
17687        }
17688        isCommon = false;
17689        includes = cacheHas;
17690        seen = new SetCache;
17691      }
17692      else {
17693        seen = iteratee ? [] : result;
17694      }
17695      outer:
17696      while (++index < length) {
17697        var value = array[index],
17698            computed = iteratee ? iteratee(value) : value;
17699
17700        value = (comparator || value !== 0) ? value : 0;
17701        if (isCommon && computed === computed) {
17702          var seenIndex = seen.length;
17703          while (seenIndex--) {
17704            if (seen[seenIndex] === computed) {
17705              continue outer;
17706            }
17707          }
17708          if (iteratee) {
17709            seen.push(computed);
17710          }
17711          result.push(value);
17712        }
17713        else if (!includes(seen, computed, comparator)) {
17714          if (seen !== result) {
17715            seen.push(computed);
17716          }
17717          result.push(value);
17718        }
17719      }
17720      return result;
17721    }
17722
17723    /**
17724     * The base implementation of `_.unset`.
17725     *
17726     * @private
17727     * @param {Object} object The object to modify.
17728     * @param {Array|string} path The property path to unset.
17729     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
17730     */
17731    function baseUnset(object, path) {
17732      path = castPath(path, object);
17733      object = parent(object, path);
17734      return object == null || delete object[toKey(last(path))];
17735    }
17736
17737    /**
17738     * The base implementation of `_.update`.
17739     *
17740     * @private
17741     * @param {Object} object The object to modify.
17742     * @param {Array|string} path The path of the property to update.
17743     * @param {Function} updater The function to produce the updated value.
17744     * @param {Function} [customizer] The function to customize path creation.
17745     * @returns {Object} Returns `object`.
17746     */
17747    function baseUpdate(object, path, updater, customizer) {
17748      return baseSet(object, path, updater(baseGet(object, path)), customizer);
17749    }
17750
17751    /**
17752     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
17753     * without support for iteratee shorthands.
17754     *
17755     * @private
17756     * @param {Array} array The array to query.
17757     * @param {Function} predicate The function invoked per iteration.
17758     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
17759     * @param {boolean} [fromRight] Specify iterating from right to left.
17760     * @returns {Array} Returns the slice of `array`.
17761     */
17762    function baseWhile(array, predicate, isDrop, fromRight) {
17763      var length = array.length,
17764          index = fromRight ? length : -1;
17765
17766      while ((fromRight ? index-- : ++index < length) &&
17767        predicate(array[index], index, array)) {}
17768
17769      return isDrop
17770        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
17771        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
17772    }
17773
17774    /**
17775     * The base implementation of `wrapperValue` which returns the result of
17776     * performing a sequence of actions on the unwrapped `value`, where each
17777     * successive action is supplied the return value of the previous.
17778     *
17779     * @private
17780     * @param {*} value The unwrapped value.
17781     * @param {Array} actions Actions to perform to resolve the unwrapped value.
17782     * @returns {*} Returns the resolved value.
17783     */
17784    function baseWrapperValue(value, actions) {
17785      var result = value;
17786      if (result instanceof LazyWrapper) {
17787        result = result.value();
17788      }
17789      return arrayReduce(actions, function(result, action) {
17790        return action.func.apply(action.thisArg, arrayPush([result], action.args));
17791      }, result);
17792    }
17793
17794    /**
17795     * The base implementation of methods like `_.xor`, without support for
17796     * iteratee shorthands, that accepts an array of arrays to inspect.
17797     *
17798     * @private
17799     * @param {Array} arrays The arrays to inspect.
17800     * @param {Function} [iteratee] The iteratee invoked per element.
17801     * @param {Function} [comparator] The comparator invoked per element.
17802     * @returns {Array} Returns the new array of values.
17803     */
17804    function baseXor(arrays, iteratee, comparator) {
17805      var length = arrays.length;
17806      if (length < 2) {
17807        return length ? baseUniq(arrays[0]) : [];
17808      }
17809      var index = -1,
17810          result = Array(length);
17811
17812      while (++index < length) {
17813        var array = arrays[index],
17814            othIndex = -1;
17815
17816        while (++othIndex < length) {
17817          if (othIndex != index) {
17818            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
17819          }
17820        }
17821      }
17822      return baseUniq(baseFlatten(result, 1), iteratee, comparator);
17823    }
17824
17825    /**
17826     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
17827     *
17828     * @private
17829     * @param {Array} props The property identifiers.
17830     * @param {Array} values The property values.
17831     * @param {Function} assignFunc The function to assign values.
17832     * @returns {Object} Returns the new object.
17833     */
17834    function baseZipObject(props, values, assignFunc) {
17835      var index = -1,
17836          length = props.length,
17837          valsLength = values.length,
17838          result = {};
17839
17840      while (++index < length) {
17841        var value = index < valsLength ? values[index] : undefined;
17842        assignFunc(result, props[index], value);
17843      }
17844      return result;
17845    }
17846
17847    /**
17848     * Casts `value` to an empty array if it's not an array like object.
17849     *
17850     * @private
17851     * @param {*} value The value to inspect.
17852     * @returns {Array|Object} Returns the cast array-like object.
17853     */
17854    function castArrayLikeObject(value) {
17855      return isArrayLikeObject(value) ? value : [];
17856    }
17857
17858    /**
17859     * Casts `value` to `identity` if it's not a function.
17860     *
17861     * @private
17862     * @param {*} value The value to inspect.
17863     * @returns {Function} Returns cast function.
17864     */
17865    function castFunction(value) {
17866      return typeof value == 'function' ? value : identity;
17867    }
17868
17869    /**
17870     * Casts `value` to a path array if it's not one.
17871     *
17872     * @private
17873     * @param {*} value The value to inspect.
17874     * @param {Object} [object] The object to query keys on.
17875     * @returns {Array} Returns the cast property path array.
17876     */
17877    function castPath(value, object) {
17878      if (isArray(value)) {
17879        return value;
17880      }
17881      return isKey(value, object) ? [value] : stringToPath(toString(value));
17882    }
17883
17884    /**
17885     * A `baseRest` alias which can be replaced with `identity` by module
17886     * replacement plugins.
17887     *
17888     * @private
17889     * @type {Function}
17890     * @param {Function} func The function to apply a rest parameter to.
17891     * @returns {Function} Returns the new function.
17892     */
17893    var castRest = baseRest;
17894
17895    /**
17896     * Casts `array` to a slice if it's needed.
17897     *
17898     * @private
17899     * @param {Array} array The array to inspect.
17900     * @param {number} start The start position.
17901     * @param {number} [end=array.length] The end position.
17902     * @returns {Array} Returns the cast slice.
17903     */
17904    function castSlice(array, start, end) {
17905      var length = array.length;
17906      end = end === undefined ? length : end;
17907      return (!start && end >= length) ? array : baseSlice(array, start, end);
17908    }
17909
17910    /**
17911     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
17912     *
17913     * @private
17914     * @param {number|Object} id The timer id or timeout object of the timer to clear.
17915     */
17916    var clearTimeout = ctxClearTimeout || function(id) {
17917      return root.clearTimeout(id);
17918    };
17919
17920    /**
17921     * Creates a clone of  `buffer`.
17922     *
17923     * @private
17924     * @param {Buffer} buffer The buffer to clone.
17925     * @param {boolean} [isDeep] Specify a deep clone.
17926     * @returns {Buffer} Returns the cloned buffer.
17927     */
17928    function cloneBuffer(buffer, isDeep) {
17929      if (isDeep) {
17930        return buffer.slice();
17931      }
17932      var length = buffer.length,
17933          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
17934
17935      buffer.copy(result);
17936      return result;
17937    }
17938
17939    /**
17940     * Creates a clone of `arrayBuffer`.
17941     *
17942     * @private
17943     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
17944     * @returns {ArrayBuffer} Returns the cloned array buffer.
17945     */
17946    function cloneArrayBuffer(arrayBuffer) {
17947      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
17948      new Uint8Array(result).set(new Uint8Array(arrayBuffer));
17949      return result;
17950    }
17951
17952    /**
17953     * Creates a clone of `dataView`.
17954     *
17955     * @private
17956     * @param {Object} dataView The data view to clone.
17957     * @param {boolean} [isDeep] Specify a deep clone.
17958     * @returns {Object} Returns the cloned data view.
17959     */
17960    function cloneDataView(dataView, isDeep) {
17961      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
17962      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
17963    }
17964
17965    /**
17966     * Creates a clone of `regexp`.
17967     *
17968     * @private
17969     * @param {Object} regexp The regexp to clone.
17970     * @returns {Object} Returns the cloned regexp.
17971     */
17972    function cloneRegExp(regexp) {
17973      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
17974      result.lastIndex = regexp.lastIndex;
17975      return result;
17976    }
17977
17978    /**
17979     * Creates a clone of the `symbol` object.
17980     *
17981     * @private
17982     * @param {Object} symbol The symbol object to clone.
17983     * @returns {Object} Returns the cloned symbol object.
17984     */
17985    function cloneSymbol(symbol) {
17986      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
17987    }
17988
17989    /**
17990     * Creates a clone of `typedArray`.
17991     *
17992     * @private
17993     * @param {Object} typedArray The typed array to clone.
17994     * @param {boolean} [isDeep] Specify a deep clone.
17995     * @returns {Object} Returns the cloned typed array.
17996     */
17997    function cloneTypedArray(typedArray, isDeep) {
17998      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
17999      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
18000    }
18001
18002    /**
18003     * Compares values to sort them in ascending order.
18004     *
18005     * @private
18006     * @param {*} value The value to compare.
18007     * @param {*} other The other value to compare.
18008     * @returns {number} Returns the sort order indicator for `value`.
18009     */
18010    function compareAscending(value, other) {
18011      if (value !== other) {
18012        var valIsDefined = value !== undefined,
18013            valIsNull = value === null,
18014            valIsReflexive = value === value,
18015            valIsSymbol = isSymbol(value);
18016
18017        var othIsDefined = other !== undefined,
18018            othIsNull = other === null,
18019            othIsReflexive = other === other,
18020            othIsSymbol = isSymbol(other);
18021
18022        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
18023            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
18024            (valIsNull && othIsDefined && othIsReflexive) ||
18025            (!valIsDefined && othIsReflexive) ||
18026            !valIsReflexive) {
18027          return 1;
18028        }
18029        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
18030            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
18031            (othIsNull && valIsDefined && valIsReflexive) ||
18032            (!othIsDefined && valIsReflexive) ||
18033            !othIsReflexive) {
18034          return -1;
18035        }
18036      }
18037      return 0;
18038    }
18039
18040    /**
18041     * Used by `_.orderBy` to compare multiple properties of a value to another
18042     * and stable sort them.
18043     *
18044     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
18045     * specify an order of "desc" for descending or "asc" for ascending sort order
18046     * of corresponding values.
18047     *
18048     * @private
18049     * @param {Object} object The object to compare.
18050     * @param {Object} other The other object to compare.
18051     * @param {boolean[]|string[]} orders The order to sort by for each property.
18052     * @returns {number} Returns the sort order indicator for `object`.
18053     */
18054    function compareMultiple(object, other, orders) {
18055      var index = -1,
18056          objCriteria = object.criteria,
18057          othCriteria = other.criteria,
18058          length = objCriteria.length,
18059          ordersLength = orders.length;
18060
18061      while (++index < length) {
18062        var result = compareAscending(objCriteria[index], othCriteria[index]);
18063        if (result) {
18064          if (index >= ordersLength) {
18065            return result;
18066          }
18067          var order = orders[index];
18068          return result * (order == 'desc' ? -1 : 1);
18069        }
18070      }
18071      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
18072      // that causes it, under certain circumstances, to provide the same value for
18073      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
18074      // for more details.
18075      //
18076      // This also ensures a stable sort in V8 and other engines.
18077      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
18078      return object.index - other.index;
18079    }
18080
18081    /**
18082     * Creates an array that is the composition of partially applied arguments,
18083     * placeholders, and provided arguments into a single array of arguments.
18084     *
18085     * @private
18086     * @param {Array} args The provided arguments.
18087     * @param {Array} partials The arguments to prepend to those provided.
18088     * @param {Array} holders The `partials` placeholder indexes.
18089     * @params {boolean} [isCurried] Specify composing for a curried function.
18090     * @returns {Array} Returns the new array of composed arguments.
18091     */
18092    function composeArgs(args, partials, holders, isCurried) {
18093      var argsIndex = -1,
18094          argsLength = args.length,
18095          holdersLength = holders.length,
18096          leftIndex = -1,
18097          leftLength = partials.length,
18098          rangeLength = nativeMax(argsLength - holdersLength, 0),
18099          result = Array(leftLength + rangeLength),
18100          isUncurried = !isCurried;
18101
18102      while (++leftIndex < leftLength) {
18103        result[leftIndex] = partials[leftIndex];
18104      }
18105      while (++argsIndex < holdersLength) {
18106        if (isUncurried || argsIndex < argsLength) {
18107          result[holders[argsIndex]] = args[argsIndex];
18108        }
18109      }
18110      while (rangeLength--) {
18111        result[leftIndex++] = args[argsIndex++];
18112      }
18113      return result;
18114    }
18115
18116    /**
18117     * This function is like `composeArgs` except that the arguments composition
18118     * is tailored for `_.partialRight`.
18119     *
18120     * @private
18121     * @param {Array} args The provided arguments.
18122     * @param {Array} partials The arguments to append to those provided.
18123     * @param {Array} holders The `partials` placeholder indexes.
18124     * @params {boolean} [isCurried] Specify composing for a curried function.
18125     * @returns {Array} Returns the new array of composed arguments.
18126     */
18127    function composeArgsRight(args, partials, holders, isCurried) {
18128      var argsIndex = -1,
18129          argsLength = args.length,
18130          holdersIndex = -1,
18131          holdersLength = holders.length,
18132          rightIndex = -1,
18133          rightLength = partials.length,
18134          rangeLength = nativeMax(argsLength - holdersLength, 0),
18135          result = Array(rangeLength + rightLength),
18136          isUncurried = !isCurried;
18137
18138      while (++argsIndex < rangeLength) {
18139        result[argsIndex] = args[argsIndex];
18140      }
18141      var offset = argsIndex;
18142      while (++rightIndex < rightLength) {
18143        result[offset + rightIndex] = partials[rightIndex];
18144      }
18145      while (++holdersIndex < holdersLength) {
18146        if (isUncurried || argsIndex < argsLength) {
18147          result[offset + holders[holdersIndex]] = args[argsIndex++];
18148        }
18149      }
18150      return result;
18151    }
18152
18153    /**
18154     * Copies the values of `source` to `array`.
18155     *
18156     * @private
18157     * @param {Array} source The array to copy values from.
18158     * @param {Array} [array=[]] The array to copy values to.
18159     * @returns {Array} Returns `array`.
18160     */
18161    function copyArray(source, array) {
18162      var index = -1,
18163          length = source.length;
18164
18165      array || (array = Array(length));
18166      while (++index < length) {
18167        array[index] = source[index];
18168      }
18169      return array;
18170    }
18171
18172    /**
18173     * Copies properties of `source` to `object`.
18174     *
18175     * @private
18176     * @param {Object} source The object to copy properties from.
18177     * @param {Array} props The property identifiers to copy.
18178     * @param {Object} [object={}] The object to copy properties to.
18179     * @param {Function} [customizer] The function to customize copied values.
18180     * @returns {Object} Returns `object`.
18181     */
18182    function copyObject(source, props, object, customizer) {
18183      var isNew = !object;
18184      object || (object = {});
18185
18186      var index = -1,
18187          length = props.length;
18188
18189      while (++index < length) {
18190        var key = props[index];
18191
18192        var newValue = customizer
18193          ? customizer(object[key], source[key], key, object, source)
18194          : undefined;
18195
18196        if (newValue === undefined) {
18197          newValue = source[key];
18198        }
18199        if (isNew) {
18200          baseAssignValue(object, key, newValue);
18201        } else {
18202          assignValue(object, key, newValue);
18203        }
18204      }
18205      return object;
18206    }
18207
18208    /**
18209     * Copies own symbols of `source` to `object`.
18210     *
18211     * @private
18212     * @param {Object} source The object to copy symbols from.
18213     * @param {Object} [object={}] The object to copy symbols to.
18214     * @returns {Object} Returns `object`.
18215     */
18216    function copySymbols(source, object) {
18217      return copyObject(source, getSymbols(source), object);
18218    }
18219
18220    /**
18221     * Copies own and inherited symbols of `source` to `object`.
18222     *
18223     * @private
18224     * @param {Object} source The object to copy symbols from.
18225     * @param {Object} [object={}] The object to copy symbols to.
18226     * @returns {Object} Returns `object`.
18227     */
18228    function copySymbolsIn(source, object) {
18229      return copyObject(source, getSymbolsIn(source), object);
18230    }
18231
18232    /**
18233     * Creates a function like `_.groupBy`.
18234     *
18235     * @private
18236     * @param {Function} setter The function to set accumulator values.
18237     * @param {Function} [initializer] The accumulator object initializer.
18238     * @returns {Function} Returns the new aggregator function.
18239     */
18240    function createAggregator(setter, initializer) {
18241      return function(collection, iteratee) {
18242        var func = isArray(collection) ? arrayAggregator : baseAggregator,
18243            accumulator = initializer ? initializer() : {};
18244
18245        return func(collection, setter, getIteratee(iteratee, 2), accumulator);
18246      };
18247    }
18248
18249    /**
18250     * Creates a function like `_.assign`.
18251     *
18252     * @private
18253     * @param {Function} assigner The function to assign values.
18254     * @returns {Function} Returns the new assigner function.
18255     */
18256    function createAssigner(assigner) {
18257      return baseRest(function(object, sources) {
18258        var index = -1,
18259            length = sources.length,
18260            customizer = length > 1 ? sources[length - 1] : undefined,
18261            guard = length > 2 ? sources[2] : undefined;
18262
18263        customizer = (assigner.length > 3 && typeof customizer == 'function')
18264          ? (length--, customizer)
18265          : undefined;
18266
18267        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
18268          customizer = length < 3 ? undefined : customizer;
18269          length = 1;
18270        }
18271        object = Object(object);
18272        while (++index < length) {
18273          var source = sources[index];
18274          if (source) {
18275            assigner(object, source, index, customizer);
18276          }
18277        }
18278        return object;
18279      });
18280    }
18281
18282    /**
18283     * Creates a `baseEach` or `baseEachRight` function.
18284     *
18285     * @private
18286     * @param {Function} eachFunc The function to iterate over a collection.
18287     * @param {boolean} [fromRight] Specify iterating from right to left.
18288     * @returns {Function} Returns the new base function.
18289     */
18290    function createBaseEach(eachFunc, fromRight) {
18291      return function(collection, iteratee) {
18292        if (collection == null) {
18293          return collection;
18294        }
18295        if (!isArrayLike(collection)) {
18296          return eachFunc(collection, iteratee);
18297        }
18298        var length = collection.length,
18299            index = fromRight ? length : -1,
18300            iterable = Object(collection);
18301
18302        while ((fromRight ? index-- : ++index < length)) {
18303          if (iteratee(iterable[index], index, iterable) === false) {
18304            break;
18305          }
18306        }
18307        return collection;
18308      };
18309    }
18310
18311    /**
18312     * Creates a base function for methods like `_.forIn` and `_.forOwn`.
18313     *
18314     * @private
18315     * @param {boolean} [fromRight] Specify iterating from right to left.
18316     * @returns {Function} Returns the new base function.
18317     */
18318    function createBaseFor(fromRight) {
18319      return function(object, iteratee, keysFunc) {
18320        var index = -1,
18321            iterable = Object(object),
18322            props = keysFunc(object),
18323            length = props.length;
18324
18325        while (length--) {
18326          var key = props[fromRight ? length : ++index];
18327          if (iteratee(iterable[key], key, iterable) === false) {
18328            break;
18329          }
18330        }
18331        return object;
18332      };
18333    }
18334
18335    /**
18336     * Creates a function that wraps `func` to invoke it with the optional `this`
18337     * binding of `thisArg`.
18338     *
18339     * @private
18340     * @param {Function} func The function to wrap.
18341     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
18342     * @param {*} [thisArg] The `this` binding of `func`.
18343     * @returns {Function} Returns the new wrapped function.
18344     */
18345    function createBind(func, bitmask, thisArg) {
18346      var isBind = bitmask & WRAP_BIND_FLAG,
18347          Ctor = createCtor(func);
18348
18349      function wrapper() {
18350        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
18351        return fn.apply(isBind ? thisArg : this, arguments);
18352      }
18353      return wrapper;
18354    }
18355
18356    /**
18357     * Creates a function like `_.lowerFirst`.
18358     *
18359     * @private
18360     * @param {string} methodName The name of the `String` case method to use.
18361     * @returns {Function} Returns the new case function.
18362     */
18363    function createCaseFirst(methodName) {
18364      return function(string) {
18365        string = toString(string);
18366
18367        var strSymbols = hasUnicode(string)
18368          ? stringToArray(string)
18369          : undefined;
18370
18371        var chr = strSymbols
18372          ? strSymbols[0]
18373          : string.charAt(0);
18374
18375        var trailing = strSymbols
18376          ? castSlice(strSymbols, 1).join('')
18377          : string.slice(1);
18378
18379        return chr[methodName]() + trailing;
18380      };
18381    }
18382
18383    /**
18384     * Creates a function like `_.camelCase`.
18385     *
18386     * @private
18387     * @param {Function} callback The function to combine each word.
18388     * @returns {Function} Returns the new compounder function.
18389     */
18390    function createCompounder(callback) {
18391      return function(string) {
18392        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
18393      };
18394    }
18395
18396    /**
18397     * Creates a function that produces an instance of `Ctor` regardless of
18398     * whether it was invoked as part of a `new` expression or by `call` or `apply`.
18399     *
18400     * @private
18401     * @param {Function} Ctor The constructor to wrap.
18402     * @returns {Function} Returns the new wrapped function.
18403     */
18404    function createCtor(Ctor) {
18405      return function() {
18406        // Use a `switch` statement to work with class constructors. See
18407        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
18408        // for more details.
18409        var args = arguments;
18410        switch (args.length) {
18411          case 0: return new Ctor;
18412          case 1: return new Ctor(args[0]);
18413          case 2: return new Ctor(args[0], args[1]);
18414          case 3: return new Ctor(args[0], args[1], args[2]);
18415          case 4: return new Ctor(args[0], args[1], args[2], args[3]);
18416          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
18417          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
18418          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
18419        }
18420        var thisBinding = baseCreate(Ctor.prototype),
18421            result = Ctor.apply(thisBinding, args);
18422
18423        // Mimic the constructor's `return` behavior.
18424        // See https://es5.github.io/#x13.2.2 for more details.
18425        return isObject(result) ? result : thisBinding;
18426      };
18427    }
18428
18429    /**
18430     * Creates a function that wraps `func` to enable currying.
18431     *
18432     * @private
18433     * @param {Function} func The function to wrap.
18434     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
18435     * @param {number} arity The arity of `func`.
18436     * @returns {Function} Returns the new wrapped function.
18437     */
18438    function createCurry(func, bitmask, arity) {
18439      var Ctor = createCtor(func);
18440
18441      function wrapper() {
18442        var length = arguments.length,
18443            args = Array(length),
18444            index = length,
18445            placeholder = getHolder(wrapper);
18446
18447        while (index--) {
18448          args[index] = arguments[index];
18449        }
18450        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
18451          ? []
18452          : replaceHolders(args, placeholder);
18453
18454        length -= holders.length;
18455        if (length < arity) {
18456          return createRecurry(
18457            func, bitmask, createHybrid, wrapper.placeholder, undefined,
18458            args, holders, undefined, undefined, arity - length);
18459        }
18460        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
18461        return apply(fn, this, args);
18462      }
18463      return wrapper;
18464    }
18465
18466    /**
18467     * Creates a `_.find` or `_.findLast` function.
18468     *
18469     * @private
18470     * @param {Function} findIndexFunc The function to find the collection index.
18471     * @returns {Function} Returns the new find function.
18472     */
18473    function createFind(findIndexFunc) {
18474      return function(collection, predicate, fromIndex) {
18475        var iterable = Object(collection);
18476        if (!isArrayLike(collection)) {
18477          var iteratee = getIteratee(predicate, 3);
18478          collection = keys(collection);
18479          predicate = function(key) { return iteratee(iterable[key], key, iterable); };
18480        }
18481        var index = findIndexFunc(collection, predicate, fromIndex);
18482        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
18483      };
18484    }
18485
18486    /**
18487     * Creates a `_.flow` or `_.flowRight` function.
18488     *
18489     * @private
18490     * @param {boolean} [fromRight] Specify iterating from right to left.
18491     * @returns {Function} Returns the new flow function.
18492     */
18493    function createFlow(fromRight) {
18494      return flatRest(function(funcs) {
18495        var length = funcs.length,
18496            index = length,
18497            prereq = LodashWrapper.prototype.thru;
18498
18499        if (fromRight) {
18500          funcs.reverse();
18501        }
18502        while (index--) {
18503          var func = funcs[index];
18504          if (typeof func != 'function') {
18505            throw new TypeError(FUNC_ERROR_TEXT);
18506          }
18507          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
18508            var wrapper = new LodashWrapper([], true);
18509          }
18510        }
18511        index = wrapper ? index : length;
18512        while (++index < length) {
18513          func = funcs[index];
18514
18515          var funcName = getFuncName(func),
18516              data = funcName == 'wrapper' ? getData(func) : undefined;
18517
18518          if (data && isLaziable(data[0]) &&
18519                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
18520                !data[4].length && data[9] == 1
18521              ) {
18522            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
18523          } else {
18524            wrapper = (func.length == 1 && isLaziable(func))
18525              ? wrapper[funcName]()
18526              : wrapper.thru(func);
18527          }
18528        }
18529        return function() {
18530          var args = arguments,
18531              value = args[0];
18532
18533          if (wrapper && args.length == 1 && isArray(value)) {
18534            return wrapper.plant(value).value();
18535          }
18536          var index = 0,
18537              result = length ? funcs[index].apply(this, args) : value;
18538
18539          while (++index < length) {
18540            result = funcs[index].call(this, result);
18541          }
18542          return result;
18543        };
18544      });
18545    }
18546
18547    /**
18548     * Creates a function that wraps `func` to invoke it with optional `this`
18549     * binding of `thisArg`, partial application, and currying.
18550     *
18551     * @private
18552     * @param {Function|string} func The function or method name to wrap.
18553     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
18554     * @param {*} [thisArg] The `this` binding of `func`.
18555     * @param {Array} [partials] The arguments to prepend to those provided to
18556     *  the new function.
18557     * @param {Array} [holders] The `partials` placeholder indexes.
18558     * @param {Array} [partialsRight] The arguments to append to those provided
18559     *  to the new function.
18560     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
18561     * @param {Array} [argPos] The argument positions of the new function.
18562     * @param {number} [ary] The arity cap of `func`.
18563     * @param {number} [arity] The arity of `func`.
18564     * @returns {Function} Returns the new wrapped function.
18565     */
18566    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
18567      var isAry = bitmask & WRAP_ARY_FLAG,
18568          isBind = bitmask & WRAP_BIND_FLAG,
18569          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
18570          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
18571          isFlip = bitmask & WRAP_FLIP_FLAG,
18572          Ctor = isBindKey ? undefined : createCtor(func);
18573
18574      function wrapper() {
18575        var length = arguments.length,
18576            args = Array(length),
18577            index = length;
18578
18579        while (index--) {
18580          args[index] = arguments[index];
18581        }
18582        if (isCurried) {
18583          var placeholder = getHolder(wrapper),
18584              holdersCount = countHolders(args, placeholder);
18585        }
18586        if (partials) {
18587          args = composeArgs(args, partials, holders, isCurried);
18588        }
18589        if (partialsRight) {
18590          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
18591        }
18592        length -= holdersCount;
18593        if (isCurried && length < arity) {
18594          var newHolders = replaceHolders(args, placeholder);
18595          return createRecurry(
18596            func, bitmask, createHybrid, wrapper.placeholder, thisArg,
18597            args, newHolders, argPos, ary, arity - length
18598          );
18599        }
18600        var thisBinding = isBind ? thisArg : this,
18601            fn = isBindKey ? thisBinding[func] : func;
18602
18603        length = args.length;
18604        if (argPos) {
18605          args = reorder(args, argPos);
18606        } else if (isFlip && length > 1) {
18607          args.reverse();
18608        }
18609        if (isAry && ary < length) {
18610          args.length = ary;
18611        }
18612        if (this && this !== root && this instanceof wrapper) {
18613          fn = Ctor || createCtor(fn);
18614        }
18615        return fn.apply(thisBinding, args);
18616      }
18617      return wrapper;
18618    }
18619
18620    /**
18621     * Creates a function like `_.invertBy`.
18622     *
18623     * @private
18624     * @param {Function} setter The function to set accumulator values.
18625     * @param {Function} toIteratee The function to resolve iteratees.
18626     * @returns {Function} Returns the new inverter function.
18627     */
18628    function createInverter(setter, toIteratee) {
18629      return function(object, iteratee) {
18630        return baseInverter(object, setter, toIteratee(iteratee), {});
18631      };
18632    }
18633
18634    /**
18635     * Creates a function that performs a mathematical operation on two values.
18636     *
18637     * @private
18638     * @param {Function} operator The function to perform the operation.
18639     * @param {number} [defaultValue] The value used for `undefined` arguments.
18640     * @returns {Function} Returns the new mathematical operation function.
18641     */
18642    function createMathOperation(operator, defaultValue) {
18643      return function(value, other) {
18644        var result;
18645        if (value === undefined && other === undefined) {
18646          return defaultValue;
18647        }
18648        if (value !== undefined) {
18649          result = value;
18650        }
18651        if (other !== undefined) {
18652          if (result === undefined) {
18653            return other;
18654          }
18655          if (typeof value == 'string' || typeof other == 'string') {
18656            value = baseToString(value);
18657            other = baseToString(other);
18658          } else {
18659            value = baseToNumber(value);
18660            other = baseToNumber(other);
18661          }
18662          result = operator(value, other);
18663        }
18664        return result;
18665      };
18666    }
18667
18668    /**
18669     * Creates a function like `_.over`.
18670     *
18671     * @private
18672     * @param {Function} arrayFunc The function to iterate over iteratees.
18673     * @returns {Function} Returns the new over function.
18674     */
18675    function createOver(arrayFunc) {
18676      return flatRest(function(iteratees) {
18677        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
18678        return baseRest(function(args) {
18679          var thisArg = this;
18680          return arrayFunc(iteratees, function(iteratee) {
18681            return apply(iteratee, thisArg, args);
18682          });
18683        });
18684      });
18685    }
18686
18687    /**
18688     * Creates the padding for `string` based on `length`. The `chars` string
18689     * is truncated if the number of characters exceeds `length`.
18690     *
18691     * @private
18692     * @param {number} length The padding length.
18693     * @param {string} [chars=' '] The string used as padding.
18694     * @returns {string} Returns the padding for `string`.
18695     */
18696    function createPadding(length, chars) {
18697      chars = chars === undefined ? ' ' : baseToString(chars);
18698
18699      var charsLength = chars.length;
18700      if (charsLength < 2) {
18701        return charsLength ? baseRepeat(chars, length) : chars;
18702      }
18703      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
18704      return hasUnicode(chars)
18705        ? castSlice(stringToArray(result), 0, length).join('')
18706        : result.slice(0, length);
18707    }
18708
18709    /**
18710     * Creates a function that wraps `func` to invoke it with the `this` binding
18711     * of `thisArg` and `partials` prepended to the arguments it receives.
18712     *
18713     * @private
18714     * @param {Function} func The function to wrap.
18715     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
18716     * @param {*} thisArg The `this` binding of `func`.
18717     * @param {Array} partials The arguments to prepend to those provided to
18718     *  the new function.
18719     * @returns {Function} Returns the new wrapped function.
18720     */
18721    function createPartial(func, bitmask, thisArg, partials) {
18722      var isBind = bitmask & WRAP_BIND_FLAG,
18723          Ctor = createCtor(func);
18724
18725      function wrapper() {
18726        var argsIndex = -1,
18727            argsLength = arguments.length,
18728            leftIndex = -1,
18729            leftLength = partials.length,
18730            args = Array(leftLength + argsLength),
18731            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
18732
18733        while (++leftIndex < leftLength) {
18734          args[leftIndex] = partials[leftIndex];
18735        }
18736        while (argsLength--) {
18737          args[leftIndex++] = arguments[++argsIndex];
18738        }
18739        return apply(fn, isBind ? thisArg : this, args);
18740      }
18741      return wrapper;
18742    }
18743
18744    /**
18745     * Creates a `_.range` or `_.rangeRight` function.
18746     *
18747     * @private
18748     * @param {boolean} [fromRight] Specify iterating from right to left.
18749     * @returns {Function} Returns the new range function.
18750     */
18751    function createRange(fromRight) {
18752      return function(start, end, step) {
18753        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
18754          end = step = undefined;
18755        }
18756        // Ensure the sign of `-0` is preserved.
18757        start = toFinite(start);
18758        if (end === undefined) {
18759          end = start;
18760          start = 0;
18761        } else {
18762          end = toFinite(end);
18763        }
18764        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
18765        return baseRange(start, end, step, fromRight);
18766      };
18767    }
18768
18769    /**
18770     * Creates a function that performs a relational operation on two values.
18771     *
18772     * @private
18773     * @param {Function} operator The function to perform the operation.
18774     * @returns {Function} Returns the new relational operation function.
18775     */
18776    function createRelationalOperation(operator) {
18777      return function(value, other) {
18778        if (!(typeof value == 'string' && typeof other == 'string')) {
18779          value = toNumber(value);
18780          other = toNumber(other);
18781        }
18782        return operator(value, other);
18783      };
18784    }
18785
18786    /**
18787     * Creates a function that wraps `func` to continue currying.
18788     *
18789     * @private
18790     * @param {Function} func The function to wrap.
18791     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
18792     * @param {Function} wrapFunc The function to create the `func` wrapper.
18793     * @param {*} placeholder The placeholder value.
18794     * @param {*} [thisArg] The `this` binding of `func`.
18795     * @param {Array} [partials] The arguments to prepend to those provided to
18796     *  the new function.
18797     * @param {Array} [holders] The `partials` placeholder indexes.
18798     * @param {Array} [argPos] The argument positions of the new function.
18799     * @param {number} [ary] The arity cap of `func`.
18800     * @param {number} [arity] The arity of `func`.
18801     * @returns {Function} Returns the new wrapped function.
18802     */
18803    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
18804      var isCurry = bitmask & WRAP_CURRY_FLAG,
18805          newHolders = isCurry ? holders : undefined,
18806          newHoldersRight = isCurry ? undefined : holders,
18807          newPartials = isCurry ? partials : undefined,
18808          newPartialsRight = isCurry ? undefined : partials;
18809
18810      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
18811      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
18812
18813      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
18814        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
18815      }
18816      var newData = [
18817        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
18818        newHoldersRight, argPos, ary, arity
18819      ];
18820
18821      var result = wrapFunc.apply(undefined, newData);
18822      if (isLaziable(func)) {
18823        setData(result, newData);
18824      }
18825      result.placeholder = placeholder;
18826      return setWrapToString(result, func, bitmask);
18827    }
18828
18829    /**
18830     * Creates a function like `_.round`.
18831     *
18832     * @private
18833     * @param {string} methodName The name of the `Math` method to use when rounding.
18834     * @returns {Function} Returns the new round function.
18835     */
18836    function createRound(methodName) {
18837      var func = Math[methodName];
18838      return function(number, precision) {
18839        number = toNumber(number);
18840        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
18841        if (precision && nativeIsFinite(number)) {
18842          // Shift with exponential notation to avoid floating-point issues.
18843          // See [MDN](https://mdn.io/round#Examples) for more details.
18844          var pair = (toString(number) + 'e').split('e'),
18845              value = func(pair[0] + 'e' + (+pair[1] + precision));
18846
18847          pair = (toString(value) + 'e').split('e');
18848          return +(pair[0] + 'e' + (+pair[1] - precision));
18849        }
18850        return func(number);
18851      };
18852    }
18853
18854    /**
18855     * Creates a set object of `values`.
18856     *
18857     * @private
18858     * @param {Array} values The values to add to the set.
18859     * @returns {Object} Returns the new set.
18860     */
18861    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
18862      return new Set(values);
18863    };
18864
18865    /**
18866     * Creates a `_.toPairs` or `_.toPairsIn` function.
18867     *
18868     * @private
18869     * @param {Function} keysFunc The function to get the keys of a given object.
18870     * @returns {Function} Returns the new pairs function.
18871     */
18872    function createToPairs(keysFunc) {
18873      return function(object) {
18874        var tag = getTag(object);
18875        if (tag == mapTag) {
18876          return mapToArray(object);
18877        }
18878        if (tag == setTag) {
18879          return setToPairs(object);
18880        }
18881        return baseToPairs(object, keysFunc(object));
18882      };
18883    }
18884
18885    /**
18886     * Creates a function that either curries or invokes `func` with optional
18887     * `this` binding and partially applied arguments.
18888     *
18889     * @private
18890     * @param {Function|string} func The function or method name to wrap.
18891     * @param {number} bitmask The bitmask flags.
18892     *    1 - `_.bind`
18893     *    2 - `_.bindKey`
18894     *    4 - `_.curry` or `_.curryRight` of a bound function
18895     *    8 - `_.curry`
18896     *   16 - `_.curryRight`
18897     *   32 - `_.partial`
18898     *   64 - `_.partialRight`
18899     *  128 - `_.rearg`
18900     *  256 - `_.ary`
18901     *  512 - `_.flip`
18902     * @param {*} [thisArg] The `this` binding of `func`.
18903     * @param {Array} [partials] The arguments to be partially applied.
18904     * @param {Array} [holders] The `partials` placeholder indexes.
18905     * @param {Array} [argPos] The argument positions of the new function.
18906     * @param {number} [ary] The arity cap of `func`.
18907     * @param {number} [arity] The arity of `func`.
18908     * @returns {Function} Returns the new wrapped function.
18909     */
18910    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
18911      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
18912      if (!isBindKey && typeof func != 'function') {
18913        throw new TypeError(FUNC_ERROR_TEXT);
18914      }
18915      var length = partials ? partials.length : 0;
18916      if (!length) {
18917        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
18918        partials = holders = undefined;
18919      }
18920      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
18921      arity = arity === undefined ? arity : toInteger(arity);
18922      length -= holders ? holders.length : 0;
18923
18924      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
18925        var partialsRight = partials,
18926            holdersRight = holders;
18927
18928        partials = holders = undefined;
18929      }
18930      var data = isBindKey ? undefined : getData(func);
18931
18932      var newData = [
18933        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
18934        argPos, ary, arity
18935      ];
18936
18937      if (data) {
18938        mergeData(newData, data);
18939      }
18940      func = newData[0];
18941      bitmask = newData[1];
18942      thisArg = newData[2];
18943      partials = newData[3];
18944      holders = newData[4];
18945      arity = newData[9] = newData[9] === undefined
18946        ? (isBindKey ? 0 : func.length)
18947        : nativeMax(newData[9] - length, 0);
18948
18949      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
18950        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
18951      }
18952      if (!bitmask || bitmask == WRAP_BIND_FLAG) {
18953        var result = createBind(func, bitmask, thisArg);
18954      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
18955        result = createCurry(func, bitmask, arity);
18956      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
18957        result = createPartial(func, bitmask, thisArg, partials);
18958      } else {
18959        result = createHybrid.apply(undefined, newData);
18960      }
18961      var setter = data ? baseSetData : setData;
18962      return setWrapToString(setter(result, newData), func, bitmask);
18963    }
18964
18965    /**
18966     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
18967     * of source objects to the destination object for all destination properties
18968     * that resolve to `undefined`.
18969     *
18970     * @private
18971     * @param {*} objValue The destination value.
18972     * @param {*} srcValue The source value.
18973     * @param {string} key The key of the property to assign.
18974     * @param {Object} object The parent object of `objValue`.
18975     * @returns {*} Returns the value to assign.
18976     */
18977    function customDefaultsAssignIn(objValue, srcValue, key, object) {
18978      if (objValue === undefined ||
18979          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
18980        return srcValue;
18981      }
18982      return objValue;
18983    }
18984
18985    /**
18986     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
18987     * objects into destination objects that are passed thru.
18988     *
18989     * @private
18990     * @param {*} objValue The destination value.
18991     * @param {*} srcValue The source value.
18992     * @param {string} key The key of the property to merge.
18993     * @param {Object} object The parent object of `objValue`.
18994     * @param {Object} source The parent object of `srcValue`.
18995     * @param {Object} [stack] Tracks traversed source values and their merged
18996     *  counterparts.
18997     * @returns {*} Returns the value to assign.
18998     */
18999    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
19000      if (isObject(objValue) && isObject(srcValue)) {
19001        // Recursively merge objects and arrays (susceptible to call stack limits).
19002        stack.set(srcValue, objValue);
19003        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
19004        stack['delete'](srcValue);
19005      }
19006      return objValue;
19007    }
19008
19009    /**
19010     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
19011     * objects.
19012     *
19013     * @private
19014     * @param {*} value The value to inspect.
19015     * @param {string} key The key of the property to inspect.
19016     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
19017     */
19018    function customOmitClone(value) {
19019      return isPlainObject(value) ? undefined : value;
19020    }
19021
19022    /**
19023     * A specialized version of `baseIsEqualDeep` for arrays with support for
19024     * partial deep comparisons.
19025     *
19026     * @private
19027     * @param {Array} array The array to compare.
19028     * @param {Array} other The other array to compare.
19029     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19030     * @param {Function} customizer The function to customize comparisons.
19031     * @param {Function} equalFunc The function to determine equivalents of values.
19032     * @param {Object} stack Tracks traversed `array` and `other` objects.
19033     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19034     */
19035    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19036      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19037          arrLength = array.length,
19038          othLength = other.length;
19039
19040      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19041        return false;
19042      }
19043      // Check that cyclic values are equal.
19044      var arrStacked = stack.get(array);
19045      var othStacked = stack.get(other);
19046      if (arrStacked && othStacked) {
19047        return arrStacked == other && othStacked == array;
19048      }
19049      var index = -1,
19050          result = true,
19051          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19052
19053      stack.set(array, other);
19054      stack.set(other, array);
19055
19056      // Ignore non-index properties.
19057      while (++index < arrLength) {
19058        var arrValue = array[index],
19059            othValue = other[index];
19060
19061        if (customizer) {
19062          var compared = isPartial
19063            ? customizer(othValue, arrValue, index, other, array, stack)
19064            : customizer(arrValue, othValue, index, array, other, stack);
19065        }
19066        if (compared !== undefined) {
19067          if (compared) {
19068            continue;
19069          }
19070          result = false;
19071          break;
19072        }
19073        // Recursively compare arrays (susceptible to call stack limits).
19074        if (seen) {
19075          if (!arraySome(other, function(othValue, othIndex) {
19076                if (!cacheHas(seen, othIndex) &&
19077                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19078                  return seen.push(othIndex);
19079                }
19080              })) {
19081            result = false;
vendor: 4,179 bytes, lines 19082-19193
19082            break;
19083          }
19084        } else if (!(
19085              arrValue === othValue ||
19086                equalFunc(arrValue, othValue, bitmask, customizer, stack)
19087            )) {
19088          result = false;
19089          break;
19090        }
19091      }
19092      stack['delete'](array);
19093      stack['delete'](other);
19094      return result;
19095    }
19096
19097    /**
19098     * A specialized version of `baseIsEqualDeep` for comparing objects of
19099     * the same `toStringTag`.
19100     *
19101     * **Note:** This function only supports comparing values with tags of
19102     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19103     *
19104     * @private
19105     * @param {Object} object The object to compare.
19106     * @param {Object} other The other object to compare.
19107     * @param {string} tag The `toStringTag` of the objects to compare.
19108     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19109     * @param {Function} customizer The function to customize comparisons.
19110     * @param {Function} equalFunc The function to determine equivalents of values.
19111     * @param {Object} stack Tracks traversed `object` and `other` objects.
19112     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19113     */
19114    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19115      switch (tag) {
19116        case dataViewTag:
19117          if ((object.byteLength != other.byteLength) ||
19118              (object.byteOffset != other.byteOffset)) {
19119            return false;
19120          }
19121          object = object.buffer;
19122          other = other.buffer;
19123
19124        case arrayBufferTag:
19125          if ((object.byteLength != other.byteLength) ||
19126              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
19127            return false;
19128          }
19129          return true;
19130
19131        case boolTag:
19132        case dateTag:
19133        case numberTag:
19134          // Coerce booleans to `1` or `0` and dates to milliseconds.
19135          // Invalid dates are coerced to `NaN`.
19136          return eq(+object, +other);
19137
19138        case errorTag:
19139          return object.name == other.name && object.message == other.message;
19140
19141        case regexpTag:
19142        case stringTag:
19143          // Coerce regexes to strings and treat strings, primitives and objects,
19144          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19145          // for more details.
19146          return object == (other + '');
19147
19148        case mapTag:
19149          var convert = mapToArray;
19150
19151        case setTag:
19152          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
19153          convert || (convert = setToArray);
19154
19155          if (object.size != other.size && !isPartial) {
19156            return false;
19157          }
19158          // Assume cyclic values are equal.
19159          var stacked = stack.get(object);
19160          if (stacked) {
19161            return stacked == other;
19162          }
19163          bitmask |= COMPARE_UNORDERED_FLAG;
19164
19165          // Recursively compare objects (susceptible to call stack limits).
19166          stack.set(object, other);
19167          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19168          stack['delete'](object);
19169          return result;
19170
19171        case symbolTag:
19172          if (symbolValueOf) {
19173            return symbolValueOf.call(object) == symbolValueOf.call(other);
19174          }
19175      }
19176      return false;
19177    }
19178
19179    /**
19180     * A specialized version of `baseIsEqualDeep` for objects with support for
19181     * partial deep comparisons.
19182     *
19183     * @private
19184     * @param {Object} object The object to compare.
19185     * @param {Object} other The other object to compare.
19186     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19187     * @param {Function} customizer The function to customize comparisons.
19188     * @param {Function} equalFunc The function to determine equivalents of values.
19189     * @param {Object} stack Tracks traversed `object` and `other` objects.
19190     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19191     */
19192    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19193      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
vendor: 9,614 bytes, lines 19194-19501
19194          objProps = getAllKeys(object),
19195          objLength = objProps.length,
19196          othProps = getAllKeys(other),
19197          othLength = othProps.length;
19198
19199      if (objLength != othLength && !isPartial) {
19200        return false;
19201      }
19202      var index = objLength;
19203      while (index--) {
19204        var key = objProps[index];
19205        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
19206          return false;
19207        }
19208      }
19209      // Check that cyclic values are equal.
19210      var objStacked = stack.get(object);
19211      var othStacked = stack.get(other);
19212      if (objStacked && othStacked) {
19213        return objStacked == other && othStacked == object;
19214      }
19215      var result = true;
19216      stack.set(object, other);
19217      stack.set(other, object);
19218
19219      var skipCtor = isPartial;
19220      while (++index < objLength) {
19221        key = objProps[index];
19222        var objValue = object[key],
19223            othValue = other[key];
19224
19225        if (customizer) {
19226          var compared = isPartial
19227            ? customizer(othValue, objValue, key, other, object, stack)
19228            : customizer(objValue, othValue, key, object, other, stack);
19229        }
19230        // Recursively compare objects (susceptible to call stack limits).
19231        if (!(compared === undefined
19232              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19233              : compared
19234            )) {
19235          result = false;
19236          break;
19237        }
19238        skipCtor || (skipCtor = key == 'constructor');
19239      }
19240      if (result && !skipCtor) {
19241        var objCtor = object.constructor,
19242            othCtor = other.constructor;
19243
19244        // Non `Object` object instances with different constructors are not equal.
19245        if (objCtor != othCtor &&
19246            ('constructor' in object && 'constructor' in other) &&
19247            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19248              typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19249          result = false;
19250        }
19251      }
19252      stack['delete'](object);
19253      stack['delete'](other);
19254      return result;
19255    }
19256
19257    /**
19258     * A specialized version of `baseRest` which flattens the rest array.
19259     *
19260     * @private
19261     * @param {Function} func The function to apply a rest parameter to.
19262     * @returns {Function} Returns the new function.
19263     */
19264    function flatRest(func) {
19265      return setToString(overRest(func, undefined, flatten), func + '');
19266    }
19267
19268    /**
19269     * Creates an array of own enumerable property names and symbols of `object`.
19270     *
19271     * @private
19272     * @param {Object} object The object to query.
19273     * @returns {Array} Returns the array of property names and symbols.
19274     */
19275    function getAllKeys(object) {
19276      return baseGetAllKeys(object, keys, getSymbols);
19277    }
19278
19279    /**
19280     * Creates an array of own and inherited enumerable property names and
19281     * symbols of `object`.
19282     *
19283     * @private
19284     * @param {Object} object The object to query.
19285     * @returns {Array} Returns the array of property names and symbols.
19286     */
19287    function getAllKeysIn(object) {
19288      return baseGetAllKeys(object, keysIn, getSymbolsIn);
19289    }
19290
19291    /**
19292     * Gets metadata for `func`.
19293     *
19294     * @private
19295     * @param {Function} func The function to query.
19296     * @returns {*} Returns the metadata for `func`.
19297     */
19298    var getData = !metaMap ? noop : function(func) {
19299      return metaMap.get(func);
19300    };
19301
19302    /**
19303     * Gets the name of `func`.
19304     *
19305     * @private
19306     * @param {Function} func The function to query.
19307     * @returns {string} Returns the function name.
19308     */
19309    function getFuncName(func) {
19310      var result = (func.name + ''),
19311          array = realNames[result],
19312          length = hasOwnProperty.call(realNames, result) ? array.length : 0;
19313
19314      while (length--) {
19315        var data = array[length],
19316            otherFunc = data.func;
19317        if (otherFunc == null || otherFunc == func) {
19318          return data.name;
19319        }
19320      }
19321      return result;
19322    }
19323
19324    /**
19325     * Gets the argument placeholder value for `func`.
19326     *
19327     * @private
19328     * @param {Function} func The function to inspect.
19329     * @returns {*} Returns the placeholder value.
19330     */
19331    function getHolder(func) {
19332      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
19333      return object.placeholder;
19334    }
19335
19336    /**
19337     * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
19338     * this function returns the custom method, otherwise it returns `baseIteratee`.
19339     * If arguments are provided, the chosen function is invoked with them and
19340     * its result is returned.
19341     *
19342     * @private
19343     * @param {*} [value] The value to convert to an iteratee.
19344     * @param {number} [arity] The arity of the created iteratee.
19345     * @returns {Function} Returns the chosen function or its result.
19346     */
19347    function getIteratee() {
19348      var result = lodash.iteratee || iteratee;
19349      result = result === iteratee ? baseIteratee : result;
19350      return arguments.length ? result(arguments[0], arguments[1]) : result;
19351    }
19352
19353    /**
19354     * Gets the data for `map`.
19355     *
19356     * @private
19357     * @param {Object} map The map to query.
19358     * @param {string} key The reference key.
19359     * @returns {*} Returns the map data.
19360     */
19361    function getMapData(map, key) {
19362      var data = map.__data__;
19363      return isKeyable(key)
19364        ? data[typeof key == 'string' ? 'string' : 'hash']
19365        : data.map;
19366    }
19367
19368    /**
19369     * Gets the property names, values, and compare flags of `object`.
19370     *
19371     * @private
19372     * @param {Object} object The object to query.
19373     * @returns {Array} Returns the match data of `object`.
19374     */
19375    function getMatchData(object) {
19376      var result = keys(object),
19377          length = result.length;
19378
19379      while (length--) {
19380        var key = result[length],
19381            value = object[key];
19382
19383        result[length] = [key, value, isStrictComparable(value)];
19384      }
19385      return result;
19386    }
19387
19388    /**
19389     * Gets the native function at `key` of `object`.
19390     *
19391     * @private
19392     * @param {Object} object The object to query.
19393     * @param {string} key The key of the method to get.
19394     * @returns {*} Returns the function if it's native, else `undefined`.
19395     */
19396    function getNative(object, key) {
19397      var value = getValue(object, key);
19398      return baseIsNative(value) ? value : undefined;
19399    }
19400
19401    /**
19402     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
19403     *
19404     * @private
19405     * @param {*} value The value to query.
19406     * @returns {string} Returns the raw `toStringTag`.
19407     */
19408    function getRawTag(value) {
19409      var isOwn = hasOwnProperty.call(value, symToStringTag),
19410          tag = value[symToStringTag];
19411
19412      try {
19413        value[symToStringTag] = undefined;
19414        var unmasked = true;
19415      } catch (e) {}
19416
19417      var result = nativeObjectToString.call(value);
19418      if (unmasked) {
19419        if (isOwn) {
19420          value[symToStringTag] = tag;
19421        } else {
19422          delete value[symToStringTag];
19423        }
19424      }
19425      return result;
19426    }
19427
19428    /**
19429     * Creates an array of the own enumerable symbols of `object`.
19430     *
19431     * @private
19432     * @param {Object} object The object to query.
19433     * @returns {Array} Returns the array of symbols.
19434     */
19435    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
19436      if (object == null) {
19437        return [];
19438      }
19439      object = Object(object);
19440      return arrayFilter(nativeGetSymbols(object), function(symbol) {
19441        return propertyIsEnumerable.call(object, symbol);
19442      });
19443    };
19444
19445    /**
19446     * Creates an array of the own and inherited enumerable symbols of `object`.
19447     *
19448     * @private
19449     * @param {Object} object The object to query.
19450     * @returns {Array} Returns the array of symbols.
19451     */
19452    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
19453      var result = [];
19454      while (object) {
19455        arrayPush(result, getSymbols(object));
19456        object = getPrototype(object);
19457      }
19458      return result;
19459    };
19460
19461    /**
19462     * Gets the `toStringTag` of `value`.
19463     *
19464     * @private
19465     * @param {*} value The value to query.
19466     * @returns {string} Returns the `toStringTag`.
19467     */
19468    var getTag = baseGetTag;
19469
19470    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
19471    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
19472        (Map && getTag(new Map) != mapTag) ||
19473        (Promise && getTag(Promise.resolve()) != promiseTag) ||
19474        (Set && getTag(new Set) != setTag) ||
19475        (WeakMap && getTag(new WeakMap) != weakMapTag)) {
19476      getTag = function(value) {
19477        var result = baseGetTag(value),
19478            Ctor = result == objectTag ? value.constructor : undefined,
19479            ctorString = Ctor ? toSource(Ctor) : '';
19480
19481        if (ctorString) {
19482          switch (ctorString) {
19483            case dataViewCtorString: return dataViewTag;
19484            case mapCtorString: return mapTag;
19485            case promiseCtorString: return promiseTag;
19486            case setCtorString: return setTag;
19487            case weakMapCtorString: return weakMapTag;
19488          }
19489        }
19490        return result;
19491      };
19492    }
19493
19494    /**
19495     * Gets the view, applying any `transforms` to the `start` and `end` positions.
19496     *
19497     * @private
19498     * @param {number} start The start of the view.
19499     * @param {number} end The end of the view.
19500     * @param {Array} transforms The transformations to apply to the view.
19501     * @returns {Object}
vendor: 6,432 bytes, lines 19501-19706
19501 Returns an object containing the `start` and `end`
19502     *  positions of the view.
19503     */
19504    function getView(start, end, transforms) {
19505      var index = -1,
19506          length = transforms.length;
19507
19508      while (++index < length) {
19509        var data = transforms[index],
19510            size = data.size;
19511
19512        switch (data.type) {
19513          case 'drop':      start += size; break;
19514          case 'dropRight': end -= size; break;
19515          case 'take':      end = nativeMin(end, start + size); break;
19516          case 'takeRight': start = nativeMax(start, end - size); break;
19517        }
19518      }
19519      return { 'start': start, 'end': end };
19520    }
19521
19522    /**
19523     * Extracts wrapper details from the `source` body comment.
19524     *
19525     * @private
19526     * @param {string} source The source to inspect.
19527     * @returns {Array} Returns the wrapper details.
19528     */
19529    function getWrapDetails(source) {
19530      var match = source.match(reWrapDetails);
19531      return match ? match[1].split(reSplitDetails) : [];
19532    }
19533
19534    /**
19535     * Checks if `path` exists on `object`.
19536     *
19537     * @private
19538     * @param {Object} object The object to query.
19539     * @param {Array|string} path The path to check.
19540     * @param {Function} hasFunc The function to check properties.
19541     * @returns {boolean} Returns `true` if `path` exists, else `false`.
19542     */
19543    function hasPath(object, path, hasFunc) {
19544      path = castPath(path, object);
19545
19546      var index = -1,
19547          length = path.length,
19548          result = false;
19549
19550      while (++index < length) {
19551        var key = toKey(path[index]);
19552        if (!(result = object != null && hasFunc(object, key))) {
19553          break;
19554        }
19555        object = object[key];
19556      }
19557      if (result || ++index != length) {
19558        return result;
19559      }
19560      length = object == null ? 0 : object.length;
19561      return !!length && isLength(length) && isIndex(key, length) &&
19562        (isArray(object) || isArguments(object));
19563    }
19564
19565    /**
19566     * Initializes an array clone.
19567     *
19568     * @private
19569     * @param {Array} array The array to clone.
19570     * @returns {Array} Returns the initialized clone.
19571     */
19572    function initCloneArray(array) {
19573      var length = array.length,
19574          result = new array.constructor(length);
19575
19576      // Add properties assigned by `RegExp#exec`.
19577      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
19578        result.index = array.index;
19579        result.input = array.input;
19580      }
19581      return result;
19582    }
19583
19584    /**
19585     * Initializes an object clone.
19586     *
19587     * @private
19588     * @param {Object} object The object to clone.
19589     * @returns {Object} Returns the initialized clone.
19590     */
19591    function initCloneObject(object) {
19592      return (typeof object.constructor == 'function' && !isPrototype(object))
19593        ? baseCreate(getPrototype(object))
19594        : {};
19595    }
19596
19597    /**
19598     * Initializes an object clone based on its `toStringTag`.
19599     *
19600     * **Note:** This function only supports cloning values with tags of
19601     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19602     *
19603     * @private
19604     * @param {Object} object The object to clone.
19605     * @param {string} tag The `toStringTag` of the object to clone.
19606     * @param {boolean} [isDeep] Specify a deep clone.
19607     * @returns {Object} Returns the initialized clone.
19608     */
19609    function initCloneByTag(object, tag, isDeep) {
19610      var Ctor = object.constructor;
19611      switch (tag) {
19612        case arrayBufferTag:
19613          return cloneArrayBuffer(object);
19614
19615        case boolTag:
19616        case dateTag:
19617          return new Ctor(+object);
19618
19619        case dataViewTag:
19620          return cloneDataView(object, isDeep);
19621
19622        case float32Tag: case float64Tag:
19623        case int8Tag: case int16Tag: case int32Tag:
19624        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
19625          return cloneTypedArray(object, isDeep);
19626
19627        case mapTag:
19628          return new Ctor;
19629
19630        case numberTag:
19631        case stringTag:
19632          return new Ctor(object);
19633
19634        case regexpTag:
19635          return cloneRegExp(object);
19636
19637        case setTag:
19638          return new Ctor;
19639
19640        case symbolTag:
19641          return cloneSymbol(object);
19642      }
19643    }
19644
19645    /**
19646     * Inserts wrapper `details` in a comment at the top of the `source` body.
19647     *
19648     * @private
19649     * @param {string} source The source to modify.
19650     * @returns {Array} details The details to insert.
19651     * @returns {string} Returns the modified source.
19652     */
19653    function insertWrapDetails(source, details) {
19654      var length = details.length;
19655      if (!length) {
19656        return source;
19657      }
19658      var lastIndex = length - 1;
19659      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
19660      details = details.join(length > 2 ? ', ' : ' ');
19661      return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
19662    }
19663
19664    /**
19665     * Checks if `value` is a flattenable `arguments` object or array.
19666     *
19667     * @private
19668     * @param {*} value The value to check.
19669     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
19670     */
19671    function isFlattenable(value) {
19672      return isArray(value) || isArguments(value) ||
19673        !!(spreadableSymbol && value && value[spreadableSymbol]);
19674    }
19675
19676    /**
19677     * Checks if `value` is a valid array-like index.
19678     *
19679     * @private
19680     * @param {*} value The value to check.
19681     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
19682     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
19683     */
19684    function isIndex(value, length) {
19685      var type = typeof value;
19686      length = length == null ? MAX_SAFE_INTEGER : length;
19687
19688      return !!length &&
19689        (type == 'number' ||
19690          (type != 'symbol' && reIsUint.test(value))) &&
19691            (value > -1 && value % 1 == 0 && value < length);
19692    }
19693
19694    /**
19695     * Checks if the given arguments are from an iteratee call.
19696     *
19697     * @private
19698     * @param {*} value The potential iteratee value argument.
19699     * @param {*} index The potential iteratee index or key argument.
19700     * @param {*} object The potential iteratee object argument.
19701     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
19702     *  else `false`.
19703     */
19704    function isIterateeCall(value, index, object) {
19705      if (!isObject(object)) {
19706        return false;
vendor: 14,387 bytes, lines 19707-20153
19707      }
19708      var type = typeof index;
19709      if (type == 'number'
19710            ? (isArrayLike(object) && isIndex(index, object.length))
19711            : (type == 'string' && index in object)
19712          ) {
19713        return eq(object[index], value);
19714      }
19715      return false;
19716    }
19717
19718    /**
19719     * Checks if `value` is a property name and not a property path.
19720     *
19721     * @private
19722     * @param {*} value The value to check.
19723     * @param {Object} [object] The object to query keys on.
19724     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
19725     */
19726    function isKey(value, object) {
19727      if (isArray(value)) {
19728        return false;
19729      }
19730      var type = typeof value;
19731      if (type == 'number' || type == 'symbol' || type == 'boolean' ||
19732          value == null || isSymbol(value)) {
19733        return true;
19734      }
19735      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
19736        (object != null && value in Object(object));
19737    }
19738
19739    /**
19740     * Checks if `value` is suitable for use as unique object key.
19741     *
19742     * @private
19743     * @param {*} value The value to check.
19744     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
19745     */
19746    function isKeyable(value) {
19747      var type = typeof value;
19748      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
19749        ? (value !== '__proto__')
19750        : (value === null);
19751    }
19752
19753    /**
19754     * Checks if `func` has a lazy counterpart.
19755     *
19756     * @private
19757     * @param {Function} func The function to check.
19758     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
19759     *  else `false`.
19760     */
19761    function isLaziable(func) {
19762      var funcName = getFuncName(func),
19763          other = lodash[funcName];
19764
19765      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
19766        return false;
19767      }
19768      if (func === other) {
19769        return true;
19770      }
19771      var data = getData(other);
19772      return !!data && func === data[0];
19773    }
19774
19775    /**
19776     * Checks if `func` has its source masked.
19777     *
19778     * @private
19779     * @param {Function} func The function to check.
19780     * @returns {boolean} Returns `true` if `func` is masked, else `false`.
19781     */
19782    function isMasked(func) {
19783      return !!maskSrcKey && (maskSrcKey in func);
19784    }
19785
19786    /**
19787     * Checks if `func` is capable of being masked.
19788     *
19789     * @private
19790     * @param {*} value The value to check.
19791     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
19792     */
19793    var isMaskable = coreJsData ? isFunction : stubFalse;
19794
19795    /**
19796     * Checks if `value` is likely a prototype object.
19797     *
19798     * @private
19799     * @param {*} value The value to check.
19800     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
19801     */
19802    function isPrototype(value) {
19803      var Ctor = value && value.constructor,
19804          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
19805
19806      return value === proto;
19807    }
19808
19809    /**
19810     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
19811     *
19812     * @private
19813     * @param {*} value The value to check.
19814     * @returns {boolean} Returns `true` if `value` if suitable for strict
19815     *  equality comparisons, else `false`.
19816     */
19817    function isStrictComparable(value) {
19818      return value === value && !isObject(value);
19819    }
19820
19821    /**
19822     * A specialized version of `matchesProperty` for source values suitable
19823     * for strict equality comparisons, i.e. `===`.
19824     *
19825     * @private
19826     * @param {string} key The key of the property to get.
19827     * @param {*} srcValue The value to match.
19828     * @returns {Function} Returns the new spec function.
19829     */
19830    function matchesStrictComparable(key, srcValue) {
19831      return function(object) {
19832        if (object == null) {
19833          return false;
19834        }
19835        return object[key] === srcValue &&
19836          (srcValue !== undefined || (key in Object(object)));
19837      };
19838    }
19839
19840    /**
19841     * A specialized version of `_.memoize` which clears the memoized function's
19842     * cache when it exceeds `MAX_MEMOIZE_SIZE`.
19843     *
19844     * @private
19845     * @param {Function} func The function to have its output memoized.
19846     * @returns {Function} Returns the new memoized function.
19847     */
19848    function memoizeCapped(func) {
19849      var result = memoize(func, function(key) {
19850        if (cache.size === MAX_MEMOIZE_SIZE) {
19851          cache.clear();
19852        }
19853        return key;
19854      });
19855
19856      var cache = result.cache;
19857      return result;
19858    }
19859
19860    /**
19861     * Merges the function metadata of `source` into `data`.
19862     *
19863     * Merging metadata reduces the number of wrappers used to invoke a function.
19864     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
19865     * may be applied regardless of execution order. Methods like `_.ary` and
19866     * `_.rearg` modify function arguments, making the order in which they are
19867     * executed important, preventing the merging of metadata. However, we make
19868     * an exception for a safe combined case where curried functions have `_.ary`
19869     * and or `_.rearg` applied.
19870     *
19871     * @private
19872     * @param {Array} data The destination metadata.
19873     * @param {Array} source The source metadata.
19874     * @returns {Array} Returns `data`.
19875     */
19876    function mergeData(data, source) {
19877      var bitmask = data[1],
19878          srcBitmask = source[1],
19879          newBitmask = bitmask | srcBitmask,
19880          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
19881
19882      var isCombo =
19883        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
19884        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
19885        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));
19886
19887      // Exit early if metadata can't be merged.
19888      if (!(isCommon || isCombo)) {
19889        return data;
19890      }
19891      // Use source `thisArg` if available.
19892      if (srcBitmask & WRAP_BIND_FLAG) {
19893        data[2] = source[2];
19894        // Set when currying a bound function.
19895        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
19896      }
19897      // Compose partial arguments.
19898      var value = source[3];
19899      if (value) {
19900        var partials = data[3];
19901        data[3] = partials ? composeArgs(partials, value, source[4]) : value;
19902        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
19903      }
19904      // Compose partial right arguments.
19905      value = source[5];
19906      if (value) {
19907        partials = data[5];
19908        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
19909        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
19910      }
19911      // Use source `argPos` if available.
19912      value = source[7];
19913      if (value) {
19914        data[7] = value;
19915      }
19916      // Use source `ary` if it's smaller.
19917      if (srcBitmask & WRAP_ARY_FLAG) {
19918        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
19919      }
19920      // Use source `arity` if one is not provided.
19921      if (data[9] == null) {
19922        data[9] = source[9];
19923      }
19924      // Use source `func` and merge bitmasks.
19925      data[0] = source[0];
19926      data[1] = newBitmask;
19927
19928      return data;
19929    }
19930
19931    /**
19932     * This function is like
19933     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
19934     * except that it includes inherited enumerable properties.
19935     *
19936     * @private
19937     * @param {Object} object The object to query.
19938     * @returns {Array} Returns the array of property names.
19939     */
19940    function nativeKeysIn(object) {
19941      var result = [];
19942      if (object != null) {
19943        for (var key in Object(object)) {
19944          result.push(key);
19945        }
19946      }
19947      return result;
19948    }
19949
19950    /**
19951     * Converts `value` to a string using `Object.prototype.toString`.
19952     *
19953     * @private
19954     * @param {*} value The value to convert.
19955     * @returns {string} Returns the converted string.
19956     */
19957    function objectToString(value) {
19958      return nativeObjectToString.call(value);
19959    }
19960
19961    /**
19962     * A specialized version of `baseRest` which transforms the rest array.
19963     *
19964     * @private
19965     * @param {Function} func The function to apply a rest parameter to.
19966     * @param {number} [start=func.length-1] The start position of the rest parameter.
19967     * @param {Function} transform The rest array transform.
19968     * @returns {Function} Returns the new function.
19969     */
19970    function overRest(func, start, transform) {
19971      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
19972      return function() {
19973        var args = arguments,
19974            index = -1,
19975            length = nativeMax(args.length - start, 0),
19976            array = Array(length);
19977
19978        while (++index < length) {
19979          array[index] = args[start + index];
19980        }
19981        index = -1;
19982        var otherArgs = Array(start + 1);
19983        while (++index < start) {
19984          otherArgs[index] = args[index];
19985        }
19986        otherArgs[start] = transform(array);
19987        return apply(func, this, otherArgs);
19988      };
19989    }
19990
19991    /**
19992     * Gets the parent value at `path` of `object`.
19993     *
19994     * @private
19995     * @param {Object} object The object to query.
19996     * @param {Array} path The path to get the parent value of.
19997     * @returns {*} Returns the parent value.
19998     */
19999    function parent(object, path) {
20000      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20001    }
20002
20003    /**
20004     * Reorder `array` according to the specified indexes where the element at
20005     * the first index is assigned as the first element, the element at
20006     * the second index is assigned as the second element, and so on.
20007     *
20008     * @private
20009     * @param {Array} array The array to reorder.
20010     * @param {Array} indexes The arranged array indexes.
20011     * @returns {Array} Returns `array`.
20012     */
20013    function reorder(array, indexes) {
20014      var arrLength = array.length,
20015          length = nativeMin(indexes.length, arrLength),
20016          oldArray = copyArray(array);
20017
20018      while (length--) {
20019        var index = indexes[length];
20020        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
20021      }
20022      return array;
20023    }
20024
20025    /**
20026     * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
20027     *
20028     * @private
20029     * @param {Object} object The object to query.
20030     * @param {string} key The key of the property to get.
20031     * @returns {*} Returns the property value.
20032     */
20033    function safeGet(object, key) {
20034      if (key === 'constructor' && typeof object[key] === 'function') {
20035        return;
20036      }
20037
20038      if (key == '__proto__') {
20039        return;
20040      }
20041
20042      return object[key];
20043    }
20044
20045    /**
20046     * Sets metadata for `func`.
20047     *
20048     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
20049     * period of time, it will trip its breaker and transition to an identity
20050     * function to avoid garbage collection pauses in V8. See
20051     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
20052     * for more details.
20053     *
20054     * @private
20055     * @param {Function} func The function to associate metadata with.
20056     * @param {*} data The metadata.
20057     * @returns {Function} Returns `func`.
20058     */
20059    var setData = shortOut(baseSetData);
20060
20061    /**
20062     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
20063     *
20064     * @private
20065     * @param {Function} func The function to delay.
20066     * @param {number} wait The number of milliseconds to delay invocation.
20067     * @returns {number|Object} Returns the timer id or timeout object.
20068     */
20069    var setTimeout = ctxSetTimeout || function(func, wait) {
20070      return root.setTimeout(func, wait);
20071    };
20072
20073    /**
20074     * Sets the `toString` method of `func` to return `string`.
20075     *
20076     * @private
20077     * @param {Function} func The function to modify.
20078     * @param {Function} string The `toString` result.
20079     * @returns {Function} Returns `func`.
20080     */
20081    var setToString = shortOut(baseSetToString);
20082
20083    /**
20084     * Sets the `toString` method of `wrapper` to mimic the source of `reference`
20085     * with wrapper details in a comment at the top of the source body.
20086     *
20087     * @private
20088     * @param {Function} wrapper The function to modify.
20089     * @param {Function} reference The reference function.
20090     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
20091     * @returns {Function} Returns `wrapper`.
20092     */
20093    function setWrapToString(wrapper, reference, bitmask) {
20094      var source = (reference + '');
20095      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
20096    }
20097
20098    /**
20099     * Creates a function that'll short out and invoke `identity` instead
20100     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
20101     * milliseconds.
20102     *
20103     * @private
20104     * @param {Function} func The function to restrict.
20105     * @returns {Function} Returns the new shortable function.
20106     */
20107    function shortOut(func) {
20108      var count = 0,
20109          lastCalled = 0;
20110
20111      return function() {
20112        var stamp = nativeNow(),
20113            remaining = HOT_SPAN - (stamp - lastCalled);
20114
20115        lastCalled = stamp;
20116        if (remaining > 0) {
20117          if (++count >= HOT_COUNT) {
20118            return arguments[0];
20119          }
20120        } else {
20121          count = 0;
20122        }
20123        return func.apply(undefined, arguments);
20124      };
20125    }
20126
20127    /**
20128     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
20129     *
20130     * @private
20131     * @param {Array} array The array to shuffle.
20132     * @param {number} [size=array.length] The size of `array`.
20133     * @returns {Array} Returns `array`.
20134     */
20135    function shuffleSelf(array, size) {
20136      var index = -1,
20137          length = array.length,
20138          lastIndex = length - 1;
20139
20140      size = size === undefined ? length : size;
20141      while (++index < size) {
20142        var rand = baseRandom(index, lastIndex),
20143            value = array[rand];
20144
20145        array[rand] = array[index];
20146        array[index] = value;
20147      }
20148      array.length = size;
20149      return array;
20150    }
20151
20152    /**
20153     * Converts `string` to a property path array.
vendor: 1,775 bytes, lines 20154-20214
20154     *
20155     * @private
20156     * @param {string} string The string to convert.
20157     * @returns {Array} Returns the property path array.
20158     */
20159    var stringToPath = memoizeCapped(function(string) {
20160      var result = [];
20161      if (string.charCodeAt(0) === 46 /* . */) {
20162        result.push('');
20163      }
20164      string.replace(rePropName, function(match, number, quote, subString) {
20165        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20166      });
20167      return result;
20168    });
20169
20170    /**
20171     * Converts `value` to a string key if it's not a string or symbol.
20172     *
20173     * @private
20174     * @param {*} value The value to inspect.
20175     * @returns {string|symbol} Returns the key.
20176     */
20177    function toKey(value) {
20178      if (typeof value == 'string' || isSymbol(value)) {
20179        return value;
20180      }
20181      var result = (value + '');
20182      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20183    }
20184
20185    /**
20186     * Converts `func` to its source code.
20187     *
20188     * @private
20189     * @param {Function} func The function to convert.
20190     * @returns {string} Returns the source code.
20191     */
20192    function toSource(func) {
20193      if (func != null) {
20194        try {
20195          return funcToString.call(func);
20196        } catch (e) {}
20197        try {
20198          return (func + '');
20199        } catch (e) {}
20200      }
20201      return '';
20202    }
20203
20204    /**
20205     * Updates wrapper `details` based on `bitmask` flags.
20206     *
20207     * @private
20208     * @returns {Array} details The details to modify.
20209     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
20210     * @returns {Array} Returns `details`.
20211     */
20212    function updateWrapDetails(details, bitmask) {
20213      arrayEach(wrapFlags, function(pair) {
20214        var value = '_.' + pair[0];
vendor: 80,381 bytes, lines 20215-22798
20215        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
20216          details.push(value);
20217        }
20218      });
20219      return details.sort();
20220    }
20221
20222    /**
20223     * Creates a clone of `wrapper`.
20224     *
20225     * @private
20226     * @param {Object} wrapper The wrapper to clone.
20227     * @returns {Object} Returns the cloned wrapper.
20228     */
20229    function wrapperClone(wrapper) {
20230      if (wrapper instanceof LazyWrapper) {
20231        return wrapper.clone();
20232      }
20233      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
20234      result.__actions__ = copyArray(wrapper.__actions__);
20235      result.__index__  = wrapper.__index__;
20236      result.__values__ = wrapper.__values__;
20237      return result;
20238    }
20239
20240    /*------------------------------------------------------------------------*/
20241
20242    /**
20243     * Creates an array of elements split into groups the length of `size`.
20244     * If `array` can't be split evenly, the final chunk will be the remaining
20245     * elements.
20246     *
20247     * @static
20248     * @memberOf _
20249     * @since 3.0.0
20250     * @category Array
20251     * @param {Array} array The array to process.
20252     * @param {number} [size=1] The length of each chunk
20253     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
20254     * @returns {Array} Returns the new array of chunks.
20255     * @example
20256     *
20257     * _.chunk(['a', 'b', 'c', 'd'], 2);
20258     * // => [['a', 'b'], ['c', 'd']]
20259     *
20260     * _.chunk(['a', 'b', 'c', 'd'], 3);
20261     * // => [['a', 'b', 'c'], ['d']]
20262     */
20263    function chunk(array, size, guard) {
20264      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
20265        size = 1;
20266      } else {
20267        size = nativeMax(toInteger(size), 0);
20268      }
20269      var length = array == null ? 0 : array.length;
20270      if (!length || size < 1) {
20271        return [];
20272      }
20273      var index = 0,
20274          resIndex = 0,
20275          result = Array(nativeCeil(length / size));
20276
20277      while (index < length) {
20278        result[resIndex++] = baseSlice(array, index, (index += size));
20279      }
20280      return result;
20281    }
20282
20283    /**
20284     * Creates an array with all falsey values removed. The values `false`, `null`,
20285     * `0`, `""`, `undefined`, and `NaN` are falsey.
20286     *
20287     * @static
20288     * @memberOf _
20289     * @since 0.1.0
20290     * @category Array
20291     * @param {Array} array The array to compact.
20292     * @returns {Array} Returns the new array of filtered values.
20293     * @example
20294     *
20295     * _.compact([0, 1, false, 2, '', 3]);
20296     * // => [1, 2, 3]
20297     */
20298    function compact(array) {
20299      var index = -1,
20300          length = array == null ? 0 : array.length,
20301          resIndex = 0,
20302          result = [];
20303
20304      while (++index < length) {
20305        var value = array[index];
20306        if (value) {
20307          result[resIndex++] = value;
20308        }
20309      }
20310      return result;
20311    }
20312
20313    /**
20314     * Creates a new array concatenating `array` with any additional arrays
20315     * and/or values.
20316     *
20317     * @static
20318     * @memberOf _
20319     * @since 4.0.0
20320     * @category Array
20321     * @param {Array} array The array to concatenate.
20322     * @param {...*} [values] The values to concatenate.
20323     * @returns {Array} Returns the new concatenated array.
20324     * @example
20325     *
20326     * var array = [1];
20327     * var other = _.concat(array, 2, [3], [[4]]);
20328     *
20329     * console.log(other);
20330     * // => [1, 2, 3, [4]]
20331     *
20332     * console.log(array);
20333     * // => [1]
20334     */
20335    function concat() {
20336      var length = arguments.length;
20337      if (!length) {
20338        return [];
20339      }
20340      var args = Array(length - 1),
20341          array = arguments[0],
20342          index = length;
20343
20344      while (index--) {
20345        args[index - 1] = arguments[index];
20346      }
20347      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
20348    }
20349
20350    /**
20351     * Creates an array of `array` values not included in the other given arrays
20352     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
20353     * for equality comparisons. The order and references of result values are
20354     * determined by the first array.
20355     *
20356     * **Note:** Unlike `_.pullAll`, this method returns a new array.
20357     *
20358     * @static
20359     * @memberOf _
20360     * @since 0.1.0
20361     * @category Array
20362     * @param {Array} array The array to inspect.
20363     * @param {...Array} [values] The values to exclude.
20364     * @returns {Array} Returns the new array of filtered values.
20365     * @see _.without, _.xor
20366     * @example
20367     *
20368     * _.difference([2, 1], [2, 3]);
20369     * // => [1]
20370     */
20371    var difference = baseRest(function(array, values) {
20372      return isArrayLikeObject(array)
20373        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
20374        : [];
20375    });
20376
20377    /**
20378     * This method is like `_.difference` except that it accepts `iteratee` which
20379     * is invoked for each element of `array` and `values` to generate the criterion
20380     * by which they're compared. The order and references of result values are
20381     * determined by the first array. The iteratee is invoked with one argument:
20382     * (value).
20383     *
20384     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
20385     *
20386     * @static
20387     * @memberOf _
20388     * @since 4.0.0
20389     * @category Array
20390     * @param {Array} array The array to inspect.
20391     * @param {...Array} [values] The values to exclude.
20392     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
20393     * @returns {Array} Returns the new array of filtered values.
20394     * @example
20395     *
20396     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
20397     * // => [1.2]
20398     *
20399     * // The `_.property` iteratee shorthand.
20400     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
20401     * // => [{ 'x': 2 }]
20402     */
20403    var differenceBy = baseRest(function(array, values) {
20404      var iteratee = last(values);
20405      if (isArrayLikeObject(iteratee)) {
20406        iteratee = undefined;
20407      }
20408      return isArrayLikeObject(array)
20409        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
20410        : [];
20411    });
20412
20413    /**
20414     * This method is like `_.difference` except that it accepts `comparator`
20415     * which is invoked to compare elements of `array` to `values`. The order and
20416     * references of result values are determined by the first array. The comparator
20417     * is invoked with two arguments: (arrVal, othVal).
20418     *
20419     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
20420     *
20421     * @static
20422     * @memberOf _
20423     * @since 4.0.0
20424     * @category Array
20425     * @param {Array} array The array to inspect.
20426     * @param {...Array} [values] The values to exclude.
20427     * @param {Function} [comparator] The comparator invoked per element.
20428     * @returns {Array} Returns the new array of filtered values.
20429     * @example
20430     *
20431     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
20432     *
20433     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
20434     * // => [{ 'x': 2, 'y': 1 }]
20435     */
20436    var differenceWith = baseRest(function(array, values) {
20437      var comparator = last(values);
20438      if (isArrayLikeObject(comparator)) {
20439        comparator = undefined;
20440      }
20441      return isArrayLikeObject(array)
20442        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
20443        : [];
20444    });
20445
20446    /**
20447     * Creates a slice of `array` with `n` elements dropped from the beginning.
20448     *
20449     * @static
20450     * @memberOf _
20451     * @since 0.5.0
20452     * @category Array
20453     * @param {Array} array The array to query.
20454     * @param {number} [n=1] The number of elements to drop.
20455     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
20456     * @returns {Array} Returns the slice of `array`.
20457     * @example
20458     *
20459     * _.drop([1, 2, 3]);
20460     * // => [2, 3]
20461     *
20462     * _.drop([1, 2, 3], 2);
20463     * // => [3]
20464     *
20465     * _.drop([1, 2, 3], 5);
20466     * // => []
20467     *
20468     * _.drop([1, 2, 3], 0);
20469     * // => [1, 2, 3]
20470     */
20471    function drop(array, n, guard) {
20472      var length = array == null ? 0 : array.length;
20473      if (!length) {
20474        return [];
20475      }
20476      n = (guard || n === undefined) ? 1 : toInteger(n);
20477      return baseSlice(array, n < 0 ? 0 : n, length);
20478    }
20479
20480    /**
20481     * Creates a slice of `array` with `n` elements dropped from the end.
20482     *
20483     * @static
20484     * @memberOf _
20485     * @since 3.0.0
20486     * @category Array
20487     * @param {Array} array The array to query.
20488     * @param {number} [n=1] The number of elements to drop.
20489     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
20490     * @returns {Array} Returns the slice of `array`.
20491     * @example
20492     *
20493     * _.dropRight([1, 2, 3]);
20494     * // => [1, 2]
20495     *
20496     * _.dropRight([1, 2, 3], 2);
20497     * // => [1]
20498     *
20499     * _.dropRight([1, 2, 3], 5);
20500     * // => []
20501     *
20502     * _.dropRight([1, 2, 3], 0);
20503     * // => [1, 2, 3]
20504     */
20505    function dropRight(array, n, guard) {
20506      var length = array == null ? 0 : array.length;
20507      if (!length) {
20508        return [];
20509      }
20510      n = (guard || n === undefined) ? 1 : toInteger(n);
20511      n = length - n;
20512      return baseSlice(array, 0, n < 0 ? 0 : n);
20513    }
20514
20515    /**
20516     * Creates a slice of `array` excluding elements dropped from the end.
20517     * Elements are dropped until `predicate` returns falsey. The predicate is
20518     * invoked with three arguments: (value, index, array).
20519     *
20520     * @static
20521     * @memberOf _
20522     * @since 3.0.0
20523     * @category Array
20524     * @param {Array} array The array to query.
20525     * @param {Function} [predicate=_.identity] The function invoked per iteration.
20526     * @returns {Array} Returns the slice of `array`.
20527     * @example
20528     *
20529     * var users = [
20530     *   { 'user': 'barney',  'active': true },
20531     *   { 'user': 'fred',    'active': false },
20532     *   { 'user': 'pebbles', 'active': false }
20533     * ];
20534     *
20535     * _.dropRightWhile(users, function(o) { return !o.active; });
20536     * // => objects for ['barney']
20537     *
20538     * // The `_.matches` iteratee shorthand.
20539     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
20540     * // => objects for ['barney', 'fred']
20541     *
20542     * // The `_.matchesProperty` iteratee shorthand.
20543     * _.dropRightWhile(users, ['active', false]);
20544     * // => objects for ['barney']
20545     *
20546     * // The `_.property` iteratee shorthand.
20547     * _.dropRightWhile(users, 'active');
20548     * // => objects for ['barney', 'fred', 'pebbles']
20549     */
20550    function dropRightWhile(array, predicate) {
20551      return (array && array.length)
20552        ? baseWhile(array, getIteratee(predicate, 3), true, true)
20553        : [];
20554    }
20555
20556    /**
20557     * Creates a slice of `array` excluding elements dropped from the beginning.
20558     * Elements are dropped until `predicate` returns falsey. The predicate is
20559     * invoked with three arguments: (value, index, array).
20560     *
20561     * @static
20562     * @memberOf _
20563     * @since 3.0.0
20564     * @category Array
20565     * @param {Array} array The array to query.
20566     * @param {Function} [predicate=_.identity] The function invoked per iteration.
20567     * @returns {Array} Returns the slice of `array`.
20568     * @example
20569     *
20570     * var users = [
20571     *   { 'user': 'barney',  'active': false },
20572     *   { 'user': 'fred',    'active': false },
20573     *   { 'user': 'pebbles', 'active': true }
20574     * ];
20575     *
20576     * _.dropWhile(users, function(o) { return !o.active; });
20577     * // => objects for ['pebbles']
20578     *
20579     * // The `_.matches` iteratee shorthand.
20580     * _.dropWhile(users, { 'user': 'barney', 'active': false });
20581     * // => objects for ['fred', 'pebbles']
20582     *
20583     * // The `_.matchesProperty` iteratee shorthand.
20584     * _.dropWhile(users, ['active', false]);
20585     * // => objects for ['pebbles']
20586     *
20587     * // The `_.property` iteratee shorthand.
20588     * _.dropWhile(users, 'active');
20589     * // => objects for ['barney', 'fred', 'pebbles']
20590     */
20591    function dropWhile(array, predicate) {
20592      return (array && array.length)
20593        ? baseWhile(array, getIteratee(predicate, 3), true)
20594        : [];
20595    }
20596
20597    /**
20598     * Fills elements of `array` with `value` from `start` up to, but not
20599     * including, `end`.
20600     *
20601     * **Note:** This method mutates `array`.
20602     *
20603     * @static
20604     * @memberOf _
20605     * @since 3.2.0
20606     * @category Array
20607     * @param {Array} array The array to fill.
20608     * @param {*} value The value to fill `array` with.
20609     * @param {number} [start=0] The start position.
20610     * @param {number} [end=array.length] The end position.
20611     * @returns {Array} Returns `array`.
20612     * @example
20613     *
20614     * var array = [1, 2, 3];
20615     *
20616     * _.fill(array, 'a');
20617     * console.log(array);
20618     * // => ['a', 'a', 'a']
20619     *
20620     * _.fill(Array(3), 2);
20621     * // => [2, 2, 2]
20622     *
20623     * _.fill([4, 6, 8, 10], '*', 1, 3);
20624     * // => [4, '*', '*', 10]
20625     */
20626    function fill(array, value, start, end) {
20627      var length = array == null ? 0 : array.length;
20628      if (!length) {
20629        return [];
20630      }
20631      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
20632        start = 0;
20633        end = length;
20634      }
20635      return baseFill(array, value, start, end);
20636    }
20637
20638    /**
20639     * This method is like `_.find` except that it returns the index of the first
20640     * element `predicate` returns truthy for instead of the element itself.
20641     *
20642     * @static
20643     * @memberOf _
20644     * @since 1.1.0
20645     * @category Array
20646     * @param {Array} array The array to inspect.
20647     * @param {Function} [predicate=_.identity] The function invoked per iteration.
20648     * @param {number} [fromIndex=0] The index to search from.
20649     * @returns {number} Returns the index of the found element, else `-1`.
20650     * @example
20651     *
20652     * var users = [
20653     *   { 'user': 'barney',  'active': false },
20654     *   { 'user': 'fred',    'active': false },
20655     *   { 'user': 'pebbles', 'active': true }
20656     * ];
20657     *
20658     * _.findIndex(users, function(o) { return o.user == 'barney'; });
20659     * // => 0
20660     *
20661     * // The `_.matches` iteratee shorthand.
20662     * _.findIndex(users, { 'user': 'fred', 'active': false });
20663     * // => 1
20664     *
20665     * // The `_.matchesProperty` iteratee shorthand.
20666     * _.findIndex(users, ['active', false]);
20667     * // => 0
20668     *
20669     * // The `_.property` iteratee shorthand.
20670     * _.findIndex(users, 'active');
20671     * // => 2
20672     */
20673    function findIndex(array, predicate, fromIndex) {
20674      var length = array == null ? 0 : array.length;
20675      if (!length) {
20676        return -1;
20677      }
20678      var index = fromIndex == null ? 0 : toInteger(fromIndex);
20679      if (index < 0) {
20680        index = nativeMax(length + index, 0);
20681      }
20682      return baseFindIndex(array, getIteratee(predicate, 3), index);
20683    }
20684
20685    /**
20686     * This method is like `_.findIndex` except that it iterates over elements
20687     * of `collection` from right to left.
20688     *
20689     * @static
20690     * @memberOf _
20691     * @since 2.0.0
20692     * @category Array
20693     * @param {Array} array The array to inspect.
20694     * @param {Function} [predicate=_.identity] The function invoked per iteration.
20695     * @param {number} [fromIndex=array.length-1] The index to search from.
20696     * @returns {number} Returns the index of the found element, else `-1`.
20697     * @example
20698     *
20699     * var users = [
20700     *   { 'user': 'barney',  'active': true },
20701     *   { 'user': 'fred',    'active': false },
20702     *   { 'user': 'pebbles', 'active': false }
20703     * ];
20704     *
20705     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
20706     * // => 2
20707     *
20708     * // The `_.matches` iteratee shorthand.
20709     * _.findLastIndex(users, { 'user': 'barney', 'active': true });
20710     * // => 0
20711     *
20712     * // The `_.matchesProperty` iteratee shorthand.
20713     * _.findLastIndex(users, ['active', false]);
20714     * // => 2
20715     *
20716     * // The `_.property` iteratee shorthand.
20717     * _.findLastIndex(users, 'active');
20718     * // => 0
20719     */
20720    function findLastIndex(array, predicate, fromIndex) {
20721      var length = array == null ? 0 : array.length;
20722      if (!length) {
20723        return -1;
20724      }
20725      var index = length - 1;
20726      if (fromIndex !== undefined) {
20727        index = toInteger(fromIndex);
20728        index = fromIndex < 0
20729          ? nativeMax(length + index, 0)
20730          : nativeMin(index, length - 1);
20731      }
20732      return baseFindIndex(array, getIteratee(predicate, 3), index, true);
20733    }
20734
20735    /**
20736     * Flattens `array` a single level deep.
20737     *
20738     * @static
20739     * @memberOf _
20740     * @since 0.1.0
20741     * @category Array
20742     * @param {Array} array The array to flatten.
20743     * @returns {Array} Returns the new flattened array.
20744     * @example
20745     *
20746     * _.flatten([1, [2, [3, [4]], 5]]);
20747     * // => [1, 2, [3, [4]], 5]
20748     */
20749    function flatten(array) {
20750      var length = array == null ? 0 : array.length;
20751      return length ? baseFlatten(array, 1) : [];
20752    }
20753
20754    /**
20755     * Recursively flattens `array`.
20756     *
20757     * @static
20758     * @memberOf _
20759     * @since 3.0.0
20760     * @category Array
20761     * @param {Array} array The array to flatten.
20762     * @returns {Array} Returns the new flattened array.
20763     * @example
20764     *
20765     * _.flattenDeep([1, [2, [3, [4]], 5]]);
20766     * // => [1, 2, 3, 4, 5]
20767     */
20768    function flattenDeep(array) {
20769      var length = array == null ? 0 : array.length;
20770      return length ? baseFlatten(array, INFINITY) : [];
20771    }
20772
20773    /**
20774     * Recursively flatten `array` up to `depth` times.
20775     *
20776     * @static
20777     * @memberOf _
20778     * @since 4.4.0
20779     * @category Array
20780     * @param {Array} array The array to flatten.
20781     * @param {number} [depth=1] The maximum recursion depth.
20782     * @returns {Array} Returns the new flattened array.
20783     * @example
20784     *
20785     * var array = [1, [2, [3, [4]], 5]];
20786     *
20787     * _.flattenDepth(array, 1);
20788     * // => [1, 2, [3, [4]], 5]
20789     *
20790     * _.flattenDepth(array, 2);
20791     * // => [1, 2, 3, [4], 5]
20792     */
20793    function flattenDepth(array, depth) {
20794      var length = array == null ? 0 : array.length;
20795      if (!length) {
20796        return [];
20797      }
20798      depth = depth === undefined ? 1 : toInteger(depth);
20799      return baseFlatten(array, depth);
20800    }
20801
20802    /**
20803     * The inverse of `_.toPairs`; this method returns an object composed
20804     * from key-value `pairs`.
20805     *
20806     * @static
20807     * @memberOf _
20808     * @since 4.0.0
20809     * @category Array
20810     * @param {Array} pairs The key-value pairs.
20811     * @returns {Object} Returns the new object.
20812     * @example
20813     *
20814     * _.fromPairs([['a', 1], ['b', 2]]);
20815     * // => { 'a': 1, 'b': 2 }
20816     */
20817    function fromPairs(pairs) {
20818      var index = -1,
20819          length = pairs == null ? 0 : pairs.length,
20820          result = {};
20821
20822      while (++index < length) {
20823        var pair = pairs[index];
20824        result[pair[0]] = pair[1];
20825      }
20826      return result;
20827    }
20828
20829    /**
20830     * Gets the first element of `array`.
20831     *
20832     * @static
20833     * @memberOf _
20834     * @since 0.1.0
20835     * @alias first
20836     * @category Array
20837     * @param {Array} array The array to query.
20838     * @returns {*} Returns the first element of `array`.
20839     * @example
20840     *
20841     * _.head([1, 2, 3]);
20842     * // => 1
20843     *
20844     * _.head([]);
20845     * // => undefined
20846     */
20847    function head(array) {
20848      return (array && array.length) ? array[0] : undefined;
20849    }
20850
20851    /**
20852     * Gets the index at which the first occurrence of `value` is found in `array`
20853     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
20854     * for equality comparisons. If `fromIndex` is negative, it's used as the
20855     * offset from the end of `array`.
20856     *
20857     * @static
20858     * @memberOf _
20859     * @since 0.1.0
20860     * @category Array
20861     * @param {Array} array The array to inspect.
20862     * @param {*} value The value to search for.
20863     * @param {number} [fromIndex=0] The index to search from.
20864     * @returns {number} Returns the index of the matched value, else `-1`.
20865     * @example
20866     *
20867     * _.indexOf([1, 2, 1, 2], 2);
20868     * // => 1
20869     *
20870     * // Search from the `fromIndex`.
20871     * _.indexOf([1, 2, 1, 2], 2, 2);
20872     * // => 3
20873     */
20874    function indexOf(array, value, fromIndex) {
20875      var length = array == null ? 0 : array.length;
20876      if (!length) {
20877        return -1;
20878      }
20879      var index = fromIndex == null ? 0 : toInteger(fromIndex);
20880      if (index < 0) {
20881        index = nativeMax(length + index, 0);
20882      }
20883      return baseIndexOf(array, value, index);
20884    }
20885
20886    /**
20887     * Gets all but the last element of `array`.
20888     *
20889     * @static
20890     * @memberOf _
20891     * @since 0.1.0
20892     * @category Array
20893     * @param {Array} array The array to query.
20894     * @returns {Array} Returns the slice of `array`.
20895     * @example
20896     *
20897     * _.initial([1, 2, 3]);
20898     * // => [1, 2]
20899     */
20900    function initial(array) {
20901      var length = array == null ? 0 : array.length;
20902      return length ? baseSlice(array, 0, -1) : [];
20903    }
20904
20905    /**
20906     * Creates an array of unique values that are included in all given arrays
20907     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
20908     * for equality comparisons. The order and references of result values are
20909     * determined by the first array.
20910     *
20911     * @static
20912     * @memberOf _
20913     * @since 0.1.0
20914     * @category Array
20915     * @param {...Array} [arrays] The arrays to inspect.
20916     * @returns {Array} Returns the new array of intersecting values.
20917     * @example
20918     *
20919     * _.intersection([2, 1], [2, 3]);
20920     * // => [2]
20921     */
20922    var intersection = baseRest(function(arrays) {
20923      var mapped = arrayMap(arrays, castArrayLikeObject);
20924      return (mapped.length && mapped[0] === arrays[0])
20925        ? baseIntersection(mapped)
20926        : [];
20927    });
20928
20929    /**
20930     * This method is like `_.intersection` except that it accepts `iteratee`
20931     * which is invoked for each element of each `arrays` to generate the criterion
20932     * by which they're compared. The order and references of result values are
20933     * determined by the first array. The iteratee is invoked with one argument:
20934     * (value).
20935     *
20936     * @static
20937     * @memberOf _
20938     * @since 4.0.0
20939     * @category Array
20940     * @param {...Array} [arrays] The arrays to inspect.
20941     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
20942     * @returns {Array} Returns the new array of intersecting values.
20943     * @example
20944     *
20945     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
20946     * // => [2.1]
20947     *
20948     * // The `_.property` iteratee shorthand.
20949     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
20950     * // => [{ 'x': 1 }]
20951     */
20952    var intersectionBy = baseRest(function(arrays) {
20953      var iteratee = last(arrays),
20954          mapped = arrayMap(arrays, castArrayLikeObject);
20955
20956      if (iteratee === last(mapped)) {
20957        iteratee = undefined;
20958      } else {
20959        mapped.pop();
20960      }
20961      return (mapped.length && mapped[0] === arrays[0])
20962        ? baseIntersection(mapped, getIteratee(iteratee, 2))
20963        : [];
20964    });
20965
20966    /**
20967     * This method is like `_.intersection` except that it accepts `comparator`
20968     * which is invoked to compare elements of `arrays`. The order and references
20969     * of result values are determined by the first array. The comparator is
20970     * invoked with two arguments: (arrVal, othVal).
20971     *
20972     * @static
20973     * @memberOf _
20974     * @since 4.0.0
20975     * @category Array
20976     * @param {...Array} [arrays] The arrays to inspect.
20977     * @param {Function} [comparator] The comparator invoked per element.
20978     * @returns {Array} Returns the new array of intersecting values.
20979     * @example
20980     *
20981     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
20982     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
20983     *
20984     * _.intersectionWith(objects, others, _.isEqual);
20985     * // => [{ 'x': 1, 'y': 2 }]
20986     */
20987    var intersectionWith = baseRest(function(arrays) {
20988      var comparator = last(arrays),
20989          mapped = arrayMap(arrays, castArrayLikeObject);
20990
20991      comparator = typeof comparator == 'function' ? comparator : undefined;
20992      if (comparator) {
20993        mapped.pop();
20994      }
20995      return (mapped.length && mapped[0] === arrays[0])
20996        ? baseIntersection(mapped, undefined, comparator)
20997        : [];
20998    });
20999
21000    /**
21001     * Converts all elements in `array` into a string separated by `separator`.
21002     *
21003     * @static
21004     * @memberOf _
21005     * @since 4.0.0
21006     * @category Array
21007     * @param {Array} array The array to convert.
21008     * @param {string} [separator=','] The element separator.
21009     * @returns {string} Returns the joined string.
21010     * @example
21011     *
21012     * _.join(['a', 'b', 'c'], '~');
21013     * // => 'a~b~c'
21014     */
21015    function join(array, separator) {
21016      return array == null ? '' : nativeJoin.call(array, separator);
21017    }
21018
21019    /**
21020     * Gets the last element of `array`.
21021     *
21022     * @static
21023     * @memberOf _
21024     * @since 0.1.0
21025     * @category Array
21026     * @param {Array} array The array to query.
21027     * @returns {*} Returns the last element of `array`.
21028     * @example
21029     *
21030     * _.last([1, 2, 3]);
21031     * // => 3
21032     */
21033    function last(array) {
21034      var length = array == null ? 0 : array.length;
21035      return length ? array[length - 1] : undefined;
21036    }
21037
21038    /**
21039     * This method is like `_.indexOf` except that it iterates over elements of
21040     * `array` from right to left.
21041     *
21042     * @static
21043     * @memberOf _
21044     * @since 0.1.0
21045     * @category Array
21046     * @param {Array} array The array to inspect.
21047     * @param {*} value The value to search for.
21048     * @param {number} [fromIndex=array.length-1] The index to search from.
21049     * @returns {number} Returns the index of the matched value, else `-1`.
21050     * @example
21051     *
21052     * _.lastIndexOf([1, 2, 1, 2], 2);
21053     * // => 3
21054     *
21055     * // Search from the `fromIndex`.
21056     * _.lastIndexOf([1, 2, 1, 2], 2, 2);
21057     * // => 1
21058     */
21059    function lastIndexOf(array, value, fromIndex) {
21060      var length = array == null ? 0 : array.length;
21061      if (!length) {
21062        return -1;
21063      }
21064      var index = length;
21065      if (fromIndex !== undefined) {
21066        index = toInteger(fromIndex);
21067        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
21068      }
21069      return value === value
21070        ? strictLastIndexOf(array, value, index)
21071        : baseFindIndex(array, baseIsNaN, index, true);
21072    }
21073
21074    /**
21075     * Gets the element at index `n` of `array`. If `n` is negative, the nth
21076     * element from the end is returned.
21077     *
21078     * @static
21079     * @memberOf _
21080     * @since 4.11.0
21081     * @category Array
21082     * @param {Array} array The array to query.
21083     * @param {number} [n=0] The index of the element to return.
21084     * @returns {*} Returns the nth element of `array`.
21085     * @example
21086     *
21087     * var array = ['a', 'b', 'c', 'd'];
21088     *
21089     * _.nth(array, 1);
21090     * // => 'b'
21091     *
21092     * _.nth(array, -2);
21093     * // => 'c';
21094     */
21095    function nth(array, n) {
21096      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
21097    }
21098
21099    /**
21100     * Removes all given values from `array` using
21101     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
21102     * for equality comparisons.
21103     *
21104     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
21105     * to remove elements from an array by predicate.
21106     *
21107     * @static
21108     * @memberOf _
21109     * @since 2.0.0
21110     * @category Array
21111     * @param {Array} array The array to modify.
21112     * @param {...*} [values] The values to remove.
21113     * @returns {Array} Returns `array`.
21114     * @example
21115     *
21116     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
21117     *
21118     * _.pull(array, 'a', 'c');
21119     * console.log(array);
21120     * // => ['b', 'b']
21121     */
21122    var pull = baseRest(pullAll);
21123
21124    /**
21125     * This method is like `_.pull` except that it accepts an array of values to remove.
21126     *
21127     * **Note:** Unlike `_.difference`, this method mutates `array`.
21128     *
21129     * @static
21130     * @memberOf _
21131     * @since 4.0.0
21132     * @category Array
21133     * @param {Array} array The array to modify.
21134     * @param {Array} values The values to remove.
21135     * @returns {Array} Returns `array`.
21136     * @example
21137     *
21138     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
21139     *
21140     * _.pullAll(array, ['a', 'c']);
21141     * console.log(array);
21142     * // => ['b', 'b']
21143     */
21144    function pullAll(array, values) {
21145      return (array && array.length && values && values.length)
21146        ? basePullAll(array, values)
21147        : array;
21148    }
21149
21150    /**
21151     * This method is like `_.pullAll` except that it accepts `iteratee` which is
21152     * invoked for each element of `array` and `values` to generate the criterion
21153     * by which they're compared. The iteratee is invoked with one argument: (value).
21154     *
21155     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
21156     *
21157     * @static
21158     * @memberOf _
21159     * @since 4.0.0
21160     * @category Array
21161     * @param {Array} array The array to modify.
21162     * @param {Array} values The values to remove.
21163     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
21164     * @returns {Array} Returns `array`.
21165     * @example
21166     *
21167     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
21168     *
21169     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
21170     * console.log(array);
21171     * // => [{ 'x': 2 }]
21172     */
21173    function pullAllBy(array, values, iteratee) {
21174      return (array && array.length && values && values.length)
21175        ? basePullAll(array, values, getIteratee(iteratee, 2))
21176        : array;
21177    }
21178
21179    /**
21180     * This method is like `_.pullAll` except that it accepts `comparator` which
21181     * is invoked to compare elements of `array` to `values`. The comparator is
21182     * invoked with two arguments: (arrVal, othVal).
21183     *
21184     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
21185     *
21186     * @static
21187     * @memberOf _
21188     * @since 4.6.0
21189     * @category Array
21190     * @param {Array} array The array to modify.
21191     * @param {Array} values The values to remove.
21192     * @param {Function} [comparator] The comparator invoked per element.
21193     * @returns {Array} Returns `array`.
21194     * @example
21195     *
21196     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
21197     *
21198     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
21199     * console.log(array);
21200     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
21201     */
21202    function pullAllWith(array, values, comparator) {
21203      return (array && array.length && values && values.length)
21204        ? basePullAll(array, values, undefined, comparator)
21205        : array;
21206    }
21207
21208    /**
21209     * Removes elements from `array` corresponding to `indexes` and returns an
21210     * array of removed elements.
21211     *
21212     * **Note:** Unlike `_.at`, this method mutates `array`.
21213     *
21214     * @static
21215     * @memberOf _
21216     * @since 3.0.0
21217     * @category Array
21218     * @param {Array} array The array to modify.
21219     * @param {...(number|number[])} [indexes] The indexes of elements to remove.
21220     * @returns {Array} Returns the new array of removed elements.
21221     * @example
21222     *
21223     * var array = ['a', 'b', 'c', 'd'];
21224     * var pulled = _.pullAt(array, [1, 3]);
21225     *
21226     * console.log(array);
21227     * // => ['a', 'c']
21228     *
21229     * console.log(pulled);
21230     * // => ['b', 'd']
21231     */
21232    var pullAt = flatRest(function(array, indexes) {
21233      var length = array == null ? 0 : array.length,
21234          result = baseAt(array, indexes);
21235
21236      basePullAt(array, arrayMap(indexes, function(index) {
21237        return isIndex(index, length) ? +index : index;
21238      }).sort(compareAscending));
21239
21240      return result;
21241    });
21242
21243    /**
21244     * Removes all elements from `array` that `predicate` returns truthy for
21245     * and returns an array of the removed elements. The predicate is invoked
21246     * with three arguments: (value, index, array).
21247     *
21248     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
21249     * to pull elements from an array by value.
21250     *
21251     * @static
21252     * @memberOf _
21253     * @since 2.0.0
21254     * @category Array
21255     * @param {Array} array The array to modify.
21256     * @param {Function} [predicate=_.identity] The function invoked per iteration.
21257     * @returns {Array} Returns the new array of removed elements.
21258     * @example
21259     *
21260     * var array = [1, 2, 3, 4];
21261     * var evens = _.remove(array, function(n) {
21262     *   return n % 2 == 0;
21263     * });
21264     *
21265     * console.log(array);
21266     * // => [1, 3]
21267     *
21268     * console.log(evens);
21269     * // => [2, 4]
21270     */
21271    function remove(array, predicate) {
21272      var result = [];
21273      if (!(array && array.length)) {
21274        return result;
21275      }
21276      var index = -1,
21277          indexes = [],
21278          length = array.length;
21279
21280      predicate = getIteratee(predicate, 3);
21281      while (++index < length) {
21282        var value = array[index];
21283        if (predicate(value, index, array)) {
21284          result.push(value);
21285          indexes.push(index);
21286        }
21287      }
21288      basePullAt(array, indexes);
21289      return result;
21290    }
21291
21292    /**
21293     * Reverses `array` so that the first element becomes the last, the second
21294     * element becomes the second to last, and so on.
21295     *
21296     * **Note:** This method mutates `array` and is based on
21297     * [`Array#reverse`](https://mdn.io/Array/reverse).
21298     *
21299     * @static
21300     * @memberOf _
21301     * @since 4.0.0
21302     * @category Array
21303     * @param {Array} array The array to modify.
21304     * @returns {Array} Returns `array`.
21305     * @example
21306     *
21307     * var array = [1, 2, 3];
21308     *
21309     * _.reverse(array);
21310     * // => [3, 2, 1]
21311     *
21312     * console.log(array);
21313     * // => [3, 2, 1]
21314     */
21315    function reverse(array) {
21316      return array == null ? array : nativeReverse.call(array);
21317    }
21318
21319    /**
21320     * Creates a slice of `array` from `start` up to, but not including, `end`.
21321     *
21322     * **Note:** This method is used instead of
21323     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
21324     * returned.
21325     *
21326     * @static
21327     * @memberOf _
21328     * @since 3.0.0
21329     * @category Array
21330     * @param {Array} array The array to slice.
21331     * @param {number} [start=0] The start position.
21332     * @param {number} [end=array.length] The end position.
21333     * @returns {Array} Returns the slice of `array`.
21334     */
21335    function slice(array, start, end) {
21336      var length = array == null ? 0 : array.length;
21337      if (!length) {
21338        return [];
21339      }
21340      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
21341        start = 0;
21342        end = length;
21343      }
21344      else {
21345        start = start == null ? 0 : toInteger(start);
21346        end = end === undefined ? length : toInteger(end);
21347      }
21348      return baseSlice(array, start, end);
21349    }
21350
21351    /**
21352     * Uses a binary search to determine the lowest index at which `value`
21353     * should be inserted into `array` in order to maintain its sort order.
21354     *
21355     * @static
21356     * @memberOf _
21357     * @since 0.1.0
21358     * @category Array
21359     * @param {Array} array The sorted array to inspect.
21360     * @param {*} value The value to evaluate.
21361     * @returns {number} Returns the index at which `value` should be inserted
21362     *  into `array`.
21363     * @example
21364     *
21365     * _.sortedIndex([30, 50], 40);
21366     * // => 1
21367     */
21368    function sortedIndex(array, value) {
21369      return baseSortedIndex(array, value);
21370    }
21371
21372    /**
21373     * This method is like `_.sortedIndex` except that it accepts `iteratee`
21374     * which is invoked for `value` and each element of `array` to compute their
21375     * sort ranking. The iteratee is invoked with one argument: (value).
21376     *
21377     * @static
21378     * @memberOf _
21379     * @since 4.0.0
21380     * @category Array
21381     * @param {Array} array The sorted array to inspect.
21382     * @param {*} value The value to evaluate.
21383     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
21384     * @returns {number} Returns the index at which `value` should be inserted
21385     *  into `array`.
21386     * @example
21387     *
21388     * var objects = [{ 'x': 4 }, { 'x': 5 }];
21389     *
21390     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
21391     * // => 0
21392     *
21393     * // The `_.property` iteratee shorthand.
21394     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
21395     * // => 0
21396     */
21397    function sortedIndexBy(array, value, iteratee) {
21398      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
21399    }
21400
21401    /**
21402     * This method is like `_.indexOf` except that it performs a binary
21403     * search on a sorted `array`.
21404     *
21405     * @static
21406     * @memberOf _
21407     * @since 4.0.0
21408     * @category Array
21409     * @param {Array} array The array to inspect.
21410     * @param {*} value The value to search for.
21411     * @returns {number} Returns the index of the matched value, else `-1`.
21412     * @example
21413     *
21414     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
21415     * // => 1
21416     */
21417    function sortedIndexOf(array, value) {
21418      var length = array == null ? 0 : array.length;
21419      if (length) {
21420        var index = baseSortedIndex(array, value);
21421        if (index < length && eq(array[index], value)) {
21422          return index;
21423        }
21424      }
21425      return -1;
21426    }
21427
21428    /**
21429     * This method is like `_.sortedIndex` except that it returns the highest
21430     * index at which `value` should be inserted into `array` in order to
21431     * maintain its sort order.
21432     *
21433     * @static
21434     * @memberOf _
21435     * @since 3.0.0
21436     * @category Array
21437     * @param {Array} array The sorted array to inspect.
21438     * @param {*} value The value to evaluate.
21439     * @returns {number} Returns the index at which `value` should be inserted
21440     *  into `array`.
21441     * @example
21442     *
21443     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
21444     * // => 4
21445     */
21446    function sortedLastIndex(array, value) {
21447      return baseSortedIndex(array, value, true);
21448    }
21449
21450    /**
21451     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
21452     * which is invoked for `value` and each element of `array` to compute their
21453     * sort ranking. The iteratee is invoked with one argument: (value).
21454     *
21455     * @static
21456     * @memberOf _
21457     * @since 4.0.0
21458     * @category Array
21459     * @param {Array} array The sorted array to inspect.
21460     * @param {*} value The value to evaluate.
21461     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
21462     * @returns {number} Returns the index at which `value` should be inserted
21463     *  into `array`.
21464     * @example
21465     *
21466     * var objects = [{ 'x': 4 }, { 'x': 5 }];
21467     *
21468     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
21469     * // => 1
21470     *
21471     * // The `_.property` iteratee shorthand.
21472     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
21473     * // => 1
21474     */
21475    function sortedLastIndexBy(array, value, iteratee) {
21476      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
21477    }
21478
21479    /**
21480     * This method is like `_.lastIndexOf` except that it performs a binary
21481     * search on a sorted `array`.
21482     *
21483     * @static
21484     * @memberOf _
21485     * @since 4.0.0
21486     * @category Array
21487     * @param {Array} array The array to inspect.
21488     * @param {*} value The value to search for.
21489     * @returns {number} Returns the index of the matched value, else `-1`.
21490     * @example
21491     *
21492     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
21493     * // => 3
21494     */
21495    function sortedLastIndexOf(array, value) {
21496      var length = array == null ? 0 : array.length;
21497      if (length) {
21498        var index = baseSortedIndex(array, value, true) - 1;
21499        if (eq(array[index], value)) {
21500          return index;
21501        }
21502      }
21503      return -1;
21504    }
21505
21506    /**
21507     * This method is like `_.uniq` except that it's designed and optimized
21508     * for sorted arrays.
21509     *
21510     * @static
21511     * @memberOf _
21512     * @since 4.0.0
21513     * @category Array
21514     * @param {Array} array The array to inspect.
21515     * @returns {Array} Returns the new duplicate free array.
21516     * @example
21517     *
21518     * _.sortedUniq([1, 1, 2]);
21519     * // => [1, 2]
21520     */
21521    function sortedUniq(array) {
21522      return (array && array.length)
21523        ? baseSortedUniq(array)
21524        : [];
21525    }
21526
21527    /**
21528     * This method is like `_.uniqBy` except that it's designed and optimized
21529     * for sorted arrays.
21530     *
21531     * @static
21532     * @memberOf _
21533     * @since 4.0.0
21534     * @category Array
21535     * @param {Array} array The array to inspect.
21536     * @param {Function} [iteratee] The iteratee invoked per element.
21537     * @returns {Array} Returns the new duplicate free array.
21538     * @example
21539     *
21540     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
21541     * // => [1.1, 2.3]
21542     */
21543    function sortedUniqBy(array, iteratee) {
21544      return (array && array.length)
21545        ? baseSortedUniq(array, getIteratee(iteratee, 2))
21546        : [];
21547    }
21548
21549    /**
21550     * Gets all but the first element of `array`.
21551     *
21552     * @static
21553     * @memberOf _
21554     * @since 4.0.0
21555     * @category Array
21556     * @param {Array} array The array to query.
21557     * @returns {Array} Returns the slice of `array`.
21558     * @example
21559     *
21560     * _.tail([1, 2, 3]);
21561     * // => [2, 3]
21562     */
21563    function tail(array) {
21564      var length = array == null ? 0 : array.length;
21565      return length ? baseSlice(array, 1, length) : [];
21566    }
21567
21568    /**
21569     * Creates a slice of `array` with `n` elements taken from the beginning.
21570     *
21571     * @static
21572     * @memberOf _
21573     * @since 0.1.0
21574     * @category Array
21575     * @param {Array} array The array to query.
21576     * @param {number} [n=1] The number of elements to take.
21577     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
21578     * @returns {Array} Returns the slice of `array`.
21579     * @example
21580     *
21581     * _.take([1, 2, 3]);
21582     * // => [1]
21583     *
21584     * _.take([1, 2, 3], 2);
21585     * // => [1, 2]
21586     *
21587     * _.take([1, 2, 3], 5);
21588     * // => [1, 2, 3]
21589     *
21590     * _.take([1, 2, 3], 0);
21591     * // => []
21592     */
21593    function take(array, n, guard) {
21594      if (!(array && array.length)) {
21595        return [];
21596      }
21597      n = (guard || n === undefined) ? 1 : toInteger(n);
21598      return baseSlice(array, 0, n < 0 ? 0 : n);
21599    }
21600
21601    /**
21602     * Creates a slice of `array` with `n` elements taken from the end.
21603     *
21604     * @static
21605     * @memberOf _
21606     * @since 3.0.0
21607     * @category Array
21608     * @param {Array} array The array to query.
21609     * @param {number} [n=1] The number of elements to take.
21610     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
21611     * @returns {Array} Returns the slice of `array`.
21612     * @example
21613     *
21614     * _.takeRight([1, 2, 3]);
21615     * // => [3]
21616     *
21617     * _.takeRight([1, 2, 3], 2);
21618     * // => [2, 3]
21619     *
21620     * _.takeRight([1, 2, 3], 5);
21621     * // => [1, 2, 3]
21622     *
21623     * _.takeRight([1, 2, 3], 0);
21624     * // => []
21625     */
21626    function takeRight(array, n, guard) {
21627      var length = array == null ? 0 : array.length;
21628      if (!length) {
21629        return [];
21630      }
21631      n = (guard || n === undefined) ? 1 : toInteger(n);
21632      n = length - n;
21633      return baseSlice(array, n < 0 ? 0 : n, length);
21634    }
21635
21636    /**
21637     * Creates a slice of `array` with elements taken from the end. Elements are
21638     * taken until `predicate` returns falsey. The predicate is invoked with
21639     * three arguments: (value, index, array).
21640     *
21641     * @static
21642     * @memberOf _
21643     * @since 3.0.0
21644     * @category Array
21645     * @param {Array} array The array to query.
21646     * @param {Function} [predicate=_.identity] The function invoked per iteration.
21647     * @returns {Array} Returns the slice of `array`.
21648     * @example
21649     *
21650     * var users = [
21651     *   { 'user': 'barney',  'active': true },
21652     *   { 'user': 'fred',    'active': false },
21653     *   { 'user': 'pebbles', 'active': false }
21654     * ];
21655     *
21656     * _.takeRightWhile(users, function(o) { return !o.active; });
21657     * // => objects for ['fred', 'pebbles']
21658     *
21659     * // The `_.matches` iteratee shorthand.
21660     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
21661     * // => objects for ['pebbles']
21662     *
21663     * // The `_.matchesProperty` iteratee shorthand.
21664     * _.takeRightWhile(users, ['active', false]);
21665     * // => objects for ['fred', 'pebbles']
21666     *
21667     * // The `_.property` iteratee shorthand.
21668     * _.takeRightWhile(users, 'active');
21669     * // => []
21670     */
21671    function takeRightWhile(array, predicate) {
21672      return (array && array.length)
21673        ? baseWhile(array, getIteratee(predicate, 3), false, true)
21674        : [];
21675    }
21676
21677    /**
21678     * Creates a slice of `array` with elements taken from the beginning. Elements
21679     * are taken until `predicate` returns falsey. The predicate is invoked with
21680     * three arguments: (value, index, array).
21681     *
21682     * @static
21683     * @memberOf _
21684     * @since 3.0.0
21685     * @category Array
21686     * @param {Array} array The array to query.
21687     * @param {Function} [predicate=_.identity] The function invoked per iteration.
21688     * @returns {Array} Returns the slice of `array`.
21689     * @example
21690     *
21691     * var users = [
21692     *   { 'user': 'barney',  'active': false },
21693     *   { 'user': 'fred',    'active': false },
21694     *   { 'user': 'pebbles', 'active': true }
21695     * ];
21696     *
21697     * _.takeWhile(users, function(o) { return !o.active; });
21698     * // => objects for ['barney', 'fred']
21699     *
21700     * // The `_.matches` iteratee shorthand.
21701     * _.takeWhile(users, { 'user': 'barney', 'active': false });
21702     * // => objects for ['barney']
21703     *
21704     * // The `_.matchesProperty` iteratee shorthand.
21705     * _.takeWhile(users, ['active', false]);
21706     * // => objects for ['barney', 'fred']
21707     *
21708     * // The `_.property` iteratee shorthand.
21709     * _.takeWhile(users, 'active');
21710     * // => []
21711     */
21712    function takeWhile(array, predicate) {
21713      return (array && array.length)
21714        ? baseWhile(array, getIteratee(predicate, 3))
21715        : [];
21716    }
21717
21718    /**
21719     * Creates an array of unique values, in order, from all given arrays using
21720     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
21721     * for equality comparisons.
21722     *
21723     * @static
21724     * @memberOf _
21725     * @since 0.1.0
21726     * @category Array
21727     * @param {...Array} [arrays] The arrays to inspect.
21728     * @returns {Array} Returns the new array of combined values.
21729     * @example
21730     *
21731     * _.union([2], [1, 2]);
21732     * // => [2, 1]
21733     */
21734    var union = baseRest(function(arrays) {
21735      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
21736    });
21737
21738    /**
21739     * This method is like `_.union` except that it accepts `iteratee` which is
21740     * invoked for each element of each `arrays` to generate the criterion by
21741     * which uniqueness is computed. Result values are chosen from the first
21742     * array in which the value occurs. The iteratee is invoked with one argument:
21743     * (value).
21744     *
21745     * @static
21746     * @memberOf _
21747     * @since 4.0.0
21748     * @category Array
21749     * @param {...Array} [arrays] The arrays to inspect.
21750     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
21751     * @returns {Array} Returns the new array of combined values.
21752     * @example
21753     *
21754     * _.unionBy([2.1], [1.2, 2.3], Math.floor);
21755     * // => [2.1, 1.2]
21756     *
21757     * // The `_.property` iteratee shorthand.
21758     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
21759     * // => [{ 'x': 1 }, { 'x': 2 }]
21760     */
21761    var unionBy = baseRest(function(arrays) {
21762      var iteratee = last(arrays);
21763      if (isArrayLikeObject(iteratee)) {
21764        iteratee = undefined;
21765      }
21766      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
21767    });
21768
21769    /**
21770     * This method is like `_.union` except that it accepts `comparator` which
21771     * is invoked to compare elements of `arrays`. Result values are chosen from
21772     * the first array in which the value occurs. The comparator is invoked
21773     * with two arguments: (arrVal, othVal).
21774     *
21775     * @static
21776     * @memberOf _
21777     * @since 4.0.0
21778     * @category Array
21779     * @param {...Array} [arrays] The arrays to inspect.
21780     * @param {Function} [comparator] The comparator invoked per element.
21781     * @returns {Array} Returns the new array of combined values.
21782     * @example
21783     *
21784     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
21785     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
21786     *
21787     * _.unionWith(objects, others, _.isEqual);
21788     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
21789     */
21790    var unionWith = baseRest(function(arrays) {
21791      var comparator = last(arrays);
21792      comparator = typeof comparator == 'function' ? comparator : undefined;
21793      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
21794    });
21795
21796    /**
21797     * Creates a duplicate-free version of an array, using
21798     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
21799     * for equality comparisons, in which only the first occurrence of each element
21800     * is kept. The order of result values is determined by the order they occur
21801     * in the array.
21802     *
21803     * @static
21804     * @memberOf _
21805     * @since 0.1.0
21806     * @category Array
21807     * @param {Array} array The array to inspect.
21808     * @returns {Array} Returns the new duplicate free array.
21809     * @example
21810     *
21811     * _.uniq([2, 1, 2]);
21812     * // => [2, 1]
21813     */
21814    function uniq(array) {
21815      return (array && array.length) ? baseUniq(array) : [];
21816    }
21817
21818    /**
21819     * This method is like `_.uniq` except that it accepts `iteratee` which is
21820     * invoked for each element in `array` to generate the criterion by which
21821     * uniqueness is computed. The order of result values is determined by the
21822     * order they occur in the array. The iteratee is invoked with one argument:
21823     * (value).
21824     *
21825     * @static
21826     * @memberOf _
21827     * @since 4.0.0
21828     * @category Array
21829     * @param {Array} array The array to inspect.
21830     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
21831     * @returns {Array} Returns the new duplicate free array.
21832     * @example
21833     *
21834     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
21835     * // => [2.1, 1.2]
21836     *
21837     * // The `_.property` iteratee shorthand.
21838     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
21839     * // => [{ 'x': 1 }, { 'x': 2 }]
21840     */
21841    function uniqBy(array, iteratee) {
21842      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
21843    }
21844
21845    /**
21846     * This method is like `_.uniq` except that it accepts `comparator` which
21847     * is invoked to compare elements of `array`. The order of result values is
21848     * determined by the order they occur in the array.The comparator is invoked
21849     * with two arguments: (arrVal, othVal).
21850     *
21851     * @static
21852     * @memberOf _
21853     * @since 4.0.0
21854     * @category Array
21855     * @param {Array} array The array to inspect.
21856     * @param {Function} [comparator] The comparator invoked per element.
21857     * @returns {Array} Returns the new duplicate free array.
21858     * @example
21859     *
21860     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
21861     *
21862     * _.uniqWith(objects, _.isEqual);
21863     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
21864     */
21865    function uniqWith(array, comparator) {
21866      comparator = typeof comparator == 'function' ? comparator : undefined;
21867      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
21868    }
21869
21870    /**
21871     * This method is like `_.zip` except that it accepts an array of grouped
21872     * elements and creates an array regrouping the elements to their pre-zip
21873     * configuration.
21874     *
21875     * @static
21876     * @memberOf _
21877     * @since 1.2.0
21878     * @category Array
21879     * @param {Array} array The array of grouped elements to process.
21880     * @returns {Array} Returns the new array of regrouped elements.
21881     * @example
21882     *
21883     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
21884     * // => [['a', 1, true], ['b', 2, false]]
21885     *
21886     * _.unzip(zipped);
21887     * // => [['a', 'b'], [1, 2], [true, false]]
21888     */
21889    function unzip(array) {
21890      if (!(array && array.length)) {
21891        return [];
21892      }
21893      var length = 0;
21894      array = arrayFilter(array, function(group) {
21895        if (isArrayLikeObject(group)) {
21896          length = nativeMax(group.length, length);
21897          return true;
21898        }
21899      });
21900      return baseTimes(length, function(index) {
21901        return arrayMap(array, baseProperty(index));
21902      });
21903    }
21904
21905    /**
21906     * This method is like `_.unzip` except that it accepts `iteratee` to specify
21907     * how regrouped values should be combined. The iteratee is invoked with the
21908     * elements of each group: (...group).
21909     *
21910     * @static
21911     * @memberOf _
21912     * @since 3.8.0
21913     * @category Array
21914     * @param {Array} array The array of grouped elements to process.
21915     * @param {Function} [iteratee=_.identity] The function to combine
21916     *  regrouped values.
21917     * @returns {Array} Returns the new array of regrouped elements.
21918     * @example
21919     *
21920     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
21921     * // => [[1, 10, 100], [2, 20, 200]]
21922     *
21923     * _.unzipWith(zipped, _.add);
21924     * // => [3, 30, 300]
21925     */
21926    function unzipWith(array, iteratee) {
21927      if (!(array && array.length)) {
21928        return [];
21929      }
21930      var result = unzip(array);
21931      if (iteratee == null) {
21932        return result;
21933      }
21934      return arrayMap(result, function(group) {
21935        return apply(iteratee, undefined, group);
21936      });
21937    }
21938
21939    /**
21940     * Creates an array excluding all given values using
21941     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
21942     * for equality comparisons.
21943     *
21944     * **Note:** Unlike `_.pull`, this method returns a new array.
21945     *
21946     * @static
21947     * @memberOf _
21948     * @since 0.1.0
21949     * @category Array
21950     * @param {Array} array The array to inspect.
21951     * @param {...*} [values] The values to exclude.
21952     * @returns {Array} Returns the new array of filtered values.
21953     * @see _.difference, _.xor
21954     * @example
21955     *
21956     * _.without([2, 1, 2, 3], 1, 2);
21957     * // => [3]
21958     */
21959    var without = baseRest(function(array, values) {
21960      return isArrayLikeObject(array)
21961        ? baseDifference(array, values)
21962        : [];
21963    });
21964
21965    /**
21966     * Creates an array of unique values that is the
21967     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
21968     * of the given arrays. The order of result values is determined by the order
21969     * they occur in the arrays.
21970     *
21971     * @static
21972     * @memberOf _
21973     * @since 2.4.0
21974     * @category Array
21975     * @param {...Array} [arrays] The arrays to inspect.
21976     * @returns {Array} Returns the new array of filtered values.
21977     * @see _.difference, _.without
21978     * @example
21979     *
21980     * _.xor([2, 1], [2, 3]);
21981     * // => [1, 3]
21982     */
21983    var xor = baseRest(function(arrays) {
21984      return baseXor(arrayFilter(arrays, isArrayLikeObject));
21985    });
21986
21987    /**
21988     * This method is like `_.xor` except that it accepts `iteratee` which is
21989     * invoked for each element of each `arrays` to generate the criterion by
21990     * which by which they're compared. The order of result values is determined
21991     * by the order they occur in the arrays. The iteratee is invoked with one
21992     * argument: (value).
21993     *
21994     * @static
21995     * @memberOf _
21996     * @since 4.0.0
21997     * @category Array
21998     * @param {...Array} [arrays] The arrays to inspect.
21999     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
22000     * @returns {Array} Returns the new array of filtered values.
22001     * @example
22002     *
22003     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
22004     * // => [1.2, 3.4]
22005     *
22006     * // The `_.property` iteratee shorthand.
22007     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
22008     * // => [{ 'x': 2 }]
22009     */
22010    var xorBy = baseRest(function(arrays) {
22011      var iteratee = last(arrays);
22012      if (isArrayLikeObject(iteratee)) {
22013        iteratee = undefined;
22014      }
22015      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
22016    });
22017
22018    /**
22019     * This method is like `_.xor` except that it accepts `comparator` which is
22020     * invoked to compare elements of `arrays`. The order of result values is
22021     * determined by the order they occur in the arrays. The comparator is invoked
22022     * with two arguments: (arrVal, othVal).
22023     *
22024     * @static
22025     * @memberOf _
22026     * @since 4.0.0
22027     * @category Array
22028     * @param {...Array} [arrays] The arrays to inspect.
22029     * @param {Function} [comparator] The comparator invoked per element.
22030     * @returns {Array} Returns the new array of filtered values.
22031     * @example
22032     *
22033     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
22034     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
22035     *
22036     * _.xorWith(objects, others, _.isEqual);
22037     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
22038     */
22039    var xorWith = baseRest(function(arrays) {
22040      var comparator = last(arrays);
22041      comparator = typeof comparator == 'function' ? comparator : undefined;
22042      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
22043    });
22044
22045    /**
22046     * Creates an array of grouped elements, the first of which contains the
22047     * first elements of the given arrays, the second of which contains the
22048     * second elements of the given arrays, and so on.
22049     *
22050     * @static
22051     * @memberOf _
22052     * @since 0.1.0
22053     * @category Array
22054     * @param {...Array} [arrays] The arrays to process.
22055     * @returns {Array} Returns the new array of grouped elements.
22056     * @example
22057     *
22058     * _.zip(['a', 'b'], [1, 2], [true, false]);
22059     * // => [['a', 1, true], ['b', 2, false]]
22060     */
22061    var zip = baseRest(unzip);
22062
22063    /**
22064     * This method is like `_.fromPairs` except that it accepts two arrays,
22065     * one of property identifiers and one of corresponding values.
22066     *
22067     * @static
22068     * @memberOf _
22069     * @since 0.4.0
22070     * @category Array
22071     * @param {Array} [props=[]] The property identifiers.
22072     * @param {Array} [values=[]] The property values.
22073     * @returns {Object} Returns the new object.
22074     * @example
22075     *
22076     * _.zipObject(['a', 'b'], [1, 2]);
22077     * // => { 'a': 1, 'b': 2 }
22078     */
22079    function zipObject(props, values) {
22080      return baseZipObject(props || [], values || [], assignValue);
22081    }
22082
22083    /**
22084     * This method is like `_.zipObject` except that it supports property paths.
22085     *
22086     * @static
22087     * @memberOf _
22088     * @since 4.1.0
22089     * @category Array
22090     * @param {Array} [props=[]] The property identifiers.
22091     * @param {Array} [values=[]] The property values.
22092     * @returns {Object} Returns the new object.
22093     * @example
22094     *
22095     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
22096     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
22097     */
22098    function zipObjectDeep(props, values) {
22099      return baseZipObject(props || [], values || [], baseSet);
22100    }
22101
22102    /**
22103     * This method is like `_.zip` except that it accepts `iteratee` to specify
22104     * how grouped values should be combined. The iteratee is invoked with the
22105     * elements of each group: (...group).
22106     *
22107     * @static
22108     * @memberOf _
22109     * @since 3.8.0
22110     * @category Array
22111     * @param {...Array} [arrays] The arrays to process.
22112     * @param {Function} [iteratee=_.identity] The function to combine
22113     *  grouped values.
22114     * @returns {Array} Returns the new array of grouped elements.
22115     * @example
22116     *
22117     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
22118     *   return a + b + c;
22119     * });
22120     * // => [111, 222]
22121     */
22122    var zipWith = baseRest(function(arrays) {
22123      var length = arrays.length,
22124          iteratee = length > 1 ? arrays[length - 1] : undefined;
22125
22126      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
22127      return unzipWith(arrays, iteratee);
22128    });
22129
22130    /*------------------------------------------------------------------------*/
22131
22132    /**
22133     * Creates a `lodash` wrapper instance that wraps `value` with explicit method
22134     * chain sequences enabled. The result of such sequences must be unwrapped
22135     * with `_#value`.
22136     *
22137     * @static
22138     * @memberOf _
22139     * @since 1.3.0
22140     * @category Seq
22141     * @param {*} value The value to wrap.
22142     * @returns {Object} Returns the new `lodash` wrapper instance.
22143     * @example
22144     *
22145     * var users = [
22146     *   { 'user': 'barney',  'age': 36 },
22147     *   { 'user': 'fred',    'age': 40 },
22148     *   { 'user': 'pebbles', 'age': 1 }
22149     * ];
22150     *
22151     * var youngest = _
22152     *   .chain(users)
22153     *   .sortBy('age')
22154     *   .map(function(o) {
22155     *     return o.user + ' is ' + o.age;
22156     *   })
22157     *   .head()
22158     *   .value();
22159     * // => 'pebbles is 1'
22160     */
22161    function chain(value) {
22162      var result = lodash(value);
22163      result.__chain__ = true;
22164      return result;
22165    }
22166
22167    /**
22168     * This method invokes `interceptor` and returns `value`. The interceptor
22169     * is invoked with one argument; (value). The purpose of this method is to
22170     * "tap into" a method chain sequence in order to modify intermediate results.
22171     *
22172     * @static
22173     * @memberOf _
22174     * @since 0.1.0
22175     * @category Seq
22176     * @param {*} value The value to provide to `interceptor`.
22177     * @param {Function} interceptor The function to invoke.
22178     * @returns {*} Returns `value`.
22179     * @example
22180     *
22181     * _([1, 2, 3])
22182     *  .tap(function(array) {
22183     *    // Mutate input array.
22184     *    array.pop();
22185     *  })
22186     *  .reverse()
22187     *  .value();
22188     * // => [2, 1]
22189     */
22190    function tap(value, interceptor) {
22191      interceptor(value);
22192      return value;
22193    }
22194
22195    /**
22196     * This method is like `_.tap` except that it returns the result of `interceptor`.
22197     * The purpose of this method is to "pass thru" values replacing intermediate
22198     * results in a method chain sequence.
22199     *
22200     * @static
22201     * @memberOf _
22202     * @since 3.0.0
22203     * @category Seq
22204     * @param {*} value The value to provide to `interceptor`.
22205     * @param {Function} interceptor The function to invoke.
22206     * @returns {*} Returns the result of `interceptor`.
22207     * @example
22208     *
22209     * _('  abc  ')
22210     *  .chain()
22211     *  .trim()
22212     *  .thru(function(value) {
22213     *    return [value];
22214     *  })
22215     *  .value();
22216     * // => ['abc']
22217     */
22218    function thru(value, interceptor) {
22219      return interceptor(value);
22220    }
22221
22222    /**
22223     * This method is the wrapper version of `_.at`.
22224     *
22225     * @name at
22226     * @memberOf _
22227     * @since 1.0.0
22228     * @category Seq
22229     * @param {...(string|string[])} [paths] The property paths to pick.
22230     * @returns {Object} Returns the new `lodash` wrapper instance.
22231     * @example
22232     *
22233     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
22234     *
22235     * _(object).at(['a[0].b.c', 'a[1]']).value();
22236     * // => [3, 4]
22237     */
22238    var wrapperAt = flatRest(function(paths) {
22239      var length = paths.length,
22240          start = length ? paths[0] : 0,
22241          value = this.__wrapped__,
22242          interceptor = function(object) { return baseAt(object, paths); };
22243
22244      if (length > 1 || this.__actions__.length ||
22245          !(value instanceof LazyWrapper) || !isIndex(start)) {
22246        return this.thru(interceptor);
22247      }
22248      value = value.slice(start, +start + (length ? 1 : 0));
22249      value.__actions__.push({
22250        'func': thru,
22251        'args': [interceptor],
22252        'thisArg': undefined
22253      });
22254      return new LodashWrapper(value, this.__chain__).thru(function(array) {
22255        if (length && !array.length) {
22256          array.push(undefined);
22257        }
22258        return array;
22259      });
22260    });
22261
22262    /**
22263     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
22264     *
22265     * @name chain
22266     * @memberOf _
22267     * @since 0.1.0
22268     * @category Seq
22269     * @returns {Object} Returns the new `lodash` wrapper instance.
22270     * @example
22271     *
22272     * var users = [
22273     *   { 'user': 'barney', 'age': 36 },
22274     *   { 'user': 'fred',   'age': 40 }
22275     * ];
22276     *
22277     * // A sequence without explicit chaining.
22278     * _(users).head();
22279     * // => { 'user': 'barney', 'age': 36 }
22280     *
22281     * // A sequence with explicit chaining.
22282     * _(users)
22283     *   .chain()
22284     *   .head()
22285     *   .pick('user')
22286     *   .value();
22287     * // => { 'user': 'barney' }
22288     */
22289    function wrapperChain() {
22290      return chain(this);
22291    }
22292
22293    /**
22294     * Executes the chain sequence and returns the wrapped result.
22295     *
22296     * @name commit
22297     * @memberOf _
22298     * @since 3.2.0
22299     * @category Seq
22300     * @returns {Object} Returns the new `lodash` wrapper instance.
22301     * @example
22302     *
22303     * var array = [1, 2];
22304     * var wrapped = _(array).push(3);
22305     *
22306     * console.log(array);
22307     * // => [1, 2]
22308     *
22309     * wrapped = wrapped.commit();
22310     * console.log(array);
22311     * // => [1, 2, 3]
22312     *
22313     * wrapped.last();
22314     * // => 3
22315     *
22316     * console.log(array);
22317     * // => [1, 2, 3]
22318     */
22319    function wrapperCommit() {
22320      return new LodashWrapper(this.value(), this.__chain__);
22321    }
22322
22323    /**
22324     * Gets the next value on a wrapped object following the
22325     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
22326     *
22327     * @name next
22328     * @memberOf _
22329     * @since 4.0.0
22330     * @category Seq
22331     * @returns {Object} Returns the next iterator value.
22332     * @example
22333     *
22334     * var wrapped = _([1, 2]);
22335     *
22336     * wrapped.next();
22337     * // => { 'done': false, 'value': 1 }
22338     *
22339     * wrapped.next();
22340     * // => { 'done': false, 'value': 2 }
22341     *
22342     * wrapped.next();
22343     * // => { 'done': true, 'value': undefined }
22344     */
22345    function wrapperNext() {
22346      if (this.__values__ === undefined) {
22347        this.__values__ = toArray(this.value());
22348      }
22349      var done = this.__index__ >= this.__values__.length,
22350          value = done ? undefined : this.__values__[this.__index__++];
22351
22352      return { 'done': done, 'value': value };
22353    }
22354
22355    /**
22356     * Enables the wrapper to be iterable.
22357     *
22358     * @name Symbol.iterator
22359     * @memberOf _
22360     * @since 4.0.0
22361     * @category Seq
22362     * @returns {Object} Returns the wrapper object.
22363     * @example
22364     *
22365     * var wrapped = _([1, 2]);
22366     *
22367     * wrapped[Symbol.iterator]() === wrapped;
22368     * // => true
22369     *
22370     * Array.from(wrapped);
22371     * // => [1, 2]
22372     */
22373    function wrapperToIterator() {
22374      return this;
22375    }
22376
22377    /**
22378     * Creates a clone of the chain sequence planting `value` as the wrapped value.
22379     *
22380     * @name plant
22381     * @memberOf _
22382     * @since 3.2.0
22383     * @category Seq
22384     * @param {*} value The value to plant.
22385     * @returns {Object} Returns the new `lodash` wrapper instance.
22386     * @example
22387     *
22388     * function square(n) {
22389     *   return n * n;
22390     * }
22391     *
22392     * var wrapped = _([1, 2]).map(square);
22393     * var other = wrapped.plant([3, 4]);
22394     *
22395     * other.value();
22396     * // => [9, 16]
22397     *
22398     * wrapped.value();
22399     * // => [1, 4]
22400     */
22401    function wrapperPlant(value) {
22402      var result,
22403          parent = this;
22404
22405      while (parent instanceof baseLodash) {
22406        var clone = wrapperClone(parent);
22407        clone.__index__ = 0;
22408        clone.__values__ = undefined;
22409        if (result) {
22410          previous.__wrapped__ = clone;
22411        } else {
22412          result = clone;
22413        }
22414        var previous = clone;
22415        parent = parent.__wrapped__;
22416      }
22417      previous.__wrapped__ = value;
22418      return result;
22419    }
22420
22421    /**
22422     * This method is the wrapper version of `_.reverse`.
22423     *
22424     * **Note:** This method mutates the wrapped array.
22425     *
22426     * @name reverse
22427     * @memberOf _
22428     * @since 0.1.0
22429     * @category Seq
22430     * @returns {Object} Returns the new `lodash` wrapper instance.
22431     * @example
22432     *
22433     * var array = [1, 2, 3];
22434     *
22435     * _(array).reverse().value()
22436     * // => [3, 2, 1]
22437     *
22438     * console.log(array);
22439     * // => [3, 2, 1]
22440     */
22441    function wrapperReverse() {
22442      var value = this.__wrapped__;
22443      if (value instanceof LazyWrapper) {
22444        var wrapped = value;
22445        if (this.__actions__.length) {
22446          wrapped = new LazyWrapper(this);
22447        }
22448        wrapped = wrapped.reverse();
22449        wrapped.__actions__.push({
22450          'func': thru,
22451          'args': [reverse],
22452          'thisArg': undefined
22453        });
22454        return new LodashWrapper(wrapped, this.__chain__);
22455      }
22456      return this.thru(reverse);
22457    }
22458
22459    /**
22460     * Executes the chain sequence to resolve the unwrapped value.
22461     *
22462     * @name value
22463     * @memberOf _
22464     * @since 0.1.0
22465     * @alias toJSON, valueOf
22466     * @category Seq
22467     * @returns {*} Returns the resolved unwrapped value.
22468     * @example
22469     *
22470     * _([1, 2, 3]).value();
22471     * // => [1, 2, 3]
22472     */
22473    function wrapperValue() {
22474      return baseWrapperValue(this.__wrapped__, this.__actions__);
22475    }
22476
22477    /*------------------------------------------------------------------------*/
22478
22479    /**
22480     * Creates an object composed of keys generated from the results of running
22481     * each element of `collection` thru `iteratee`. The corresponding value of
22482     * each key is the number of times the key was returned by `iteratee`. The
22483     * iteratee is invoked with one argument: (value).
22484     *
22485     * @static
22486     * @memberOf _
22487     * @since 0.5.0
22488     * @category Collection
22489     * @param {Array|Object} collection The collection to iterate over.
22490     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
22491     * @returns {Object} Returns the composed aggregate object.
22492     * @example
22493     *
22494     * _.countBy([6.1, 4.2, 6.3], Math.floor);
22495     * // => { '4': 1, '6': 2 }
22496     *
22497     * // The `_.property` iteratee shorthand.
22498     * _.countBy(['one', 'two', 'three'], 'length');
22499     * // => { '3': 2, '5': 1 }
22500     */
22501    var countBy = createAggregator(function(result, value, key) {
22502      if (hasOwnProperty.call(result, key)) {
22503        ++result[key];
22504      } else {
22505        baseAssignValue(result, key, 1);
22506      }
22507    });
22508
22509    /**
22510     * Checks if `predicate` returns truthy for **all** elements of `collection`.
22511     * Iteration is stopped once `predicate` returns falsey. The predicate is
22512     * invoked with three arguments: (value, index|key, collection).
22513     *
22514     * **Note:** This method returns `true` for
22515     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
22516     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
22517     * elements of empty collections.
22518     *
22519     * @static
22520     * @memberOf _
22521     * @since 0.1.0
22522     * @category Collection
22523     * @param {Array|Object} collection The collection to iterate over.
22524     * @param {Function} [predicate=_.identity] The function invoked per iteration.
22525     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
22526     * @returns {boolean} Returns `true` if all elements pass the predicate check,
22527     *  else `false`.
22528     * @example
22529     *
22530     * _.every([true, 1, null, 'yes'], Boolean);
22531     * // => false
22532     *
22533     * var users = [
22534     *   { 'user': 'barney', 'age': 36, 'active': false },
22535     *   { 'user': 'fred',   'age': 40, 'active': false }
22536     * ];
22537     *
22538     * // The `_.matches` iteratee shorthand.
22539     * _.every(users, { 'user': 'barney', 'active': false });
22540     * // => false
22541     *
22542     * // The `_.matchesProperty` iteratee shorthand.
22543     * _.every(users, ['active', false]);
22544     * // => true
22545     *
22546     * // The `_.property` iteratee shorthand.
22547     * _.every(users, 'active');
22548     * // => false
22549     */
22550    function every(collection, predicate, guard) {
22551      var func = isArray(collection) ? arrayEvery : baseEvery;
22552      if (guard && isIterateeCall(collection, predicate, guard)) {
22553        predicate = undefined;
22554      }
22555      return func(collection, getIteratee(predicate, 3));
22556    }
22557
22558    /**
22559     * Iterates over elements of `collection`, returning an array of all elements
22560     * `predicate` returns truthy for. The predicate is invoked with three
22561     * arguments: (value, index|key, collection).
22562     *
22563     * **Note:** Unlike `_.remove`, this method returns a new array.
22564     *
22565     * @static
22566     * @memberOf _
22567     * @since 0.1.0
22568     * @category Collection
22569     * @param {Array|Object} collection The collection to iterate over.
22570     * @param {Function} [predicate=_.identity] The function invoked per iteration.
22571     * @returns {Array} Returns the new filtered array.
22572     * @see _.reject
22573     * @example
22574     *
22575     * var users = [
22576     *   { 'user': 'barney', 'age': 36, 'active': true },
22577     *   { 'user': 'fred',   'age': 40, 'active': false }
22578     * ];
22579     *
22580     * _.filter(users, function(o) { return !o.active; });
22581     * // => objects for ['fred']
22582     *
22583     * // The `_.matches` iteratee shorthand.
22584     * _.filter(users, { 'age': 36, 'active': true });
22585     * // => objects for ['barney']
22586     *
22587     * // The `_.matchesProperty` iteratee shorthand.
22588     * _.filter(users, ['active', false]);
22589     * // => objects for ['fred']
22590     *
22591     * // The `_.property` iteratee shorthand.
22592     * _.filter(users, 'active');
22593     * // => objects for ['barney']
22594     *
22595     * // Combining several predicates using `_.overEvery` or `_.overSome`.
22596     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
22597     * // => objects for ['fred', 'barney']
22598     */
22599    function filter(collection, predicate) {
22600      var func = isArray(collection) ? arrayFilter : baseFilter;
22601      return func(collection, getIteratee(predicate, 3));
22602    }
22603
22604    /**
22605     * Iterates over elements of `collection`, returning the first element
22606     * `predicate` returns truthy for. The predicate is invoked with three
22607     * arguments: (value, index|key, collection).
22608     *
22609     * @static
22610     * @memberOf _
22611     * @since 0.1.0
22612     * @category Collection
22613     * @param {Array|Object} collection The collection to inspect.
22614     * @param {Function} [predicate=_.identity] The function invoked per iteration.
22615     * @param {number} [fromIndex=0] The index to search from.
22616     * @returns {*} Returns the matched element, else `undefined`.
22617     * @example
22618     *
22619     * var users = [
22620     *   { 'user': 'barney',  'age': 36, 'active': true },
22621     *   { 'user': 'fred',    'age': 40, 'active': false },
22622     *   { 'user': 'pebbles', 'age': 1,  'active': true }
22623     * ];
22624     *
22625     * _.find(users, function(o) { return o.age < 40; });
22626     * // => object for 'barney'
22627     *
22628     * // The `_.matches` iteratee shorthand.
22629     * _.find(users, { 'age': 1, 'active': true });
22630     * // => object for 'pebbles'
22631     *
22632     * // The `_.matchesProperty` iteratee shorthand.
22633     * _.find(users, ['active', false]);
22634     * // => object for 'fred'
22635     *
22636     * // The `_.property` iteratee shorthand.
22637     * _.find(users, 'active');
22638     * // => object for 'barney'
22639     */
22640    var find = createFind(findIndex);
22641
22642    /**
22643     * This method is like `_.find` except that it iterates over elements of
22644     * `collection` from right to left.
22645     *
22646     * @static
22647     * @memberOf _
22648     * @since 2.0.0
22649     * @category Collection
22650     * @param {Array|Object} collection The collection to inspect.
22651     * @param {Function} [predicate=_.identity] The function invoked per iteration.
22652     * @param {number} [fromIndex=collection.length-1] The index to search from.
22653     * @returns {*} Returns the matched element, else `undefined`.
22654     * @example
22655     *
22656     * _.findLast([1, 2, 3, 4], function(n) {
22657     *   return n % 2 == 1;
22658     * });
22659     * // => 3
22660     */
22661    var findLast = createFind(findLastIndex);
22662
22663    /**
22664     * Creates a flattened array of values by running each element in `collection`
22665     * thru `iteratee` and flattening the mapped results. The iteratee is invoked
22666     * with three arguments: (value, index|key, collection).
22667     *
22668     * @static
22669     * @memberOf _
22670     * @since 4.0.0
22671     * @category Collection
22672     * @param {Array|Object} collection The collection to iterate over.
22673     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
22674     * @returns {Array} Returns the new flattened array.
22675     * @example
22676     *
22677     * function duplicate(n) {
22678     *   return [n, n];
22679     * }
22680     *
22681     * _.flatMap([1, 2], duplicate);
22682     * // => [1, 1, 2, 2]
22683     */
22684    function flatMap(collection, iteratee) {
22685      return baseFlatten(map(collection, iteratee), 1);
22686    }
22687
22688    /**
22689     * This method is like `_.flatMap` except that it recursively flattens the
22690     * mapped results.
22691     *
22692     * @static
22693     * @memberOf _
22694     * @since 4.7.0
22695     * @category Collection
22696     * @param {Array|Object} collection The collection to iterate over.
22697     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
22698     * @returns {Array} Returns the new flattened array.
22699     * @example
22700     *
22701     * function duplicate(n) {
22702     *   return [[[n, n]]];
22703     * }
22704     *
22705     * _.flatMapDeep([1, 2], duplicate);
22706     * // => [1, 1, 2, 2]
22707     */
22708    function flatMapDeep(collection, iteratee) {
22709      return baseFlatten(map(collection, iteratee), INFINITY);
22710    }
22711
22712    /**
22713     * This method is like `_.flatMap` except that it recursively flattens the
22714     * mapped results up to `depth` times.
22715     *
22716     * @static
22717     * @memberOf _
22718     * @since 4.7.0
22719     * @category Collection
22720     * @param {Array|Object} collection The collection to iterate over.
22721     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
22722     * @param {number} [depth=1] The maximum recursion depth.
22723     * @returns {Array} Returns the new flattened array.
22724     * @example
22725     *
22726     * function duplicate(n) {
22727     *   return [[[n, n]]];
22728     * }
22729     *
22730     * _.flatMapDepth([1, 2], duplicate, 2);
22731     * // => [[1, 1], [2, 2]]
22732     */
22733    function flatMapDepth(collection, iteratee, depth) {
22734      depth = depth === undefined ? 1 : toInteger(depth);
22735      return baseFlatten(map(collection, iteratee), depth);
22736    }
22737
22738    /**
22739     * Iterates over elements of `collection` and invokes `iteratee` for each element.
22740     * The iteratee is invoked with three arguments: (value, index|key, collection).
22741     * Iteratee functions may exit iteration early by explicitly returning `false`.
22742     *
22743     * **Note:** As with other "Collections" methods, objects with a "length"
22744     * property are iterated like arrays. To avoid this behavior use `_.forIn`
22745     * or `_.forOwn` for object iteration.
22746     *
22747     * @static
22748     * @memberOf _
22749     * @since 0.1.0
22750     * @alias each
22751     * @category Collection
22752     * @param {Array|Object} collection The collection to iterate over.
22753     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
22754     * @returns {Array|Object} Returns `collection`.
22755     * @see _.forEachRight
22756     * @example
22757     *
22758     * _.forEach([1, 2], function(value) {
22759     *   console.log(value);
22760     * });
22761     * // => Logs `1` then `2`.
22762     *
22763     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
22764     *   console.log(key);
22765     * });
22766     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
22767     */
22768    function forEach(collection, iteratee) {
22769      var func = isArray(collection) ? arrayEach : baseEach;
22770      return func(collection, getIteratee(iteratee, 3));
22771    }
22772
22773    /**
22774     * This method is like `_.forEach` except that it iterates over elements of
22775     * `collection` from right to left.
22776     *
22777     * @static
22778     * @memberOf _
22779     * @since 2.0.0
22780     * @alias eachRight
22781     * @category Collection
22782     * @param {Array|Object} collection The collection to iterate over.
22783     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
22784     * @returns {Array|Object} Returns `collection`.
22785     * @see _.forEach
22786     * @example
22787     *
22788     * _.forEachRight([1, 2], function(value) {
22789     *   console.log(value);
22790     * });
22791     * // => Logs `2` then `1`.
22792     */
22793    function forEachRight(collection, iteratee) {
22794      var func = isArray(collection) ? arrayEachRight : baseEachRight;
22795      return func(collection, getIteratee(iteratee, 3));
22796    }
22797
22798    /**
vendor: 4,136 bytes, lines 22799-22906
22799     * Creates an object composed of keys generated from the results of running
22800     * each element of `collection` thru `iteratee`. The order of grouped values
22801     * is determined by the order they occur in `collection`. The corresponding
22802     * value of each key is an array of elements responsible for generating the
22803     * key. The iteratee is invoked with one argument: (value).
22804     *
22805     * @static
22806     * @memberOf _
22807     * @since 0.1.0
22808     * @category Collection
22809     * @param {Array|Object} collection The collection to iterate over.
22810     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
22811     * @returns {Object} Returns the composed aggregate object.
22812     * @example
22813     *
22814     * _.groupBy([6.1, 4.2, 6.3], Math.floor);
22815     * // => { '4': [4.2], '6': [6.1, 6.3] }
22816     *
22817     * // The `_.property` iteratee shorthand.
22818     * _.groupBy(['one', 'two', 'three'], 'length');
22819     * // => { '3': ['one', 'two'], '5': ['three'] }
22820     */
22821    var groupBy = createAggregator(function(result, value, key) {
22822      if (hasOwnProperty.call(result, key)) {
22823        result[key].push(value);
22824      } else {
22825        baseAssignValue(result, key, [value]);
22826      }
22827    });
22828
22829    /**
22830     * Checks if `value` is in `collection`. If `collection` is a string, it's
22831     * checked for a substring of `value`, otherwise
22832     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22833     * is used for equality comparisons. If `fromIndex` is negative, it's used as
22834     * the offset from the end of `collection`.
22835     *
22836     * @static
22837     * @memberOf _
22838     * @since 0.1.0
22839     * @category Collection
22840     * @param {Array|Object|string} collection The collection to inspect.
22841     * @param {*} value The value to search for.
22842     * @param {number} [fromIndex=0] The index to search from.
22843     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
22844     * @returns {boolean} Returns `true` if `value` is found, else `false`.
22845     * @example
22846     *
22847     * _.includes([1, 2, 3], 1);
22848     * // => true
22849     *
22850     * _.includes([1, 2, 3], 1, 2);
22851     * // => false
22852     *
22853     * _.includes({ 'a': 1, 'b': 2 }, 1);
22854     * // => true
22855     *
22856     * _.includes('abcd', 'bc');
22857     * // => true
22858     */
22859    function includes(collection, value, fromIndex, guard) {
22860      collection = isArrayLike(collection) ? collection : values(collection);
22861      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
22862
22863      var length = collection.length;
22864      if (fromIndex < 0) {
22865        fromIndex = nativeMax(length + fromIndex, 0);
22866      }
22867      return isString(collection)
22868        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
22869        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
22870    }
22871
22872    /**
22873     * Invokes the method at `path` of each element in `collection`, returning
22874     * an array of the results of each invoked method. Any additional arguments
22875     * are provided to each invoked method. If `path` is a function, it's invoked
22876     * for, and `this` bound to, each element in `collection`.
22877     *
22878     * @static
22879     * @memberOf _
22880     * @since 4.0.0
22881     * @category Collection
22882     * @param {Array|Object} collection The collection to iterate over.
22883     * @param {Array|Function|string} path The path of the method to invoke or
22884     *  the function invoked per iteration.
22885     * @param {...*} [args] The arguments to invoke each method with.
22886     * @returns {Array} Returns the array of results.
22887     * @example
22888     *
22889     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
22890     * // => [[1, 5, 7], [1, 2, 3]]
22891     *
22892     * _.invokeMap([123, 456], String.prototype.split, '');
22893     * // => [['1', '2', '3'], ['4', '5', '6']]
22894     */
22895    var invokeMap = baseRest(function(collection, path, args) {
22896      var index = -1,
22897          isFunc = typeof path == 'function',
22898          result = isArrayLike(collection) ? Array(collection.length) : [];
22899
22900      baseEach(collection, function(value) {
22901        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
22902      });
22903      return result;
22904    });
22905
22906    /**
vendor: 68,500 bytes, lines 22907-25021
22907     * Creates an object composed of keys generated from the results of running
22908     * each element of `collection` thru `iteratee`. The corresponding value of
22909     * each key is the last element responsible for generating the key. The
22910     * iteratee is invoked with one argument: (value).
22911     *
22912     * @static
22913     * @memberOf _
22914     * @since 4.0.0
22915     * @category Collection
22916     * @param {Array|Object} collection The collection to iterate over.
22917     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
22918     * @returns {Object} Returns the composed aggregate object.
22919     * @example
22920     *
22921     * var array = [
22922     *   { 'dir': 'left', 'code': 97 },
22923     *   { 'dir': 'right', 'code': 100 }
22924     * ];
22925     *
22926     * _.keyBy(array, function(o) {
22927     *   return String.fromCharCode(o.code);
22928     * });
22929     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
22930     *
22931     * _.keyBy(array, 'dir');
22932     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
22933     */
22934    var keyBy = createAggregator(function(result, value, key) {
22935      baseAssignValue(result, key, value);
22936    });
22937
22938    /**
22939     * Creates an array of values by running each element in `collection` thru
22940     * `iteratee`. The iteratee is invoked with three arguments:
22941     * (value, index|key, collection).
22942     *
22943     * Many lodash methods are guarded to work as iteratees for methods like
22944     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
22945     *
22946     * The guarded methods are:
22947     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
22948     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
22949     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
22950     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
22951     *
22952     * @static
22953     * @memberOf _
22954     * @since 0.1.0
22955     * @category Collection
22956     * @param {Array|Object} collection The collection to iterate over.
22957     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
22958     * @returns {Array} Returns the new mapped array.
22959     * @example
22960     *
22961     * function square(n) {
22962     *   return n * n;
22963     * }
22964     *
22965     * _.map([4, 8], square);
22966     * // => [16, 64]
22967     *
22968     * _.map({ 'a': 4, 'b': 8 }, square);
22969     * // => [16, 64] (iteration order is not guaranteed)
22970     *
22971     * var users = [
22972     *   { 'user': 'barney' },
22973     *   { 'user': 'fred' }
22974     * ];
22975     *
22976     * // The `_.property` iteratee shorthand.
22977     * _.map(users, 'user');
22978     * // => ['barney', 'fred']
22979     */
22980    function map(collection, iteratee) {
22981      var func = isArray(collection) ? arrayMap : baseMap;
22982      return func(collection, getIteratee(iteratee, 3));
22983    }
22984
22985    /**
22986     * This method is like `_.sortBy` except that it allows specifying the sort
22987     * orders of the iteratees to sort by. If `orders` is unspecified, all values
22988     * are sorted in ascending order. Otherwise, specify an order of "desc" for
22989     * descending or "asc" for ascending sort order of corresponding values.
22990     *
22991     * @static
22992     * @memberOf _
22993     * @since 4.0.0
22994     * @category Collection
22995     * @param {Array|Object} collection The collection to iterate over.
22996     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
22997     *  The iteratees to sort by.
22998     * @param {string[]} [orders] The sort orders of `iteratees`.
22999     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
23000     * @returns {Array} Returns the new sorted array.
23001     * @example
23002     *
23003     * var users = [
23004     *   { 'user': 'fred',   'age': 48 },
23005     *   { 'user': 'barney', 'age': 34 },
23006     *   { 'user': 'fred',   'age': 40 },
23007     *   { 'user': 'barney', 'age': 36 }
23008     * ];
23009     *
23010     * // Sort by `user` in ascending order and by `age` in descending order.
23011     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
23012     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
23013     */
23014    function orderBy(collection, iteratees, orders, guard) {
23015      if (collection == null) {
23016        return [];
23017      }
23018      if (!isArray(iteratees)) {
23019        iteratees = iteratees == null ? [] : [iteratees];
23020      }
23021      orders = guard ? undefined : orders;
23022      if (!isArray(orders)) {
23023        orders = orders == null ? [] : [orders];
23024      }
23025      return baseOrderBy(collection, iteratees, orders);
23026    }
23027
23028    /**
23029     * Creates an array of elements split into two groups, the first of which
23030     * contains elements `predicate` returns truthy for, the second of which
23031     * contains elements `predicate` returns falsey for. The predicate is
23032     * invoked with one argument: (value).
23033     *
23034     * @static
23035     * @memberOf _
23036     * @since 3.0.0
23037     * @category Collection
23038     * @param {Array|Object} collection The collection to iterate over.
23039     * @param {Function} [predicate=_.identity] The function invoked per iteration.
23040     * @returns {Array} Returns the array of grouped elements.
23041     * @example
23042     *
23043     * var users = [
23044     *   { 'user': 'barney',  'age': 36, 'active': false },
23045     *   { 'user': 'fred',    'age': 40, 'active': true },
23046     *   { 'user': 'pebbles', 'age': 1,  'active': false }
23047     * ];
23048     *
23049     * _.partition(users, function(o) { return o.active; });
23050     * // => objects for [['fred'], ['barney', 'pebbles']]
23051     *
23052     * // The `_.matches` iteratee shorthand.
23053     * _.partition(users, { 'age': 1, 'active': false });
23054     * // => objects for [['pebbles'], ['barney', 'fred']]
23055     *
23056     * // The `_.matchesProperty` iteratee shorthand.
23057     * _.partition(users, ['active', false]);
23058     * // => objects for [['barney', 'pebbles'], ['fred']]
23059     *
23060     * // The `_.property` iteratee shorthand.
23061     * _.partition(users, 'active');
23062     * // => objects for [['fred'], ['barney', 'pebbles']]
23063     */
23064    var partition = createAggregator(function(result, value, key) {
23065      result[key ? 0 : 1].push(value);
23066    }, function() { return [[], []]; });
23067
23068    /**
23069     * Reduces `collection` to a value which is the accumulated result of running
23070     * each element in `collection` thru `iteratee`, where each successive
23071     * invocation is supplied the return value of the previous. If `accumulator`
23072     * is not given, the first element of `collection` is used as the initial
23073     * value. The iteratee is invoked with four arguments:
23074     * (accumulator, value, index|key, collection).
23075     *
23076     * Many lodash methods are guarded to work as iteratees for methods like
23077     * `_.reduce`, `_.reduceRight`, and `_.transform`.
23078     *
23079     * The guarded methods are:
23080     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
23081     * and `sortBy`
23082     *
23083     * @static
23084     * @memberOf _
23085     * @since 0.1.0
23086     * @category Collection
23087     * @param {Array|Object} collection The collection to iterate over.
23088     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
23089     * @param {*} [accumulator] The initial value.
23090     * @returns {*} Returns the accumulated value.
23091     * @see _.reduceRight
23092     * @example
23093     *
23094     * _.reduce([1, 2], function(sum, n) {
23095     *   return sum + n;
23096     * }, 0);
23097     * // => 3
23098     *
23099     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
23100     *   (result[value] || (result[value] = [])).push(key);
23101     *   return result;
23102     * }, {});
23103     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
23104     */
23105    function reduce(collection, iteratee, accumulator) {
23106      var func = isArray(collection) ? arrayReduce : baseReduce,
23107          initAccum = arguments.length < 3;
23108
23109      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
23110    }
23111
23112    /**
23113     * This method is like `_.reduce` except that it iterates over elements of
23114     * `collection` from right to left.
23115     *
23116     * @static
23117     * @memberOf _
23118     * @since 0.1.0
23119     * @category Collection
23120     * @param {Array|Object} collection The collection to iterate over.
23121     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
23122     * @param {*} [accumulator] The initial value.
23123     * @returns {*} Returns the accumulated value.
23124     * @see _.reduce
23125     * @example
23126     *
23127     * var array = [[0, 1], [2, 3], [4, 5]];
23128     *
23129     * _.reduceRight(array, function(flattened, other) {
23130     *   return flattened.concat(other);
23131     * }, []);
23132     * // => [4, 5, 2, 3, 0, 1]
23133     */
23134    function reduceRight(collection, iteratee, accumulator) {
23135      var func = isArray(collection) ? arrayReduceRight : baseReduce,
23136          initAccum = arguments.length < 3;
23137
23138      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
23139    }
23140
23141    /**
23142     * The opposite of `_.filter`; this method returns the elements of `collection`
23143     * that `predicate` does **not** return truthy for.
23144     *
23145     * @static
23146     * @memberOf _
23147     * @since 0.1.0
23148     * @category Collection
23149     * @param {Array|Object} collection The collection to iterate over.
23150     * @param {Function} [predicate=_.identity] The function invoked per iteration.
23151     * @returns {Array} Returns the new filtered array.
23152     * @see _.filter
23153     * @example
23154     *
23155     * var users = [
23156     *   { 'user': 'barney', 'age': 36, 'active': false },
23157     *   { 'user': 'fred',   'age': 40, 'active': true }
23158     * ];
23159     *
23160     * _.reject(users, function(o) { return !o.active; });
23161     * // => objects for ['fred']
23162     *
23163     * // The `_.matches` iteratee shorthand.
23164     * _.reject(users, { 'age': 40, 'active': true });
23165     * // => objects for ['barney']
23166     *
23167     * // The `_.matchesProperty` iteratee shorthand.
23168     * _.reject(users, ['active', false]);
23169     * // => objects for ['fred']
23170     *
23171     * // The `_.property` iteratee shorthand.
23172     * _.reject(users, 'active');
23173     * // => objects for ['barney']
23174     */
23175    function reject(collection, predicate) {
23176      var func = isArray(collection) ? arrayFilter : baseFilter;
23177      return func(collection, negate(getIteratee(predicate, 3)));
23178    }
23179
23180    /**
23181     * Gets a random element from `collection`.
23182     *
23183     * @static
23184     * @memberOf _
23185     * @since 2.0.0
23186     * @category Collection
23187     * @param {Array|Object} collection The collection to sample.
23188     * @returns {*} Returns the random element.
23189     * @example
23190     *
23191     * _.sample([1, 2, 3, 4]);
23192     * // => 2
23193     */
23194    function sample(collection) {
23195      var func = isArray(collection) ? arraySample : baseSample;
23196      return func(collection);
23197    }
23198
23199    /**
23200     * Gets `n` random elements at unique keys from `collection` up to the
23201     * size of `collection`.
23202     *
23203     * @static
23204     * @memberOf _
23205     * @since 4.0.0
23206     * @category Collection
23207     * @param {Array|Object} collection The collection to sample.
23208     * @param {number} [n=1] The number of elements to sample.
23209     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
23210     * @returns {Array} Returns the random elements.
23211     * @example
23212     *
23213     * _.sampleSize([1, 2, 3], 2);
23214     * // => [3, 1]
23215     *
23216     * _.sampleSize([1, 2, 3], 4);
23217     * // => [2, 3, 1]
23218     */
23219    function sampleSize(collection, n, guard) {
23220      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
23221        n = 1;
23222      } else {
23223        n = toInteger(n);
23224      }
23225      var func = isArray(collection) ? arraySampleSize : baseSampleSize;
23226      return func(collection, n);
23227    }
23228
23229    /**
23230     * Creates an array of shuffled values, using a version of the
23231     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
23232     *
23233     * @static
23234     * @memberOf _
23235     * @since 0.1.0
23236     * @category Collection
23237     * @param {Array|Object} collection The collection to shuffle.
23238     * @returns {Array} Returns the new shuffled array.
23239     * @example
23240     *
23241     * _.shuffle([1, 2, 3, 4]);
23242     * // => [4, 1, 3, 2]
23243     */
23244    function shuffle(collection) {
23245      var func = isArray(collection) ? arrayShuffle : baseShuffle;
23246      return func(collection);
23247    }
23248
23249    /**
23250     * Gets the size of `collection` by returning its length for array-like
23251     * values or the number of own enumerable string keyed properties for objects.
23252     *
23253     * @static
23254     * @memberOf _
23255     * @since 0.1.0
23256     * @category Collection
23257     * @param {Array|Object|string} collection The collection to inspect.
23258     * @returns {number} Returns the collection size.
23259     * @example
23260     *
23261     * _.size([1, 2, 3]);
23262     * // => 3
23263     *
23264     * _.size({ 'a': 1, 'b': 2 });
23265     * // => 2
23266     *
23267     * _.size('pebbles');
23268     * // => 7
23269     */
23270    function size(collection) {
23271      if (collection == null) {
23272        return 0;
23273      }
23274      if (isArrayLike(collection)) {
23275        return isString(collection) ? stringSize(collection) : collection.length;
23276      }
23277      var tag = getTag(collection);
23278      if (tag == mapTag || tag == setTag) {
23279        return collection.size;
23280      }
23281      return baseKeys(collection).length;
23282    }
23283
23284    /**
23285     * Checks if `predicate` returns truthy for **any** element of `collection`.
23286     * Iteration is stopped once `predicate` returns truthy. The predicate is
23287     * invoked with three arguments: (value, index|key, collection).
23288     *
23289     * @static
23290     * @memberOf _
23291     * @since 0.1.0
23292     * @category Collection
23293     * @param {Array|Object} collection The collection to iterate over.
23294     * @param {Function} [predicate=_.identity] The function invoked per iteration.
23295     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
23296     * @returns {boolean} Returns `true` if any element passes the predicate check,
23297     *  else `false`.
23298     * @example
23299     *
23300     * _.some([null, 0, 'yes', false], Boolean);
23301     * // => true
23302     *
23303     * var users = [
23304     *   { 'user': 'barney', 'active': true },
23305     *   { 'user': 'fred',   'active': false }
23306     * ];
23307     *
23308     * // The `_.matches` iteratee shorthand.
23309     * _.some(users, { 'user': 'barney', 'active': false });
23310     * // => false
23311     *
23312     * // The `_.matchesProperty` iteratee shorthand.
23313     * _.some(users, ['active', false]);
23314     * // => true
23315     *
23316     * // The `_.property` iteratee shorthand.
23317     * _.some(users, 'active');
23318     * // => true
23319     */
23320    function some(collection, predicate, guard) {
23321      var func = isArray(collection) ? arraySome : baseSome;
23322      if (guard && isIterateeCall(collection, predicate, guard)) {
23323        predicate = undefined;
23324      }
23325      return func(collection, getIteratee(predicate, 3));
23326    }
23327
23328    /**
23329     * Creates an array of elements, sorted in ascending order by the results of
23330     * running each element in a collection thru each iteratee. This method
23331     * performs a stable sort, that is, it preserves the original sort order of
23332     * equal elements. The iteratees are invoked with one argument: (value).
23333     *
23334     * @static
23335     * @memberOf _
23336     * @since 0.1.0
23337     * @category Collection
23338     * @param {Array|Object} collection The collection to iterate over.
23339     * @param {...(Function|Function[])} [iteratees=[_.identity]]
23340     *  The iteratees to sort by.
23341     * @returns {Array} Returns the new sorted array.
23342     * @example
23343     *
23344     * var users = [
23345     *   { 'user': 'fred',   'age': 48 },
23346     *   { 'user': 'barney', 'age': 36 },
23347     *   { 'user': 'fred',   'age': 30 },
23348     *   { 'user': 'barney', 'age': 34 }
23349     * ];
23350     *
23351     * _.sortBy(users, [function(o) { return o.user; }]);
23352     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
23353     *
23354     * _.sortBy(users, ['user', 'age']);
23355     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
23356     */
23357    var sortBy = baseRest(function(collection, iteratees) {
23358      if (collection == null) {
23359        return [];
23360      }
23361      var length = iteratees.length;
23362      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
23363        iteratees = [];
23364      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
23365        iteratees = [iteratees[0]];
23366      }
23367      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
23368    });
23369
23370    /*------------------------------------------------------------------------*/
23371
23372    /**
23373     * Gets the timestamp of the number of milliseconds that have elapsed since
23374     * the Unix epoch (1 January 1970 00:00:00 UTC).
23375     *
23376     * @static
23377     * @memberOf _
23378     * @since 2.4.0
23379     * @category Date
23380     * @returns {number} Returns the timestamp.
23381     * @example
23382     *
23383     * _.defer(function(stamp) {
23384     *   console.log(_.now() - stamp);
23385     * }, _.now());
23386     * // => Logs the number of milliseconds it took for the deferred invocation.
23387     */
23388    var now = ctxNow || function() {
23389      return root.Date.now();
23390    };
23391
23392    /*------------------------------------------------------------------------*/
23393
23394    /**
23395     * The opposite of `_.before`; this method creates a function that invokes
23396     * `func` once it's called `n` or more times.
23397     *
23398     * @static
23399     * @memberOf _
23400     * @since 0.1.0
23401     * @category Function
23402     * @param {number} n The number of calls before `func` is invoked.
23403     * @param {Function} func The function to restrict.
23404     * @returns {Function} Returns the new restricted function.
23405     * @example
23406     *
23407     * var saves = ['profile', 'settings'];
23408     *
23409     * var done = _.after(saves.length, function() {
23410     *   console.log('done saving!');
23411     * });
23412     *
23413     * _.forEach(saves, function(type) {
23414     *   asyncSave({ 'type': type, 'complete': done });
23415     * });
23416     * // => Logs 'done saving!' after the two async saves have completed.
23417     */
23418    function after(n, func) {
23419      if (typeof func != 'function') {
23420        throw new TypeError(FUNC_ERROR_TEXT);
23421      }
23422      n = toInteger(n);
23423      return function() {
23424        if (--n < 1) {
23425          return func.apply(this, arguments);
23426        }
23427      };
23428    }
23429
23430    /**
23431     * Creates a function that invokes `func`, with up to `n` arguments,
23432     * ignoring any additional arguments.
23433     *
23434     * @static
23435     * @memberOf _
23436     * @since 3.0.0
23437     * @category Function
23438     * @param {Function} func The function to cap arguments for.
23439     * @param {number} [n=func.length] The arity cap.
23440     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
23441     * @returns {Function} Returns the new capped function.
23442     * @example
23443     *
23444     * _.map(['6', '8', '10'], _.ary(parseInt, 1));
23445     * // => [6, 8, 10]
23446     */
23447    function ary(func, n, guard) {
23448      n = guard ? undefined : n;
23449      n = (func && n == null) ? func.length : n;
23450      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
23451    }
23452
23453    /**
23454     * Creates a function that invokes `func`, with the `this` binding and arguments
23455     * of the created function, while it's called less than `n` times. Subsequent
23456     * calls to the created function return the result of the last `func` invocation.
23457     *
23458     * @static
23459     * @memberOf _
23460     * @since 3.0.0
23461     * @category Function
23462     * @param {number} n The number of calls at which `func` is no longer invoked.
23463     * @param {Function} func The function to restrict.
23464     * @returns {Function} Returns the new restricted function.
23465     * @example
23466     *
23467     * jQuery(element).on('click', _.before(5, addContactToList));
23468     * // => Allows adding up to 4 contacts to the list.
23469     */
23470    function before(n, func) {
23471      var result;
23472      if (typeof func != 'function') {
23473        throw new TypeError(FUNC_ERROR_TEXT);
23474      }
23475      n = toInteger(n);
23476      return function() {
23477        if (--n > 0) {
23478          result = func.apply(this, arguments);
23479        }
23480        if (n <= 1) {
23481          func = undefined;
23482        }
23483        return result;
23484      };
23485    }
23486
23487    /**
23488     * Creates a function that invokes `func` with the `this` binding of `thisArg`
23489     * and `partials` prepended to the arguments it receives.
23490     *
23491     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
23492     * may be used as a placeholder for partially applied arguments.
23493     *
23494     * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
23495     * property of bound functions.
23496     *
23497     * @static
23498     * @memberOf _
23499     * @since 0.1.0
23500     * @category Function
23501     * @param {Function} func The function to bind.
23502     * @param {*} thisArg The `this` binding of `func`.
23503     * @param {...*} [partials] The arguments to be partially applied.
23504     * @returns {Function} Returns the new bound function.
23505     * @example
23506     *
23507     * function greet(greeting, punctuation) {
23508     *   return greeting + ' ' + this.user + punctuation;
23509     * }
23510     *
23511     * var object = { 'user': 'fred' };
23512     *
23513     * var bound = _.bind(greet, object, 'hi');
23514     * bound('!');
23515     * // => 'hi fred!'
23516     *
23517     * // Bound with placeholders.
23518     * var bound = _.bind(greet, object, _, '!');
23519     * bound('hi');
23520     * // => 'hi fred!'
23521     */
23522    var bind = baseRest(function(func, thisArg, partials) {
23523      var bitmask = WRAP_BIND_FLAG;
23524      if (partials.length) {
23525        var holders = replaceHolders(partials, getHolder(bind));
23526        bitmask |= WRAP_PARTIAL_FLAG;
23527      }
23528      return createWrap(func, bitmask, thisArg, partials, holders);
23529    });
23530
23531    /**
23532     * Creates a function that invokes the method at `object[key]` with `partials`
23533     * prepended to the arguments it receives.
23534     *
23535     * This method differs from `_.bind` by allowing bound functions to reference
23536     * methods that may be redefined or don't yet exist. See
23537     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
23538     * for more details.
23539     *
23540     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
23541     * builds, may be used as a placeholder for partially applied arguments.
23542     *
23543     * @static
23544     * @memberOf _
23545     * @since 0.10.0
23546     * @category Function
23547     * @param {Object} object The object to invoke the method on.
23548     * @param {string} key The key of the method.
23549     * @param {...*} [partials] The arguments to be partially applied.
23550     * @returns {Function} Returns the new bound function.
23551     * @example
23552     *
23553     * var object = {
23554     *   'user': 'fred',
23555     *   'greet': function(greeting, punctuation) {
23556     *     return greeting + ' ' + this.user + punctuation;
23557     *   }
23558     * };
23559     *
23560     * var bound = _.bindKey(object, 'greet', 'hi');
23561     * bound('!');
23562     * // => 'hi fred!'
23563     *
23564     * object.greet = function(greeting, punctuation) {
23565     *   return greeting + 'ya ' + this.user + punctuation;
23566     * };
23567     *
23568     * bound('!');
23569     * // => 'hiya fred!'
23570     *
23571     * // Bound with placeholders.
23572     * var bound = _.bindKey(object, 'greet', _, '!');
23573     * bound('hi');
23574     * // => 'hiya fred!'
23575     */
23576    var bindKey = baseRest(function(object, key, partials) {
23577      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
23578      if (partials.length) {
23579        var holders = replaceHolders(partials, getHolder(bindKey));
23580        bitmask |= WRAP_PARTIAL_FLAG;
23581      }
23582      return createWrap(key, bitmask, object, partials, holders);
23583    });
23584
23585    /**
23586     * Creates a function that accepts arguments of `func` and either invokes
23587     * `func` returning its result, if at least `arity` number of arguments have
23588     * been provided, or returns a function that accepts the remaining `func`
23589     * arguments, and so on. The arity of `func` may be specified if `func.length`
23590     * is not sufficient.
23591     *
23592     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
23593     * may be used as a placeholder for provided arguments.
23594     *
23595     * **Note:** This method doesn't set the "length" property of curried functions.
23596     *
23597     * @static
23598     * @memberOf _
23599     * @since 2.0.0
23600     * @category Function
23601     * @param {Function} func The function to curry.
23602     * @param {number} [arity=func.length] The arity of `func`.
23603     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
23604     * @returns {Function} Returns the new curried function.
23605     * @example
23606     *
23607     * var abc = function(a, b, c) {
23608     *   return [a, b, c];
23609     * };
23610     *
23611     * var curried = _.curry(abc);
23612     *
23613     * curried(1)(2)(3);
23614     * // => [1, 2, 3]
23615     *
23616     * curried(1, 2)(3);
23617     * // => [1, 2, 3]
23618     *
23619     * curried(1, 2, 3);
23620     * // => [1, 2, 3]
23621     *
23622     * // Curried with placeholders.
23623     * curried(1)(_, 3)(2);
23624     * // => [1, 2, 3]
23625     */
23626    function curry(func, arity, guard) {
23627      arity = guard ? undefined : arity;
23628      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
23629      result.placeholder = curry.placeholder;
23630      return result;
23631    }
23632
23633    /**
23634     * This method is like `_.curry` except that arguments are applied to `func`
23635     * in the manner of `_.partialRight` instead of `_.partial`.
23636     *
23637     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
23638     * builds, may be used as a placeholder for provided arguments.
23639     *
23640     * **Note:** This method doesn't set the "length" property of curried functions.
23641     *
23642     * @static
23643     * @memberOf _
23644     * @since 3.0.0
23645     * @category Function
23646     * @param {Function} func The function to curry.
23647     * @param {number} [arity=func.length] The arity of `func`.
23648     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
23649     * @returns {Function} Returns the new curried function.
23650     * @example
23651     *
23652     * var abc = function(a, b, c) {
23653     *   return [a, b, c];
23654     * };
23655     *
23656     * var curried = _.curryRight(abc);
23657     *
23658     * curried(3)(2)(1);
23659     * // => [1, 2, 3]
23660     *
23661     * curried(2, 3)(1);
23662     * // => [1, 2, 3]
23663     *
23664     * curried(1, 2, 3);
23665     * // => [1, 2, 3]
23666     *
23667     * // Curried with placeholders.
23668     * curried(3)(1, _)(2);
23669     * // => [1, 2, 3]
23670     */
23671    function curryRight(func, arity, guard) {
23672      arity = guard ? undefined : arity;
23673      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
23674      result.placeholder = curryRight.placeholder;
23675      return result;
23676    }
23677
23678    /**
23679     * Creates a debounced function that delays invoking `func` until after `wait`
23680     * milliseconds have elapsed since the last time the debounced function was
23681     * invoked. The debounced function comes with a `cancel` method to cancel
23682     * delayed `func` invocations and a `flush` method to immediately invoke them.
23683     * Provide `options` to indicate whether `func` should be invoked on the
23684     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
23685     * with the last arguments provided to the debounced function. Subsequent
23686     * calls to the debounced function return the result of the last `func`
23687     * invocation.
23688     *
23689     * **Note:** If `leading` and `trailing` options are `true`, `func` is
23690     * invoked on the trailing edge of the timeout only if the debounced function
23691     * is invoked more than once during the `wait` timeout.
23692     *
23693     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
23694     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
23695     *
23696     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
23697     * for details over the differences between `_.debounce` and `_.throttle`.
23698     *
23699     * @static
23700     * @memberOf _
23701     * @since 0.1.0
23702     * @category Function
23703     * @param {Function} func The function to debounce.
23704     * @param {number} [wait=0] The number of milliseconds to delay.
23705     * @param {Object} [options={}] The options object.
23706     * @param {boolean} [options.leading=false]
23707     *  Specify invoking on the leading edge of the timeout.
23708     * @param {number} [options.maxWait]
23709     *  The maximum time `func` is allowed to be delayed before it's invoked.
23710     * @param {boolean} [options.trailing=true]
23711     *  Specify invoking on the trailing edge of the timeout.
23712     * @returns {Function} Returns the new debounced function.
23713     * @example
23714     *
23715     * // Avoid costly calculations while the window size is in flux.
23716     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
23717     *
23718     * // Invoke `sendMail` when clicked, debouncing subsequent calls.
23719     * jQuery(element).on('click', _.debounce(sendMail, 300, {
23720     *   'leading': true,
23721     *   'trailing': false
23722     * }));
23723     *
23724     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
23725     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
23726     * var source = new EventSource('/stream');
23727     * jQuery(source).on('message', debounced);
23728     *
23729     * // Cancel the trailing debounced invocation.
23730     * jQuery(window).on('popstate', debounced.cancel);
23731     */
23732    function debounce(func, wait, options) {
23733      var lastArgs,
23734          lastThis,
23735          maxWait,
23736          result,
23737          timerId,
23738          lastCallTime,
23739          lastInvokeTime = 0,
23740          leading = false,
23741          maxing = false,
23742          trailing = true;
23743
23744      if (typeof func != 'function') {
23745        throw new TypeError(FUNC_ERROR_TEXT);
23746      }
23747      wait = toNumber(wait) || 0;
23748      if (isObject(options)) {
23749        leading = !!options.leading;
23750        maxing = 'maxWait' in options;
23751        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
23752        trailing = 'trailing' in options ? !!options.trailing : trailing;
23753      }
23754
23755      function invokeFunc(time) {
23756        var args = lastArgs,
23757            thisArg = lastThis;
23758
23759        lastArgs = lastThis = undefined;
23760        lastInvokeTime = time;
23761        result = func.apply(thisArg, args);
23762        return result;
23763      }
23764
23765      function leadingEdge(time) {
23766        // Reset any `maxWait` timer.
23767        lastInvokeTime = time;
23768        // Start the timer for the trailing edge.
23769        timerId = setTimeout(timerExpired, wait);
23770        // Invoke the leading edge.
23771        return leading ? invokeFunc(time) : result;
23772      }
23773
23774      function remainingWait(time) {
23775        var timeSinceLastCall = time - lastCallTime,
23776            timeSinceLastInvoke = time - lastInvokeTime,
23777            timeWaiting = wait - timeSinceLastCall;
23778
23779        return maxing
23780          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
23781          : timeWaiting;
23782      }
23783
23784      function shouldInvoke(time) {
23785        var timeSinceLastCall = time - lastCallTime,
23786            timeSinceLastInvoke = time - lastInvokeTime;
23787
23788        // Either this is the first call, activity has stopped and we're at the
23789        // trailing edge, the system time has gone backwards and we're treating
23790        // it as the trailing edge, or we've hit the `maxWait` limit.
23791        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
23792          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
23793      }
23794
23795      function timerExpired() {
23796        var time = now();
23797        if (shouldInvoke(time)) {
23798          return trailingEdge(time);
23799        }
23800        // Restart the timer.
23801        timerId = setTimeout(timerExpired, remainingWait(time));
23802      }
23803
23804      function trailingEdge(time) {
23805        timerId = undefined;
23806
23807        // Only invoke if we have `lastArgs` which means `func` has been
23808        // debounced at least once.
23809        if (trailing && lastArgs) {
23810          return invokeFunc(time);
23811        }
23812        lastArgs = lastThis = undefined;
23813        return result;
23814      }
23815
23816      function cancel() {
23817        if (timerId !== undefined) {
23818          clearTimeout(timerId);
23819        }
23820        lastInvokeTime = 0;
23821        lastArgs = lastCallTime = lastThis = timerId = undefined;
23822      }
23823
23824      function flush() {
23825        return timerId === undefined ? result : trailingEdge(now());
23826      }
23827
23828      function debounced() {
23829        var time = now(),
23830            isInvoking = shouldInvoke(time);
23831
23832        lastArgs = arguments;
23833        lastThis = this;
23834        lastCallTime = time;
23835
23836        if (isInvoking) {
23837          if (timerId === undefined) {
23838            return leadingEdge(lastCallTime);
23839          }
23840          if (maxing) {
23841            // Handle invocations in a tight loop.
23842            clearTimeout(timerId);
23843            timerId = setTimeout(timerExpired, wait);
23844            return invokeFunc(lastCallTime);
23845          }
23846        }
23847        if (timerId === undefined) {
23848          timerId = setTimeout(timerExpired, wait);
23849        }
23850        return result;
23851      }
23852      debounced.cancel = cancel;
23853      debounced.flush = flush;
23854      return debounced;
23855    }
23856
23857    /**
23858     * Defers invoking the `func` until the current call stack has cleared. Any
23859     * additional arguments are provided to `func` when it's invoked.
23860     *
23861     * @static
23862     * @memberOf _
23863     * @since 0.1.0
23864     * @category Function
23865     * @param {Function} func The function to defer.
23866     * @param {...*} [args] The arguments to invoke `func` with.
23867     * @returns {number} Returns the timer id.
23868     * @example
23869     *
23870     * _.defer(function(text) {
23871     *   console.log(text);
23872     * }, 'deferred');
23873     * // => Logs 'deferred' after one millisecond.
23874     */
23875    var defer = baseRest(function(func, args) {
23876      return baseDelay(func, 1, args);
23877    });
23878
23879    /**
23880     * Invokes `func` after `wait` milliseconds. Any additional arguments are
23881     * provided to `func` when it's invoked.
23882     *
23883     * @static
23884     * @memberOf _
23885     * @since 0.1.0
23886     * @category Function
23887     * @param {Function} func The function to delay.
23888     * @param {number} wait The number of milliseconds to delay invocation.
23889     * @param {...*} [args] The arguments to invoke `func` with.
23890     * @returns {number} Returns the timer id.
23891     * @example
23892     *
23893     * _.delay(function(text) {
23894     *   console.log(text);
23895     * }, 1000, 'later');
23896     * // => Logs 'later' after one second.
23897     */
23898    var delay = baseRest(function(func, wait, args) {
23899      return baseDelay(func, toNumber(wait) || 0, args);
23900    });
23901
23902    /**
23903     * Creates a function that invokes `func` with arguments reversed.
23904     *
23905     * @static
23906     * @memberOf _
23907     * @since 4.0.0
23908     * @category Function
23909     * @param {Function} func The function to flip arguments for.
23910     * @returns {Function} Returns the new flipped function.
23911     * @example
23912     *
23913     * var flipped = _.flip(function() {
23914     *   return _.toArray(arguments);
23915     * });
23916     *
23917     * flipped('a', 'b', 'c', 'd');
23918     * // => ['d', 'c', 'b', 'a']
23919     */
23920    function flip(func) {
23921      return createWrap(func, WRAP_FLIP_FLAG);
23922    }
23923
23924    /**
23925     * Creates a function that memoizes the result of `func`. If `resolver` is
23926     * provided, it determines the cache key for storing the result based on the
23927     * arguments provided to the memoized function. By default, the first argument
23928     * provided to the memoized function is used as the map cache key. The `func`
23929     * is invoked with the `this` binding of the memoized function.
23930     *
23931     * **Note:** The cache is exposed as the `cache` property on the memoized
23932     * function. Its creation may be customized by replacing the `_.memoize.Cache`
23933     * constructor with one whose instances implement the
23934     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
23935     * method interface of `clear`, `delete`, `get`, `has`, and `set`.
23936     *
23937     * @static
23938     * @memberOf _
23939     * @since 0.1.0
23940     * @category Function
23941     * @param {Function} func The function to have its output memoized.
23942     * @param {Function} [resolver] The function to resolve the cache key.
23943     * @returns {Function} Returns the new memoized function.
23944     * @example
23945     *
23946     * var object = { 'a': 1, 'b': 2 };
23947     * var other = { 'c': 3, 'd': 4 };
23948     *
23949     * var values = _.memoize(_.values);
23950     * values(object);
23951     * // => [1, 2]
23952     *
23953     * values(other);
23954     * // => [3, 4]
23955     *
23956     * object.a = 2;
23957     * values(object);
23958     * // => [1, 2]
23959     *
23960     * // Modify the result cache.
23961     * values.cache.set(object, ['a', 'b']);
23962     * values(object);
23963     * // => ['a', 'b']
23964     *
23965     * // Replace `_.memoize.Cache`.
23966     * _.memoize.Cache = WeakMap;
23967     */
23968    function memoize(func, resolver) {
23969      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
23970        throw new TypeError(FUNC_ERROR_TEXT);
23971      }
23972      var memoized = function() {
23973        var args = arguments,
23974            key = resolver ? resolver.apply(this, args) : args[0],
23975            cache = memoized.cache;
23976
23977        if (cache.has(key)) {
23978          return cache.get(key);
23979        }
23980        var result = func.apply(this, args);
23981        memoized.cache = cache.set(key, result) || cache;
23982        return result;
23983      };
23984      memoized.cache = new (memoize.Cache || MapCache);
23985      return memoized;
23986    }
23987
23988    // Expose `MapCache`.
23989    memoize.Cache = MapCache;
23990
23991    /**
23992     * Creates a function that negates the result of the predicate `func`. The
23993     * `func` predicate is invoked with the `this` binding and arguments of the
23994     * created function.
23995     *
23996     * @static
23997     * @memberOf _
23998     * @since 3.0.0
23999     * @category Function
24000     * @param {Function} predicate The predicate to negate.
24001     * @returns {Function} Returns the new negated function.
24002     * @example
24003     *
24004     * function isEven(n) {
24005     *   return n % 2 == 0;
24006     * }
24007     *
24008     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
24009     * // => [1, 3, 5]
24010     */
24011    function negate(predicate) {
24012      if (typeof predicate != 'function') {
24013        throw new TypeError(FUNC_ERROR_TEXT);
24014      }
24015      return function() {
24016        var args = arguments;
24017        switch (args.length) {
24018          case 0: return !predicate.call(this);
24019          case 1: return !predicate.call(this, args[0]);
24020          case 2: return !predicate.call(this, args[0], args[1]);
24021          case 3: return !predicate.call(this, args[0], args[1], args[2]);
24022        }
24023        return !predicate.apply(this, args);
24024      };
24025    }
24026
24027    /**
24028     * Creates a function that is restricted to invoking `func` once. Repeat calls
24029     * to the function return the value of the first invocation. The `func` is
24030     * invoked with the `this` binding and arguments of the created function.
24031     *
24032     * @static
24033     * @memberOf _
24034     * @since 0.1.0
24035     * @category Function
24036     * @param {Function} func The function to restrict.
24037     * @returns {Function} Returns the new restricted function.
24038     * @example
24039     *
24040     * var initialize = _.once(createApplication);
24041     * initialize();
24042     * initialize();
24043     * // => `createApplication` is invoked once
24044     */
24045    function once(func) {
24046      return before(2, func);
24047    }
24048
24049    /**
24050     * Creates a function that invokes `func` with its arguments transformed.
24051     *
24052     * @static
24053     * @since 4.0.0
24054     * @memberOf _
24055     * @category Function
24056     * @param {Function} func The function to wrap.
24057     * @param {...(Function|Function[])} [transforms=[_.identity]]
24058     *  The argument transforms.
24059     * @returns {Function} Returns the new function.
24060     * @example
24061     *
24062     * function doubled(n) {
24063     *   return n * 2;
24064     * }
24065     *
24066     * function square(n) {
24067     *   return n * n;
24068     * }
24069     *
24070     * var func = _.overArgs(function(x, y) {
24071     *   return [x, y];
24072     * }, [square, doubled]);
24073     *
24074     * func(9, 3);
24075     * // => [81, 6]
24076     *
24077     * func(10, 5);
24078     * // => [100, 10]
24079     */
24080    var overArgs = castRest(function(func, transforms) {
24081      transforms = (transforms.length == 1 && isArray(transforms[0]))
24082        ? arrayMap(transforms[0], baseUnary(getIteratee()))
24083        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
24084
24085      var funcsLength = transforms.length;
24086      return baseRest(function(args) {
24087        var index = -1,
24088            length = nativeMin(args.length, funcsLength);
24089
24090        while (++index < length) {
24091          args[index] = transforms[index].call(this, args[index]);
24092        }
24093        return apply(func, this, args);
24094      });
24095    });
24096
24097    /**
24098     * Creates a function that invokes `func` with `partials` prepended to the
24099     * arguments it receives. This method is like `_.bind` except it does **not**
24100     * alter the `this` binding.
24101     *
24102     * The `_.partial.placeholder` value, which defaults to `_` in monolithic
24103     * builds, may be used as a placeholder for partially applied arguments.
24104     *
24105     * **Note:** This method doesn't set the "length" property of partially
24106     * applied functions.
24107     *
24108     * @static
24109     * @memberOf _
24110     * @since 0.2.0
24111     * @category Function
24112     * @param {Function} func The function to partially apply arguments to.
24113     * @param {...*} [partials] The arguments to be partially applied.
24114     * @returns {Function} Returns the new partially applied function.
24115     * @example
24116     *
24117     * function greet(greeting, name) {
24118     *   return greeting + ' ' + name;
24119     * }
24120     *
24121     * var sayHelloTo = _.partial(greet, 'hello');
24122     * sayHelloTo('fred');
24123     * // => 'hello fred'
24124     *
24125     * // Partially applied with placeholders.
24126     * var greetFred = _.partial(greet, _, 'fred');
24127     * greetFred('hi');
24128     * // => 'hi fred'
24129     */
24130    var partial = baseRest(function(func, partials) {
24131      var holders = replaceHolders(partials, getHolder(partial));
24132      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
24133    });
24134
24135    /**
24136     * This method is like `_.partial` except that partially applied arguments
24137     * are appended to the arguments it receives.
24138     *
24139     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
24140     * builds, may be used as a placeholder for partially applied arguments.
24141     *
24142     * **Note:** This method doesn't set the "length" property of partially
24143     * applied functions.
24144     *
24145     * @static
24146     * @memberOf _
24147     * @since 1.0.0
24148     * @category Function
24149     * @param {Function} func The function to partially apply arguments to.
24150     * @param {...*} [partials] The arguments to be partially applied.
24151     * @returns {Function} Returns the new partially applied function.
24152     * @example
24153     *
24154     * function greet(greeting, name) {
24155     *   return greeting + ' ' + name;
24156     * }
24157     *
24158     * var greetFred = _.partialRight(greet, 'fred');
24159     * greetFred('hi');
24160     * // => 'hi fred'
24161     *
24162     * // Partially applied with placeholders.
24163     * var sayHelloTo = _.partialRight(greet, 'hello', _);
24164     * sayHelloTo('fred');
24165     * // => 'hello fred'
24166     */
24167    var partialRight = baseRest(function(func, partials) {
24168      var holders = replaceHolders(partials, getHolder(partialRight));
24169      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
24170    });
24171
24172    /**
24173     * Creates a function that invokes `func` with arguments arranged according
24174     * to the specified `indexes` where the argument value at the first index is
24175     * provided as the first argument, the argument value at the second index is
24176     * provided as the second argument, and so on.
24177     *
24178     * @static
24179     * @memberOf _
24180     * @since 3.0.0
24181     * @category Function
24182     * @param {Function} func The function to rearrange arguments for.
24183     * @param {...(number|number[])} indexes The arranged argument indexes.
24184     * @returns {Function} Returns the new function.
24185     * @example
24186     *
24187     * var rearged = _.rearg(function(a, b, c) {
24188     *   return [a, b, c];
24189     * }, [2, 0, 1]);
24190     *
24191     * rearged('b', 'c', 'a')
24192     * // => ['a', 'b', 'c']
24193     */
24194    var rearg = flatRest(function(func, indexes) {
24195      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
24196    });
24197
24198    /**
24199     * Creates a function that invokes `func` with the `this` binding of the
24200     * created function and arguments from `start` and beyond provided as
24201     * an array.
24202     *
24203     * **Note:** This method is based on the
24204     * [rest parameter](https://mdn.io/rest_parameters).
24205     *
24206     * @static
24207     * @memberOf _
24208     * @since 4.0.0
24209     * @category Function
24210     * @param {Function} func The function to apply a rest parameter to.
24211     * @param {number} [start=func.length-1] The start position of the rest parameter.
24212     * @returns {Function} Returns the new function.
24213     * @example
24214     *
24215     * var say = _.rest(function(what, names) {
24216     *   return what + ' ' + _.initial(names).join(', ') +
24217     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
24218     * });
24219     *
24220     * say('hello', 'fred', 'barney', 'pebbles');
24221     * // => 'hello fred, barney, & pebbles'
24222     */
24223    function rest(func, start) {
24224      if (typeof func != 'function') {
24225        throw new TypeError(FUNC_ERROR_TEXT);
24226      }
24227      start = start === undefined ? start : toInteger(start);
24228      return baseRest(func, start);
24229    }
24230
24231    /**
24232     * Creates a function that invokes `func` with the `this` binding of the
24233     * create function and an array of arguments much like
24234     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
24235     *
24236     * **Note:** This method is based on the
24237     * [spread operator](https://mdn.io/spread_operator).
24238     *
24239     * @static
24240     * @memberOf _
24241     * @since 3.2.0
24242     * @category Function
24243     * @param {Function} func The function to spread arguments over.
24244     * @param {number} [start=0] The start position of the spread.
24245     * @returns {Function} Returns the new function.
24246     * @example
24247     *
24248     * var say = _.spread(function(who, what) {
24249     *   return who + ' says ' + what;
24250     * });
24251     *
24252     * say(['fred', 'hello']);
24253     * // => 'fred says hello'
24254     *
24255     * var numbers = Promise.all([
24256     *   Promise.resolve(40),
24257     *   Promise.resolve(36)
24258     * ]);
24259     *
24260     * numbers.then(_.spread(function(x, y) {
24261     *   return x + y;
24262     * }));
24263     * // => a Promise of 76
24264     */
24265    function spread(func, start) {
24266      if (typeof func != 'function') {
24267        throw new TypeError(FUNC_ERROR_TEXT);
24268      }
24269      start = start == null ? 0 : nativeMax(toInteger(start), 0);
24270      return baseRest(function(args) {
24271        var array = args[start],
24272            otherArgs = castSlice(args, 0, start);
24273
24274        if (array) {
24275          arrayPush(otherArgs, array);
24276        }
24277        return apply(func, this, otherArgs);
24278      });
24279    }
24280
24281    /**
24282     * Creates a throttled function that only invokes `func` at most once per
24283     * every `wait` milliseconds. The throttled function comes with a `cancel`
24284     * method to cancel delayed `func` invocations and a `flush` method to
24285     * immediately invoke them. Provide `options` to indicate whether `func`
24286     * should be invoked on the leading and/or trailing edge of the `wait`
24287     * timeout. The `func` is invoked with the last arguments provided to the
24288     * throttled function. Subsequent calls to the throttled function return the
24289     * result of the last `func` invocation.
24290     *
24291     * **Note:** If `leading` and `trailing` options are `true`, `func` is
24292     * invoked on the trailing edge of the timeout only if the throttled function
24293     * is invoked more than once during the `wait` timeout.
24294     *
24295     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
24296     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
24297     *
24298     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
24299     * for details over the differences between `_.throttle` and `_.debounce`.
24300     *
24301     * @static
24302     * @memberOf _
24303     * @since 0.1.0
24304     * @category Function
24305     * @param {Function} func The function to throttle.
24306     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
24307     * @param {Object} [options={}] The options object.
24308     * @param {boolean} [options.leading=true]
24309     *  Specify invoking on the leading edge of the timeout.
24310     * @param {boolean} [options.trailing=true]
24311     *  Specify invoking on the trailing edge of the timeout.
24312     * @returns {Function} Returns the new throttled function.
24313     * @example
24314     *
24315     * // Avoid excessively updating the position while scrolling.
24316     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
24317     *
24318     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
24319     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
24320     * jQuery(element).on('click', throttled);
24321     *
24322     * // Cancel the trailing throttled invocation.
24323     * jQuery(window).on('popstate', throttled.cancel);
24324     */
24325    function throttle(func, wait, options) {
24326      var leading = true,
24327          trailing = true;
24328
24329      if (typeof func != 'function') {
24330        throw new TypeError(FUNC_ERROR_TEXT);
24331      }
24332      if (isObject(options)) {
24333        leading = 'leading' in options ? !!options.leading : leading;
24334        trailing = 'trailing' in options ? !!options.trailing : trailing;
24335      }
24336      return debounce(func, wait, {
24337        'leading': leading,
24338        'maxWait': wait,
24339        'trailing': trailing
24340      });
24341    }
24342
24343    /**
24344     * Creates a function that accepts up to one argument, ignoring any
24345     * additional arguments.
24346     *
24347     * @static
24348     * @memberOf _
24349     * @since 4.0.0
24350     * @category Function
24351     * @param {Function} func The function to cap arguments for.
24352     * @returns {Function} Returns the new capped function.
24353     * @example
24354     *
24355     * _.map(['6', '8', '10'], _.unary(parseInt));
24356     * // => [6, 8, 10]
24357     */
24358    function unary(func) {
24359      return ary(func, 1);
24360    }
24361
24362    /**
24363     * Creates a function that provides `value` to `wrapper` as its first
24364     * argument. Any additional arguments provided to the function are appended
24365     * to those provided to the `wrapper`. The wrapper is invoked with the `this`
24366     * binding of the created function.
24367     *
24368     * @static
24369     * @memberOf _
24370     * @since 0.1.0
24371     * @category Function
24372     * @param {*} value The value to wrap.
24373     * @param {Function} [wrapper=identity] The wrapper function.
24374     * @returns {Function} Returns the new function.
24375     * @example
24376     *
24377     * var p = _.wrap(_.escape, function(func, text) {
24378     *   return '<p>' + func(text) + '</p>';
24379     * });
24380     *
24381     * p('fred, barney, & pebbles');
24382     * // => '<p>fred, barney, &amp; pebbles</p>'
24383     */
24384    function wrap(value, wrapper) {
24385      return partial(castFunction(wrapper), value);
24386    }
24387
24388    /*------------------------------------------------------------------------*/
24389
24390    /**
24391     * Casts `value` as an array if it's not one.
24392     *
24393     * @static
24394     * @memberOf _
24395     * @since 4.4.0
24396     * @category Lang
24397     * @param {*} value The value to inspect.
24398     * @returns {Array} Returns the cast array.
24399     * @example
24400     *
24401     * _.castArray(1);
24402     * // => [1]
24403     *
24404     * _.castArray({ 'a': 1 });
24405     * // => [{ 'a': 1 }]
24406     *
24407     * _.castArray('abc');
24408     * // => ['abc']
24409     *
24410     * _.castArray(null);
24411     * // => [null]
24412     *
24413     * _.castArray(undefined);
24414     * // => [undefined]
24415     *
24416     * _.castArray();
24417     * // => []
24418     *
24419     * var array = [1, 2, 3];
24420     * console.log(_.castArray(array) === array);
24421     * // => true
24422     */
24423    function castArray() {
24424      if (!arguments.length) {
24425        return [];
24426      }
24427      var value = arguments[0];
24428      return isArray(value) ? value : [value];
24429    }
24430
24431    /**
24432     * Creates a shallow clone of `value`.
24433     *
24434     * **Note:** This method is loosely based on the
24435     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
24436     * and supports cloning arrays, array buffers, booleans, date objects, maps,
24437     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
24438     * arrays. The own enumerable properties of `arguments` objects are cloned
24439     * as plain objects. An empty object is returned for uncloneable values such
24440     * as error objects, functions, DOM nodes, and WeakMaps.
24441     *
24442     * @static
24443     * @memberOf _
24444     * @since 0.1.0
24445     * @category Lang
24446     * @param {*} value The value to clone.
24447     * @returns {*} Returns the cloned value.
24448     * @see _.cloneDeep
24449     * @example
24450     *
24451     * var objects = [{ 'a': 1 }, { 'b': 2 }];
24452     *
24453     * var shallow = _.clone(objects);
24454     * console.log(shallow[0] === objects[0]);
24455     * // => true
24456     */
24457    function clone(value) {
24458      return baseClone(value, CLONE_SYMBOLS_FLAG);
24459    }
24460
24461    /**
24462     * This method is like `_.clone` except that it accepts `customizer` which
24463     * is invoked to produce the cloned value. If `customizer` returns `undefined`,
24464     * cloning is handled by the method instead. The `customizer` is invoked with
24465     * up to four arguments; (value [, index|key, object, stack]).
24466     *
24467     * @static
24468     * @memberOf _
24469     * @since 4.0.0
24470     * @category Lang
24471     * @param {*} value The value to clone.
24472     * @param {Function} [customizer] The function to customize cloning.
24473     * @returns {*} Returns the cloned value.
24474     * @see _.cloneDeepWith
24475     * @example
24476     *
24477     * function customizer(value) {
24478     *   if (_.isElement(value)) {
24479     *     return value.cloneNode(false);
24480     *   }
24481     * }
24482     *
24483     * var el = _.cloneWith(document.body, customizer);
24484     *
24485     * console.log(el === document.body);
24486     * // => false
24487     * console.log(el.nodeName);
24488     * // => 'BODY'
24489     * console.log(el.childNodes.length);
24490     * // => 0
24491     */
24492    function cloneWith(value, customizer) {
24493      customizer = typeof customizer == 'function' ? customizer : undefined;
24494      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
24495    }
24496
24497    /**
24498     * This method is like `_.clone` except that it recursively clones `value`.
24499     *
24500     * @static
24501     * @memberOf _
24502     * @since 1.0.0
24503     * @category Lang
24504     * @param {*} value The value to recursively clone.
24505     * @returns {*} Returns the deep cloned value.
24506     * @see _.clone
24507     * @example
24508     *
24509     * var objects = [{ 'a': 1 }, { 'b': 2 }];
24510     *
24511     * var deep = _.cloneDeep(objects);
24512     * console.log(deep[0] === objects[0]);
24513     * // => false
24514     */
24515    function cloneDeep(value) {
24516      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
24517    }
24518
24519    /**
24520     * This method is like `_.cloneWith` except that it recursively clones `value`.
24521     *
24522     * @static
24523     * @memberOf _
24524     * @since 4.0.0
24525     * @category Lang
24526     * @param {*} value The value to recursively clone.
24527     * @param {Function} [customizer] The function to customize cloning.
24528     * @returns {*} Returns the deep cloned value.
24529     * @see _.cloneWith
24530     * @example
24531     *
24532     * function customizer(value) {
24533     *   if (_.isElement(value)) {
24534     *     return value.cloneNode(true);
24535     *   }
24536     * }
24537     *
24538     * var el = _.cloneDeepWith(document.body, customizer);
24539     *
24540     * console.log(el === document.body);
24541     * // => false
24542     * console.log(el.nodeName);
24543     * // => 'BODY'
24544     * console.log(el.childNodes.length);
24545     * // => 20
24546     */
24547    function cloneDeepWith(value, customizer) {
24548      customizer = typeof customizer == 'function' ? customizer : undefined;
24549      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
24550    }
24551
24552    /**
24553     * Checks if `object` conforms to `source` by invoking the predicate
24554     * properties of `source` with the corresponding property values of `object`.
24555     *
24556     * **Note:** This method is equivalent to `_.conforms` when `source` is
24557     * partially applied.
24558     *
24559     * @static
24560     * @memberOf _
24561     * @since 4.14.0
24562     * @category Lang
24563     * @param {Object} object The object to inspect.
24564     * @param {Object} source The object of property predicates to conform to.
24565     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
24566     * @example
24567     *
24568     * var object = { 'a': 1, 'b': 2 };
24569     *
24570     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
24571     * // => true
24572     *
24573     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
24574     * // => false
24575     */
24576    function conformsTo(object, source) {
24577      return source == null || baseConformsTo(object, source, keys(source));
24578    }
24579
24580    /**
24581     * Performs a
24582     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
24583     * comparison between two values to determine if they are equivalent.
24584     *
24585     * @static
24586     * @memberOf _
24587     * @since 4.0.0
24588     * @category Lang
24589     * @param {*} value The value to compare.
24590     * @param {*} other The other value to compare.
24591     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
24592     * @example
24593     *
24594     * var object = { 'a': 1 };
24595     * var other = { 'a': 1 };
24596     *
24597     * _.eq(object, object);
24598     * // => true
24599     *
24600     * _.eq(object, other);
24601     * // => false
24602     *
24603     * _.eq('a', 'a');
24604     * // => true
24605     *
24606     * _.eq('a', Object('a'));
24607     * // => false
24608     *
24609     * _.eq(NaN, NaN);
24610     * // => true
24611     */
24612    function eq(value, other) {
24613      return value === other || (value !== value && other !== other);
24614    }
24615
24616    /**
24617     * Checks if `value` is greater than `other`.
24618     *
24619     * @static
24620     * @memberOf _
24621     * @since 3.9.0
24622     * @category Lang
24623     * @param {*} value The value to compare.
24624     * @param {*} other The other value to compare.
24625     * @returns {boolean} Returns `true` if `value` is greater than `other`,
24626     *  else `false`.
24627     * @see _.lt
24628     * @example
24629     *
24630     * _.gt(3, 1);
24631     * // => true
24632     *
24633     * _.gt(3, 3);
24634     * // => false
24635     *
24636     * _.gt(1, 3);
24637     * // => false
24638     */
24639    var gt = createRelationalOperation(baseGt);
24640
24641    /**
24642     * Checks if `value` is greater than or equal to `other`.
24643     *
24644     * @static
24645     * @memberOf _
24646     * @since 3.9.0
24647     * @category Lang
24648     * @param {*} value The value to compare.
24649     * @param {*} other The other value to compare.
24650     * @returns {boolean} Returns `true` if `value` is greater than or equal to
24651     *  `other`, else `false`.
24652     * @see _.lte
24653     * @example
24654     *
24655     * _.gte(3, 1);
24656     * // => true
24657     *
24658     * _.gte(3, 3);
24659     * // => true
24660     *
24661     * _.gte(1, 3);
24662     * // => false
24663     */
24664    var gte = createRelationalOperation(function(value, other) {
24665      return value >= other;
24666    });
24667
24668    /**
24669     * Checks if `value` is likely an `arguments` object.
24670     *
24671     * @static
24672     * @memberOf _
24673     * @since 0.1.0
24674     * @category Lang
24675     * @param {*} value The value to check.
24676     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
24677     *  else `false`.
24678     * @example
24679     *
24680     * _.isArguments(function() { return arguments; }());
24681     * // => true
24682     *
24683     * _.isArguments([1, 2, 3]);
24684     * // => false
24685     */
24686    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
24687      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
24688        !propertyIsEnumerable.call(value, 'callee');
24689    };
24690
24691    /**
24692     * Checks if `value` is classified as an `Array` object.
24693     *
24694     * @static
24695     * @memberOf _
24696     * @since 0.1.0
24697     * @category Lang
24698     * @param {*} value The value to check.
24699     * @returns {boolean} Returns `true` if `value` is an array, else `false`.
24700     * @example
24701     *
24702     * _.isArray([1, 2, 3]);
24703     * // => true
24704     *
24705     * _.isArray(document.body.children);
24706     * // => false
24707     *
24708     * _.isArray('abc');
24709     * // => false
24710     *
24711     * _.isArray(_.noop);
24712     * // => false
24713     */
24714    var isArray = Array.isArray;
24715
24716    /**
24717     * Checks if `value` is classified as an `ArrayBuffer` object.
24718     *
24719     * @static
24720     * @memberOf _
24721     * @since 4.3.0
24722     * @category Lang
24723     * @param {*} value The value to check.
24724     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
24725     * @example
24726     *
24727     * _.isArrayBuffer(new ArrayBuffer(2));
24728     * // => true
24729     *
24730     * _.isArrayBuffer(new Array(2));
24731     * // => false
24732     */
24733    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
24734
24735    /**
24736     * Checks if `value` is array-like. A value is considered array-like if it's
24737     * not a function and has a `value.length` that's an integer greater than or
24738     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
24739     *
24740     * @static
24741     * @memberOf _
24742     * @since 4.0.0
24743     * @category Lang
24744     * @param {*} value The value to check.
24745     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
24746     * @example
24747     *
24748     * _.isArrayLike([1, 2, 3]);
24749     * // => true
24750     *
24751     * _.isArrayLike(document.body.children);
24752     * // => true
24753     *
24754     * _.isArrayLike('abc');
24755     * // => true
24756     *
24757     * _.isArrayLike(_.noop);
24758     * // => false
24759     */
24760    function isArrayLike(value) {
24761      return value != null && isLength(value.length) && !isFunction(value);
24762    }
24763
24764    /**
24765     * This method is like `_.isArrayLike` except that it also checks if `value`
24766     * is an object.
24767     *
24768     * @static
24769     * @memberOf _
24770     * @since 4.0.0
24771     * @category Lang
24772     * @param {*} value The value to check.
24773     * @returns {boolean} Returns `true` if `value` is an array-like object,
24774     *  else `false`.
24775     * @example
24776     *
24777     * _.isArrayLikeObject([1, 2, 3]);
24778     * // => true
24779     *
24780     * _.isArrayLikeObject(document.body.children);
24781     * // => true
24782     *
24783     * _.isArrayLikeObject('abc');
24784     * // => false
24785     *
24786     * _.isArrayLikeObject(_.noop);
24787     * // => false
24788     */
24789    function isArrayLikeObject(value) {
24790      return isObjectLike(value) && isArrayLike(value);
24791    }
24792
24793    /**
24794     * Checks if `value` is classified as a boolean primitive or object.
24795     *
24796     * @static
24797     * @memberOf _
24798     * @since 0.1.0
24799     * @category Lang
24800     * @param {*} value The value to check.
24801     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
24802     * @example
24803     *
24804     * _.isBoolean(false);
24805     * // => true
24806     *
24807     * _.isBoolean(null);
24808     * // => false
24809     */
24810    function isBoolean(value) {
24811      return value === true || value === false ||
24812        (isObjectLike(value) && baseGetTag(value) == boolTag);
24813    }
24814
24815    /**
24816     * Checks if `value` is a buffer.
24817     *
24818     * @static
24819     * @memberOf _
24820     * @since 4.3.0
24821     * @category Lang
24822     * @param {*} value The value to check.
24823     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
24824     * @example
24825     *
24826     * _.isBuffer(new Buffer(2));
24827     * // => true
24828     *
24829     * _.isBuffer(new Uint8Array(2));
24830     * // => false
24831     */
24832    var isBuffer = nativeIsBuffer || stubFalse;
24833
24834    /**
24835     * Checks if `value` is classified as a `Date` object.
24836     *
24837     * @static
24838     * @memberOf _
24839     * @since 0.1.0
24840     * @category Lang
24841     * @param {*} value The value to check.
24842     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
24843     * @example
24844     *
24845     * _.isDate(new Date);
24846     * // => true
24847     *
24848     * _.isDate('Mon April 23 2012');
24849     * // => false
24850     */
24851    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
24852
24853    /**
24854     * Checks if `value` is likely a DOM element.
24855     *
24856     * @static
24857     * @memberOf _
24858     * @since 0.1.0
24859     * @category Lang
24860     * @param {*} value The value to check.
24861     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
24862     * @example
24863     *
24864     * _.isElement(document.body);
24865     * // => true
24866     *
24867     * _.isElement('<body>');
24868     * // => false
24869     */
24870    function isElement(value) {
24871      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
24872    }
24873
24874    /**
24875     * Checks if `value` is an empty object, collection, map, or set.
24876     *
24877     * Objects are considered empty if they have no own enumerable string keyed
24878     * properties.
24879     *
24880     * Array-like values such as `arguments` objects, arrays, buffers, strings, or
24881     * jQuery-like collections are considered empty if they have a `length` of `0`.
24882     * Similarly, maps and sets are considered empty if they have a `size` of `0`.
24883     *
24884     * @static
24885     * @memberOf _
24886     * @since 0.1.0
24887     * @category Lang
24888     * @param {*} value The value to check.
24889     * @returns {boolean} Returns `true` if `value` is empty, else `false`.
24890     * @example
24891     *
24892     * _.isEmpty(null);
24893     * // => true
24894     *
24895     * _.isEmpty(true);
24896     * // => true
24897     *
24898     * _.isEmpty(1);
24899     * // => true
24900     *
24901     * _.isEmpty([1, 2, 3]);
24902     * // => false
24903     *
24904     * _.isEmpty({ 'a': 1 });
24905     * // => false
24906     */
24907    function isEmpty(value) {
24908      if (value == null) {
24909        return true;
24910      }
24911      if (isArrayLike(value) &&
24912          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
24913            isBuffer(value) || isTypedArray(value) || isArguments(value))) {
24914        return !value.length;
24915      }
24916      var tag = getTag(value);
24917      if (tag == mapTag || tag == setTag) {
24918        return !value.size;
24919      }
24920      if (isPrototype(value)) {
24921        return !baseKeys(value).length;
24922      }
24923      for (var key in value) {
24924        if (hasOwnProperty.call(value, key)) {
24925          return false;
24926        }
24927      }
24928      return true;
24929    }
24930
24931    /**
24932     * Performs a deep comparison between two values to determine if they are
24933     * equivalent.
24934     *
24935     * **Note:** This method supports comparing arrays, array buffers, booleans,
24936     * date objects, error objects, maps, numbers, `Object` objects, regexes,
24937     * sets, strings, symbols, and typed arrays. `Object` objects are compared
24938     * by their own, not inherited, enumerable properties. Functions and DOM
24939     * nodes are compared by strict equality, i.e. `===`.
24940     *
24941     * @static
24942     * @memberOf _
24943     * @since 0.1.0
24944     * @category Lang
24945     * @param {*} value The value to compare.
24946     * @param {*} other The other value to compare.
24947     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
24948     * @example
24949     *
24950     * var object = { 'a': 1 };
24951     * var other = { 'a': 1 };
24952     *
24953     * _.isEqual(object, other);
24954     * // => true
24955     *
24956     * object === other;
24957     * // => false
24958     */
24959    function isEqual(value, other) {
24960      return baseIsEqual(value, other);
24961    }
24962
24963    /**
24964     * This method is like `_.isEqual` except that it accepts `customizer` which
24965     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
24966     * are handled by the method instead. The `customizer` is invoked with up to
24967     * six arguments: (objValue, othValue [, index|key, object, other, stack]).
24968     *
24969     * @static
24970     * @memberOf _
24971     * @since 4.0.0
24972     * @category Lang
24973     * @param {*} value The value to compare.
24974     * @param {*} other The other value to compare.
24975     * @param {Function} [customizer] The function to customize comparisons.
24976     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
24977     * @example
24978     *
24979     * function isGreeting(value) {
24980     *   return /^h(?:i|ello)$/.test(value);
24981     * }
24982     *
24983     * function customizer(objValue, othValue) {
24984     *   if (isGreeting(objValue) && isGreeting(othValue)) {
24985     *     return true;
24986     *   }
24987     * }
24988     *
24989     * var array = ['hello', 'goodbye'];
24990     * var other = ['hi', 'goodbye'];
24991     *
24992     * _.isEqualWith(array, other, customizer);
24993     * // => true
24994     */
24995    function isEqualWith(value, other, customizer) {
24996      customizer = typeof customizer == 'function' ? customizer : undefined;
24997      var result = customizer ? customizer(value, other) : undefined;
24998      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
24999    }
25000
25001    /**
25002     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
25003     * `SyntaxError`, `TypeError`, or `URIError` object.
25004     *
25005     * @static
25006     * @memberOf _
25007     * @since 3.0.0
25008     * @category Lang
25009     * @param {*} value The value to check.
25010     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
25011     * @example
25012     *
25013     * _.isError(new Error);
25014     * // => true
25015     *
25016     * _.isError(Error);
25017     * // => false
25018     */
25019    function isError(value) {
25020      if (!isObjectLike(value)) {
25021        return false;
vendor: 6,607 bytes, lines 25022-25259
25022      }
25023      var tag = baseGetTag(value);
25024      return tag == errorTag || tag == domExcTag ||
25025        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
25026    }
25027
25028    /**
25029     * Checks if `value` is a finite primitive number.
25030     *
25031     * **Note:** This method is based on
25032     * [`Number.isFinite`](https://mdn.io/Number/isFinite).
25033     *
25034     * @static
25035     * @memberOf _
25036     * @since 0.1.0
25037     * @category Lang
25038     * @param {*} value The value to check.
25039     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
25040     * @example
25041     *
25042     * _.isFinite(3);
25043     * // => true
25044     *
25045     * _.isFinite(Number.MIN_VALUE);
25046     * // => true
25047     *
25048     * _.isFinite(Infinity);
25049     * // => false
25050     *
25051     * _.isFinite('3');
25052     * // => false
25053     */
25054    function isFinite(value) {
25055      return typeof value == 'number' && nativeIsFinite(value);
25056    }
25057
25058    /**
25059     * Checks if `value` is classified as a `Function` object.
25060     *
25061     * @static
25062     * @memberOf _
25063     * @since 0.1.0
25064     * @category Lang
25065     * @param {*} value The value to check.
25066     * @returns {boolean} Returns `true` if `value` is a function, else `false`.
25067     * @example
25068     *
25069     * _.isFunction(_);
25070     * // => true
25071     *
25072     * _.isFunction(/abc/);
25073     * // => false
25074     */
25075    function isFunction(value) {
25076      if (!isObject(value)) {
25077        return false;
25078      }
25079      // The use of `Object#toString` avoids issues with the `typeof` operator
25080      // in Safari 9 which returns 'object' for typed arrays and other constructors.
25081      var tag = baseGetTag(value);
25082      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
25083    }
25084
25085    /**
25086     * Checks if `value` is an integer.
25087     *
25088     * **Note:** This method is based on
25089     * [`Number.isInteger`](https://mdn.io/Number/isInteger).
25090     *
25091     * @static
25092     * @memberOf _
25093     * @since 4.0.0
25094     * @category Lang
25095     * @param {*} value The value to check.
25096     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
25097     * @example
25098     *
25099     * _.isInteger(3);
25100     * // => true
25101     *
25102     * _.isInteger(Number.MIN_VALUE);
25103     * // => false
25104     *
25105     * _.isInteger(Infinity);
25106     * // => false
25107     *
25108     * _.isInteger('3');
25109     * // => false
25110     */
25111    function isInteger(value) {
25112      return typeof value == 'number' && value == toInteger(value);
25113    }
25114
25115    /**
25116     * Checks if `value` is a valid array-like length.
25117     *
25118     * **Note:** This method is loosely based on
25119     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
25120     *
25121     * @static
25122     * @memberOf _
25123     * @since 4.0.0
25124     * @category Lang
25125     * @param {*} value The value to check.
25126     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
25127     * @example
25128     *
25129     * _.isLength(3);
25130     * // => true
25131     *
25132     * _.isLength(Number.MIN_VALUE);
25133     * // => false
25134     *
25135     * _.isLength(Infinity);
25136     * // => false
25137     *
25138     * _.isLength('3');
25139     * // => false
25140     */
25141    function isLength(value) {
25142      return typeof value == 'number' &&
25143        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
25144    }
25145
25146    /**
25147     * Checks if `value` is the
25148     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
25149     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
25150     *
25151     * @static
25152     * @memberOf _
25153     * @since 0.1.0
25154     * @category Lang
25155     * @param {*} value The value to check.
25156     * @returns {boolean} Returns `true` if `value` is an object, else `false`.
25157     * @example
25158     *
25159     * _.isObject({});
25160     * // => true
25161     *
25162     * _.isObject([1, 2, 3]);
25163     * // => true
25164     *
25165     * _.isObject(_.noop);
25166     * // => true
25167     *
25168     * _.isObject(null);
25169     * // => false
25170     */
25171    function isObject(value) {
25172      var type = typeof value;
25173      return value != null && (type == 'object' || type == 'function');
25174    }
25175
25176    /**
25177     * Checks if `value` is object-like. A value is object-like if it's not `null`
25178     * and has a `typeof` result of "object".
25179     *
25180     * @static
25181     * @memberOf _
25182     * @since 4.0.0
25183     * @category Lang
25184     * @param {*} value The value to check.
25185     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
25186     * @example
25187     *
25188     * _.isObjectLike({});
25189     * // => true
25190     *
25191     * _.isObjectLike([1, 2, 3]);
25192     * // => true
25193     *
25194     * _.isObjectLike(_.noop);
25195     * // => false
25196     *
25197     * _.isObjectLike(null);
25198     * // => false
25199     */
25200    function isObjectLike(value) {
25201      return value != null && typeof value == 'object';
25202    }
25203
25204    /**
25205     * Checks if `value` is classified as a `Map` object.
25206     *
25207     * @static
25208     * @memberOf _
25209     * @since 4.3.0
25210     * @category Lang
25211     * @param {*} value The value to check.
25212     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
25213     * @example
25214     *
25215     * _.isMap(new Map);
25216     * // => true
25217     *
25218     * _.isMap(new WeakMap);
25219     * // => false
25220     */
25221    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
25222
25223    /**
25224     * Performs a partial deep comparison between `object` and `source` to
25225     * determine if `object` contains equivalent property values.
25226     *
25227     * **Note:** This method is equivalent to `_.matches` when `source` is
25228     * partially applied.
25229     *
25230     * Partial comparisons will match empty array and empty object `source`
25231     * values against any array or object value, respectively. See `_.isEqual`
25232     * for a list of supported value comparisons.
25233     *
25234     * @static
25235     * @memberOf _
25236     * @since 3.0.0
25237     * @category Lang
25238     * @param {Object} object The object to inspect.
25239     * @param {Object} source The object of property values to match.
25240     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
25241     * @example
25242     *
25243     * var object = { 'a': 1, 'b': 2 };
25244     *
25245     * _.isMatch(object, { 'b': 2 });
25246     * // => true
25247     *
25248     * _.isMatch(object, { 'b': 1 });
25249     * // => false
25250     */
25251    function isMatch(object, source) {
25252      return object === source || baseIsMatch(object, source, getMatchData(source));
25253    }
25254
25255    /**
25256     * This method is like `_.isMatch` except that it accepts `customizer` which
25257     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
25258     * are handled by the method instead. The `customizer` is invoked with five
25259     * arguments: (objValue, srcValue, index|key, object, source).
vendor: 12,241 bytes, lines 25260-25725
25260     *
25261     * @static
25262     * @memberOf _
25263     * @since 4.0.0
25264     * @category Lang
25265     * @param {Object} object The object to inspect.
25266     * @param {Object} source The object of property values to match.
25267     * @param {Function} [customizer] The function to customize comparisons.
25268     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
25269     * @example
25270     *
25271     * function isGreeting(value) {
25272     *   return /^h(?:i|ello)$/.test(value);
25273     * }
25274     *
25275     * function customizer(objValue, srcValue) {
25276     *   if (isGreeting(objValue) && isGreeting(srcValue)) {
25277     *     return true;
25278     *   }
25279     * }
25280     *
25281     * var object = { 'greeting': 'hello' };
25282     * var source = { 'greeting': 'hi' };
25283     *
25284     * _.isMatchWith(object, source, customizer);
25285     * // => true
25286     */
25287    function isMatchWith(object, source, customizer) {
25288      customizer = typeof customizer == 'function' ? customizer : undefined;
25289      return baseIsMatch(object, source, getMatchData(source), customizer);
25290    }
25291
25292    /**
25293     * Checks if `value` is `NaN`.
25294     *
25295     * **Note:** This method is based on
25296     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
25297     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
25298     * `undefined` and other non-number values.
25299     *
25300     * @static
25301     * @memberOf _
25302     * @since 0.1.0
25303     * @category Lang
25304     * @param {*} value The value to check.
25305     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
25306     * @example
25307     *
25308     * _.isNaN(NaN);
25309     * // => true
25310     *
25311     * _.isNaN(new Number(NaN));
25312     * // => true
25313     *
25314     * isNaN(undefined);
25315     * // => true
25316     *
25317     * _.isNaN(undefined);
25318     * // => false
25319     */
25320    function isNaN(value) {
25321      // An `NaN` primitive is the only value that is not equal to itself.
25322      // Perform the `toStringTag` check first to avoid errors with some
25323      // ActiveX objects in IE.
25324      return isNumber(value) && value != +value;
25325    }
25326
25327    /**
25328     * Checks if `value` is a pristine native function.
25329     *
25330     * **Note:** This method can't reliably detect native functions in the presence
25331     * of the core-js package because core-js circumvents this kind of detection.
25332     * Despite multiple requests, the core-js maintainer has made it clear: any
25333     * attempt to fix the detection will be obstructed. As a result, we're left
25334     * with little choice but to throw an error. Unfortunately, this also affects
25335     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
25336     * which rely on core-js.
25337     *
25338     * @static
25339     * @memberOf _
25340     * @since 3.0.0
25341     * @category Lang
25342     * @param {*} value The value to check.
25343     * @returns {boolean} Returns `true` if `value` is a native function,
25344     *  else `false`.
25345     * @example
25346     *
25347     * _.isNative(Array.prototype.push);
25348     * // => true
25349     *
25350     * _.isNative(_);
25351     * // => false
25352     */
25353    function isNative(value) {
25354      if (isMaskable(value)) {
25355        throw new Error(CORE_ERROR_TEXT);
25356      }
25357      return baseIsNative(value);
25358    }
25359
25360    /**
25361     * Checks if `value` is `null`.
25362     *
25363     * @static
25364     * @memberOf _
25365     * @since 0.1.0
25366     * @category Lang
25367     * @param {*} value The value to check.
25368     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
25369     * @example
25370     *
25371     * _.isNull(null);
25372     * // => true
25373     *
25374     * _.isNull(void 0);
25375     * // => false
25376     */
25377    function isNull(value) {
25378      return value === null;
25379    }
25380
25381    /**
25382     * Checks if `value` is `null` or `undefined`.
25383     *
25384     * @static
25385     * @memberOf _
25386     * @since 4.0.0
25387     * @category Lang
25388     * @param {*} value The value to check.
25389     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
25390     * @example
25391     *
25392     * _.isNil(null);
25393     * // => true
25394     *
25395     * _.isNil(void 0);
25396     * // => true
25397     *
25398     * _.isNil(NaN);
25399     * // => false
25400     */
25401    function isNil(value) {
25402      return value == null;
25403    }
25404
25405    /**
25406     * Checks if `value` is classified as a `Number` primitive or object.
25407     *
25408     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
25409     * classified as numbers, use the `_.isFinite` method.
25410     *
25411     * @static
25412     * @memberOf _
25413     * @since 0.1.0
25414     * @category Lang
25415     * @param {*} value The value to check.
25416     * @returns {boolean} Returns `true` if `value` is a number, else `false`.
25417     * @example
25418     *
25419     * _.isNumber(3);
25420     * // => true
25421     *
25422     * _.isNumber(Number.MIN_VALUE);
25423     * // => true
25424     *
25425     * _.isNumber(Infinity);
25426     * // => true
25427     *
25428     * _.isNumber('3');
25429     * // => false
25430     */
25431    function isNumber(value) {
25432      return typeof value == 'number' ||
25433        (isObjectLike(value) && baseGetTag(value) == numberTag);
25434    }
25435
25436    /**
25437     * Checks if `value` is a plain object, that is, an object created by the
25438     * `Object` constructor or one with a `[[Prototype]]` of `null`.
25439     *
25440     * @static
25441     * @memberOf _
25442     * @since 0.8.0
25443     * @category Lang
25444     * @param {*} value The value to check.
25445     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
25446     * @example
25447     *
25448     * function Foo() {
25449     *   this.a = 1;
25450     * }
25451     *
25452     * _.isPlainObject(new Foo);
25453     * // => false
25454     *
25455     * _.isPlainObject([1, 2, 3]);
25456     * // => false
25457     *
25458     * _.isPlainObject({ 'x': 0, 'y': 0 });
25459     * // => true
25460     *
25461     * _.isPlainObject(Object.create(null));
25462     * // => true
25463     */
25464    function isPlainObject(value) {
25465      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
25466        return false;
25467      }
25468      var proto = getPrototype(value);
25469      if (proto === null) {
25470        return true;
25471      }
25472      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
25473      return typeof Ctor == 'function' && Ctor instanceof Ctor &&
25474        funcToString.call(Ctor) == objectCtorString;
25475    }
25476
25477    /**
25478     * Checks if `value` is classified as a `RegExp` object.
25479     *
25480     * @static
25481     * @memberOf _
25482     * @since 0.1.0
25483     * @category Lang
25484     * @param {*} value The value to check.
25485     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
25486     * @example
25487     *
25488     * _.isRegExp(/abc/);
25489     * // => true
25490     *
25491     * _.isRegExp('/abc/');
25492     * // => false
25493     */
25494    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
25495
25496    /**
25497     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
25498     * double precision number which isn't the result of a rounded unsafe integer.
25499     *
25500     * **Note:** This method is based on
25501     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
25502     *
25503     * @static
25504     * @memberOf _
25505     * @since 4.0.0
25506     * @category Lang
25507     * @param {*} value The value to check.
25508     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
25509     * @example
25510     *
25511     * _.isSafeInteger(3);
25512     * // => true
25513     *
25514     * _.isSafeInteger(Number.MIN_VALUE);
25515     * // => false
25516     *
25517     * _.isSafeInteger(Infinity);
25518     * // => false
25519     *
25520     * _.isSafeInteger('3');
25521     * // => false
25522     */
25523    function isSafeInteger(value) {
25524      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
25525    }
25526
25527    /**
25528     * Checks if `value` is classified as a `Set` object.
25529     *
25530     * @static
25531     * @memberOf _
25532     * @since 4.3.0
25533     * @category Lang
25534     * @param {*} value The value to check.
25535     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
25536     * @example
25537     *
25538     * _.isSet(new Set);
25539     * // => true
25540     *
25541     * _.isSet(new WeakSet);
25542     * // => false
25543     */
25544    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
25545
25546    /**
25547     * Checks if `value` is classified as a `String` primitive or object.
25548     *
25549     * @static
25550     * @since 0.1.0
25551     * @memberOf _
25552     * @category Lang
25553     * @param {*} value The value to check.
25554     * @returns {boolean} Returns `true` if `value` is a string, else `false`.
25555     * @example
25556     *
25557     * _.isString('abc');
25558     * // => true
25559     *
25560     * _.isString(1);
25561     * // => false
25562     */
25563    function isString(value) {
25564      return typeof value == 'string' ||
25565        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
25566    }
25567
25568    /**
25569     * Checks if `value` is classified as a `Symbol` primitive or object.
25570     *
25571     * @static
25572     * @memberOf _
25573     * @since 4.0.0
25574     * @category Lang
25575     * @param {*} value The value to check.
25576     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
25577     * @example
25578     *
25579     * _.isSymbol(Symbol.iterator);
25580     * // => true
25581     *
25582     * _.isSymbol('abc');
25583     * // => false
25584     */
25585    function isSymbol(value) {
25586      return typeof value == 'symbol' ||
25587        (isObjectLike(value) && baseGetTag(value) == symbolTag);
25588    }
25589
25590    /**
25591     * Checks if `value` is classified as a typed array.
25592     *
25593     * @static
25594     * @memberOf _
25595     * @since 3.0.0
25596     * @category Lang
25597     * @param {*} value The value to check.
25598     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
25599     * @example
25600     *
25601     * _.isTypedArray(new Uint8Array);
25602     * // => true
25603     *
25604     * _.isTypedArray([]);
25605     * // => false
25606     */
25607    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
25608
25609    /**
25610     * Checks if `value` is `undefined`.
25611     *
25612     * @static
25613     * @since 0.1.0
25614     * @memberOf _
25615     * @category Lang
25616     * @param {*} value The value to check.
25617     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
25618     * @example
25619     *
25620     * _.isUndefined(void 0);
25621     * // => true
25622     *
25623     * _.isUndefined(null);
25624     * // => false
25625     */
25626    function isUndefined(value) {
25627      return value === undefined;
25628    }
25629
25630    /**
25631     * Checks if `value` is classified as a `WeakMap` object.
25632     *
25633     * @static
25634     * @memberOf _
25635     * @since 4.3.0
25636     * @category Lang
25637     * @param {*} value The value to check.
25638     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
25639     * @example
25640     *
25641     * _.isWeakMap(new WeakMap);
25642     * // => true
25643     *
25644     * _.isWeakMap(new Map);
25645     * // => false
25646     */
25647    function isWeakMap(value) {
25648      return isObjectLike(value) && getTag(value) == weakMapTag;
25649    }
25650
25651    /**
25652     * Checks if `value` is classified as a `WeakSet` object.
25653     *
25654     * @static
25655     * @memberOf _
25656     * @since 4.3.0
25657     * @category Lang
25658     * @param {*} value The value to check.
25659     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
25660     * @example
25661     *
25662     * _.isWeakSet(new WeakSet);
25663     * // => true
25664     *
25665     * _.isWeakSet(new Set);
25666     * // => false
25667     */
25668    function isWeakSet(value) {
25669      return isObjectLike(value) && baseGetTag(value) == weakSetTag;
25670    }
25671
25672    /**
25673     * Checks if `value` is less than `other`.
25674     *
25675     * @static
25676     * @memberOf _
25677     * @since 3.9.0
25678     * @category Lang
25679     * @param {*} value The value to compare.
25680     * @param {*} other The other value to compare.
25681     * @returns {boolean} Returns `true` if `value` is less than `other`,
25682     *  else `false`.
25683     * @see _.gt
25684     * @example
25685     *
25686     * _.lt(1, 3);
25687     * // => true
25688     *
25689     * _.lt(3, 3);
25690     * // => false
25691     *
25692     * _.lt(3, 1);
25693     * // => false
25694     */
25695    var lt = createRelationalOperation(baseLt);
25696
25697    /**
25698     * Checks if `value` is less than or equal to `other`.
25699     *
25700     * @static
25701     * @memberOf _
25702     * @since 3.9.0
25703     * @category Lang
25704     * @param {*} value The value to compare.
25705     * @param {*} other The other value to compare.
25706     * @returns {boolean} Returns `true` if `value` is less than or equal to
25707     *  `other`, else `false`.
25708     * @see _.gte
25709     * @example
25710     *
25711     * _.lte(1, 3);
25712     * // => true
25713     *
25714     * _.lte(3, 3);
25715     * // => true
25716     *
25717     * _.lte(3, 1);
25718     * // => false
25719     */
25720    var lte = createRelationalOperation(function(value, other) {
25721      return value <= other;
25722    });
25723
25724    /**
25725     * Converts `value` to an array.
vendor: 11,756 bytes, lines 25726-26155
25726     *
25727     * @static
25728     * @since 0.1.0
25729     * @memberOf _
25730     * @category Lang
25731     * @param {*} value The value to convert.
25732     * @returns {Array} Returns the converted array.
25733     * @example
25734     *
25735     * _.toArray({ 'a': 1, 'b': 2 });
25736     * // => [1, 2]
25737     *
25738     * _.toArray('abc');
25739     * // => ['a', 'b', 'c']
25740     *
25741     * _.toArray(1);
25742     * // => []
25743     *
25744     * _.toArray(null);
25745     * // => []
25746     */
25747    function toArray(value) {
25748      if (!value) {
25749        return [];
25750      }
25751      if (isArrayLike(value)) {
25752        return isString(value) ? stringToArray(value) : copyArray(value);
25753      }
25754      if (symIterator && value[symIterator]) {
25755        return iteratorToArray(value[symIterator]());
25756      }
25757      var tag = getTag(value),
25758          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
25759
25760      return func(value);
25761    }
25762
25763    /**
25764     * Converts `value` to a finite number.
25765     *
25766     * @static
25767     * @memberOf _
25768     * @since 4.12.0
25769     * @category Lang
25770     * @param {*} value The value to convert.
25771     * @returns {number} Returns the converted number.
25772     * @example
25773     *
25774     * _.toFinite(3.2);
25775     * // => 3.2
25776     *
25777     * _.toFinite(Number.MIN_VALUE);
25778     * // => 5e-324
25779     *
25780     * _.toFinite(Infinity);
25781     * // => 1.7976931348623157e+308
25782     *
25783     * _.toFinite('3.2');
25784     * // => 3.2
25785     */
25786    function toFinite(value) {
25787      if (!value) {
25788        return value === 0 ? value : 0;
25789      }
25790      value = toNumber(value);
25791      if (value === INFINITY || value === -INFINITY) {
25792        var sign = (value < 0 ? -1 : 1);
25793        return sign * MAX_INTEGER;
25794      }
25795      return value === value ? value : 0;
25796    }
25797
25798    /**
25799     * Converts `value` to an integer.
25800     *
25801     * **Note:** This method is loosely based on
25802     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
25803     *
25804     * @static
25805     * @memberOf _
25806     * @since 4.0.0
25807     * @category Lang
25808     * @param {*} value The value to convert.
25809     * @returns {number} Returns the converted integer.
25810     * @example
25811     *
25812     * _.toInteger(3.2);
25813     * // => 3
25814     *
25815     * _.toInteger(Number.MIN_VALUE);
25816     * // => 0
25817     *
25818     * _.toInteger(Infinity);
25819     * // => 1.7976931348623157e+308
25820     *
25821     * _.toInteger('3.2');
25822     * // => 3
25823     */
25824    function toInteger(value) {
25825      var result = toFinite(value),
25826          remainder = result % 1;
25827
25828      return result === result ? (remainder ? result - remainder : result) : 0;
25829    }
25830
25831    /**
25832     * Converts `value` to an integer suitable for use as the length of an
25833     * array-like object.
25834     *
25835     * **Note:** This method is based on
25836     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
25837     *
25838     * @static
25839     * @memberOf _
25840     * @since 4.0.0
25841     * @category Lang
25842     * @param {*} value The value to convert.
25843     * @returns {number} Returns the converted integer.
25844     * @example
25845     *
25846     * _.toLength(3.2);
25847     * // => 3
25848     *
25849     * _.toLength(Number.MIN_VALUE);
25850     * // => 0
25851     *
25852     * _.toLength(Infinity);
25853     * // => 4294967295
25854     *
25855     * _.toLength('3.2');
25856     * // => 3
25857     */
25858    function toLength(value) {
25859      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
25860    }
25861
25862    /**
25863     * Converts `value` to a number.
25864     *
25865     * @static
25866     * @memberOf _
25867     * @since 4.0.0
25868     * @category Lang
25869     * @param {*} value The value to process.
25870     * @returns {number} Returns the number.
25871     * @example
25872     *
25873     * _.toNumber(3.2);
25874     * // => 3.2
25875     *
25876     * _.toNumber(Number.MIN_VALUE);
25877     * // => 5e-324
25878     *
25879     * _.toNumber(Infinity);
25880     * // => Infinity
25881     *
25882     * _.toNumber('3.2');
25883     * // => 3.2
25884     */
25885    function toNumber(value) {
25886      if (typeof value == 'number') {
25887        return value;
25888      }
25889      if (isSymbol(value)) {
25890        return NAN;
25891      }
25892      if (isObject(value)) {
25893        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
25894        value = isObject(other) ? (other + '') : other;
25895      }
25896      if (typeof value != 'string') {
25897        return value === 0 ? value : +value;
25898      }
25899      value = baseTrim(value);
25900      var isBinary = reIsBinary.test(value);
25901      return (isBinary || reIsOctal.test(value))
25902        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
25903        : (reIsBadHex.test(value) ? NAN : +value);
25904    }
25905
25906    /**
25907     * Converts `value` to a plain object flattening inherited enumerable string
25908     * keyed properties of `value` to own properties of the plain object.
25909     *
25910     * @static
25911     * @memberOf _
25912     * @since 3.0.0
25913     * @category Lang
25914     * @param {*} value The value to convert.
25915     * @returns {Object} Returns the converted plain object.
25916     * @example
25917     *
25918     * function Foo() {
25919     *   this.b = 2;
25920     * }
25921     *
25922     * Foo.prototype.c = 3;
25923     *
25924     * _.assign({ 'a': 1 }, new Foo);
25925     * // => { 'a': 1, 'b': 2 }
25926     *
25927     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
25928     * // => { 'a': 1, 'b': 2, 'c': 3 }
25929     */
25930    function toPlainObject(value) {
25931      return copyObject(value, keysIn(value));
25932    }
25933
25934    /**
25935     * Converts `value` to a safe integer. A safe integer can be compared and
25936     * represented correctly.
25937     *
25938     * @static
25939     * @memberOf _
25940     * @since 4.0.0
25941     * @category Lang
25942     * @param {*} value The value to convert.
25943     * @returns {number} Returns the converted integer.
25944     * @example
25945     *
25946     * _.toSafeInteger(3.2);
25947     * // => 3
25948     *
25949     * _.toSafeInteger(Number.MIN_VALUE);
25950     * // => 0
25951     *
25952     * _.toSafeInteger(Infinity);
25953     * // => 9007199254740991
25954     *
25955     * _.toSafeInteger('3.2');
25956     * // => 3
25957     */
25958    function toSafeInteger(value) {
25959      return value
25960        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
25961        : (value === 0 ? value : 0);
25962    }
25963
25964    /**
25965     * Converts `value` to a string. An empty string is returned for `null`
25966     * and `undefined` values. The sign of `-0` is preserved.
25967     *
25968     * @static
25969     * @memberOf _
25970     * @since 4.0.0
25971     * @category Lang
25972     * @param {*} value The value to convert.
25973     * @returns {string} Returns the converted string.
25974     * @example
25975     *
25976     * _.toString(null);
25977     * // => ''
25978     *
25979     * _.toString(-0);
25980     * // => '-0'
25981     *
25982     * _.toString([1, 2, 3]);
25983     * // => '1,2,3'
25984     */
25985    function toString(value) {
25986      return value == null ? '' : baseToString(value);
25987    }
25988
25989    /*------------------------------------------------------------------------*/
25990
25991    /**
25992     * Assigns own enumerable string keyed properties of source objects to the
25993     * destination object. Source objects are applied from left to right.
25994     * Subsequent sources overwrite property assignments of previous sources.
25995     *
25996     * **Note:** This method mutates `object` and is loosely based on
25997     * [`Object.assign`](https://mdn.io/Object/assign).
25998     *
25999     * @static
26000     * @memberOf _
26001     * @since 0.10.0
26002     * @category Object
26003     * @param {Object} object The destination object.
26004     * @param {...Object} [sources] The source objects.
26005     * @returns {Object} Returns `object`.
26006     * @see _.assignIn
26007     * @example
26008     *
26009     * function Foo() {
26010     *   this.a = 1;
26011     * }
26012     *
26013     * function Bar() {
26014     *   this.c = 3;
26015     * }
26016     *
26017     * Foo.prototype.b = 2;
26018     * Bar.prototype.d = 4;
26019     *
26020     * _.assign({ 'a': 0 }, new Foo, new Bar);
26021     * // => { 'a': 1, 'c': 3 }
26022     */
26023    var assign = createAssigner(function(object, source) {
26024      if (isPrototype(source) || isArrayLike(source)) {
26025        copyObject(source, keys(source), object);
26026        return;
26027      }
26028      for (var key in source) {
26029        if (hasOwnProperty.call(source, key)) {
26030          assignValue(object, key, source[key]);
26031        }
26032      }
26033    });
26034
26035    /**
26036     * This method is like `_.assign` except that it iterates over own and
26037     * inherited source properties.
26038     *
26039     * **Note:** This method mutates `object`.
26040     *
26041     * @static
26042     * @memberOf _
26043     * @since 4.0.0
26044     * @alias extend
26045     * @category Object
26046     * @param {Object} object The destination object.
26047     * @param {...Object} [sources] The source objects.
26048     * @returns {Object} Returns `object`.
26049     * @see _.assign
26050     * @example
26051     *
26052     * function Foo() {
26053     *   this.a = 1;
26054     * }
26055     *
26056     * function Bar() {
26057     *   this.c = 3;
26058     * }
26059     *
26060     * Foo.prototype.b = 2;
26061     * Bar.prototype.d = 4;
26062     *
26063     * _.assignIn({ 'a': 0 }, new Foo, new Bar);
26064     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
26065     */
26066    var assignIn = createAssigner(function(object, source) {
26067      copyObject(source, keysIn(source), object);
26068    });
26069
26070    /**
26071     * This method is like `_.assignIn` except that it accepts `customizer`
26072     * which is invoked to produce the assigned values. If `customizer` returns
26073     * `undefined`, assignment is handled by the method instead. The `customizer`
26074     * is invoked with five arguments: (objValue, srcValue, key, object, source).
26075     *
26076     * **Note:** This method mutates `object`.
26077     *
26078     * @static
26079     * @memberOf _
26080     * @since 4.0.0
26081     * @alias extendWith
26082     * @category Object
26083     * @param {Object} object The destination object.
26084     * @param {...Object} sources The source objects.
26085     * @param {Function} [customizer] The function to customize assigned values.
26086     * @returns {Object} Returns `object`.
26087     * @see _.assignWith
26088     * @example
26089     *
26090     * function customizer(objValue, srcValue) {
26091     *   return _.isUndefined(objValue) ? srcValue : objValue;
26092     * }
26093     *
26094     * var defaults = _.partialRight(_.assignInWith, customizer);
26095     *
26096     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
26097     * // => { 'a': 1, 'b': 2 }
26098     */
26099    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
26100      copyObject(source, keysIn(source), object, customizer);
26101    });
26102
26103    /**
26104     * This method is like `_.assign` except that it accepts `customizer`
26105     * which is invoked to produce the assigned values. If `customizer` returns
26106     * `undefined`, assignment is handled by the method instead. The `customizer`
26107     * is invoked with five arguments: (objValue, srcValue, key, object, source).
26108     *
26109     * **Note:** This method mutates `object`.
26110     *
26111     * @static
26112     * @memberOf _
26113     * @since 4.0.0
26114     * @category Object
26115     * @param {Object} object The destination object.
26116     * @param {...Object} sources The source objects.
26117     * @param {Function} [customizer] The function to customize assigned values.
26118     * @returns {Object} Returns `object`.
26119     * @see _.assignInWith
26120     * @example
26121     *
26122     * function customizer(objValue, srcValue) {
26123     *   return _.isUndefined(objValue) ? srcValue : objValue;
26124     * }
26125     *
26126     * var defaults = _.partialRight(_.assignWith, customizer);
26127     *
26128     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
26129     * // => { 'a': 1, 'b': 2 }
26130     */
26131    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
26132      copyObject(source, keys(source), object, customizer);
26133    });
26134
26135    /**
26136     * Creates an array of values corresponding to `paths` of `object`.
26137     *
26138     * @static
26139     * @memberOf _
26140     * @since 1.0.0
26141     * @category Object
26142     * @param {Object} object The object to iterate over.
26143     * @param {...(string|string[])} [paths] The property paths to pick.
26144     * @returns {Array} Returns the picked values.
26145     * @example
26146     *
26147     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
26148     *
26149     * _.at(object, ['a[0].b.c', 'a[1]']);
26150     * // => [3, 4]
26151     */
26152    var at = flatRest(baseAt);
26153
26154    /**
26155     * Creates an object that inherits from the `prototype` object. If a
vendor: 13,619 bytes, lines 26156-26620
26156     * `properties` object is given, its own enumerable string keyed properties
26157     * are assigned to the created object.
26158     *
26159     * @static
26160     * @memberOf _
26161     * @since 2.3.0
26162     * @category Object
26163     * @param {Object} prototype The object to inherit from.
26164     * @param {Object} [properties] The properties to assign to the object.
26165     * @returns {Object} Returns the new object.
26166     * @example
26167     *
26168     * function Shape() {
26169     *   this.x = 0;
26170     *   this.y = 0;
26171     * }
26172     *
26173     * function Circle() {
26174     *   Shape.call(this);
26175     * }
26176     *
26177     * Circle.prototype = _.create(Shape.prototype, {
26178     *   'constructor': Circle
26179     * });
26180     *
26181     * var circle = new Circle;
26182     * circle instanceof Circle;
26183     * // => true
26184     *
26185     * circle instanceof Shape;
26186     * // => true
26187     */
26188    function create(prototype, properties) {
26189      var result = baseCreate(prototype);
26190      return properties == null ? result : baseAssign(result, properties);
26191    }
26192
26193    /**
26194     * Assigns own and inherited enumerable string keyed properties of source
26195     * objects to the destination object for all destination properties that
26196     * resolve to `undefined`. Source objects are applied from left to right.
26197     * Once a property is set, additional values of the same property are ignored.
26198     *
26199     * **Note:** This method mutates `object`.
26200     *
26201     * @static
26202     * @since 0.1.0
26203     * @memberOf _
26204     * @category Object
26205     * @param {Object} object The destination object.
26206     * @param {...Object} [sources] The source objects.
26207     * @returns {Object} Returns `object`.
26208     * @see _.defaultsDeep
26209     * @example
26210     *
26211     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
26212     * // => { 'a': 1, 'b': 2 }
26213     */
26214    var defaults = baseRest(function(object, sources) {
26215      object = Object(object);
26216
26217      var index = -1;
26218      var length = sources.length;
26219      var guard = length > 2 ? sources[2] : undefined;
26220
26221      if (guard && isIterateeCall(sources[0], sources[1], guard)) {
26222        length = 1;
26223      }
26224
26225      while (++index < length) {
26226        var source = sources[index];
26227        var props = keysIn(source);
26228        var propsIndex = -1;
26229        var propsLength = props.length;
26230
26231        while (++propsIndex < propsLength) {
26232          var key = props[propsIndex];
26233          var value = object[key];
26234
26235          if (value === undefined ||
26236              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
26237            object[key] = source[key];
26238          }
26239        }
26240      }
26241
26242      return object;
26243    });
26244
26245    /**
26246     * This method is like `_.defaults` except that it recursively assigns
26247     * default properties.
26248     *
26249     * **Note:** This method mutates `object`.
26250     *
26251     * @static
26252     * @memberOf _
26253     * @since 3.10.0
26254     * @category Object
26255     * @param {Object} object The destination object.
26256     * @param {...Object} [sources] The source objects.
26257     * @returns {Object} Returns `object`.
26258     * @see _.defaults
26259     * @example
26260     *
26261     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
26262     * // => { 'a': { 'b': 2, 'c': 3 } }
26263     */
26264    var defaultsDeep = baseRest(function(args) {
26265      args.push(undefined, customDefaultsMerge);
26266      return apply(mergeWith, undefined, args);
26267    });
26268
26269    /**
26270     * This method is like `_.find` except that it returns the key of the first
26271     * element `predicate` returns truthy for instead of the element itself.
26272     *
26273     * @static
26274     * @memberOf _
26275     * @since 1.1.0
26276     * @category Object
26277     * @param {Object} object The object to inspect.
26278     * @param {Function} [predicate=_.identity] The function invoked per iteration.
26279     * @returns {string|undefined} Returns the key of the matched element,
26280     *  else `undefined`.
26281     * @example
26282     *
26283     * var users = {
26284     *   'barney':  { 'age': 36, 'active': true },
26285     *   'fred':    { 'age': 40, 'active': false },
26286     *   'pebbles': { 'age': 1,  'active': true }
26287     * };
26288     *
26289     * _.findKey(users, function(o) { return o.age < 40; });
26290     * // => 'barney' (iteration order is not guaranteed)
26291     *
26292     * // The `_.matches` iteratee shorthand.
26293     * _.findKey(users, { 'age': 1, 'active': true });
26294     * // => 'pebbles'
26295     *
26296     * // The `_.matchesProperty` iteratee shorthand.
26297     * _.findKey(users, ['active', false]);
26298     * // => 'fred'
26299     *
26300     * // The `_.property` iteratee shorthand.
26301     * _.findKey(users, 'active');
26302     * // => 'barney'
26303     */
26304    function findKey(object, predicate) {
26305      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
26306    }
26307
26308    /**
26309     * This method is like `_.findKey` except that it iterates over elements of
26310     * a collection in the opposite order.
26311     *
26312     * @static
26313     * @memberOf _
26314     * @since 2.0.0
26315     * @category Object
26316     * @param {Object} object The object to inspect.
26317     * @param {Function} [predicate=_.identity] The function invoked per iteration.
26318     * @returns {string|undefined} Returns the key of the matched element,
26319     *  else `undefined`.
26320     * @example
26321     *
26322     * var users = {
26323     *   'barney':  { 'age': 36, 'active': true },
26324     *   'fred':    { 'age': 40, 'active': false },
26325     *   'pebbles': { 'age': 1,  'active': true }
26326     * };
26327     *
26328     * _.findLastKey(users, function(o) { return o.age < 40; });
26329     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
26330     *
26331     * // The `_.matches` iteratee shorthand.
26332     * _.findLastKey(users, { 'age': 36, 'active': true });
26333     * // => 'barney'
26334     *
26335     * // The `_.matchesProperty` iteratee shorthand.
26336     * _.findLastKey(users, ['active', false]);
26337     * // => 'fred'
26338     *
26339     * // The `_.property` iteratee shorthand.
26340     * _.findLastKey(users, 'active');
26341     * // => 'pebbles'
26342     */
26343    function findLastKey(object, predicate) {
26344      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
26345    }
26346
26347    /**
26348     * Iterates over own and inherited enumerable string keyed properties of an
26349     * object and invokes `iteratee` for each property. The iteratee is invoked
26350     * with three arguments: (value, key, object). Iteratee functions may exit
26351     * iteration early by explicitly returning `false`.
26352     *
26353     * @static
26354     * @memberOf _
26355     * @since 0.3.0
26356     * @category Object
26357     * @param {Object} object The object to iterate over.
26358     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26359     * @returns {Object} Returns `object`.
26360     * @see _.forInRight
26361     * @example
26362     *
26363     * function Foo() {
26364     *   this.a = 1;
26365     *   this.b = 2;
26366     * }
26367     *
26368     * Foo.prototype.c = 3;
26369     *
26370     * _.forIn(new Foo, function(value, key) {
26371     *   console.log(key);
26372     * });
26373     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
26374     */
26375    function forIn(object, iteratee) {
26376      return object == null
26377        ? object
26378        : baseFor(object, getIteratee(iteratee, 3), keysIn);
26379    }
26380
26381    /**
26382     * This method is like `_.forIn` except that it iterates over properties of
26383     * `object` in the opposite order.
26384     *
26385     * @static
26386     * @memberOf _
26387     * @since 2.0.0
26388     * @category Object
26389     * @param {Object} object The object to iterate over.
26390     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26391     * @returns {Object} Returns `object`.
26392     * @see _.forIn
26393     * @example
26394     *
26395     * function Foo() {
26396     *   this.a = 1;
26397     *   this.b = 2;
26398     * }
26399     *
26400     * Foo.prototype.c = 3;
26401     *
26402     * _.forInRight(new Foo, function(value, key) {
26403     *   console.log(key);
26404     * });
26405     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
26406     */
26407    function forInRight(object, iteratee) {
26408      return object == null
26409        ? object
26410        : baseForRight(object, getIteratee(iteratee, 3), keysIn);
26411    }
26412
26413    /**
26414     * Iterates over own enumerable string keyed properties of an object and
26415     * invokes `iteratee` for each property. The iteratee is invoked with three
26416     * arguments: (value, key, object). Iteratee functions may exit iteration
26417     * early by explicitly returning `false`.
26418     *
26419     * @static
26420     * @memberOf _
26421     * @since 0.3.0
26422     * @category Object
26423     * @param {Object} object The object to iterate over.
26424     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26425     * @returns {Object} Returns `object`.
26426     * @see _.forOwnRight
26427     * @example
26428     *
26429     * function Foo() {
26430     *   this.a = 1;
26431     *   this.b = 2;
26432     * }
26433     *
26434     * Foo.prototype.c = 3;
26435     *
26436     * _.forOwn(new Foo, function(value, key) {
26437     *   console.log(key);
26438     * });
26439     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26440     */
26441    function forOwn(object, iteratee) {
26442      return object && baseForOwn(object, getIteratee(iteratee, 3));
26443    }
26444
26445    /**
26446     * This method is like `_.forOwn` except that it iterates over properties of
26447     * `object` in the opposite order.
26448     *
26449     * @static
26450     * @memberOf _
26451     * @since 2.0.0
26452     * @category Object
26453     * @param {Object} object The object to iterate over.
26454     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26455     * @returns {Object} Returns `object`.
26456     * @see _.forOwn
26457     * @example
26458     *
26459     * function Foo() {
26460     *   this.a = 1;
26461     *   this.b = 2;
26462     * }
26463     *
26464     * Foo.prototype.c = 3;
26465     *
26466     * _.forOwnRight(new Foo, function(value, key) {
26467     *   console.log(key);
26468     * });
26469     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
26470     */
26471    function forOwnRight(object, iteratee) {
26472      return object && baseForOwnRight(object, getIteratee(iteratee, 3));
26473    }
26474
26475    /**
26476     * Creates an array of function property names from own enumerable properties
26477     * of `object`.
26478     *
26479     * @static
26480     * @since 0.1.0
26481     * @memberOf _
26482     * @category Object
26483     * @param {Object} object The object to inspect.
26484     * @returns {Array} Returns the function names.
26485     * @see _.functionsIn
26486     * @example
26487     *
26488     * function Foo() {
26489     *   this.a = _.constant('a');
26490     *   this.b = _.constant('b');
26491     * }
26492     *
26493     * Foo.prototype.c = _.constant('c');
26494     *
26495     * _.functions(new Foo);
26496     * // => ['a', 'b']
26497     */
26498    function functions(object) {
26499      return object == null ? [] : baseFunctions(object, keys(object));
26500    }
26501
26502    /**
26503     * Creates an array of function property names from own and inherited
26504     * enumerable properties of `object`.
26505     *
26506     * @static
26507     * @memberOf _
26508     * @since 4.0.0
26509     * @category Object
26510     * @param {Object} object The object to inspect.
26511     * @returns {Array} Returns the function names.
26512     * @see _.functions
26513     * @example
26514     *
26515     * function Foo() {
26516     *   this.a = _.constant('a');
26517     *   this.b = _.constant('b');
26518     * }
26519     *
26520     * Foo.prototype.c = _.constant('c');
26521     *
26522     * _.functionsIn(new Foo);
26523     * // => ['a', 'b', 'c']
26524     */
26525    function functionsIn(object) {
26526      return object == null ? [] : baseFunctions(object, keysIn(object));
26527    }
26528
26529    /**
26530     * Gets the value at `path` of `object`. If the resolved value is
26531     * `undefined`, the `defaultValue` is returned in its place.
26532     *
26533     * @static
26534     * @memberOf _
26535     * @since 3.7.0
26536     * @category Object
26537     * @param {Object} object The object to query.
26538     * @param {Array|string} path The path of the property to get.
26539     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
26540     * @returns {*} Returns the resolved value.
26541     * @example
26542     *
26543     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
26544     *
26545     * _.get(object, 'a[0].b.c');
26546     * // => 3
26547     *
26548     * _.get(object, ['a', '0', 'b', 'c']);
26549     * // => 3
26550     *
26551     * _.get(object, 'a.b.c', 'default');
26552     * // => 'default'
26553     */
26554    function get(object, path, defaultValue) {
26555      var result = object == null ? undefined : baseGet(object, path);
26556      return result === undefined ? defaultValue : result;
26557    }
26558
26559    /**
26560     * Checks if `path` is a direct property of `object`.
26561     *
26562     * @static
26563     * @since 0.1.0
26564     * @memberOf _
26565     * @category Object
26566     * @param {Object} object The object to query.
26567     * @param {Array|string} path The path to check.
26568     * @returns {boolean} Returns `true` if `path` exists, else `false`.
26569     * @example
26570     *
26571     * var object = { 'a': { 'b': 2 } };
26572     * var other = _.create({ 'a': _.create({ 'b': 2 }) });
26573     *
26574     * _.has(object, 'a');
26575     * // => true
26576     *
26577     * _.has(object, 'a.b');
26578     * // => true
26579     *
26580     * _.has(object, ['a', 'b']);
26581     * // => true
26582     *
26583     * _.has(other, 'a');
26584     * // => false
26585     */
26586    function has(object, path) {
26587      return object != null && hasPath(object, path, baseHas);
26588    }
26589
26590    /**
26591     * Checks if `path` is a direct or inherited property of `object`.
26592     *
26593     * @static
26594     * @memberOf _
26595     * @since 4.0.0
26596     * @category Object
26597     * @param {Object} object The object to query.
26598     * @param {Array|string} path The path to check.
26599     * @returns {boolean} Returns `true` if `path` exists, else `false`.
26600     * @example
26601     *
26602     * var object = _.create({ 'a': _.create({ 'b': 2 }) });
26603     *
26604     * _.hasIn(object, 'a');
26605     * // => true
26606     *
26607     * _.hasIn(object, 'a.b');
26608     * // => true
26609     *
26610     * _.hasIn(object, ['a', 'b']);
26611     * // => true
26612     *
26613     * _.hasIn(object, 'b');
26614     * // => false
26615     */
26616    function hasIn(object, path) {
26617      return object != null && hasPath(object, path, baseHasIn);
26618    }
26619
26620    /**
vendor: 11,848 bytes, lines 26621-26991
26621     * Creates an object composed of the inverted keys and values of `object`.
26622     * If `object` contains duplicate values, subsequent values overwrite
26623     * property assignments of previous values.
26624     *
26625     * @static
26626     * @memberOf _
26627     * @since 0.7.0
26628     * @category Object
26629     * @param {Object} object The object to invert.
26630     * @returns {Object} Returns the new inverted object.
26631     * @example
26632     *
26633     * var object = { 'a': 1, 'b': 2, 'c': 1 };
26634     *
26635     * _.invert(object);
26636     * // => { '1': 'c', '2': 'b' }
26637     */
26638    var invert = createInverter(function(result, value, key) {
26639      if (value != null &&
26640          typeof value.toString != 'function') {
26641        value = nativeObjectToString.call(value);
26642      }
26643
26644      result[value] = key;
26645    }, constant(identity));
26646
26647    /**
26648     * This method is like `_.invert` except that the inverted object is generated
26649     * from the results of running each element of `object` thru `iteratee`. The
26650     * corresponding inverted value of each inverted key is an array of keys
26651     * responsible for generating the inverted value. The iteratee is invoked
26652     * with one argument: (value).
26653     *
26654     * @static
26655     * @memberOf _
26656     * @since 4.1.0
26657     * @category Object
26658     * @param {Object} object The object to invert.
26659     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
26660     * @returns {Object} Returns the new inverted object.
26661     * @example
26662     *
26663     * var object = { 'a': 1, 'b': 2, 'c': 1 };
26664     *
26665     * _.invertBy(object);
26666     * // => { '1': ['a', 'c'], '2': ['b'] }
26667     *
26668     * _.invertBy(object, function(value) {
26669     *   return 'group' + value;
26670     * });
26671     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
26672     */
26673    var invertBy = createInverter(function(result, value, key) {
26674      if (value != null &&
26675          typeof value.toString != 'function') {
26676        value = nativeObjectToString.call(value);
26677      }
26678
26679      if (hasOwnProperty.call(result, value)) {
26680        result[value].push(key);
26681      } else {
26682        result[value] = [key];
26683      }
26684    }, getIteratee);
26685
26686    /**
26687     * Invokes the method at `path` of `object`.
26688     *
26689     * @static
26690     * @memberOf _
26691     * @since 4.0.0
26692     * @category Object
26693     * @param {Object} object The object to query.
26694     * @param {Array|string} path The path of the method to invoke.
26695     * @param {...*} [args] The arguments to invoke the method with.
26696     * @returns {*} Returns the result of the invoked method.
26697     * @example
26698     *
26699     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
26700     *
26701     * _.invoke(object, 'a[0].b.c.slice', 1, 3);
26702     * // => [2, 3]
26703     */
26704    var invoke = baseRest(baseInvoke);
26705
26706    /**
26707     * Creates an array of the own enumerable property names of `object`.
26708     *
26709     * **Note:** Non-object values are coerced to objects. See the
26710     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
26711     * for more details.
26712     *
26713     * @static
26714     * @since 0.1.0
26715     * @memberOf _
26716     * @category Object
26717     * @param {Object} object The object to query.
26718     * @returns {Array} Returns the array of property names.
26719     * @example
26720     *
26721     * function Foo() {
26722     *   this.a = 1;
26723     *   this.b = 2;
26724     * }
26725     *
26726     * Foo.prototype.c = 3;
26727     *
26728     * _.keys(new Foo);
26729     * // => ['a', 'b'] (iteration order is not guaranteed)
26730     *
26731     * _.keys('hi');
26732     * // => ['0', '1']
26733     */
26734    function keys(object) {
26735      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
26736    }
26737
26738    /**
26739     * Creates an array of the own and inherited enumerable property names of `object`.
26740     *
26741     * **Note:** Non-object values are coerced to objects.
26742     *
26743     * @static
26744     * @memberOf _
26745     * @since 3.0.0
26746     * @category Object
26747     * @param {Object} object The object to query.
26748     * @returns {Array} Returns the array of property names.
26749     * @example
26750     *
26751     * function Foo() {
26752     *   this.a = 1;
26753     *   this.b = 2;
26754     * }
26755     *
26756     * Foo.prototype.c = 3;
26757     *
26758     * _.keysIn(new Foo);
26759     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
26760     */
26761    function keysIn(object) {
26762      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
26763    }
26764
26765    /**
26766     * The opposite of `_.mapValues`; this method creates an object with the
26767     * same values as `object` and keys generated by running each own enumerable
26768     * string keyed property of `object` thru `iteratee`. The iteratee is invoked
26769     * with three arguments: (value, key, object).
26770     *
26771     * @static
26772     * @memberOf _
26773     * @since 3.8.0
26774     * @category Object
26775     * @param {Object} object The object to iterate over.
26776     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26777     * @returns {Object} Returns the new mapped object.
26778     * @see _.mapValues
26779     * @example
26780     *
26781     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
26782     *   return key + value;
26783     * });
26784     * // => { 'a1': 1, 'b2': 2 }
26785     */
26786    function mapKeys(object, iteratee) {
26787      var result = {};
26788      iteratee = getIteratee(iteratee, 3);
26789
26790      baseForOwn(object, function(value, key, object) {
26791        baseAssignValue(result, iteratee(value, key, object), value);
26792      });
26793      return result;
26794    }
26795
26796    /**
26797     * Creates an object with the same keys as `object` and values generated
26798     * by running each own enumerable string keyed property of `object` thru
26799     * `iteratee`. The iteratee is invoked with three arguments:
26800     * (value, key, object).
26801     *
26802     * @static
26803     * @memberOf _
26804     * @since 2.4.0
26805     * @category Object
26806     * @param {Object} object The object to iterate over.
26807     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26808     * @returns {Object} Returns the new mapped object.
26809     * @see _.mapKeys
26810     * @example
26811     *
26812     * var users = {
26813     *   'fred':    { 'user': 'fred',    'age': 40 },
26814     *   'pebbles': { 'user': 'pebbles', 'age': 1 }
26815     * };
26816     *
26817     * _.mapValues(users, function(o) { return o.age; });
26818     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
26819     *
26820     * // The `_.property` iteratee shorthand.
26821     * _.mapValues(users, 'age');
26822     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
26823     */
26824    function mapValues(object, iteratee) {
26825      var result = {};
26826      iteratee = getIteratee(iteratee, 3);
26827
26828      baseForOwn(object, function(value, key, object) {
26829        baseAssignValue(result, key, iteratee(value, key, object));
26830      });
26831      return result;
26832    }
26833
26834    /**
26835     * This method is like `_.assign` except that it recursively merges own and
26836     * inherited enumerable string keyed properties of source objects into the
26837     * destination object. Source properties that resolve to `undefined` are
26838     * skipped if a destination value exists. Array and plain object properties
26839     * are merged recursively. Other objects and value types are overridden by
26840     * assignment. Source objects are applied from left to right. Subsequent
26841     * sources overwrite property assignments of previous sources.
26842     *
26843     * **Note:** This method mutates `object`.
26844     *
26845     * @static
26846     * @memberOf _
26847     * @since 0.5.0
26848     * @category Object
26849     * @param {Object} object The destination object.
26850     * @param {...Object} [sources] The source objects.
26851     * @returns {Object} Returns `object`.
26852     * @example
26853     *
26854     * var object = {
26855     *   'a': [{ 'b': 2 }, { 'd': 4 }]
26856     * };
26857     *
26858     * var other = {
26859     *   'a': [{ 'c': 3 }, { 'e': 5 }]
26860     * };
26861     *
26862     * _.merge(object, other);
26863     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
26864     */
26865    var merge = createAssigner(function(object, source, srcIndex) {
26866      baseMerge(object, source, srcIndex);
26867    });
26868
26869    /**
26870     * This method is like `_.merge` except that it accepts `customizer` which
26871     * is invoked to produce the merged values of the destination and source
26872     * properties. If `customizer` returns `undefined`, merging is handled by the
26873     * method instead. The `customizer` is invoked with six arguments:
26874     * (objValue, srcValue, key, object, source, stack).
26875     *
26876     * **Note:** This method mutates `object`.
26877     *
26878     * @static
26879     * @memberOf _
26880     * @since 4.0.0
26881     * @category Object
26882     * @param {Object} object The destination object.
26883     * @param {...Object} sources The source objects.
26884     * @param {Function} customizer The function to customize assigned values.
26885     * @returns {Object} Returns `object`.
26886     * @example
26887     *
26888     * function customizer(objValue, srcValue) {
26889     *   if (_.isArray(objValue)) {
26890     *     return objValue.concat(srcValue);
26891     *   }
26892     * }
26893     *
26894     * var object = { 'a': [1], 'b': [2] };
26895     * var other = { 'a': [3], 'b': [4] };
26896     *
26897     * _.mergeWith(object, other, customizer);
26898     * // => { 'a': [1, 3], 'b': [2, 4] }
26899     */
26900    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
26901      baseMerge(object, source, srcIndex, customizer);
26902    });
26903
26904    /**
26905     * The opposite of `_.pick`; this method creates an object composed of the
26906     * own and inherited enumerable property paths of `object` that are not omitted.
26907     *
26908     * **Note:** This method is considerably slower than `_.pick`.
26909     *
26910     * @static
26911     * @since 0.1.0
26912     * @memberOf _
26913     * @category Object
26914     * @param {Object} object The source object.
26915     * @param {...(string|string[])} [paths] The property paths to omit.
26916     * @returns {Object} Returns the new object.
26917     * @example
26918     *
26919     * var object = { 'a': 1, 'b': '2', 'c': 3 };
26920     *
26921     * _.omit(object, ['a', 'c']);
26922     * // => { 'b': '2' }
26923     */
26924    var omit = flatRest(function(object, paths) {
26925      var result = {};
26926      if (object == null) {
26927        return result;
26928      }
26929      var isDeep = false;
26930      paths = arrayMap(paths, function(path) {
26931        path = castPath(path, object);
26932        isDeep || (isDeep = path.length > 1);
26933        return path;
26934      });
26935      copyObject(object, getAllKeysIn(object), result);
26936      if (isDeep) {
26937        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
26938      }
26939      var length = paths.length;
26940      while (length--) {
26941        baseUnset(result, paths[length]);
26942      }
26943      return result;
26944    });
26945
26946    /**
26947     * The opposite of `_.pickBy`; this method creates an object composed of
26948     * the own and inherited enumerable string keyed properties of `object` that
26949     * `predicate` doesn't return truthy for. The predicate is invoked with two
26950     * arguments: (value, key).
26951     *
26952     * @static
26953     * @memberOf _
26954     * @since 4.0.0
26955     * @category Object
26956     * @param {Object} object The source object.
26957     * @param {Function} [predicate=_.identity] The function invoked per property.
26958     * @returns {Object} Returns the new object.
26959     * @example
26960     *
26961     * var object = { 'a': 1, 'b': '2', 'c': 3 };
26962     *
26963     * _.omitBy(object, _.isNumber);
26964     * // => { 'b': '2' }
26965     */
26966    function omitBy(object, predicate) {
26967      return pickBy(object, negate(getIteratee(predicate)));
26968    }
26969
26970    /**
26971     * Creates an object composed of the picked `object` properties.
26972     *
26973     * @static
26974     * @since 0.1.0
26975     * @memberOf _
26976     * @category Object
26977     * @param {Object} object The source object.
26978     * @param {...(string|string[])} [paths] The property paths to pick.
26979     * @returns {Object} Returns the new object.
26980     * @example
26981     *
26982     * var object = { 'a': 1, 'b': '2', 'c': 3 };
26983     *
26984     * _.pick(object, ['a', 'c']);
26985     * // => { 'a': 1, 'c': 3 }
26986     */
26987    var pick = flatRest(function(object, paths) {
26988      return object == null ? {} : basePick(object, paths);
26989    });
26990
26991    /**
vendor: 11,160 bytes, lines 26992-27330
26992     * Creates an object composed of the `object` properties `predicate` returns
26993     * truthy for. The predicate is invoked with two arguments: (value, key).
26994     *
26995     * @static
26996     * @memberOf _
26997     * @since 4.0.0
26998     * @category Object
26999     * @param {Object} object The source object.
27000     * @param {Function} [predicate=_.identity] The function invoked per property.
27001     * @returns {Object} Returns the new object.
27002     * @example
27003     *
27004     * var object = { 'a': 1, 'b': '2', 'c': 3 };
27005     *
27006     * _.pickBy(object, _.isNumber);
27007     * // => { 'a': 1, 'c': 3 }
27008     */
27009    function pickBy(object, predicate) {
27010      if (object == null) {
27011        return {};
27012      }
27013      var props = arrayMap(getAllKeysIn(object), function(prop) {
27014        return [prop];
27015      });
27016      predicate = getIteratee(predicate);
27017      return basePickBy(object, props, function(value, path) {
27018        return predicate(value, path[0]);
27019      });
27020    }
27021
27022    /**
27023     * This method is like `_.get` except that if the resolved value is a
27024     * function it's invoked with the `this` binding of its parent object and
27025     * its result is returned.
27026     *
27027     * @static
27028     * @since 0.1.0
27029     * @memberOf _
27030     * @category Object
27031     * @param {Object} object The object to query.
27032     * @param {Array|string} path The path of the property to resolve.
27033     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
27034     * @returns {*} Returns the resolved value.
27035     * @example
27036     *
27037     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
27038     *
27039     * _.result(object, 'a[0].b.c1');
27040     * // => 3
27041     *
27042     * _.result(object, 'a[0].b.c2');
27043     * // => 4
27044     *
27045     * _.result(object, 'a[0].b.c3', 'default');
27046     * // => 'default'
27047     *
27048     * _.result(object, 'a[0].b.c3', _.constant('default'));
27049     * // => 'default'
27050     */
27051    function result(object, path, defaultValue) {
27052      path = castPath(path, object);
27053
27054      var index = -1,
27055          length = path.length;
27056
27057      // Ensure the loop is entered when path is empty.
27058      if (!length) {
27059        length = 1;
27060        object = undefined;
27061      }
27062      while (++index < length) {
27063        var value = object == null ? undefined : object[toKey(path[index])];
27064        if (value === undefined) {
27065          index = length;
27066          value = defaultValue;
27067        }
27068        object = isFunction(value) ? value.call(object) : value;
27069      }
27070      return object;
27071    }
27072
27073    /**
27074     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
27075     * it's created. Arrays are created for missing index properties while objects
27076     * are created for all other missing properties. Use `_.setWith` to customize
27077     * `path` creation.
27078     *
27079     * **Note:** This method mutates `object`.
27080     *
27081     * @static
27082     * @memberOf _
27083     * @since 3.7.0
27084     * @category Object
27085     * @param {Object} object The object to modify.
27086     * @param {Array|string} path The path of the property to set.
27087     * @param {*} value The value to set.
27088     * @returns {Object} Returns `object`.
27089     * @example
27090     *
27091     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
27092     *
27093     * _.set(object, 'a[0].b.c', 4);
27094     * console.log(object.a[0].b.c);
27095     * // => 4
27096     *
27097     * _.set(object, ['x', '0', 'y', 'z'], 5);
27098     * console.log(object.x[0].y.z);
27099     * // => 5
27100     */
27101    function set(object, path, value) {
27102      return object == null ? object : baseSet(object, path, value);
27103    }
27104
27105    /**
27106     * This method is like `_.set` except that it accepts `customizer` which is
27107     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
27108     * path creation is handled by the method instead. The `customizer` is invoked
27109     * with three arguments: (nsValue, key, nsObject).
27110     *
27111     * **Note:** This method mutates `object`.
27112     *
27113     * @static
27114     * @memberOf _
27115     * @since 4.0.0
27116     * @category Object
27117     * @param {Object} object The object to modify.
27118     * @param {Array|string} path The path of the property to set.
27119     * @param {*} value The value to set.
27120     * @param {Function} [customizer] The function to customize assigned values.
27121     * @returns {Object} Returns `object`.
27122     * @example
27123     *
27124     * var object = {};
27125     *
27126     * _.setWith(object, '[0][1]', 'a', Object);
27127     * // => { '0': { '1': 'a' } }
27128     */
27129    function setWith(object, path, value, customizer) {
27130      customizer = typeof customizer == 'function' ? customizer : undefined;
27131      return object == null ? object : baseSet(object, path, value, customizer);
27132    }
27133
27134    /**
27135     * Creates an array of own enumerable string keyed-value pairs for `object`
27136     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
27137     * entries are returned.
27138     *
27139     * @static
27140     * @memberOf _
27141     * @since 4.0.0
27142     * @alias entries
27143     * @category Object
27144     * @param {Object} object The object to query.
27145     * @returns {Array} Returns the key-value pairs.
27146     * @example
27147     *
27148     * function Foo() {
27149     *   this.a = 1;
27150     *   this.b = 2;
27151     * }
27152     *
27153     * Foo.prototype.c = 3;
27154     *
27155     * _.toPairs(new Foo);
27156     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
27157     */
27158    var toPairs = createToPairs(keys);
27159
27160    /**
27161     * Creates an array of own and inherited enumerable string keyed-value pairs
27162     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
27163     * or set, its entries are returned.
27164     *
27165     * @static
27166     * @memberOf _
27167     * @since 4.0.0
27168     * @alias entriesIn
27169     * @category Object
27170     * @param {Object} object The object to query.
27171     * @returns {Array} Returns the key-value pairs.
27172     * @example
27173     *
27174     * function Foo() {
27175     *   this.a = 1;
27176     *   this.b = 2;
27177     * }
27178     *
27179     * Foo.prototype.c = 3;
27180     *
27181     * _.toPairsIn(new Foo);
27182     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
27183     */
27184    var toPairsIn = createToPairs(keysIn);
27185
27186    /**
27187     * An alternative to `_.reduce`; this method transforms `object` to a new
27188     * `accumulator` object which is the result of running each of its own
27189     * enumerable string keyed properties thru `iteratee`, with each invocation
27190     * potentially mutating the `accumulator` object. If `accumulator` is not
27191     * provided, a new object with the same `[[Prototype]]` will be used. The
27192     * iteratee is invoked with four arguments: (accumulator, value, key, object).
27193     * Iteratee functions may exit iteration early by explicitly returning `false`.
27194     *
27195     * @static
27196     * @memberOf _
27197     * @since 1.3.0
27198     * @category Object
27199     * @param {Object} object The object to iterate over.
27200     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
27201     * @param {*} [accumulator] The custom accumulator value.
27202     * @returns {*} Returns the accumulated value.
27203     * @example
27204     *
27205     * _.transform([2, 3, 4], function(result, n) {
27206     *   result.push(n *= n);
27207     *   return n % 2 == 0;
27208     * }, []);
27209     * // => [4, 9]
27210     *
27211     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
27212     *   (result[value] || (result[value] = [])).push(key);
27213     * }, {});
27214     * // => { '1': ['a', 'c'], '2': ['b'] }
27215     */
27216    function transform(object, iteratee, accumulator) {
27217      var isArr = isArray(object),
27218          isArrLike = isArr || isBuffer(object) || isTypedArray(object);
27219
27220      iteratee = getIteratee(iteratee, 4);
27221      if (accumulator == null) {
27222        var Ctor = object && object.constructor;
27223        if (isArrLike) {
27224          accumulator = isArr ? new Ctor : [];
27225        }
27226        else if (isObject(object)) {
27227          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
27228        }
27229        else {
27230          accumulator = {};
27231        }
27232      }
27233      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
27234        return iteratee(accumulator, value, index, object);
27235      });
27236      return accumulator;
27237    }
27238
27239    /**
27240     * Removes the property at `path` of `object`.
27241     *
27242     * **Note:** This method mutates `object`.
27243     *
27244     * @static
27245     * @memberOf _
27246     * @since 4.0.0
27247     * @category Object
27248     * @param {Object} object The object to modify.
27249     * @param {Array|string} path The path of the property to unset.
27250     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
27251     * @example
27252     *
27253     * var object = { 'a': [{ 'b': { 'c': 7 } }] };
27254     * _.unset(object, 'a[0].b.c');
27255     * // => true
27256     *
27257     * console.log(object);
27258     * // => { 'a': [{ 'b': {} }] };
27259     *
27260     * _.unset(object, ['a', '0', 'b', 'c']);
27261     * // => true
27262     *
27263     * console.log(object);
27264     * // => { 'a': [{ 'b': {} }] };
27265     */
27266    function unset(object, path) {
27267      return object == null ? true : baseUnset(object, path);
27268    }
27269
27270    /**
27271     * This method is like `_.set` except that accepts `updater` to produce the
27272     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
27273     * is invoked with one argument: (value).
27274     *
27275     * **Note:** This method mutates `object`.
27276     *
27277     * @static
27278     * @memberOf _
27279     * @since 4.6.0
27280     * @category Object
27281     * @param {Object} object The object to modify.
27282     * @param {Array|string} path The path of the property to set.
27283     * @param {Function} updater The function to produce the updated value.
27284     * @returns {Object} Returns `object`.
27285     * @example
27286     *
27287     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
27288     *
27289     * _.update(object, 'a[0].b.c', function(n) { return n * n; });
27290     * console.log(object.a[0].b.c);
27291     * // => 9
27292     *
27293     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
27294     * console.log(object.x[0].y.z);
27295     * // => 0
27296     */
27297    function update(object, path, updater) {
27298      return object == null ? object : baseUpdate(object, path, castFunction(updater));
27299    }
27300
27301    /**
27302     * This method is like `_.update` except that it accepts `customizer` which is
27303     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
27304     * path creation is handled by the method instead. The `customizer` is invoked
27305     * with three arguments: (nsValue, key, nsObject).
27306     *
27307     * **Note:** This method mutates `object`.
27308     *
27309     * @static
27310     * @memberOf _
27311     * @since 4.6.0
27312     * @category Object
27313     * @param {Object} object The object to modify.
27314     * @param {Array|string} path The path of the property to set.
27315     * @param {Function} updater The function to produce the updated value.
27316     * @param {Function} [customizer] The function to customize assigned values.
27317     * @returns {Object} Returns `object`.
27318     * @example
27319     *
27320     * var object = {};
27321     *
27322     * _.updateWith(object, '[0][1]', _.constant('a'), Object);
27323     * // => { '0': { '1': 'a' } }
27324     */
27325    function updateWith(object, path, updater, customizer) {
27326      customizer = typeof customizer == 'function' ? customizer : undefined;
27327      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
27328    }
27329
27330    /**
vendor: 1,263 bytes, lines 27331-27380
27331     * Creates an array of the own enumerable string keyed property values of `object`.
27332     *
27333     * **Note:** Non-object values are coerced to objects.
27334     *
27335     * @static
27336     * @since 0.1.0
27337     * @memberOf _
27338     * @category Object
27339     * @param {Object} object The object to query.
27340     * @returns {Array} Returns the array of property values.
27341     * @example
27342     *
27343     * function Foo() {
27344     *   this.a = 1;
27345     *   this.b = 2;
27346     * }
27347     *
27348     * Foo.prototype.c = 3;
27349     *
27350     * _.values(new Foo);
27351     * // => [1, 2] (iteration order is not guaranteed)
27352     *
27353     * _.values('hi');
27354     * // => ['h', 'i']
27355     */
27356    function values(object) {
27357      return object == null ? [] : baseValues(object, keys(object));
27358    }
27359
27360    /**
27361     * Creates an array of the own and inherited enumerable string keyed property
27362     * values of `object`.
27363     *
27364     * **Note:** Non-object values are coerced to objects.
27365     *
27366     * @static
27367     * @memberOf _
27368     * @since 3.0.0
27369     * @category Object
27370     * @param {Object} object The object to query.
27371     * @returns {Array} Returns the array of property values.
27372     * @example
27373     *
27374     * function Foo() {
27375     *   this.a = 1;
27376     *   this.b = 2;
27377     * }
27378     *
27379     * Foo.prototype.c = 3;
27380     *
vendor: 9,679 bytes, lines 27381-27701
27381     * _.valuesIn(new Foo);
27382     * // => [1, 2, 3] (iteration order is not guaranteed)
27383     */
27384    function valuesIn(object) {
27385      return object == null ? [] : baseValues(object, keysIn(object));
27386    }
27387
27388    /*------------------------------------------------------------------------*/
27389
27390    /**
27391     * Clamps `number` within the inclusive `lower` and `upper` bounds.
27392     *
27393     * @static
27394     * @memberOf _
27395     * @since 4.0.0
27396     * @category Number
27397     * @param {number} number The number to clamp.
27398     * @param {number} [lower] The lower bound.
27399     * @param {number} upper The upper bound.
27400     * @returns {number} Returns the clamped number.
27401     * @example
27402     *
27403     * _.clamp(-10, -5, 5);
27404     * // => -5
27405     *
27406     * _.clamp(10, -5, 5);
27407     * // => 5
27408     */
27409    function clamp(number, lower, upper) {
27410      if (upper === undefined) {
27411        upper = lower;
27412        lower = undefined;
27413      }
27414      if (upper !== undefined) {
27415        upper = toNumber(upper);
27416        upper = upper === upper ? upper : 0;
27417      }
27418      if (lower !== undefined) {
27419        lower = toNumber(lower);
27420        lower = lower === lower ? lower : 0;
27421      }
27422      return baseClamp(toNumber(number), lower, upper);
27423    }
27424
27425    /**
27426     * Checks if `n` is between `start` and up to, but not including, `end`. If
27427     * `end` is not specified, it's set to `start` with `start` then set to `0`.
27428     * If `start` is greater than `end` the params are swapped to support
27429     * negative ranges.
27430     *
27431     * @static
27432     * @memberOf _
27433     * @since 3.3.0
27434     * @category Number
27435     * @param {number} number The number to check.
27436     * @param {number} [start=0] The start of the range.
27437     * @param {number} end The end of the range.
27438     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
27439     * @see _.range, _.rangeRight
27440     * @example
27441     *
27442     * _.inRange(3, 2, 4);
27443     * // => true
27444     *
27445     * _.inRange(4, 8);
27446     * // => true
27447     *
27448     * _.inRange(4, 2);
27449     * // => false
27450     *
27451     * _.inRange(2, 2);
27452     * // => false
27453     *
27454     * _.inRange(1.2, 2);
27455     * // => true
27456     *
27457     * _.inRange(5.2, 4);
27458     * // => false
27459     *
27460     * _.inRange(-3, -2, -6);
27461     * // => true
27462     */
27463    function inRange(number, start, end) {
27464      start = toFinite(start);
27465      if (end === undefined) {
27466        end = start;
27467        start = 0;
27468      } else {
27469        end = toFinite(end);
27470      }
27471      number = toNumber(number);
27472      return baseInRange(number, start, end);
27473    }
27474
27475    /**
27476     * Produces a random number between the inclusive `lower` and `upper` bounds.
27477     * If only one argument is provided a number between `0` and the given number
27478     * is returned. If `floating` is `true`, or either `lower` or `upper` are
27479     * floats, a floating-point number is returned instead of an integer.
27480     *
27481     * **Note:** JavaScript follows the IEEE-754 standard for resolving
27482     * floating-point values which can produce unexpected results.
27483     *
27484     * @static
27485     * @memberOf _
27486     * @since 0.7.0
27487     * @category Number
27488     * @param {number} [lower=0] The lower bound.
27489     * @param {number} [upper=1] The upper bound.
27490     * @param {boolean} [floating] Specify returning a floating-point number.
27491     * @returns {number} Returns the random number.
27492     * @example
27493     *
27494     * _.random(0, 5);
27495     * // => an integer between 0 and 5
27496     *
27497     * _.random(5);
27498     * // => also an integer between 0 and 5
27499     *
27500     * _.random(5, true);
27501     * // => a floating-point number between 0 and 5
27502     *
27503     * _.random(1.2, 5.2);
27504     * // => a floating-point number between 1.2 and 5.2
27505     */
27506    function random(lower, upper, floating) {
27507      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
27508        upper = floating = undefined;
27509      }
27510      if (floating === undefined) {
27511        if (typeof upper == 'boolean') {
27512          floating = upper;
27513          upper = undefined;
27514        }
27515        else if (typeof lower == 'boolean') {
27516          floating = lower;
27517          lower = undefined;
27518        }
27519      }
27520      if (lower === undefined && upper === undefined) {
27521        lower = 0;
27522        upper = 1;
27523      }
27524      else {
27525        lower = toFinite(lower);
27526        if (upper === undefined) {
27527          upper = lower;
27528          lower = 0;
27529        } else {
27530          upper = toFinite(upper);
27531        }
27532      }
27533      if (lower > upper) {
27534        var temp = lower;
27535        lower = upper;
27536        upper = temp;
27537      }
27538      if (floating || lower % 1 || upper % 1) {
27539        var rand = nativeRandom();
27540        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
27541      }
27542      return baseRandom(lower, upper);
27543    }
27544
27545    /*------------------------------------------------------------------------*/
27546
27547    /**
27548     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
27549     *
27550     * @static
27551     * @memberOf _
27552     * @since 3.0.0
27553     * @category String
27554     * @param {string} [string=''] The string to convert.
27555     * @returns {string} Returns the camel cased string.
27556     * @example
27557     *
27558     * _.camelCase('Foo Bar');
27559     * // => 'fooBar'
27560     *
27561     * _.camelCase('--foo-bar--');
27562     * // => 'fooBar'
27563     *
27564     * _.camelCase('__FOO_BAR__');
27565     * // => 'fooBar'
27566     */
27567    var camelCase = createCompounder(function(result, word, index) {
27568      word = word.toLowerCase();
27569      return result + (index ? capitalize(word) : word);
27570    });
27571
27572    /**
27573     * Converts the first character of `string` to upper case and the remaining
27574     * to lower case.
27575     *
27576     * @static
27577     * @memberOf _
27578     * @since 3.0.0
27579     * @category String
27580     * @param {string} [string=''] The string to capitalize.
27581     * @returns {string} Returns the capitalized string.
27582     * @example
27583     *
27584     * _.capitalize('FRED');
27585     * // => 'Fred'
27586     */
27587    function capitalize(string) {
27588      return upperFirst(toString(string).toLowerCase());
27589    }
27590
27591    /**
27592     * Deburrs `string` by converting
27593     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
27594     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
27595     * letters to basic Latin letters and removing
27596     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
27597     *
27598     * @static
27599     * @memberOf _
27600     * @since 3.0.0
27601     * @category String
27602     * @param {string} [string=''] The string to deburr.
27603     * @returns {string} Returns the deburred string.
27604     * @example
27605     *
27606     * _.deburr('déjà vu');
27607     * // => 'deja vu'
27608     */
27609    function deburr(string) {
27610      string = toString(string);
27611      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
27612    }
27613
27614    /**
27615     * Checks if `string` ends with the given target string.
27616     *
27617     * @static
27618     * @memberOf _
27619     * @since 3.0.0
27620     * @category String
27621     * @param {string} [string=''] The string to inspect.
27622     * @param {string} [target] The string to search for.
27623     * @param {number} [position=string.length] The position to search up to.
27624     * @returns {boolean} Returns `true` if `string` ends with `target`,
27625     *  else `false`.
27626     * @example
27627     *
27628     * _.endsWith('abc', 'c');
27629     * // => true
27630     *
27631     * _.endsWith('abc', 'b');
27632     * // => false
27633     *
27634     * _.endsWith('abc', 'b', 2);
27635     * // => true
27636     */
27637    function endsWith(string, target, position) {
27638      string = toString(string);
27639      target = baseToString(target);
27640
27641      var length = string.length;
27642      position = position === undefined
27643        ? length
27644        : baseClamp(toInteger(position), 0, length);
27645
27646      var end = position;
27647      position -= target.length;
27648      return position >= 0 && string.slice(position, end) == target;
27649    }
27650
27651    /**
27652     * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
27653     * corresponding HTML entities.
27654     *
27655     * **Note:** No other characters are escaped. To escape additional
27656     * characters use a third-party library like [_he_](https://mths.be/he).
27657     *
27658     * Though the ">" character is escaped for symmetry, characters like
27659     * ">" and "/" don't need escaping in HTML and have no special meaning
27660     * unless they're part of a tag or unquoted attribute value. See
27661     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
27662     * (under "semi-related fun fact") for more details.
27663     *
27664     * When working with HTML you should always
27665     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
27666     * XSS vectors.
27667     *
27668     * @static
27669     * @since 0.1.0
27670     * @memberOf _
27671     * @category String
27672     * @param {string} [string=''] The string to escape.
27673     * @returns {string} Returns the escaped string.
27674     * @example
27675     *
27676     * _.escape('fred, barney, & pebbles');
27677     * // => 'fred, barney, &amp; pebbles'
27678     */
27679    function escape(string) {
27680      string = toString(string);
27681      return (string && reHasUnescapedHtml.test(string))
27682        ? string.replace(reUnescapedHtml, escapeHtmlChar)
27683        : string;
27684    }
27685
27686    /**
27687     * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
27688     * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
27689     *
27690     * @static
27691     * @memberOf _
27692     * @since 3.0.0
27693     * @category String
27694     * @param {string} [string=''] The string to escape.
27695     * @returns {string} Returns the escaped string.
27696     * @example
27697     *
27698     * _.escapeRegExp('[lodash](https://lodash.com/)');
27699     * // => '\[lodash\]\(https://lodash\.com/\)'
27700     */
27701    function escapeRegExp(string) {
vendor: 4,658 bytes, lines 27702-27871
27702      string = toString(string);
27703      return (string && reHasRegExpChar.test(string))
27704        ? string.replace(reRegExpChar, '\\$&')
27705        : string;
27706    }
27707
27708    /**
27709     * Converts `string` to
27710     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
27711     *
27712     * @static
27713     * @memberOf _
27714     * @since 3.0.0
27715     * @category String
27716     * @param {string} [string=''] The string to convert.
27717     * @returns {string} Returns the kebab cased string.
27718     * @example
27719     *
27720     * _.kebabCase('Foo Bar');
27721     * // => 'foo-bar'
27722     *
27723     * _.kebabCase('fooBar');
27724     * // => 'foo-bar'
27725     *
27726     * _.kebabCase('__FOO_BAR__');
27727     * // => 'foo-bar'
27728     */
27729    var kebabCase = createCompounder(function(result, word, index) {
27730      return result + (index ? '-' : '') + word.toLowerCase();
27731    });
27732
27733    /**
27734     * Converts `string`, as space separated words, to lower case.
27735     *
27736     * @static
27737     * @memberOf _
27738     * @since 4.0.0
27739     * @category String
27740     * @param {string} [string=''] The string to convert.
27741     * @returns {string} Returns the lower cased string.
27742     * @example
27743     *
27744     * _.lowerCase('--Foo-Bar--');
27745     * // => 'foo bar'
27746     *
27747     * _.lowerCase('fooBar');
27748     * // => 'foo bar'
27749     *
27750     * _.lowerCase('__FOO_BAR__');
27751     * // => 'foo bar'
27752     */
27753    var lowerCase = createCompounder(function(result, word, index) {
27754      return result + (index ? ' ' : '') + word.toLowerCase();
27755    });
27756
27757    /**
27758     * Converts the first character of `string` to lower case.
27759     *
27760     * @static
27761     * @memberOf _
27762     * @since 4.0.0
27763     * @category String
27764     * @param {string} [string=''] The string to convert.
27765     * @returns {string} Returns the converted string.
27766     * @example
27767     *
27768     * _.lowerFirst('Fred');
27769     * // => 'fred'
27770     *
27771     * _.lowerFirst('FRED');
27772     * // => 'fRED'
27773     */
27774    var lowerFirst = createCaseFirst('toLowerCase');
27775
27776    /**
27777     * Pads `string` on the left and right sides if it's shorter than `length`.
27778     * Padding characters are truncated if they can't be evenly divided by `length`.
27779     *
27780     * @static
27781     * @memberOf _
27782     * @since 3.0.0
27783     * @category String
27784     * @param {string} [string=''] The string to pad.
27785     * @param {number} [length=0] The padding length.
27786     * @param {string} [chars=' '] The string used as padding.
27787     * @returns {string} Returns the padded string.
27788     * @example
27789     *
27790     * _.pad('abc', 8);
27791     * // => '  abc   '
27792     *
27793     * _.pad('abc', 8, '_-');
27794     * // => '_-abc_-_'
27795     *
27796     * _.pad('abc', 3);
27797     * // => 'abc'
27798     */
27799    function pad(string, length, chars) {
27800      string = toString(string);
27801      length = toInteger(length);
27802
27803      var strLength = length ? stringSize(string) : 0;
27804      if (!length || strLength >= length) {
27805        return string;
27806      }
27807      var mid = (length - strLength) / 2;
27808      return (
27809        createPadding(nativeFloor(mid), chars) +
27810        string +
27811        createPadding(nativeCeil(mid), chars)
27812      );
27813    }
27814
27815    /**
27816     * Pads `string` on the right side if it's shorter than `length`. Padding
27817     * characters are truncated if they exceed `length`.
27818     *
27819     * @static
27820     * @memberOf _
27821     * @since 4.0.0
27822     * @category String
27823     * @param {string} [string=''] The string to pad.
27824     * @param {number} [length=0] The padding length.
27825     * @param {string} [chars=' '] The string used as padding.
27826     * @returns {string} Returns the padded string.
27827     * @example
27828     *
27829     * _.padEnd('abc', 6);
27830     * // => 'abc   '
27831     *
27832     * _.padEnd('abc', 6, '_-');
27833     * // => 'abc_-_'
27834     *
27835     * _.padEnd('abc', 3);
27836     * // => 'abc'
27837     */
27838    function padEnd(string, length, chars) {
27839      string = toString(string);
27840      length = toInteger(length);
27841
27842      var strLength = length ? stringSize(string) : 0;
27843      return (length && strLength < length)
27844        ? (string + createPadding(length - strLength, chars))
27845        : string;
27846    }
27847
27848    /**
27849     * Pads `string` on the left side if it's shorter than `length`. Padding
27850     * characters are truncated if they exceed `length`.
27851     *
27852     * @static
27853     * @memberOf _
27854     * @since 4.0.0
27855     * @category String
27856     * @param {string} [string=''] The string to pad.
27857     * @param {number} [length=0] The padding length.
27858     * @param {string} [chars=' '] The string used as padding.
27859     * @returns {string} Returns the padded string.
27860     * @example
27861     *
27862     * _.padStart('abc', 6);
27863     * // => '   abc'
27864     *
27865     * _.padStart('abc', 6, '_-');
27866     * // => '_-_abc'
27867     *
27868     * _.padStart('abc', 3);
27869     * // => 'abc'
27870     */
27871    function padStart(string, length, chars) {
vendor: 29,827 bytes, lines 27872-28769
27872      string = toString(string);
27873      length = toInteger(length);
27874
27875      var strLength = length ? stringSize(string) : 0;
27876      return (length && strLength < length)
27877        ? (createPadding(length - strLength, chars) + string)
27878        : string;
27879    }
27880
27881    /**
27882     * Converts `string` to an integer of the specified radix. If `radix` is
27883     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
27884     * hexadecimal, in which case a `radix` of `16` is used.
27885     *
27886     * **Note:** This method aligns with the
27887     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
27888     *
27889     * @static
27890     * @memberOf _
27891     * @since 1.1.0
27892     * @category String
27893     * @param {string} string The string to convert.
27894     * @param {number} [radix=10] The radix to interpret `value` by.
27895     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
27896     * @returns {number} Returns the converted integer.
27897     * @example
27898     *
27899     * _.parseInt('08');
27900     * // => 8
27901     *
27902     * _.map(['6', '08', '10'], _.parseInt);
27903     * // => [6, 8, 10]
27904     */
27905    function parseInt(string, radix, guard) {
27906      if (guard || radix == null) {
27907        radix = 0;
27908      } else if (radix) {
27909        radix = +radix;
27910      }
27911      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
27912    }
27913
27914    /**
27915     * Repeats the given string `n` times.
27916     *
27917     * @static
27918     * @memberOf _
27919     * @since 3.0.0
27920     * @category String
27921     * @param {string} [string=''] The string to repeat.
27922     * @param {number} [n=1] The number of times to repeat the string.
27923     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
27924     * @returns {string} Returns the repeated string.
27925     * @example
27926     *
27927     * _.repeat('*', 3);
27928     * // => '***'
27929     *
27930     * _.repeat('abc', 2);
27931     * // => 'abcabc'
27932     *
27933     * _.repeat('abc', 0);
27934     * // => ''
27935     */
27936    function repeat(string, n, guard) {
27937      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
27938        n = 1;
27939      } else {
27940        n = toInteger(n);
27941      }
27942      return baseRepeat(toString(string), n);
27943    }
27944
27945    /**
27946     * Replaces matches for `pattern` in `string` with `replacement`.
27947     *
27948     * **Note:** This method is based on
27949     * [`String#replace`](https://mdn.io/String/replace).
27950     *
27951     * @static
27952     * @memberOf _
27953     * @since 4.0.0
27954     * @category String
27955     * @param {string} [string=''] The string to modify.
27956     * @param {RegExp|string} pattern The pattern to replace.
27957     * @param {Function|string} replacement The match replacement.
27958     * @returns {string} Returns the modified string.
27959     * @example
27960     *
27961     * _.replace('Hi Fred', 'Fred', 'Barney');
27962     * // => 'Hi Barney'
27963     */
27964    function replace() {
27965      var args = arguments,
27966          string = toString(args[0]);
27967
27968      return args.length < 3 ? string : string.replace(args[1], args[2]);
27969    }
27970
27971    /**
27972     * Converts `string` to
27973     * [snake case](https://en.wikipedia.org/wiki/Snake_case).
27974     *
27975     * @static
27976     * @memberOf _
27977     * @since 3.0.0
27978     * @category String
27979     * @param {string} [string=''] The string to convert.
27980     * @returns {string} Returns the snake cased string.
27981     * @example
27982     *
27983     * _.snakeCase('Foo Bar');
27984     * // => 'foo_bar'
27985     *
27986     * _.snakeCase('fooBar');
27987     * // => 'foo_bar'
27988     *
27989     * _.snakeCase('--FOO-BAR--');
27990     * // => 'foo_bar'
27991     */
27992    var snakeCase = createCompounder(function(result, word, index) {
27993      return result + (index ? '_' : '') + word.toLowerCase();
27994    });
27995
27996    /**
27997     * Splits `string` by `separator`.
27998     *
27999     * **Note:** This method is based on
28000     * [`String#split`](https://mdn.io/String/split).
28001     *
28002     * @static
28003     * @memberOf _
28004     * @since 4.0.0
28005     * @category String
28006     * @param {string} [string=''] The string to split.
28007     * @param {RegExp|string} separator The separator pattern to split by.
28008     * @param {number} [limit] The length to truncate results to.
28009     * @returns {Array} Returns the string segments.
28010     * @example
28011     *
28012     * _.split('a-b-c', '-', 2);
28013     * // => ['a', 'b']
28014     */
28015    function split(string, separator, limit) {
28016      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
28017        separator = limit = undefined;
28018      }
28019      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
28020      if (!limit) {
28021        return [];
28022      }
28023      string = toString(string);
28024      if (string && (
28025            typeof separator == 'string' ||
28026            (separator != null && !isRegExp(separator))
28027          )) {
28028        separator = baseToString(separator);
28029        if (!separator && hasUnicode(string)) {
28030          return castSlice(stringToArray(string), 0, limit);
28031        }
28032      }
28033      return string.split(separator, limit);
28034    }
28035
28036    /**
28037     * Converts `string` to
28038     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
28039     *
28040     * @static
28041     * @memberOf _
28042     * @since 3.1.0
28043     * @category String
28044     * @param {string} [string=''] The string to convert.
28045     * @returns {string} Returns the start cased string.
28046     * @example
28047     *
28048     * _.startCase('--foo-bar--');
28049     * // => 'Foo Bar'
28050     *
28051     * _.startCase('fooBar');
28052     * // => 'Foo Bar'
28053     *
28054     * _.startCase('__FOO_BAR__');
28055     * // => 'FOO BAR'
28056     */
28057    var startCase = createCompounder(function(result, word, index) {
28058      return result + (index ? ' ' : '') + upperFirst(word);
28059    });
28060
28061    /**
28062     * Checks if `string` starts with the given target string.
28063     *
28064     * @static
28065     * @memberOf _
28066     * @since 3.0.0
28067     * @category String
28068     * @param {string} [string=''] The string to inspect.
28069     * @param {string} [target] The string to search for.
28070     * @param {number} [position=0] The position to search from.
28071     * @returns {boolean} Returns `true` if `string` starts with `target`,
28072     *  else `false`.
28073     * @example
28074     *
28075     * _.startsWith('abc', 'a');
28076     * // => true
28077     *
28078     * _.startsWith('abc', 'b');
28079     * // => false
28080     *
28081     * _.startsWith('abc', 'b', 1);
28082     * // => true
28083     */
28084    function startsWith(string, target, position) {
28085      string = toString(string);
28086      position = position == null
28087        ? 0
28088        : baseClamp(toInteger(position), 0, string.length);
28089
28090      target = baseToString(target);
28091      return string.slice(position, position + target.length) == target;
28092    }
28093
28094    /**
28095     * Creates a compiled template function that can interpolate data properties
28096     * in "interpolate" delimiters, HTML-escape interpolated data properties in
28097     * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
28098     * properties may be accessed as free variables in the template. If a setting
28099     * object is given, it takes precedence over `_.templateSettings` values.
28100     *
28101     * **Note:** In the development build `_.template` utilizes
28102     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
28103     * for easier debugging.
28104     *
28105     * For more information on precompiling templates see
28106     * [lodash's custom builds documentation](https://lodash.com/custom-builds).
28107     *
28108     * For more information on Chrome extension sandboxes see
28109     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
28110     *
28111     * @static
28112     * @since 0.1.0
28113     * @memberOf _
28114     * @category String
28115     * @param {string} [string=''] The template string.
28116     * @param {Object} [options={}] The options object.
28117     * @param {RegExp} [options.escape=_.templateSettings.escape]
28118     *  The HTML "escape" delimiter.
28119     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
28120     *  The "evaluate" delimiter.
28121     * @param {Object} [options.imports=_.templateSettings.imports]
28122     *  An object to import into the template as free variables.
28123     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
28124     *  The "interpolate" delimiter.
28125     * @param {string} [options.sourceURL='lodash.templateSources[n]']
28126     *  The sourceURL of the compiled template.
28127     * @param {string} [options.variable='obj']
28128     *  The data object variable name.
28129     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
28130     * @returns {Function} Returns the compiled template function.
28131     * @example
28132     *
28133     * // Use the "interpolate" delimiter to create a compiled template.
28134     * var compiled = _.template('hello <%= user %>!');
28135     * compiled({ 'user': 'fred' });
28136     * // => 'hello fred!'
28137     *
28138     * // Use the HTML "escape" delimiter to escape data property values.
28139     * var compiled = _.template('<b><%- value %></b>');
28140     * compiled({ 'value': '<script>' });
28141     * // => '<b>&lt;script&gt;</b>'
28142     *
28143     * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
28144     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
28145     * compiled({ 'users': ['fred', 'barney'] });
28146     * // => '<li>fred</li><li>barney</li>'
28147     *
28148     * // Use the internal `print` function in "evaluate" delimiters.
28149     * var compiled = _.template('<% print("hello " + user); %>!');
28150     * compiled({ 'user': 'barney' });
28151     * // => 'hello barney!'
28152     *
28153     * // Use the ES template literal delimiter as an "interpolate" delimiter.
28154     * // Disable support by replacing the "interpolate" delimiter.
28155     * var compiled = _.template('hello ${ user }!');
28156     * compiled({ 'user': 'pebbles' });
28157     * // => 'hello pebbles!'
28158     *
28159     * // Use backslashes to treat delimiters as plain text.
28160     * var compiled = _.template('<%= "\\<%- value %\\>" %>');
28161     * compiled({ 'value': 'ignored' });
28162     * // => '<%- value %>'
28163     *
28164     * // Use the `imports` option to import `jQuery` as `jq`.
28165     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
28166     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
28167     * compiled({ 'users': ['fred', 'barney'] });
28168     * // => '<li>fred</li><li>barney</li>'
28169     *
28170     * // Use the `sourceURL` option to specify a custom sourceURL for the template.
28171     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
28172     * compiled(data);
28173     * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
28174     *
28175     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
28176     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
28177     * compiled.source;
28178     * // => function(data) {
28179     * //   var __t, __p = '';
28180     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
28181     * //   return __p;
28182     * // }
28183     *
28184     * // Use custom template delimiters.
28185     * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
28186     * var compiled = _.template('hello {{ user }}!');
28187     * compiled({ 'user': 'mustache' });
28188     * // => 'hello mustache!'
28189     *
28190     * // Use the `source` property to inline compiled templates for meaningful
28191     * // line numbers in error messages and stack traces.
28192     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
28193     *   var JST = {\
28194     *     "main": ' + _.template(mainText).source + '\
28195     *   };\
28196     * ');
28197     */
28198    function template(string, options, guard) {
28199      // Based on John Resig's `tmpl` implementation
28200      // (http://ejohn.org/blog/javascript-micro-templating/)
28201      // and Laura Doktorova's doT.js (https://github.com/olado/doT).
28202      var settings = lodash.templateSettings;
28203
28204      if (guard && isIterateeCall(string, options, guard)) {
28205        options = undefined;
28206      }
28207      string = toString(string);
28208      options = assignInWith({}, options, settings, customDefaultsAssignIn);
28209
28210      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
28211          importsKeys = keys(imports),
28212          importsValues = baseValues(imports, importsKeys);
28213
28214      var isEscaping,
28215          isEvaluating,
28216          index = 0,
28217          interpolate = options.interpolate || reNoMatch,
28218          source = "__p += '";
28219
28220      // Compile the regexp to match each delimiter.
28221      var reDelimiters = RegExp(
28222        (options.escape || reNoMatch).source + '|' +
28223        interpolate.source + '|' +
28224        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
28225        (options.evaluate || reNoMatch).source + '|$'
28226      , 'g');
28227
28228      // Use a sourceURL for easier debugging.
28229      // The sourceURL gets injected into the source that's eval-ed, so be careful
28230      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in
28231      // and escape the comment, thus injecting code that gets evaled.
28232      var sourceURL = '//# sourceURL=' +
28233        (hasOwnProperty.call(options, 'sourceURL')
28234          ? (options.sourceURL + '').replace(/\s/g, ' ')
28235          : ('lodash.templateSources[' + (++templateCounter) + ']')
28236        ) + '\n';
28237
28238      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
28239        interpolateValue || (interpolateValue = esTemplateValue);
28240
28241        // Escape characters that can't be included in string literals.
28242        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
28243
28244        // Replace delimiters with snippets.
28245        if (escapeValue) {
28246          isEscaping = true;
28247          source += "' +\n__e(" + escapeValue + ") +\n'";
28248        }
28249        if (evaluateValue) {
28250          isEvaluating = true;
28251          source += "';\n" + evaluateValue + ";\n__p += '";
28252        }
28253        if (interpolateValue) {
28254          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
28255        }
28256        index = offset + match.length;
28257
28258        // The JS engine embedded in Adobe products needs `match` returned in
28259        // order to produce the correct `offset` value.
28260        return match;
28261      });
28262
28263      source += "';\n";
28264
28265      // If `variable` is not specified wrap a with-statement around the generated
28266      // code to add the data object to the top of the scope chain.
28267      var variable = hasOwnProperty.call(options, 'variable') && options.variable;
28268      if (!variable) {
28269        source = 'with (obj) {\n' + source + '\n}\n';
28270      }
28271      // Throw an error if a forbidden character was found in `variable`, to prevent
28272      // potential command injection attacks.
28273      else if (reForbiddenIdentifierChars.test(variable)) {
28274        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);
28275      }
28276
28277      // Cleanup code by stripping empty strings.
28278      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
28279        .replace(reEmptyStringMiddle, '$1')
28280        .replace(reEmptyStringTrailing, '$1;');
28281
28282      // Frame code as the function body.
28283      source = 'function(' + (variable || 'obj') + ') {\n' +
28284        (variable
28285          ? ''
28286          : 'obj || (obj = {});\n'
28287        ) +
28288        "var __t, __p = ''" +
28289        (isEscaping
28290           ? ', __e = _.escape'
28291           : ''
28292        ) +
28293        (isEvaluating
28294          ? ', __j = Array.prototype.join;\n' +
28295            "function print() { __p += __j.call(arguments, '') }\n"
28296          : ';\n'
28297        ) +
28298        source +
28299        'return __p\n}';
28300
28301      var result = attempt(function() {
28302        return Function(importsKeys, sourceURL + 'return ' + source)
28303          .apply(undefined, importsValues);
28304      });
28305
28306      // Provide the compiled function's source by its `toString` method or
28307      // the `source` property as a convenience for inlining compiled templates.
28308      result.source = source;
28309      if (isError(result)) {
28310        throw result;
28311      }
28312      return result;
28313    }
28314
28315    /**
28316     * Converts `string`, as a whole, to lower case just like
28317     * [String#toLowerCase](https://mdn.io/toLowerCase).
28318     *
28319     * @static
28320     * @memberOf _
28321     * @since 4.0.0
28322     * @category String
28323     * @param {string} [string=''] The string to convert.
28324     * @returns {string} Returns the lower cased string.
28325     * @example
28326     *
28327     * _.toLower('--Foo-Bar--');
28328     * // => '--foo-bar--'
28329     *
28330     * _.toLower('fooBar');
28331     * // => 'foobar'
28332     *
28333     * _.toLower('__FOO_BAR__');
28334     * // => '__foo_bar__'
28335     */
28336    function toLower(value) {
28337      return toString(value).toLowerCase();
28338    }
28339
28340    /**
28341     * Converts `string`, as a whole, to upper case just like
28342     * [String#toUpperCase](https://mdn.io/toUpperCase).
28343     *
28344     * @static
28345     * @memberOf _
28346     * @since 4.0.0
28347     * @category String
28348     * @param {string} [string=''] The string to convert.
28349     * @returns {string} Returns the upper cased string.
28350     * @example
28351     *
28352     * _.toUpper('--foo-bar--');
28353     * // => '--FOO-BAR--'
28354     *
28355     * _.toUpper('fooBar');
28356     * // => 'FOOBAR'
28357     *
28358     * _.toUpper('__foo_bar__');
28359     * // => '__FOO_BAR__'
28360     */
28361    function toUpper(value) {
28362      return toString(value).toUpperCase();
28363    }
28364
28365    /**
28366     * Removes leading and trailing whitespace or specified characters from `string`.
28367     *
28368     * @static
28369     * @memberOf _
28370     * @since 3.0.0
28371     * @category String
28372     * @param {string} [string=''] The string to trim.
28373     * @param {string} [chars=whitespace] The characters to trim.
28374     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
28375     * @returns {string} Returns the trimmed string.
28376     * @example
28377     *
28378     * _.trim('  abc  ');
28379     * // => 'abc'
28380     *
28381     * _.trim('-_-abc-_-', '_-');
28382     * // => 'abc'
28383     *
28384     * _.map(['  foo  ', '  bar  '], _.trim);
28385     * // => ['foo', 'bar']
28386     */
28387    function trim(string, chars, guard) {
28388      string = toString(string);
28389      if (string && (guard || chars === undefined)) {
28390        return baseTrim(string);
28391      }
28392      if (!string || !(chars = baseToString(chars))) {
28393        return string;
28394      }
28395      var strSymbols = stringToArray(string),
28396          chrSymbols = stringToArray(chars),
28397          start = charsStartIndex(strSymbols, chrSymbols),
28398          end = charsEndIndex(strSymbols, chrSymbols) + 1;
28399
28400      return castSlice(strSymbols, start, end).join('');
28401    }
28402
28403    /**
28404     * Removes trailing whitespace or specified characters from `string`.
28405     *
28406     * @static
28407     * @memberOf _
28408     * @since 4.0.0
28409     * @category String
28410     * @param {string} [string=''] The string to trim.
28411     * @param {string} [chars=whitespace] The characters to trim.
28412     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
28413     * @returns {string} Returns the trimmed string.
28414     * @example
28415     *
28416     * _.trimEnd('  abc  ');
28417     * // => '  abc'
28418     *
28419     * _.trimEnd('-_-abc-_-', '_-');
28420     * // => '-_-abc'
28421     */
28422    function trimEnd(string, chars, guard) {
28423      string = toString(string);
28424      if (string && (guard || chars === undefined)) {
28425        return string.slice(0, trimmedEndIndex(string) + 1);
28426      }
28427      if (!string || !(chars = baseToString(chars))) {
28428        return string;
28429      }
28430      var strSymbols = stringToArray(string),
28431          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
28432
28433      return castSlice(strSymbols, 0, end).join('');
28434    }
28435
28436    /**
28437     * Removes leading whitespace or specified characters from `string`.
28438     *
28439     * @static
28440     * @memberOf _
28441     * @since 4.0.0
28442     * @category String
28443     * @param {string} [string=''] The string to trim.
28444     * @param {string} [chars=whitespace] The characters to trim.
28445     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
28446     * @returns {string} Returns the trimmed string.
28447     * @example
28448     *
28449     * _.trimStart('  abc  ');
28450     * // => 'abc  '
28451     *
28452     * _.trimStart('-_-abc-_-', '_-');
28453     * // => 'abc-_-'
28454     */
28455    function trimStart(string, chars, guard) {
28456      string = toString(string);
28457      if (string && (guard || chars === undefined)) {
28458        return string.replace(reTrimStart, '');
28459      }
28460      if (!string || !(chars = baseToString(chars))) {
28461        return string;
28462      }
28463      var strSymbols = stringToArray(string),
28464          start = charsStartIndex(strSymbols, stringToArray(chars));
28465
28466      return castSlice(strSymbols, start).join('');
28467    }
28468
28469    /**
28470     * Truncates `string` if it's longer than the given maximum string length.
28471     * The last characters of the truncated string are replaced with the omission
28472     * string which defaults to "...".
28473     *
28474     * @static
28475     * @memberOf _
28476     * @since 4.0.0
28477     * @category String
28478     * @param {string} [string=''] The string to truncate.
28479     * @param {Object} [options={}] The options object.
28480     * @param {number} [options.length=30] The maximum string length.
28481     * @param {string} [options.omission='...'] The string to indicate text is omitted.
28482     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
28483     * @returns {string} Returns the truncated string.
28484     * @example
28485     *
28486     * _.truncate('hi-diddly-ho there, neighborino');
28487     * // => 'hi-diddly-ho there, neighbo...'
28488     *
28489     * _.truncate('hi-diddly-ho there, neighborino', {
28490     *   'length': 24,
28491     *   'separator': ' '
28492     * });
28493     * // => 'hi-diddly-ho there,...'
28494     *
28495     * _.truncate('hi-diddly-ho there, neighborino', {
28496     *   'length': 24,
28497     *   'separator': /,? +/
28498     * });
28499     * // => 'hi-diddly-ho there...'
28500     *
28501     * _.truncate('hi-diddly-ho there, neighborino', {
28502     *   'omission': ' [...]'
28503     * });
28504     * // => 'hi-diddly-ho there, neig [...]'
28505     */
28506    function truncate(string, options) {
28507      var length = DEFAULT_TRUNC_LENGTH,
28508          omission = DEFAULT_TRUNC_OMISSION;
28509
28510      if (isObject(options)) {
28511        var separator = 'separator' in options ? options.separator : separator;
28512        length = 'length' in options ? toInteger(options.length) : length;
28513        omission = 'omission' in options ? baseToString(options.omission) : omission;
28514      }
28515      string = toString(string);
28516
28517      var strLength = string.length;
28518      if (hasUnicode(string)) {
28519        var strSymbols = stringToArray(string);
28520        strLength = strSymbols.length;
28521      }
28522      if (length >= strLength) {
28523        return string;
28524      }
28525      var end = length - stringSize(omission);
28526      if (end < 1) {
28527        return omission;
28528      }
28529      var result = strSymbols
28530        ? castSlice(strSymbols, 0, end).join('')
28531        : string.slice(0, end);
28532
28533      if (separator === undefined) {
28534        return result + omission;
28535      }
28536      if (strSymbols) {
28537        end += (result.length - end);
28538      }
28539      if (isRegExp(separator)) {
28540        if (string.slice(end).search(separator)) {
28541          var match,
28542              substring = result;
28543
28544          if (!separator.global) {
28545            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
28546          }
28547          separator.lastIndex = 0;
28548          while ((match = separator.exec(substring))) {
28549            var newEnd = match.index;
28550          }
28551          result = result.slice(0, newEnd === undefined ? end : newEnd);
28552        }
28553      } else if (string.indexOf(baseToString(separator), end) != end) {
28554        var index = result.lastIndexOf(separator);
28555        if (index > -1) {
28556          result = result.slice(0, index);
28557        }
28558      }
28559      return result + omission;
28560    }
28561
28562    /**
28563     * The inverse of `_.escape`; this method converts the HTML entities
28564     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
28565     * their corresponding characters.
28566     *
28567     * **Note:** No other HTML entities are unescaped. To unescape additional
28568     * HTML entities use a third-party library like [_he_](https://mths.be/he).
28569     *
28570     * @static
28571     * @memberOf _
28572     * @since 0.6.0
28573     * @category String
28574     * @param {string} [string=''] The string to unescape.
28575     * @returns {string} Returns the unescaped string.
28576     * @example
28577     *
28578     * _.unescape('fred, barney, &amp; pebbles');
28579     * // => 'fred, barney, & pebbles'
28580     */
28581    function unescape(string) {
28582      string = toString(string);
28583      return (string && reHasEscapedHtml.test(string))
28584        ? string.replace(reEscapedHtml, unescapeHtmlChar)
28585        : string;
28586    }
28587
28588    /**
28589     * Converts `string`, as space separated words, to upper case.
28590     *
28591     * @static
28592     * @memberOf _
28593     * @since 4.0.0
28594     * @category String
28595     * @param {string} [string=''] The string to convert.
28596     * @returns {string} Returns the upper cased string.
28597     * @example
28598     *
28599     * _.upperCase('--foo-bar');
28600     * // => 'FOO BAR'
28601     *
28602     * _.upperCase('fooBar');
28603     * // => 'FOO BAR'
28604     *
28605     * _.upperCase('__foo_bar__');
28606     * // => 'FOO BAR'
28607     */
28608    var upperCase = createCompounder(function(result, word, index) {
28609      return result + (index ? ' ' : '') + word.toUpperCase();
28610    });
28611
28612    /**
28613     * Converts the first character of `string` to upper case.
28614     *
28615     * @static
28616     * @memberOf _
28617     * @since 4.0.0
28618     * @category String
28619     * @param {string} [string=''] The string to convert.
28620     * @returns {string} Returns the converted string.
28621     * @example
28622     *
28623     * _.upperFirst('fred');
28624     * // => 'Fred'
28625     *
28626     * _.upperFirst('FRED');
28627     * // => 'FRED'
28628     */
28629    var upperFirst = createCaseFirst('toUpperCase');
28630
28631    /**
28632     * Splits `string` into an array of its words.
28633     *
28634     * @static
28635     * @memberOf _
28636     * @since 3.0.0
28637     * @category String
28638     * @param {string} [string=''] The string to inspect.
28639     * @param {RegExp|string} [pattern] The pattern to match words.
28640     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
28641     * @returns {Array} Returns the words of `string`.
28642     * @example
28643     *
28644     * _.words('fred, barney, & pebbles');
28645     * // => ['fred', 'barney', 'pebbles']
28646     *
28647     * _.words('fred, barney, & pebbles', /[^, ]+/g);
28648     * // => ['fred', 'barney', '&', 'pebbles']
28649     */
28650    function words(string, pattern, guard) {
28651      string = toString(string);
28652      pattern = guard ? undefined : pattern;
28653
28654      if (pattern === undefined) {
28655        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
28656      }
28657      return string.match(pattern) || [];
28658    }
28659
28660    /*------------------------------------------------------------------------*/
28661
28662    /**
28663     * Attempts to invoke `func`, returning either the result or the caught error
28664     * object. Any additional arguments are provided to `func` when it's invoked.
28665     *
28666     * @static
28667     * @memberOf _
28668     * @since 3.0.0
28669     * @category Util
28670     * @param {Function} func The function to attempt.
28671     * @param {...*} [args] The arguments to invoke `func` with.
28672     * @returns {*} Returns the `func` result or error object.
28673     * @example
28674     *
28675     * // Avoid throwing errors for invalid selectors.
28676     * var elements = _.attempt(function(selector) {
28677     *   return document.querySelectorAll(selector);
28678     * }, '>_>');
28679     *
28680     * if (_.isError(elements)) {
28681     *   elements = [];
28682     * }
28683     */
28684    var attempt = baseRest(function(func, args) {
28685      try {
28686        return apply(func, undefined, args);
28687      } catch (e) {
28688        return isError(e) ? e : new Error(e);
28689      }
28690    });
28691
28692    /**
28693     * Binds methods of an object to the object itself, overwriting the existing
28694     * method.
28695     *
28696     * **Note:** This method doesn't set the "length" property of bound functions.
28697     *
28698     * @static
28699     * @since 0.1.0
28700     * @memberOf _
28701     * @category Util
28702     * @param {Object} object The object to bind and assign the bound methods to.
28703     * @param {...(string|string[])} methodNames The object method names to bind.
28704     * @returns {Object} Returns `object`.
28705     * @example
28706     *
28707     * var view = {
28708     *   'label': 'docs',
28709     *   'click': function() {
28710     *     console.log('clicked ' + this.label);
28711     *   }
28712     * };
28713     *
28714     * _.bindAll(view, ['click']);
28715     * jQuery(element).on('click', view.click);
28716     * // => Logs 'clicked docs' when clicked.
28717     */
28718    var bindAll = flatRest(function(object, methodNames) {
28719      arrayEach(methodNames, function(key) {
28720        key = toKey(key);
28721        baseAssignValue(object, key, bind(object[key], object));
28722      });
28723      return object;
28724    });
28725
28726    /**
28727     * Creates a function that iterates over `pairs` and invokes the corresponding
28728     * function of the first predicate to return truthy. The predicate-function
28729     * pairs are invoked with the `this` binding and arguments of the created
28730     * function.
28731     *
28732     * @static
28733     * @memberOf _
28734     * @since 4.0.0
28735     * @category Util
28736     * @param {Array} pairs The predicate-function pairs.
28737     * @returns {Function} Returns the new composite function.
28738     * @example
28739     *
28740     * var func = _.cond([
28741     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
28742     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
28743     *   [_.stubTrue,                      _.constant('no match')]
28744     * ]);
28745     *
28746     * func({ 'a': 1, 'b': 2 });
28747     * // => 'matches A'
28748     *
28749     * func({ 'a': 0, 'b': 1 });
28750     * // => 'matches B'
28751     *
28752     * func({ 'a': '1', 'b': '2' });
28753     * // => 'no match'
28754     */
28755    function cond(pairs) {
28756      var length = pairs == null ? 0 : pairs.length,
28757          toIteratee = getIteratee();
28758
28759      pairs = !length ? [] : arrayMap(pairs, function(pair) {
28760        if (typeof pair[1] != 'function') {
28761          throw new TypeError(FUNC_ERROR_TEXT);
28762        }
28763        return [toIteratee(pair[0]), pair[1]];
28764      });
28765
28766      return baseRest(function(args) {
28767        var index = -1;
28768        while (++index < length) {
28769          var pair = pairs[index];
vendor: 10,296 bytes, lines 28770-29102
28770          if (apply(pair[0], this, args)) {
28771            return apply(pair[1], this, args);
28772          }
28773        }
28774      });
28775    }
28776
28777    /**
28778     * Creates a function that invokes the predicate properties of `source` with
28779     * the corresponding property values of a given object, returning `true` if
28780     * all predicates return truthy, else `false`.
28781     *
28782     * **Note:** The created function is equivalent to `_.conformsTo` with
28783     * `source` partially applied.
28784     *
28785     * @static
28786     * @memberOf _
28787     * @since 4.0.0
28788     * @category Util
28789     * @param {Object} source The object of property predicates to conform to.
28790     * @returns {Function} Returns the new spec function.
28791     * @example
28792     *
28793     * var objects = [
28794     *   { 'a': 2, 'b': 1 },
28795     *   { 'a': 1, 'b': 2 }
28796     * ];
28797     *
28798     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
28799     * // => [{ 'a': 1, 'b': 2 }]
28800     */
28801    function conforms(source) {
28802      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
28803    }
28804
28805    /**
28806     * Creates a function that returns `value`.
28807     *
28808     * @static
28809     * @memberOf _
28810     * @since 2.4.0
28811     * @category Util
28812     * @param {*} value The value to return from the new function.
28813     * @returns {Function} Returns the new constant function.
28814     * @example
28815     *
28816     * var objects = _.times(2, _.constant({ 'a': 1 }));
28817     *
28818     * console.log(objects);
28819     * // => [{ 'a': 1 }, { 'a': 1 }]
28820     *
28821     * console.log(objects[0] === objects[1]);
28822     * // => true
28823     */
28824    function constant(value) {
28825      return function() {
28826        return value;
28827      };
28828    }
28829
28830    /**
28831     * Checks `value` to determine whether a default value should be returned in
28832     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
28833     * or `undefined`.
28834     *
28835     * @static
28836     * @memberOf _
28837     * @since 4.14.0
28838     * @category Util
28839     * @param {*} value The value to check.
28840     * @param {*} defaultValue The default value.
28841     * @returns {*} Returns the resolved value.
28842     * @example
28843     *
28844     * _.defaultTo(1, 10);
28845     * // => 1
28846     *
28847     * _.defaultTo(undefined, 10);
28848     * // => 10
28849     */
28850    function defaultTo(value, defaultValue) {
28851      return (value == null || value !== value) ? defaultValue : value;
28852    }
28853
28854    /**
28855     * Creates a function that returns the result of invoking the given functions
28856     * with the `this` binding of the created function, where each successive
28857     * invocation is supplied the return value of the previous.
28858     *
28859     * @static
28860     * @memberOf _
28861     * @since 3.0.0
28862     * @category Util
28863     * @param {...(Function|Function[])} [funcs] The functions to invoke.
28864     * @returns {Function} Returns the new composite function.
28865     * @see _.flowRight
28866     * @example
28867     *
28868     * function square(n) {
28869     *   return n * n;
28870     * }
28871     *
28872     * var addSquare = _.flow([_.add, square]);
28873     * addSquare(1, 2);
28874     * // => 9
28875     */
28876    var flow = createFlow();
28877
28878    /**
28879     * This method is like `_.flow` except that it creates a function that
28880     * invokes the given functions from right to left.
28881     *
28882     * @static
28883     * @since 3.0.0
28884     * @memberOf _
28885     * @category Util
28886     * @param {...(Function|Function[])} [funcs] The functions to invoke.
28887     * @returns {Function} Returns the new composite function.
28888     * @see _.flow
28889     * @example
28890     *
28891     * function square(n) {
28892     *   return n * n;
28893     * }
28894     *
28895     * var addSquare = _.flowRight([square, _.add]);
28896     * addSquare(1, 2);
28897     * // => 9
28898     */
28899    var flowRight = createFlow(true);
28900
28901    /**
28902     * This method returns the first argument it receives.
28903     *
28904     * @static
28905     * @since 0.1.0
28906     * @memberOf _
28907     * @category Util
28908     * @param {*} value Any value.
28909     * @returns {*} Returns `value`.
28910     * @example
28911     *
28912     * var object = { 'a': 1 };
28913     *
28914     * console.log(_.identity(object) === object);
28915     * // => true
28916     */
28917    function identity(value) {
28918      return value;
28919    }
28920
28921    /**
28922     * Creates a function that invokes `func` with the arguments of the created
28923     * function. If `func` is a property name, the created function returns the
28924     * property value for a given element. If `func` is an array or object, the
28925     * created function returns `true` for elements that contain the equivalent
28926     * source properties, otherwise it returns `false`.
28927     *
28928     * @static
28929     * @since 4.0.0
28930     * @memberOf _
28931     * @category Util
28932     * @param {*} [func=_.identity] The value to convert to a callback.
28933     * @returns {Function} Returns the callback.
28934     * @example
28935     *
28936     * var users = [
28937     *   { 'user': 'barney', 'age': 36, 'active': true },
28938     *   { 'user': 'fred',   'age': 40, 'active': false }
28939     * ];
28940     *
28941     * // The `_.matches` iteratee shorthand.
28942     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
28943     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
28944     *
28945     * // The `_.matchesProperty` iteratee shorthand.
28946     * _.filter(users, _.iteratee(['user', 'fred']));
28947     * // => [{ 'user': 'fred', 'age': 40 }]
28948     *
28949     * // The `_.property` iteratee shorthand.
28950     * _.map(users, _.iteratee('user'));
28951     * // => ['barney', 'fred']
28952     *
28953     * // Create custom iteratee shorthands.
28954     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
28955     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
28956     *     return func.test(string);
28957     *   };
28958     * });
28959     *
28960     * _.filter(['abc', 'def'], /ef/);
28961     * // => ['def']
28962     */
28963    function iteratee(func) {
28964      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
28965    }
28966
28967    /**
28968     * Creates a function that performs a partial deep comparison between a given
28969     * object and `source`, returning `true` if the given object has equivalent
28970     * property values, else `false`.
28971     *
28972     * **Note:** The created function is equivalent to `_.isMatch` with `source`
28973     * partially applied.
28974     *
28975     * Partial comparisons will match empty array and empty object `source`
28976     * values against any array or object value, respectively. See `_.isEqual`
28977     * for a list of supported value comparisons.
28978     *
28979     * **Note:** Multiple values can be checked by combining several matchers
28980     * using `_.overSome`
28981     *
28982     * @static
28983     * @memberOf _
28984     * @since 3.0.0
28985     * @category Util
28986     * @param {Object} source The object of property values to match.
28987     * @returns {Function} Returns the new spec function.
28988     * @example
28989     *
28990     * var objects = [
28991     *   { 'a': 1, 'b': 2, 'c': 3 },
28992     *   { 'a': 4, 'b': 5, 'c': 6 }
28993     * ];
28994     *
28995     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
28996     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
28997     *
28998     * // Checking for several possible values
28999     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
29000     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
29001     */
29002    function matches(source) {
29003      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
29004    }
29005
29006    /**
29007     * Creates a function that performs a partial deep comparison between the
29008     * value at `path` of a given object to `srcValue`, returning `true` if the
29009     * object value is equivalent, else `false`.
29010     *
29011     * **Note:** Partial comparisons will match empty array and empty object
29012     * `srcValue` values against any array or object value, respectively. See
29013     * `_.isEqual` for a list of supported value comparisons.
29014     *
29015     * **Note:** Multiple values can be checked by combining several matchers
29016     * using `_.overSome`
29017     *
29018     * @static
29019     * @memberOf _
29020     * @since 3.2.0
29021     * @category Util
29022     * @param {Array|string} path The path of the property to get.
29023     * @param {*} srcValue The value to match.
29024     * @returns {Function} Returns the new spec function.
29025     * @example
29026     *
29027     * var objects = [
29028     *   { 'a': 1, 'b': 2, 'c': 3 },
29029     *   { 'a': 4, 'b': 5, 'c': 6 }
29030     * ];
29031     *
29032     * _.find(objects, _.matchesProperty('a', 4));
29033     * // => { 'a': 4, 'b': 5, 'c': 6 }
29034     *
29035     * // Checking for several possible values
29036     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));
29037     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
29038     */
29039    function matchesProperty(path, srcValue) {
29040      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
29041    }
29042
29043    /**
29044     * Creates a function that invokes the method at `path` of a given object.
29045     * Any additional arguments are provided to the invoked method.
29046     *
29047     * @static
29048     * @memberOf _
29049     * @since 3.7.0
29050     * @category Util
29051     * @param {Array|string} path The path of the method to invoke.
29052     * @param {...*} [args] The arguments to invoke the method with.
29053     * @returns {Function} Returns the new invoker function.
29054     * @example
29055     *
29056     * var objects = [
29057     *   { 'a': { 'b': _.constant(2) } },
29058     *   { 'a': { 'b': _.constant(1) } }
29059     * ];
29060     *
29061     * _.map(objects, _.method('a.b'));
29062     * // => [2, 1]
29063     *
29064     * _.map(objects, _.method(['a', 'b']));
29065     * // => [2, 1]
29066     */
29067    var method = baseRest(function(path, args) {
29068      return function(object) {
29069        return baseInvoke(object, path, args);
29070      };
29071    });
29072
29073    /**
29074     * The opposite of `_.method`; this method creates a function that invokes
29075     * the method at a given path of `object`. Any additional arguments are
29076     * provided to the invoked method.
29077     *
29078     * @static
29079     * @memberOf _
29080     * @since 3.7.0
29081     * @category Util
29082     * @param {Object} object The object to query.
29083     * @param {...*} [args] The arguments to invoke the method with.
29084     * @returns {Function} Returns the new invoker function.
29085     * @example
29086     *
29087     * var array = _.times(3, _.constant),
29088     *     object = { 'a': array, 'b': array, 'c': array };
29089     *
29090     * _.map(['a[2]', 'c[0]'], _.methodOf(object));
29091     * // => [2, 0]
29092     *
29093     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
29094     * // => [2, 0]
29095     */
29096    var methodOf = baseRest(function(object, args) {
29097      return function(path) {
29098        return baseInvoke(object, path, args);
29099      };
29100    });
29101
29102    /**
vendor: 10,734 bytes, lines 29103-29490
29103     * Adds all own enumerable string keyed function properties of a source
29104     * object to the destination object. If `object` is a function, then methods
29105     * are added to its prototype as well.
29106     *
29107     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
29108     * avoid conflicts caused by modifying the original.
29109     *
29110     * @static
29111     * @since 0.1.0
29112     * @memberOf _
29113     * @category Util
29114     * @param {Function|Object} [object=lodash] The destination object.
29115     * @param {Object} source The object of functions to add.
29116     * @param {Object} [options={}] The options object.
29117     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
29118     * @returns {Function|Object} Returns `object`.
29119     * @example
29120     *
29121     * function vowels(string) {
29122     *   return _.filter(string, function(v) {
29123     *     return /[aeiou]/i.test(v);
29124     *   });
29125     * }
29126     *
29127     * _.mixin({ 'vowels': vowels });
29128     * _.vowels('fred');
29129     * // => ['e']
29130     *
29131     * _('fred').vowels().value();
29132     * // => ['e']
29133     *
29134     * _.mixin({ 'vowels': vowels }, { 'chain': false });
29135     * _('fred').vowels();
29136     * // => ['e']
29137     */
29138    function mixin(object, source, options) {
29139      var props = keys(source),
29140          methodNames = baseFunctions(source, props);
29141
29142      if (options == null &&
29143          !(isObject(source) && (methodNames.length || !props.length))) {
29144        options = source;
29145        source = object;
29146        object = this;
29147        methodNames = baseFunctions(source, keys(source));
29148      }
29149      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
29150          isFunc = isFunction(object);
29151
29152      arrayEach(methodNames, function(methodName) {
29153        var func = source[methodName];
29154        object[methodName] = func;
29155        if (isFunc) {
29156          object.prototype[methodName] = function() {
29157            var chainAll = this.__chain__;
29158            if (chain || chainAll) {
29159              var result = object(this.__wrapped__),
29160                  actions = result.__actions__ = copyArray(this.__actions__);
29161
29162              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
29163              result.__chain__ = chainAll;
29164              return result;
29165            }
29166            return func.apply(object, arrayPush([this.value()], arguments));
29167          };
29168        }
29169      });
29170
29171      return object;
29172    }
29173
29174    /**
29175     * Reverts the `_` variable to its previous value and returns a reference to
29176     * the `lodash` function.
29177     *
29178     * @static
29179     * @since 0.1.0
29180     * @memberOf _
29181     * @category Util
29182     * @returns {Function} Returns the `lodash` function.
29183     * @example
29184     *
29185     * var lodash = _.noConflict();
29186     */
29187    function noConflict() {
29188      if (root._ === this) {
29189        root._ = oldDash;
29190      }
29191      return this;
29192    }
29193
29194    /**
29195     * This method returns `undefined`.
29196     *
29197     * @static
29198     * @memberOf _
29199     * @since 2.3.0
29200     * @category Util
29201     * @example
29202     *
29203     * _.times(2, _.noop);
29204     * // => [undefined, undefined]
29205     */
29206    function noop() {
29207      // No operation performed.
29208    }
29209
29210    /**
29211     * Creates a function that gets the argument at index `n`. If `n` is negative,
29212     * the nth argument from the end is returned.
29213     *
29214     * @static
29215     * @memberOf _
29216     * @since 4.0.0
29217     * @category Util
29218     * @param {number} [n=0] The index of the argument to return.
29219     * @returns {Function} Returns the new pass-thru function.
29220     * @example
29221     *
29222     * var func = _.nthArg(1);
29223     * func('a', 'b', 'c', 'd');
29224     * // => 'b'
29225     *
29226     * var func = _.nthArg(-2);
29227     * func('a', 'b', 'c', 'd');
29228     * // => 'c'
29229     */
29230    function nthArg(n) {
29231      n = toInteger(n);
29232      return baseRest(function(args) {
29233        return baseNth(args, n);
29234      });
29235    }
29236
29237    /**
29238     * Creates a function that invokes `iteratees` with the arguments it receives
29239     * and returns their results.
29240     *
29241     * @static
29242     * @memberOf _
29243     * @since 4.0.0
29244     * @category Util
29245     * @param {...(Function|Function[])} [iteratees=[_.identity]]
29246     *  The iteratees to invoke.
29247     * @returns {Function} Returns the new function.
29248     * @example
29249     *
29250     * var func = _.over([Math.max, Math.min]);
29251     *
29252     * func(1, 2, 3, 4);
29253     * // => [4, 1]
29254     */
29255    var over = createOver(arrayMap);
29256
29257    /**
29258     * Creates a function that checks if **all** of the `predicates` return
29259     * truthy when invoked with the arguments it receives.
29260     *
29261     * Following shorthands are possible for providing predicates.
29262     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
29263     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
29264     *
29265     * @static
29266     * @memberOf _
29267     * @since 4.0.0
29268     * @category Util
29269     * @param {...(Function|Function[])} [predicates=[_.identity]]
29270     *  The predicates to check.
29271     * @returns {Function} Returns the new function.
29272     * @example
29273     *
29274     * var func = _.overEvery([Boolean, isFinite]);
29275     *
29276     * func('1');
29277     * // => true
29278     *
29279     * func(null);
29280     * // => false
29281     *
29282     * func(NaN);
29283     * // => false
29284     */
29285    var overEvery = createOver(arrayEvery);
29286
29287    /**
29288     * Creates a function that checks if **any** of the `predicates` return
29289     * truthy when invoked with the arguments it receives.
29290     *
29291     * Following shorthands are possible for providing predicates.
29292     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
29293     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
29294     *
29295     * @static
29296     * @memberOf _
29297     * @since 4.0.0
29298     * @category Util
29299     * @param {...(Function|Function[])} [predicates=[_.identity]]
29300     *  The predicates to check.
29301     * @returns {Function} Returns the new function.
29302     * @example
29303     *
29304     * var func = _.overSome([Boolean, isFinite]);
29305     *
29306     * func('1');
29307     * // => true
29308     *
29309     * func(null);
29310     * // => true
29311     *
29312     * func(NaN);
29313     * // => false
29314     *
29315     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])
29316     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])
29317     */
29318    var overSome = createOver(arraySome);
29319
29320    /**
29321     * Creates a function that returns the value at `path` of a given object.
29322     *
29323     * @static
29324     * @memberOf _
29325     * @since 2.4.0
29326     * @category Util
29327     * @param {Array|string} path The path of the property to get.
29328     * @returns {Function} Returns the new accessor function.
29329     * @example
29330     *
29331     * var objects = [
29332     *   { 'a': { 'b': 2 } },
29333     *   { 'a': { 'b': 1 } }
29334     * ];
29335     *
29336     * _.map(objects, _.property('a.b'));
29337     * // => [2, 1]
29338     *
29339     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
29340     * // => [1, 2]
29341     */
29342    function property(path) {
29343      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
29344    }
29345
29346    /**
29347     * The opposite of `_.property`; this method creates a function that returns
29348     * the value at a given path of `object`.
29349     *
29350     * @static
29351     * @memberOf _
29352     * @since 3.0.0
29353     * @category Util
29354     * @param {Object} object The object to query.
29355     * @returns {Function} Returns the new accessor function.
29356     * @example
29357     *
29358     * var array = [0, 1, 2],
29359     *     object = { 'a': array, 'b': array, 'c': array };
29360     *
29361     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
29362     * // => [2, 0]
29363     *
29364     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
29365     * // => [2, 0]
29366     */
29367    function propertyOf(object) {
29368      return function(path) {
29369        return object == null ? undefined : baseGet(object, path);
29370      };
29371    }
29372
29373    /**
29374     * Creates an array of numbers (positive and/or negative) progressing from
29375     * `start` up to, but not including, `end`. A step of `-1` is used if a negative
29376     * `start` is specified without an `end` or `step`. If `end` is not specified,
29377     * it's set to `start` with `start` then set to `0`.
29378     *
29379     * **Note:** JavaScript follows the IEEE-754 standard for resolving
29380     * floating-point values which can produce unexpected results.
29381     *
29382     * @static
29383     * @since 0.1.0
29384     * @memberOf _
29385     * @category Util
29386     * @param {number} [start=0] The start of the range.
29387     * @param {number} end The end of the range.
29388     * @param {number} [step=1] The value to increment or decrement by.
29389     * @returns {Array} Returns the range of numbers.
29390     * @see _.inRange, _.rangeRight
29391     * @example
29392     *
29393     * _.range(4);
29394     * // => [0, 1, 2, 3]
29395     *
29396     * _.range(-4);
29397     * // => [0, -1, -2, -3]
29398     *
29399     * _.range(1, 5);
29400     * // => [1, 2, 3, 4]
29401     *
29402     * _.range(0, 20, 5);
29403     * // => [0, 5, 10, 15]
29404     *
29405     * _.range(0, -4, -1);
29406     * // => [0, -1, -2, -3]
29407     *
29408     * _.range(1, 4, 0);
29409     * // => [1, 1, 1]
29410     *
29411     * _.range(0);
29412     * // => []
29413     */
29414    var range = createRange();
29415
29416    /**
29417     * This method is like `_.range` except that it populates values in
29418     * descending order.
29419     *
29420     * @static
29421     * @memberOf _
29422     * @since 4.0.0
29423     * @category Util
29424     * @param {number} [start=0] The start of the range.
29425     * @param {number} end The end of the range.
29426     * @param {number} [step=1] The value to increment or decrement by.
29427     * @returns {Array} Returns the range of numbers.
29428     * @see _.inRange, _.range
29429     * @example
29430     *
29431     * _.rangeRight(4);
29432     * // => [3, 2, 1, 0]
29433     *
29434     * _.rangeRight(-4);
29435     * // => [-3, -2, -1, 0]
29436     *
29437     * _.rangeRight(1, 5);
29438     * // => [4, 3, 2, 1]
29439     *
29440     * _.rangeRight(0, 20, 5);
29441     * // => [15, 10, 5, 0]
29442     *
29443     * _.rangeRight(0, -4, -1);
29444     * // => [-3, -2, -1, 0]
29445     *
29446     * _.rangeRight(1, 4, 0);
29447     * // => [1, 1, 1]
29448     *
29449     * _.rangeRight(0);
29450     * // => []
29451     */
29452    var rangeRight = createRange(true);
29453
29454    /**
29455     * This method returns a new empty array.
29456     *
29457     * @static
29458     * @memberOf _
29459     * @since 4.13.0
29460     * @category Util
29461     * @returns {Array} Returns the new empty array.
29462     * @example
29463     *
29464     * var arrays = _.times(2, _.stubArray);
29465     *
29466     * console.log(arrays);
29467     * // => [[], []]
29468     *
29469     * console.log(arrays[0] === arrays[1]);
29470     * // => false
29471     */
29472    function stubArray() {
29473      return [];
29474    }
29475
29476    /**
29477     * This method returns `false`.
29478     *
29479     * @static
29480     * @memberOf _
29481     * @since 4.13.0
29482     * @category Util
29483     * @returns {boolean} Returns `false`.
29484     * @example
29485     *
29486     * _.times(2, _.stubFalse);
29487     * // => [false, false]
29488     */
29489    function stubFalse() {
29490      return false;
vendor: 1,044 bytes, lines 29491-29544
29491    }
29492
29493    /**
29494     * This method returns a new empty object.
29495     *
29496     * @static
29497     * @memberOf _
29498     * @since 4.13.0
29499     * @category Util
29500     * @returns {Object} Returns the new empty object.
29501     * @example
29502     *
29503     * var objects = _.times(2, _.stubObject);
29504     *
29505     * console.log(objects);
29506     * // => [{}, {}]
29507     *
29508     * console.log(objects[0] === objects[1]);
29509     * // => false
29510     */
29511    function stubObject() {
29512      return {};
29513    }
29514
29515    /**
29516     * This method returns an empty string.
29517     *
29518     * @static
29519     * @memberOf _
29520     * @since 4.13.0
29521     * @category Util
29522     * @returns {string} Returns the empty string.
29523     * @example
29524     *
29525     * _.times(2, _.stubString);
29526     * // => ['', '']
29527     */
29528    function stubString() {
29529      return '';
29530    }
29531
29532    /**
29533     * This method returns `true`.
29534     *
29535     * @static
29536     * @memberOf _
29537     * @since 4.13.0
29538     * @category Util
29539     * @returns {boolean} Returns `true`.
29540     * @example
29541     *
29542     * _.times(2, _.stubTrue);
29543     * // => [true, true]
29544     */
vendor: 9,081 bytes, lines 29545-29888
29545    function stubTrue() {
29546      return true;
29547    }
29548
29549    /**
29550     * Invokes the iteratee `n` times, returning an array of the results of
29551     * each invocation. The iteratee is invoked with one argument; (index).
29552     *
29553     * @static
29554     * @since 0.1.0
29555     * @memberOf _
29556     * @category Util
29557     * @param {number} n The number of times to invoke `iteratee`.
29558     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
29559     * @returns {Array} Returns the array of results.
29560     * @example
29561     *
29562     * _.times(3, String);
29563     * // => ['0', '1', '2']
29564     *
29565     *  _.times(4, _.constant(0));
29566     * // => [0, 0, 0, 0]
29567     */
29568    function times(n, iteratee) {
29569      n = toInteger(n);
29570      if (n < 1 || n > MAX_SAFE_INTEGER) {
29571        return [];
29572      }
29573      var index = MAX_ARRAY_LENGTH,
29574          length = nativeMin(n, MAX_ARRAY_LENGTH);
29575
29576      iteratee = getIteratee(iteratee);
29577      n -= MAX_ARRAY_LENGTH;
29578
29579      var result = baseTimes(length, iteratee);
29580      while (++index < n) {
29581        iteratee(index);
29582      }
29583      return result;
29584    }
29585
29586    /**
29587     * Converts `value` to a property path array.
29588     *
29589     * @static
29590     * @memberOf _
29591     * @since 4.0.0
29592     * @category Util
29593     * @param {*} value The value to convert.
29594     * @returns {Array} Returns the new property path array.
29595     * @example
29596     *
29597     * _.toPath('a.b.c');
29598     * // => ['a', 'b', 'c']
29599     *
29600     * _.toPath('a[0].b.c');
29601     * // => ['a', '0', 'b', 'c']
29602     */
29603    function toPath(value) {
29604      if (isArray(value)) {
29605        return arrayMap(value, toKey);
29606      }
29607      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
29608    }
29609
29610    /**
29611     * Generates a unique ID. If `prefix` is given, the ID is appended to it.
29612     *
29613     * @static
29614     * @since 0.1.0
29615     * @memberOf _
29616     * @category Util
29617     * @param {string} [prefix=''] The value to prefix the ID with.
29618     * @returns {string} Returns the unique ID.
29619     * @example
29620     *
29621     * _.uniqueId('contact_');
29622     * // => 'contact_104'
29623     *
29624     * _.uniqueId();
29625     * // => '105'
29626     */
29627    function uniqueId(prefix) {
29628      var id = ++idCounter;
29629      return toString(prefix) + id;
29630    }
29631
29632    /*------------------------------------------------------------------------*/
29633
29634    /**
29635     * Adds two numbers.
29636     *
29637     * @static
29638     * @memberOf _
29639     * @since 3.4.0
29640     * @category Math
29641     * @param {number} augend The first number in an addition.
29642     * @param {number} addend The second number in an addition.
29643     * @returns {number} Returns the total.
29644     * @example
29645     *
29646     * _.add(6, 4);
29647     * // => 10
29648     */
29649    var add = createMathOperation(function(augend, addend) {
29650      return augend + addend;
29651    }, 0);
29652
29653    /**
29654     * Computes `number` rounded up to `precision`.
29655     *
29656     * @static
29657     * @memberOf _
29658     * @since 3.10.0
29659     * @category Math
29660     * @param {number} number The number to round up.
29661     * @param {number} [precision=0] The precision to round up to.
29662     * @returns {number} Returns the rounded up number.
29663     * @example
29664     *
29665     * _.ceil(4.006);
29666     * // => 5
29667     *
29668     * _.ceil(6.004, 2);
29669     * // => 6.01
29670     *
29671     * _.ceil(6040, -2);
29672     * // => 6100
29673     */
29674    var ceil = createRound('ceil');
29675
29676    /**
29677     * Divide two numbers.
29678     *
29679     * @static
29680     * @memberOf _
29681     * @since 4.7.0
29682     * @category Math
29683     * @param {number} dividend The first number in a division.
29684     * @param {number} divisor The second number in a division.
29685     * @returns {number} Returns the quotient.
29686     * @example
29687     *
29688     * _.divide(6, 4);
29689     * // => 1.5
29690     */
29691    var divide = createMathOperation(function(dividend, divisor) {
29692      return dividend / divisor;
29693    }, 1);
29694
29695    /**
29696     * Computes `number` rounded down to `precision`.
29697     *
29698     * @static
29699     * @memberOf _
29700     * @since 3.10.0
29701     * @category Math
29702     * @param {number} number The number to round down.
29703     * @param {number} [precision=0] The precision to round down to.
29704     * @returns {number} Returns the rounded down number.
29705     * @example
29706     *
29707     * _.floor(4.006);
29708     * // => 4
29709     *
29710     * _.floor(0.046, 2);
29711     * // => 0.04
29712     *
29713     * _.floor(4060, -2);
29714     * // => 4000
29715     */
29716    var floor = createRound('floor');
29717
29718    /**
29719     * Computes the maximum value of `array`. If `array` is empty or falsey,
29720     * `undefined` is returned.
29721     *
29722     * @static
29723     * @since 0.1.0
29724     * @memberOf _
29725     * @category Math
29726     * @param {Array} array The array to iterate over.
29727     * @returns {*} Returns the maximum value.
29728     * @example
29729     *
29730     * _.max([4, 2, 8, 6]);
29731     * // => 8
29732     *
29733     * _.max([]);
29734     * // => undefined
29735     */
29736    function max(array) {
29737      return (array && array.length)
29738        ? baseExtremum(array, identity, baseGt)
29739        : undefined;
29740    }
29741
29742    /**
29743     * This method is like `_.max` except that it accepts `iteratee` which is
29744     * invoked for each element in `array` to generate the criterion by which
29745     * the value is ranked. The iteratee is invoked with one argument: (value).
29746     *
29747     * @static
29748     * @memberOf _
29749     * @since 4.0.0
29750     * @category Math
29751     * @param {Array} array The array to iterate over.
29752     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
29753     * @returns {*} Returns the maximum value.
29754     * @example
29755     *
29756     * var objects = [{ 'n': 1 }, { 'n': 2 }];
29757     *
29758     * _.maxBy(objects, function(o) { return o.n; });
29759     * // => { 'n': 2 }
29760     *
29761     * // The `_.property` iteratee shorthand.
29762     * _.maxBy(objects, 'n');
29763     * // => { 'n': 2 }
29764     */
29765    function maxBy(array, iteratee) {
29766      return (array && array.length)
29767        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
29768        : undefined;
29769    }
29770
29771    /**
29772     * Computes the mean of the values in `array`.
29773     *
29774     * @static
29775     * @memberOf _
29776     * @since 4.0.0
29777     * @category Math
29778     * @param {Array} array The array to iterate over.
29779     * @returns {number} Returns the mean.
29780     * @example
29781     *
29782     * _.mean([4, 2, 8, 6]);
29783     * // => 5
29784     */
29785    function mean(array) {
29786      return baseMean(array, identity);
29787    }
29788
29789    /**
29790     * This method is like `_.mean` except that it accepts `iteratee` which is
29791     * invoked for each element in `array` to generate the value to be averaged.
29792     * The iteratee is invoked with one argument: (value).
29793     *
29794     * @static
29795     * @memberOf _
29796     * @since 4.7.0
29797     * @category Math
29798     * @param {Array} array The array to iterate over.
29799     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
29800     * @returns {number} Returns the mean.
29801     * @example
29802     *
29803     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
29804     *
29805     * _.meanBy(objects, function(o) { return o.n; });
29806     * // => 5
29807     *
29808     * // The `_.property` iteratee shorthand.
29809     * _.meanBy(objects, 'n');
29810     * // => 5
29811     */
29812    function meanBy(array, iteratee) {
29813      return baseMean(array, getIteratee(iteratee, 2));
29814    }
29815
29816    /**
29817     * Computes the minimum value of `array`. If `array` is empty or falsey,
29818     * `undefined` is returned.
29819     *
29820     * @static
29821     * @since 0.1.0
29822     * @memberOf _
29823     * @category Math
29824     * @param {Array} array The array to iterate over.
29825     * @returns {*} Returns the minimum value.
29826     * @example
29827     *
29828     * _.min([4, 2, 8, 6]);
29829     * // => 2
29830     *
29831     * _.min([]);
29832     * // => undefined
29833     */
29834    function min(array) {
29835      return (array && array.length)
29836        ? baseExtremum(array, identity, baseLt)
29837        : undefined;
29838    }
29839
29840    /**
29841     * This method is like `_.min` except that it accepts `iteratee` which is
29842     * invoked for each element in `array` to generate the criterion by which
29843     * the value is ranked. The iteratee is invoked with one argument: (value).
29844     *
29845     * @static
29846     * @memberOf _
29847     * @since 4.0.0
29848     * @category Math
29849     * @param {Array} array The array to iterate over.
29850     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
29851     * @returns {*} Returns the minimum value.
29852     * @example
29853     *
29854     * var objects = [{ 'n': 1 }, { 'n': 2 }];
29855     *
29856     * _.minBy(objects, function(o) { return o.n; });
29857     * // => { 'n': 1 }
29858     *
29859     * // The `_.property` iteratee shorthand.
29860     * _.minBy(objects, 'n');
29861     * // => { 'n': 1 }
29862     */
29863    function minBy(array, iteratee) {
29864      return (array && array.length)
29865        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
29866        : undefined;
29867    }
29868
29869    /**
29870     * Multiply two numbers.
29871     *
29872     * @static
29873     * @memberOf _
29874     * @since 4.7.0
29875     * @category Math
29876     * @param {number} multiplier The first number in a multiplication.
29877     * @param {number} multiplicand The second number in a multiplication.
29878     * @returns {number} Returns the product.
29879     * @example
29880     *
29881     * _.multiply(6, 4);
29882     * // => 24
29883     */
29884    var multiply = createMathOperation(function(multiplier, multiplicand) {
29885      return multiplier * multiplicand;
29886    }, 1);
29887
29888    /**
vendor: 13,137 bytes, lines 29889-30327
29889     * Computes `number` rounded to `precision`.
29890     *
29891     * @static
29892     * @memberOf _
29893     * @since 3.10.0
29894     * @category Math
29895     * @param {number} number The number to round.
29896     * @param {number} [precision=0] The precision to round to.
29897     * @returns {number} Returns the rounded number.
29898     * @example
29899     *
29900     * _.round(4.006);
29901     * // => 4
29902     *
29903     * _.round(4.006, 2);
29904     * // => 4.01
29905     *
29906     * _.round(4060, -2);
29907     * // => 4100
29908     */
29909    var round = createRound('round');
29910
29911    /**
29912     * Subtract two numbers.
29913     *
29914     * @static
29915     * @memberOf _
29916     * @since 4.0.0
29917     * @category Math
29918     * @param {number} minuend The first number in a subtraction.
29919     * @param {number} subtrahend The second number in a subtraction.
29920     * @returns {number} Returns the difference.
29921     * @example
29922     *
29923     * _.subtract(6, 4);
29924     * // => 2
29925     */
29926    var subtract = createMathOperation(function(minuend, subtrahend) {
29927      return minuend - subtrahend;
29928    }, 0);
29929
29930    /**
29931     * Computes the sum of the values in `array`.
29932     *
29933     * @static
29934     * @memberOf _
29935     * @since 3.4.0
29936     * @category Math
29937     * @param {Array} array The array to iterate over.
29938     * @returns {number} Returns the sum.
29939     * @example
29940     *
29941     * _.sum([4, 2, 8, 6]);
29942     * // => 20
29943     */
29944    function sum(array) {
29945      return (array && array.length)
29946        ? baseSum(array, identity)
29947        : 0;
29948    }
29949
29950    /**
29951     * This method is like `_.sum` except that it accepts `iteratee` which is
29952     * invoked for each element in `array` to generate the value to be summed.
29953     * The iteratee is invoked with one argument: (value).
29954     *
29955     * @static
29956     * @memberOf _
29957     * @since 4.0.0
29958     * @category Math
29959     * @param {Array} array The array to iterate over.
29960     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
29961     * @returns {number} Returns the sum.
29962     * @example
29963     *
29964     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
29965     *
29966     * _.sumBy(objects, function(o) { return o.n; });
29967     * // => 20
29968     *
29969     * // The `_.property` iteratee shorthand.
29970     * _.sumBy(objects, 'n');
29971     * // => 20
29972     */
29973    function sumBy(array, iteratee) {
29974      return (array && array.length)
29975        ? baseSum(array, getIteratee(iteratee, 2))
29976        : 0;
29977    }
29978
29979    /*------------------------------------------------------------------------*/
29980
29981    // Add methods that return wrapped values in chain sequences.
29982    lodash.after = after;
29983    lodash.ary = ary;
29984    lodash.assign = assign;
29985    lodash.assignIn = assignIn;
29986    lodash.assignInWith = assignInWith;
29987    lodash.assignWith = assignWith;
29988    lodash.at = at;
29989    lodash.before = before;
29990    lodash.bind = bind;
29991    lodash.bindAll = bindAll;
29992    lodash.bindKey = bindKey;
29993    lodash.castArray = castArray;
29994    lodash.chain = chain;
29995    lodash.chunk = chunk;
29996    lodash.compact = compact;
29997    lodash.concat = concat;
29998    lodash.cond = cond;
29999    lodash.conforms = conforms;
30000    lodash.constant = constant;
30001    lodash.countBy = countBy;
30002    lodash.create = create;
30003    lodash.curry = curry;
30004    lodash.curryRight = curryRight;
30005    lodash.debounce = debounce;
30006    lodash.defaults = defaults;
30007    lodash.defaultsDeep = defaultsDeep;
30008    lodash.defer = defer;
30009    lodash.delay = delay;
30010    lodash.difference = difference;
30011    lodash.differenceBy = differenceBy;
30012    lodash.differenceWith = differenceWith;
30013    lodash.drop = drop;
30014    lodash.dropRight = dropRight;
30015    lodash.dropRightWhile = dropRightWhile;
30016    lodash.dropWhile = dropWhile;
30017    lodash.fill = fill;
30018    lodash.filter = filter;
30019    lodash.flatMap = flatMap;
30020    lodash.flatMapDeep = flatMapDeep;
30021    lodash.flatMapDepth = flatMapDepth;
30022    lodash.flatten = flatten;
30023    lodash.flattenDeep = flattenDeep;
30024    lodash.flattenDepth = flattenDepth;
30025    lodash.flip = flip;
30026    lodash.flow = flow;
30027    lodash.flowRight = flowRight;
30028    lodash.fromPairs = fromPairs;
30029    lodash.functions = functions;
30030    lodash.functionsIn = functionsIn;
30031    lodash.groupBy = groupBy;
30032    lodash.initial = initial;
30033    lodash.intersection = intersection;
30034    lodash.intersectionBy = intersectionBy;
30035    lodash.intersectionWith = intersectionWith;
30036    lodash.invert = invert;
30037    lodash.invertBy = invertBy;
30038    lodash.invokeMap = invokeMap;
30039    lodash.iteratee = iteratee;
30040    lodash.keyBy = keyBy;
30041    lodash.keys = keys;
30042    lodash.keysIn = keysIn;
30043    lodash.map = map;
30044    lodash.mapKeys = mapKeys;
30045    lodash.mapValues = mapValues;
30046    lodash.matches = matches;
30047    lodash.matchesProperty = matchesProperty;
30048    lodash.memoize = memoize;
30049    lodash.merge = merge;
30050    lodash.mergeWith = mergeWith;
30051    lodash.method = method;
30052    lodash.methodOf = methodOf;
30053    lodash.mixin = mixin;
30054    lodash.negate = negate;
30055    lodash.nthArg = nthArg;
30056    lodash.omit = omit;
30057    lodash.omitBy = omitBy;
30058    lodash.once = once;
30059    lodash.orderBy = orderBy;
30060    lodash.over = over;
30061    lodash.overArgs = overArgs;
30062    lodash.overEvery = overEvery;
30063    lodash.overSome = overSome;
30064    lodash.partial = partial;
30065    lodash.partialRight = partialRight;
30066    lodash.partition = partition;
30067    lodash.pick = pick;
30068    lodash.pickBy = pickBy;
30069    lodash.property = property;
30070    lodash.propertyOf = propertyOf;
30071    lodash.pull = pull;
30072    lodash.pullAll = pullAll;
30073    lodash.pullAllBy = pullAllBy;
30074    lodash.pullAllWith = pullAllWith;
30075    lodash.pullAt = pullAt;
30076    lodash.range = range;
30077    lodash.rangeRight = rangeRight;
30078    lodash.rearg = rearg;
30079    lodash.reject = reject;
30080    lodash.remove = remove;
30081    lodash.rest = rest;
30082    lodash.reverse = reverse;
30083    lodash.sampleSize = sampleSize;
30084    lodash.set = set;
30085    lodash.setWith = setWith;
30086    lodash.shuffle = shuffle;
30087    lodash.slice = slice;
30088    lodash.sortBy = sortBy;
30089    lodash.sortedUniq = sortedUniq;
30090    lodash.sortedUniqBy = sortedUniqBy;
30091    lodash.split = split;
30092    lodash.spread = spread;
30093    lodash.tail = tail;
30094    lodash.take = take;
30095    lodash.takeRight = takeRight;
30096    lodash.takeRightWhile = takeRightWhile;
30097    lodash.takeWhile = takeWhile;
30098    lodash.tap = tap;
30099    lodash.throttle = throttle;
30100    lodash.thru = thru;
30101    lodash.toArray = toArray;
30102    lodash.toPairs = toPairs;
30103    lodash.toPairsIn = toPairsIn;
30104    lodash.toPath = toPath;
30105    lodash.toPlainObject = toPlainObject;
30106    lodash.transform = transform;
30107    lodash.unary = unary;
30108    lodash.union = union;
30109    lodash.unionBy = unionBy;
30110    lodash.unionWith = unionWith;
30111    lodash.uniq = uniq;
30112    lodash.uniqBy = uniqBy;
30113    lodash.uniqWith = uniqWith;
30114    lodash.unset = unset;
30115    lodash.unzip = unzip;
30116    lodash.unzipWith = unzipWith;
30117    lodash.update = update;
30118    lodash.updateWith = updateWith;
30119    lodash.values = values;
30120    lodash.valuesIn = valuesIn;
30121    lodash.without = without;
30122    lodash.words = words;
30123    lodash.wrap = wrap;
30124    lodash.xor = xor;
30125    lodash.xorBy = xorBy;
30126    lodash.xorWith = xorWith;
30127    lodash.zip = zip;
30128    lodash.zipObject = zipObject;
30129    lodash.zipObjectDeep = zipObjectDeep;
30130    lodash.zipWith = zipWith;
30131
30132    // Add aliases.
30133    lodash.entries = toPairs;
30134    lodash.entriesIn = toPairsIn;
30135    lodash.extend = assignIn;
30136    lodash.extendWith = assignInWith;
30137
30138    // Add methods to `lodash.prototype`.
30139    mixin(lodash, lodash);
30140
30141    /*------------------------------------------------------------------------*/
30142
30143    // Add methods that return unwrapped values in chain sequences.
30144    lodash.add = add;
30145    lodash.attempt = attempt;
30146    lodash.camelCase = camelCase;
30147    lodash.capitalize = capitalize;
30148    lodash.ceil = ceil;
30149    lodash.clamp = clamp;
30150    lodash.clone = clone;
30151    lodash.cloneDeep = cloneDeep;
30152    lodash.cloneDeepWith = cloneDeepWith;
30153    lodash.cloneWith = cloneWith;
30154    lodash.conformsTo = conformsTo;
30155    lodash.deburr = deburr;
30156    lodash.defaultTo = defaultTo;
30157    lodash.divide = divide;
30158    lodash.endsWith = endsWith;
30159    lodash.eq = eq;
30160    lodash.escape = escape;
30161    lodash.escapeRegExp = escapeRegExp;
30162    lodash.every = every;
30163    lodash.find = find;
30164    lodash.findIndex = findIndex;
30165    lodash.findKey = findKey;
30166    lodash.findLast = findLast;
30167    lodash.findLastIndex = findLastIndex;
30168    lodash.findLastKey = findLastKey;
30169    lodash.floor = floor;
30170    lodash.forEach = forEach;
30171    lodash.forEachRight = forEachRight;
30172    lodash.forIn = forIn;
30173    lodash.forInRight = forInRight;
30174    lodash.forOwn = forOwn;
30175    lodash.forOwnRight = forOwnRight;
30176    lodash.get = get;
30177    lodash.gt = gt;
30178    lodash.gte = gte;
30179    lodash.has = has;
30180    lodash.hasIn = hasIn;
30181    lodash.head = head;
30182    lodash.identity = identity;
30183    lodash.includes = includes;
30184    lodash.indexOf = indexOf;
30185    lodash.inRange = inRange;
30186    lodash.invoke = invoke;
30187    lodash.isArguments = isArguments;
30188    lodash.isArray = isArray;
30189    lodash.isArrayBuffer = isArrayBuffer;
30190    lodash.isArrayLike = isArrayLike;
30191    lodash.isArrayLikeObject = isArrayLikeObject;
30192    lodash.isBoolean = isBoolean;
30193    lodash.isBuffer = isBuffer;
30194    lodash.isDate = isDate;
30195    lodash.isElement = isElement;
30196    lodash.isEmpty = isEmpty;
30197    lodash.isEqual = isEqual;
30198    lodash.isEqualWith = isEqualWith;
30199    lodash.isError = isError;
30200    lodash.isFinite = isFinite;
30201    lodash.isFunction = isFunction;
30202    lodash.isInteger = isInteger;
30203    lodash.isLength = isLength;
30204    lodash.isMap = isMap;
30205    lodash.isMatch = isMatch;
30206    lodash.isMatchWith = isMatchWith;
30207    lodash.isNaN = isNaN;
30208    lodash.isNative = isNative;
30209    lodash.isNil = isNil;
30210    lodash.isNull = isNull;
30211    lodash.isNumber = isNumber;
30212    lodash.isObject = isObject;
30213    lodash.isObjectLike = isObjectLike;
30214    lodash.isPlainObject = isPlainObject;
30215    lodash.isRegExp = isRegExp;
30216    lodash.isSafeInteger = isSafeInteger;
30217    lodash.isSet = isSet;
30218    lodash.isString = isString;
30219    lodash.isSymbol = isSymbol;
30220    lodash.isTypedArray = isTypedArray;
30221    lodash.isUndefined = isUndefined;
30222    lodash.isWeakMap = isWeakMap;
30223    lodash.isWeakSet = isWeakSet;
30224    lodash.join = join;
30225    lodash.kebabCase = kebabCase;
30226    lodash.last = last;
30227    lodash.lastIndexOf = lastIndexOf;
30228    lodash.lowerCase = lowerCase;
30229    lodash.lowerFirst = lowerFirst;
30230    lodash.lt = lt;
30231    lodash.lte = lte;
30232    lodash.max = max;
30233    lodash.maxBy = maxBy;
30234    lodash.mean = mean;
30235    lodash.meanBy = meanBy;
30236    lodash.min = min;
30237    lodash.minBy = minBy;
30238    lodash.stubArray = stubArray;
30239    lodash.stubFalse = stubFalse;
30240    lodash.stubObject = stubObject;
30241    lodash.stubString = stubString;
30242    lodash.stubTrue = stubTrue;
30243    lodash.multiply = multiply;
30244    lodash.nth = nth;
30245    lodash.noConflict = noConflict;
30246    lodash.noop = noop;
30247    lodash.now = now;
30248    lodash.pad = pad;
30249    lodash.padEnd = padEnd;
30250    lodash.padStart = padStart;
30251    lodash.parseInt = parseInt;
30252    lodash.random = random;
30253    lodash.reduce = reduce;
30254    lodash.reduceRight = reduceRight;
30255    lodash.repeat = repeat;
30256    lodash.replace = replace;
30257    lodash.result = result;
30258    lodash.round = round;
30259    lodash.runInContext = runInContext;
30260    lodash.sample = sample;
30261    lodash.size = size;
30262    lodash.snakeCase = snakeCase;
30263    lodash.some = some;
30264    lodash.sortedIndex = sortedIndex;
30265    lodash.sortedIndexBy = sortedIndexBy;
30266    lodash.sortedIndexOf = sortedIndexOf;
30267    lodash.sortedLastIndex = sortedLastIndex;
30268    lodash.sortedLastIndexBy = sortedLastIndexBy;
30269    lodash.sortedLastIndexOf = sortedLastIndexOf;
30270    lodash.startCase = startCase;
30271    lodash.startsWith = startsWith;
30272    lodash.subtract = subtract;
30273    lodash.sum = sum;
30274    lodash.sumBy = sumBy;
30275    lodash.template = template;
30276    lodash.times = times;
30277    lodash.toFinite = toFinite;
30278    lodash.toInteger = toInteger;
30279    lodash.toLength = toLength;
30280    lodash.toLower = toLower;
30281    lodash.toNumber = toNumber;
30282    lodash.toSafeInteger = toSafeInteger;
30283    lodash.toString = toString;
30284    lodash.toUpper = toUpper;
30285    lodash.trim = trim;
30286    lodash.trimEnd = trimEnd;
30287    lodash.trimStart = trimStart;
30288    lodash.truncate = truncate;
30289    lodash.unescape = unescape;
30290    lodash.uniqueId = uniqueId;
30291    lodash.upperCase = upperCase;
30292    lodash.upperFirst = upperFirst;
30293
30294    // Add aliases.
30295    lodash.each = forEach;
30296    lodash.eachRight = forEachRight;
30297    lodash.first = head;
30298
30299    mixin(lodash, (function() {
30300      var source = {};
30301      baseForOwn(lodash, function(func, methodName) {
30302        if (!hasOwnProperty.call(lodash.prototype, methodName)) {
30303          source[methodName] = func;
30304        }
30305      });
30306      return source;
30307    }()), { 'chain': false });
30308
30309    /*------------------------------------------------------------------------*/
30310
30311    /**
30312     * The semantic version number.
30313     *
30314     * @static
30315     * @memberOf _
30316     * @type {string}
30317     */
30318    lodash.VERSION = VERSION;
30319
30320    // Assign default placeholders.
30321    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
30322      lodash[methodName].placeholder = lodash;
30323    });
30324
30325    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
30326    arrayEach(['drop', 'take'], function(methodName, index) {
30327      LazyWrapper.prototype[methodName] = function(n) {
vendor: 7,434 bytes, lines 30328-30545
30328        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
30329
30330        var result = (this.__filtered__ && !index)
30331          ? new LazyWrapper(this)
30332          : this.clone();
30333
30334        if (result.__filtered__) {
30335          result.__takeCount__ = nativeMin(n, result.__takeCount__);
30336        } else {
30337          result.__views__.push({
30338            'size': nativeMin(n, MAX_ARRAY_LENGTH),
30339            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
30340          });
30341        }
30342        return result;
30343      };
30344
30345      LazyWrapper.prototype[methodName + 'Right'] = function(n) {
30346        return this.reverse()[methodName](n).reverse();
30347      };
30348    });
30349
30350    // Add `LazyWrapper` methods that accept an `iteratee` value.
30351    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
30352      var type = index + 1,
30353          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
30354
30355      LazyWrapper.prototype[methodName] = function(iteratee) {
30356        var result = this.clone();
30357        result.__iteratees__.push({
30358          'iteratee': getIteratee(iteratee, 3),
30359          'type': type
30360        });
30361        result.__filtered__ = result.__filtered__ || isFilter;
30362        return result;
30363      };
30364    });
30365
30366    // Add `LazyWrapper` methods for `_.head` and `_.last`.
30367    arrayEach(['head', 'last'], function(methodName, index) {
30368      var takeName = 'take' + (index ? 'Right' : '');
30369
30370      LazyWrapper.prototype[methodName] = function() {
30371        return this[takeName](1).value()[0];
30372      };
30373    });
30374
30375    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
30376    arrayEach(['initial', 'tail'], function(methodName, index) {
30377      var dropName = 'drop' + (index ? '' : 'Right');
30378
30379      LazyWrapper.prototype[methodName] = function() {
30380        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
30381      };
30382    });
30383
30384    LazyWrapper.prototype.compact = function() {
30385      return this.filter(identity);
30386    };
30387
30388    LazyWrapper.prototype.find = function(predicate) {
30389      return this.filter(predicate).head();
30390    };
30391
30392    LazyWrapper.prototype.findLast = function(predicate) {
30393      return this.reverse().find(predicate);
30394    };
30395
30396    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
30397      if (typeof path == 'function') {
30398        return new LazyWrapper(this);
30399      }
30400      return this.map(function(value) {
30401        return baseInvoke(value, path, args);
30402      });
30403    });
30404
30405    LazyWrapper.prototype.reject = function(predicate) {
30406      return this.filter(negate(getIteratee(predicate)));
30407    };
30408
30409    LazyWrapper.prototype.slice = function(start, end) {
30410      start = toInteger(start);
30411
30412      var result = this;
30413      if (result.__filtered__ && (start > 0 || end < 0)) {
30414        return new LazyWrapper(result);
30415      }
30416      if (start < 0) {
30417        result = result.takeRight(-start);
30418      } else if (start) {
30419        result = result.drop(start);
30420      }
30421      if (end !== undefined) {
30422        end = toInteger(end);
30423        result = end < 0 ? result.dropRight(-end) : result.take(end - start);
30424      }
30425      return result;
30426    };
30427
30428    LazyWrapper.prototype.takeRightWhile = function(predicate) {
30429      return this.reverse().takeWhile(predicate).reverse();
30430    };
30431
30432    LazyWrapper.prototype.toArray = function() {
30433      return this.take(MAX_ARRAY_LENGTH);
30434    };
30435
30436    // Add `LazyWrapper` methods to `lodash.prototype`.
30437    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
30438      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
30439          isTaker = /^(?:head|last)$/.test(methodName),
30440          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
30441          retUnwrapped = isTaker || /^find/.test(methodName);
30442
30443      if (!lodashFunc) {
30444        return;
30445      }
30446      lodash.prototype[methodName] = function() {
30447        var value = this.__wrapped__,
30448            args = isTaker ? [1] : arguments,
30449            isLazy = value instanceof LazyWrapper,
30450            iteratee = args[0],
30451            useLazy = isLazy || isArray(value);
30452
30453        var interceptor = function(value) {
30454          var result = lodashFunc.apply(lodash, arrayPush([value], args));
30455          return (isTaker && chainAll) ? result[0] : result;
30456        };
30457
30458        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
30459          // Avoid lazy use if the iteratee has a "length" value other than `1`.
30460          isLazy = useLazy = false;
30461        }
30462        var chainAll = this.__chain__,
30463            isHybrid = !!this.__actions__.length,
30464            isUnwrapped = retUnwrapped && !chainAll,
30465            onlyLazy = isLazy && !isHybrid;
30466
30467        if (!retUnwrapped && useLazy) {
30468          value = onlyLazy ? value : new LazyWrapper(this);
30469          var result = func.apply(value, args);
30470          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
30471          return new LodashWrapper(result, chainAll);
30472        }
30473        if (isUnwrapped && onlyLazy) {
30474          return func.apply(this, args);
30475        }
30476        result = this.thru(interceptor);
30477        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
30478      };
30479    });
30480
30481    // Add `Array` methods to `lodash.prototype`.
30482    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
30483      var func = arrayProto[methodName],
30484          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
30485          retUnwrapped = /^(?:pop|shift)$/.test(methodName);
30486
30487      lodash.prototype[methodName] = function() {
30488        var args = arguments;
30489        if (retUnwrapped && !this.__chain__) {
30490          var value = this.value();
30491          return func.apply(isArray(value) ? value : [], args);
30492        }
30493        return this[chainName](function(value) {
30494          return func.apply(isArray(value) ? value : [], args);
30495        });
30496      };
30497    });
30498
30499    // Map minified method names to their real names.
30500    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
30501      var lodashFunc = lodash[methodName];
30502      if (lodashFunc) {
30503        var key = lodashFunc.name + '';
30504        if (!hasOwnProperty.call(realNames, key)) {
30505          realNames[key] = [];
30506        }
30507        realNames[key].push({ 'name': methodName, 'func': lodashFunc });
30508      }
30509    });
30510
30511    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
30512      'name': 'wrapper',
30513      'func': undefined
30514    }];
30515
30516    // Add methods to `LazyWrapper`.
30517    LazyWrapper.prototype.clone = lazyClone;
30518    LazyWrapper.prototype.reverse = lazyReverse;
30519    LazyWrapper.prototype.value = lazyValue;
30520
30521    // Add chain sequence methods to the `lodash` wrapper.
30522    lodash.prototype.at = wrapperAt;
30523    lodash.prototype.chain = wrapperChain;
30524    lodash.prototype.commit = wrapperCommit;
30525    lodash.prototype.next = wrapperNext;
30526    lodash.prototype.plant = wrapperPlant;
30527    lodash.prototype.reverse = wrapperReverse;
30528    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
30529
30530    // Add lazy aliases.
30531    lodash.prototype.first = lodash.prototype.head;
30532
30533    if (symIterator) {
30534      lodash.prototype[symIterator] = wrapperToIterator;
30535    }
30536    return lodash;
30537  });
30538
30539  /*--------------------------------------------------------------------------*/
30540
30541  // Export lodash.
30542  var _ = runInContext();
30543
30544  // Some AMD build optimizers, like r.js, check for condition patterns like:
30545  if (t
30545ypeof define == 'function' && typeof define.amd == 'object' && define.amd) {
30546    // Expose Lodash on the global object to prevent errors when Lodash is
30547    // loaded by a script tag in the presence of an AMD loader.
30548    // See http://requirejs.org/docs/errors.html#mismatch for more details.
30549    // Use `_.noConflict` to remove Lodash from the global object.
30550    root._ = _;
30551
30552    // Define as an anonymous module so, through path mapping, it can be
30553    // referenced as the "underscore" module.
30554    define(function() {
30555      return _;
30556    });
30557  }
30558  // Check for `exports` after `define` in case a build optimizer adds it.
30559  else if (freeModule) {
30560    // Export for Node.js.
30561    (freeModule.exports = _)._ = _;
30562    // Export for CommonJS support.
30563    freeExports._ = _;
30564  }
30565  else {
30566    // Export to the global object.
30567    root._ = _;
30568  }
30569}.call(this));
30570
30571}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
30572},{}],29:[function(require,module,exports){
30573/*! VelocityJS.org (1.4.0). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */
30574
30575/*************************
30576 Velocity jQuery Shim
30577 *************************/
30578
vendor: 193,527 bytes, lines 30579-35118
30579/*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */
30580
30581/* This file contains the jQuery functions that Velocity relies on, thereby removing Velocity's dependency on a full copy of jQuery, and allowing it to work in any environment. */
30582/* These shimmed functions are only used if jQuery isn't present. If both this shim and jQuery are loaded, Velocity defaults to jQuery proper. */
30583/* Browser support: Using this shim instead of jQuery proper removes support for IE8. */
30584
30585(function(window) {
30586	"use strict";
30587	/***************
30588	 Setup
30589	 ***************/
30590
30591	/* If jQuery is already loaded, there's no point in loading this shim. */
30592	if (window.jQuery) {
30593		return;
30594	}
30595
30596	/* jQuery base. */
30597	var $ = function(selector, context) {
30598		return new $.fn.init(selector, context);
30599	};
30600
30601	/********************
30602	 Private Methods
30603	 ********************/
30604
30605	/* jQuery */
30606	$.isWindow = function(obj) {
30607		/* jshint eqeqeq: false */
30608		return obj && obj === obj.window;
30609	};
30610
30611	/* jQuery */
30612	$.type = function(obj) {
30613		if (!obj) {
30614			return obj + "";
30615		}
30616
30617		return typeof obj === "object" || typeof obj === "function" ?
30618				class2type[toString.call(obj)] || "object" :
30619				typeof obj;
30620	};
30621
30622	/* jQuery */
30623	$.isArray = Array.isArray || function(obj) {
30624		return $.type(obj) === "array";
30625	};
30626
30627	/* jQuery */
30628	function isArraylike(obj) {
30629		var length = obj.length,
30630				type = $.type(obj);
30631
30632		if (type === "function" || $.isWindow(obj)) {
30633			return false;
30634		}
30635
30636		if (obj.nodeType === 1 && length) {
30637			return true;
30638		}
30639
30640		return type === "array" || length === 0 || typeof length === "number" && length > 0 && (length - 1) in obj;
30641	}
30642
30643	/***************
30644	 $ Methods
30645	 ***************/
30646
30647	/* jQuery: Support removed for IE<9. */
30648	$.isPlainObject = function(obj) {
30649		var key;
30650
30651		if (!obj || $.type(obj) !== "object" || obj.nodeType || $.isWindow(obj)) {
30652			return false;
30653		}
30654
30655		try {
30656			if (obj.constructor &&
30657					!hasOwn.call(obj, "constructor") &&
30658					!hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
30659				return false;
30660			}
30661		} catch (e) {
30662			return false;
30663		}
30664
30665		for (key in obj) {
30666		}
30667
30668		return key === undefined || hasOwn.call(obj, key);
30669	};
30670
30671	/* jQuery */
30672	$.each = function(obj, callback, args) {
30673		var value,
30674				i = 0,
30675				length = obj.length,
30676				isArray = isArraylike(obj);
30677
30678		if (args) {
30679			if (isArray) {
30680				for (; i < length; i++) {
30681					value = callback.apply(obj[i], args);
30682
30683					if (value === false) {
30684						break;
30685					}
30686				}
30687			} else {
30688				for (i in obj) {
30689					if (!obj.hasOwnProperty(i)) {
30690						continue;
30691					}
30692					value = callback.apply(obj[i], args);
30693
30694					if (value === false) {
30695						break;
30696					}
30697				}
30698			}
30699
30700		} else {
30701			if (isArray) {
30702				for (; i < length; i++) {
30703					value = callback.call(obj[i], i, obj[i]);
30704
30705					if (value === false) {
30706						break;
30707					}
30708				}
30709			} else {
30710				for (i in obj) {
30711					if (!obj.hasOwnProperty(i)) {
30712						continue;
30713					}
30714					value = callback.call(obj[i], i, obj[i]);
30715
30716					if (value === false) {
30717						break;
30718					}
30719				}
30720			}
30721		}
30722
30723		return obj;
30724	};
30725
30726	/* Custom */
30727	$.data = function(node, key, value) {
30728		/* $.getData() */
30729		if (value === undefined) {
30730			var getId = node[$.expando],
30731					store = getId && cache[getId];
30732
30733			if (key === undefined) {
30734				return store;
30735			} else if (store) {
30736				if (key in store) {
30737					return store[key];
30738				}
30739			}
30740			/* $.setData() */
30741		} else if (key !== undefined) {
30742			var setId = node[$.expando] || (node[$.expando] = ++$.uuid);
30743
30744			cache[setId] = cache[setId] || {};
30745			cache[setId][key] = value;
30746
30747			return value;
30748		}
30749	};
30750
30751	/* Custom */
30752	$.removeData = function(node, keys) {
30753		var id = node[$.expando],
30754				store = id && cache[id];
30755
30756		if (store) {
30757			// Cleanup the entire store if no keys are provided.
30758			if (!keys) {
30759				delete cache[id];
30760			} else {
30761				$.each(keys, function(_, key) {
30762					delete store[key];
30763				});
30764			}
30765		}
30766	};
30767
30768	/* jQuery */
30769	$.extend = function() {
30770		var src, copyIsArray, copy, name, options, clone,
30771				target = arguments[0] || {},
30772				i = 1,
30773				length = arguments.length,
30774				deep = false;
30775
30776		if (typeof target === "boolean") {
30777			deep = target;
30778
30779			target = arguments[i] || {};
30780			i++;
30781		}
30782
30783		if (typeof target !== "object" && $.type(target) !== "function") {
30784			target = {};
30785		}
30786
30787		if (i === length) {
30788			target = this;
30789			i--;
30790		}
30791
30792		for (; i < length; i++) {
30793			if ((options = arguments[i])) {
30794				for (name in options) {
30795					if (!options.hasOwnProperty(name)) {
30796						continue;
30797					}
30798					src = target[name];
30799					copy = options[name];
30800
30801					if (target === copy) {
30802						continue;
30803					}
30804
30805					if (deep && copy && ($.isPlainObject(copy) || (copyIsArray = $.isArray(copy)))) {
30806						if (copyIsArray) {
30807							copyIsArray = false;
30808							clone = src && $.isArray(src) ? src : [];
30809
30810						} else {
30811							clone = src && $.isPlainObject(src) ? src : {};
30812						}
30813
30814						target[name] = $.extend(deep, clone, copy);
30815
30816					} else if (copy !== undefined) {
30817						target[name] = copy;
30818					}
30819				}
30820			}
30821		}
30822
30823		return target;
30824	};
30825
30826	/* jQuery 1.4.3 */
30827	$.queue = function(elem, type, data) {
30828		function $makeArray(arr, results) {
30829			var ret = results || [];
30830
30831			if (arr) {
30832				if (isArraylike(Object(arr))) {
30833					/* $.merge */
30834					(function(first, second) {
30835						var len = +second.length,
30836								j = 0,
30837								i = first.length;
30838
30839						while (j < len) {
30840							first[i++] = second[j++];
30841						}
30842
30843						if (len !== len) {
30844							while (second[j] !== undefined) {
30845								first[i++] = second[j++];
30846							}
30847						}
30848
30849						first.length = i;
30850
30851						return first;
30852					})(ret, typeof arr === "string" ? [arr] : arr);
30853				} else {
30854					[].push.call(ret, arr);
30855				}
30856			}
30857
30858			return ret;
30859		}
30860
30861		if (!elem) {
30862			return;
30863		}
30864
30865		type = (type || "fx") + "queue";
30866
30867		var q = $.data(elem, type);
30868
30869		if (!data) {
30870			return q || [];
30871		}
30872
30873		if (!q || $.isArray(data)) {
30874			q = $.data(elem, type, $makeArray(data));
30875		} else {
30876			q.push(data);
30877		}
30878
30879		return q;
30880	};
30881
30882	/* jQuery 1.4.3 */
30883	$.dequeue = function(elems, type) {
30884		/* Custom: Embed element iteration. */
30885		$.each(elems.nodeType ? [elems] : elems, function(i, elem) {
30886			type = type || "fx";
30887
30888			var queue = $.queue(elem, type),
30889					fn = queue.shift();
30890
30891			if (fn === "inprogress") {
30892				fn = queue.shift();
30893			}
30894
30895			if (fn) {
30896				if (type === "fx") {
30897					queue.unshift("inprogress");
30898				}
30899
30900				fn.call(elem, function() {
30901					$.dequeue(elem, type);
30902				});
30903			}
30904		});
30905	};
30906
30907	/******************
30908	 $.fn Methods
30909	 ******************/
30910
30911	/* jQuery */
30912	$.fn = $.prototype = {
30913		init: function(selector) {
30914			/* Just return the element wrapped inside an array; don't proceed with the actual jQuery node wrapping process. */
30915			if (selector.nodeType) {
30916				this[0] = selector;
30917
30918				return this;
30919			} else {
30920				throw new Error("Not a DOM node.");
30921			}
30922		},
30923		offset: function() {
30924			/* jQuery altered code: Dropped disconnected DOM node checking. */
30925			var box = this[0].getBoundingClientRect ? this[0].getBoundingClientRect() : {top: 0, left: 0};
30926
30927			return {
30928				top: box.top + (window.pageYOffset || document.scrollTop || 0) - (document.clientTop || 0),
30929				left: box.left + (window.pageXOffset || document.scrollLeft || 0) - (document.clientLeft || 0)
30930			};
30931		},
30932		position: function() {
30933			/* jQuery */
30934			function offsetParentFn(elem) {
30935				var offsetParent = elem.offsetParent;
30936
30937				while (offsetParent && offsetParent.nodeName.toLowerCase() !== "html" && offsetParent.style && offsetParent.style.position === "static") {
30938					offsetParent = offsetParent.offsetParent;
30939				}
30940
30941				return offsetParent || document;
30942			}
30943
30944			/* Zepto */
30945			var elem = this[0],
30946					offsetParent = offsetParentFn(elem),
30947					offset = this.offset(),
30948					parentOffset = /^(?:body|html)$/i.test(offsetParent.nodeName) ? {top: 0, left: 0} : $(offsetParent).offset();
30949
30950			offset.top -= parseFloat(elem.style.marginTop) || 0;
30951			offset.left -= parseFloat(elem.style.marginLeft) || 0;
30952
30953			if (offsetParent.style) {
30954				parentOffset.top += parseFloat(offsetParent.style.borderTopWidth) || 0;
30955				parentOffset.left += parseFloat(offsetParent.style.borderLeftWidth) || 0;
30956			}
30957
30958			return {
30959				top: offset.top - parentOffset.top,
30960				left: offset.left - parentOffset.left
30961			};
30962		}
30963	};
30964
30965	/**********************
30966	 Private Variables
30967	 **********************/
30968
30969	/* For $.data() */
30970	var cache = {};
30971	$.expando = "velocity" + (new Date().getTime());
30972	$.uuid = 0;
30973
30974	/* For $.queue() */
30975	var class2type = {},
30976			hasOwn = class2type.hasOwnProperty,
30977			toString = class2type.toString;
30978
30979	var types = "Boolean Number String Function Array Date RegExp Object Error".split(" ");
30980	for (var i = 0; i < types.length; i++) {
30981		class2type["[object " + types[i] + "]"] = types[i].toLowerCase();
30982	}
30983
30984	/* Makes $(node) possible, without having to call init. */
30985	$.fn.init.prototype = $.fn;
30986
30987	/* Globalize Velocity onto the window, and assign its Utilities property. */
30988	window.Velocity = {Utilities: $};
30989})(window);
30990
30991/******************
30992 Velocity.js
30993 ******************/
30994
30995(function(factory) {
30996	"use strict";
30997	/* CommonJS module. */
30998	if (typeof module === "object" && typeof module.exports === "object") {
30999		module.exports = factory();
31000		/* AMD module. */
31001	} else if (typeof define === "function" && define.amd) {
31002		define(factory);
31003		/* Browser globals. */
31004	} else {
31005		factory();
31006	}
31007}(function() {
31008	"use strict";
31009	return function(global, window, document, undefined) {
31010
31011		/***************
31012		 Summary
31013		 ***************/
31014
31015		/*
31016		 - CSS: CSS stack that works independently from the rest of Velocity.
31017		 - animate(): Core animation method that iterates over the targeted elements and queues the incoming call onto each element individually.
31018		 - Pre-Queueing: Prepare the element for animation by instantiating its data cache and processing the call's options.
31019		 - Queueing: The logic that runs once the call has reached its point of execution in the element's $.queue() stack.
31020		 Most logic is placed here to avoid risking it becoming stale (if the element's properties have changed).
31021		 - Pushing: Consolidation of the tween data followed by its push onto the global in-progress calls container.
31022		 - tick(): The single requestAnimationFrame loop responsible for tweening all in-progress calls.
31023		 - completeCall(): Handles the cleanup process for each Velocity call.
31024		 */
31025
31026		/*********************
31027		 Helper Functions
31028		 *********************/
31029
31030		/* IE detection. Gist: https://gist.github.com/julianshapiro/9098609 */
31031		var IE = (function() {
31032			if (document.documentMode) {
31033				return document.documentMode;
31034			} else {
31035				for (var i = 7; i > 4; i--) {
31036					var div = document.createElement("div");
31037
31038					div.innerHTML = "<!--[if IE " + i + "]><span></span><![endif]-->";
31039
31040					if (div.getElementsByTagName("span").length) {
31041						div = null;
31042
31043						return i;
31044					}
31045				}
31046			}
31047
31048			return undefined;
31049		})();
31050
31051		/* rAF shim. Gist: https://gist.github.com/julianshapiro/9497513 */
31052		var rAFShim = (function() {
31053			var timeLast = 0;
31054
31055			return window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) {
31056				var timeCurrent = (new Date()).getTime(),
31057						timeDelta;
31058
31059				/* Dynamically set delay on a per-tick basis to match 60fps. */
31060				/* Technique by Erik Moller. MIT license: https://gist.github.com/paulirish/1579671 */
31061				timeDelta = Math.max(0, 16 - (timeCurrent - timeLast));
31062				timeLast = timeCurrent + timeDelta;
31063
31064				return setTimeout(function() {
31065					callback(timeCurrent + timeDelta);
31066				}, timeDelta);
31067			};
31068		})();
31069
31070		var performance = (function() {
31071			var perf = window.performance || {};
31072
31073			if (!perf.hasOwnProperty("now")) {
31074				var nowOffset = perf.timing && perf.timing.domComplete ? perf.timing.domComplete : (new Date()).getTime();
31075
31076				perf.now = function() {
31077					return (new Date()).getTime() - nowOffset;
31078				};
31079			}
31080			return perf;
31081		})();
31082
31083		/* Array compacting. Copyright Lo-Dash. MIT License: https://github.com/lodash/lodash/blob/master/LICENSE.txt */
31084		function compactSparseArray(array) {
31085			var index = -1,
31086					length = array ? array.length : 0,
31087					result = [];
31088
31089			while (++index < length) {
31090				var value = array[index];
31091
31092				if (value) {
31093					result.push(value);
31094				}
31095			}
31096
31097			return result;
31098		}
31099
31100		function sanitizeElements(elements) {
31101			/* Unwrap jQuery/Zepto objects. */
31102			if (Type.isWrapped(elements)) {
31103				elements = [].slice.call(elements);
31104				/* Wrap a single element in an array so that $.each() can iterate with the element instead of its node's children. */
31105			} else if (Type.isNode(elements)) {
31106				elements = [elements];
31107			}
31108
31109			return elements;
31110		}
31111
31112		var Type = {
31113			isNumber: function(variable) {
31114				return (typeof variable === "number");
31115			},
31116			isString: function(variable) {
31117				return (typeof variable === "string");
31118			},
31119			isArray: Array.isArray || function(variable) {
31120				return Object.prototype.toString.call(variable) === "[object Array]";
31121			},
31122			isFunction: function(variable) {
31123				return Object.prototype.toString.call(variable) === "[object Function]";
31124			},
31125			isNode: function(variable) {
31126				return variable && variable.nodeType;
31127			},
31128			/* Copyright Martin Bohm. MIT License: https://gist.github.com/Tomalak/818a78a226a0738eaade */
31129			isNodeList: function(variable) {
31130				return typeof variable === "object" &&
31131						/^\[object (HTMLCollection|NodeList|Object)\]$/.test(Object.prototype.toString.call(variable)) &&
31132						variable.length !== undefined &&
31133						(variable.length === 0 || (typeof variable[0] === "object" && variable[0].nodeType > 0));
31134			},
31135			/* Determine if variable is an array-like wrapped jQuery, Zepto or similar element. */
31136			isWrapped: function(variable) {
31137				return variable && (Type.isArray(variable) || (Type.isNumber(variable.length) && !Type.isString(variable) && !Type.isFunction(variable)));
31138			},
31139			isSVG: function(variable) {
31140				return window.SVGElement && (variable instanceof window.SVGElement);
31141			},
31142			isEmptyObject: function(variable) {
31143				for (var name in variable) {
31144					if (variable.hasOwnProperty(name)) {
31145						return false;
31146					}
31147				}
31148
31149				return true;
31150			}
31151		};
31152
31153		/*****************
31154		 Dependencies
31155		 *****************/
31156
31157		var $,
31158				isJQuery = false;
31159
31160		if (global.fn && global.fn.jquery) {
31161			$ = global;
31162			isJQuery = true;
31163		} else {
31164			$ = window.Velocity.Utilities;
31165		}
31166
31167		if (IE <= 8 && !isJQuery) {
31168			throw new Error("Velocity: IE8 and below require jQuery to be loaded before Velocity.");
31169		} else if (IE <= 7) {
31170			/* Revert to jQuery's $.animate(), and lose Velocity's extra features. */
31171			jQuery.fn.velocity = jQuery.fn.animate;
31172
31173			/* Now that $.fn.velocity is aliased, abort this Velocity declaration. */
31174			return;
31175		}
31176
31177		/*****************
31178		 Constants
31179		 *****************/
31180
31181		var DURATION_DEFAULT = 400,
31182				EASING_DEFAULT = "swing";
31183
31184		/*************
31185		 State
31186		 *************/
31187
31188		var Velocity = {
31189			/* Container for page-wide Velocity state data. */
31190			State: {
31191				/* Detect mobile devices to determine if mobileHA should be turned on. */
31192				isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),
31193				/* The mobileHA option's behavior changes on older Android devices (Gingerbread, versions 2.3.3-2.3.7). */
31194				isAndroid: /Android/i.test(navigator.userAgent),
31195				isGingerbread: /Android 2\.3\.[3-7]/i.test(navigator.userAgent),
31196				isChrome: window.chrome,
31197				isFirefox: /Firefox/i.test(navigator.userAgent),
31198				/* Create a cached element for re-use when checking for CSS property prefixes. */
31199				prefixElement: document.createElement("div"),
31200				/* Cache every prefix match to avoid repeating lookups. */
31201				prefixMatches: {},
31202				/* Cache the anchor used for animating window scrolling. */
31203				scrollAnchor: null,
31204				/* Cache the browser-specific property names associated with the scroll anchor. */
31205				scrollPropertyLeft: null,
31206				scrollPropertyTop: null,
31207				/* Keep track of whether our RAF tick is running. */
31208				isTicking: false,
31209				/* Container for every in-progress call to Velocity. */
31210				calls: [],
31211				delayedElements: {
31212					count: 0
31213				}
31214			},
31215			/* Velocity's custom CSS stack. Made global for unit testing. */
31216			CSS: {/* Defined below. */},
31217			/* A shim of the jQuery utility functions used by Velocity -- provided by Velocity's optional jQuery shim. */
31218			Utilities: $,
31219			/* Container for the user's custom animation redirects that are referenced by name in place of the properties map argument. */
31220			Redirects: {/* Manually registered by the user. */},
31221			Easings: {/* Defined below. */},
31222			/* Attempt to use ES6 Promises by default. Users can override this with a third-party promises library. */
31223			Promise: window.Promise,
31224			/* Velocity option defaults, which can be overriden by the user. */
31225			defaults: {
31226				queue: "",
31227				duration: DURATION_DEFAULT,
31228				easing: EASING_DEFAULT,
31229				begin: undefined,
31230				complete: undefined,
31231				progress: undefined,
31232				display: undefined,
31233				visibility: undefined,
31234				loop: false,
31235				delay: false,
31236				mobileHA: true,
31237				/* Advanced: Set to false to prevent property values from being cached between consecutive Velocity-initiated chain calls. */
31238				_cacheValues: true,
31239				/* Advanced: Set to false if the promise should always resolve on empty element lists. */
31240				promiseRejectEmpty: true
31241			},
31242			/* A design goal of Velocity is to cache data wherever possible in order to avoid DOM requerying. Accordingly, each element has a data cache. */
31243			init: function(element) {
31244				$.data(element, "velocity", {
31245					/* Store whether this is an SVG element, since its properties are retrieved and updated differently than standard HTML elements. */
31246					isSVG: Type.isSVG(element),
31247					/* Keep track of whether the element is currently being animated by Velocity.
31248					 This is used to ensure that property values are not transferred between non-consecutive (stale) calls. */
31249					isAnimating: false,
31250					/* A reference to the element's live computedStyle object. Learn more here: https://developer.mozilla.org/en/docs/Web/API/window.getComputedStyle */
31251					computedStyle: null,
31252					/* Tween data is cached for each animation on the element so that data can be passed across calls --
31253					 in particular, end values are used as subsequent start values in consecutive Velocity calls. */
31254					tweensContainer: null,
31255					/* The full root property values of each CSS hook being animated on this element are cached so that:
31256					 1) Concurrently-animating hooks sharing the same root can have their root values' merged into one while tweening.
31257					 2) Post-hook-injection root values can be transferred over to consecutively chained Velocity calls as starting root values. */
31258					rootPropertyValueCache: {},
31259					/* A cache for transform updates, which must be manually flushed via CSS.flushTransformCache(). */
31260					transformCache: {}
31261				});
31262			},
31263			/* A parallel to jQuery's $.css(), used for getting/setting Velocity's hooked CSS properties. */
31264			hook: null, /* Defined below. */
31265			/* Velocity-wide animation time remapping for testing purposes. */
31266			mock: false,
31267			version: {major: 1, minor: 4, patch: 0},
31268			/* Set to 1 or 2 (most verbose) to output debug info to console. */
31269			debug: false,
31270			/* Use rAF high resolution timestamp when available */
31271			timestamp: true,
31272			/* Pause all animations */
31273			pauseAll: function(queueName) {
31274				var currentTime = (new Date()).getTime();
31275
31276				$.each(Velocity.State.calls, function(i, activeCall) {
31277
31278					if (activeCall) {
31279
31280						/* If we have a queueName and this call is not on that queue, skip */
31281						if (queueName !== undefined && ((activeCall[2].queue !== queueName) || (activeCall[2].queue === false))) {
31282							return true;
31283						}
31284
31285						/* Set call to paused */
31286						activeCall[5] = {
31287							resume: false
31288						};
31289					}
31290				});
31291
31292				/* Pause timers on any currently delayed calls */
31293				$.each(Velocity.State.delayedElements, function(k, element) {
31294					if (!element) {
31295						return;
31296					}
31297					pauseDelayOnElement(element, currentTime);
31298				});
31299			},
31300			/* Resume all animations */
31301			resumeAll: function(queueName) {
31302				var currentTime = (new Date()).getTime();
31303
31304				$.each(Velocity.State.calls, function(i, activeCall) {
31305
31306					if (activeCall) {
31307
31308						/* If we have a queueName and this call is not on that queue, skip */
31309						if (queueName !== undefined && ((activeCall[2].queue !== queueName) || (activeCall[2].queue === false))) {
31310							return true;
31311						}
31312
31313						/* Set call to resumed if it was paused */
31314						if (activeCall[5]) {
31315							activeCall[5].resume = true;
31316						}
31317					}
31318				});
31319				/* Resume timers on any currently delayed calls */
31320				$.each(Velocity.State.delayedElements, function(k, element) {
31321					if (!element) {
31322						return;
31323					}
31324					resumeDelayOnElement(element, currentTime);
31325				});
31326			}
31327		};
31328
31329		/* Retrieve the appropriate scroll anchor and property name for the browser: https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY */
31330		if (window.pageYOffset !== undefined) {
31331			Velocity.State.scrollAnchor = window;
31332			Velocity.State.scrollPropertyLeft = "pageXOffset";
31333			Velocity.State.scrollPropertyTop = "pageYOffset";
31334		} else {
31335			Velocity.State.scrollAnchor = document.documentElement || document.body.parentNode || document.body;
31336			Velocity.State.scrollPropertyLeft = "scrollLeft";
31337			Velocity.State.scrollPropertyTop = "scrollTop";
31338		}
31339
31340		/* Shorthand alias for jQuery's $.data() utility. */
31341		function Data(element) {
31342			/* Hardcode a reference to the plugin name. */
31343			var response = $.data(element, "velocity");
31344
31345			/* jQuery <=1.4.2 returns null instead of undefined when no match is found. We normalize this behavior. */
31346			return response === null ? undefined : response;
31347		}
31348
31349		/**************
31350		 Delay Timer
31351		 **************/
31352
31353		function pauseDelayOnElement(element, currentTime) {
31354			/* Check for any delay timers, and pause the set timeouts (while preserving time data)
31355			 to be resumed when the "resume" command is issued */
31356			var data = Data(element);
31357			if (data && data.delayTimer && !data.delayPaused) {
31358				data.delayRemaining = data.delay - currentTime + data.delayBegin;
31359				data.delayPaused = true;
31360				clearTimeout(data.delayTimer.setTimeout);
31361			}
31362		}
31363
31364		function resumeDelayOnElement(element, currentTime) {
31365			/* Check for any paused timers and resume */
31366			var data = Data(element);
31367			if (data && data.delayTimer && data.delayPaused) {
31368				/* If the element was mid-delay, re initiate the timeout with the remaining delay */
31369				data.delayPaused = false;
31370				data.delayTimer.setTimeout = setTimeout(data.delayTimer.next, data.delayRemaining);
31371			}
31372		}
31373
31374
31375
31376		/**************
31377		 Easing
31378		 **************/
31379
31380		/* Step easing generator. */
31381		function generateStep(steps) {
31382			return function(p) {
31383				return Math.round(p * steps) * (1 / steps);
31384			};
31385		}
31386
31387		/* Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License */
31388		function generateBezier(mX1, mY1, mX2, mY2) {
31389			var NEWTON_ITERATIONS = 4,
31390					NEWTON_MIN_SLOPE = 0.001,
31391					SUBDIVISION_PRECISION = 0.0000001,
31392					SUBDIVISION_MAX_ITERATIONS = 10,
31393					kSplineTableSize = 11,
31394					kSampleStepSize = 1.0 / (kSplineTableSize - 1.0),
31395					float32ArraySupported = "Float32Array" in window;
31396
31397			/* Must contain four arguments. */
31398			if (arguments.length !== 4) {
31399				return false;
31400			}
31401
31402			/* Arguments must be numbers. */
31403			for (var i = 0; i < 4; ++i) {
31404				if (typeof arguments[i] !== "number" || isNaN(arguments[i]) || !isFinite(arguments[i])) {
31405					return false;
31406				}
31407			}
31408
31409			/* X values must be in the [0, 1] range. */
31410			mX1 = Math.min(mX1, 1);
31411			mX2 = Math.min(mX2, 1);
31412			mX1 = Math.max(mX1, 0);
31413			mX2 = Math.max(mX2, 0);
31414
31415			var mSampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);
31416
31417			function A(aA1, aA2) {
31418				return 1.0 - 3.0 * aA2 + 3.0 * aA1;
31419			}
31420			function B(aA1, aA2) {
31421				return 3.0 * aA2 - 6.0 * aA1;
31422			}
31423			function C(aA1) {
31424				return 3.0 * aA1;
31425			}
31426
31427			function calcBezier(aT, aA1, aA2) {
31428				return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;
31429			}
31430
31431			function getSlope(aT, aA1, aA2) {
31432				return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1);
31433			}
31434
31435			function newtonRaphsonIterate(aX, aGuessT) {
31436				for (var i = 0; i < NEWTON_ITERATIONS; ++i) {
31437					var currentSlope = getSlope(aGuessT, mX1, mX2);
31438
31439					if (currentSlope === 0.0) {
31440						return aGuessT;
31441					}
31442
31443					var currentX = calcBezier(aGuessT, mX1, mX2) - aX;
31444					aGuessT -= currentX / currentSlope;
31445				}
31446
31447				return aGuessT;
31448			}
31449
31450			function calcSampleValues() {
31451				for (var i = 0; i < kSplineTableSize; ++i) {
31452					mSampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);
31453				}
31454			}
31455
31456			function binarySubdivide(aX, aA, aB) {
31457				var currentX, currentT, i = 0;
31458
31459				do {
31460					currentT = aA + (aB - aA) / 2.0;
31461					currentX = calcBezier(currentT, mX1, mX2) - aX;
31462					if (currentX > 0.0) {
31463						aB = currentT;
31464					} else {
31465						aA = currentT;
31466					}
31467				} while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
31468
31469				return currentT;
31470			}
31471
31472			function getTForX(aX) {
31473				var intervalStart = 0.0,
31474						currentSample = 1,
31475						lastSample = kSplineTableSize - 1;
31476
31477				for (; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample) {
31478					intervalStart += kSampleStepSize;
31479				}
31480
31481				--currentSample;
31482
31483				var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample + 1] - mSampleValues[currentSample]),
31484						guessForT = intervalStart + dist * kSampleStepSize,
31485						initialSlope = getSlope(guessForT, mX1, mX2);
31486
31487				if (initialSlope >= NEWTON_MIN_SLOPE) {
31488					return newtonRaphsonIterate(aX, guessForT);
31489				} else if (initialSlope === 0.0) {
31490					return guessForT;
31491				} else {
31492					return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize);
31493				}
31494			}
31495
31496			var _precomputed = false;
31497
31498			function precompute() {
31499				_precomputed = true;
31500				if (mX1 !== mY1 || mX2 !== mY2) {
31501					calcSampleValues();
31502				}
31503			}
31504
31505			var f = function(aX) {
31506				if (!_precomputed) {
31507					precompute();
31508				}
31509				if (mX1 === mY1 && mX2 === mY2) {
31510					return aX;
31511				}
31512				if (aX === 0) {
31513					return 0;
31514				}
31515				if (aX === 1) {
31516					return 1;
31517				}
31518
31519				return calcBezier(getTForX(aX), mY1, mY2);
31520			};
31521
31522			f.getControlPoints = function() {
31523				return [{x: mX1, y: mY1}, {x: mX2, y: mY2}];
31524			};
31525
31526			var str = "generateBezier(" + [mX1, mY1, mX2, mY2] + ")";
31527			f.toString = function() {
31528				return str;
31529			};
31530
31531			return f;
31532		}
31533
31534		/* Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */
31535		/* Given a tension, friction, and duration, a simulation at 60FPS will first run without a defined duration in order to calculate the full path. A second pass
31536		 then adjusts the time delta -- using the relation between actual time and duration -- to calculate the path for the duration-constrained animation. */
31537		var generateSpringRK4 = (function() {
31538			function springAccelerationForState(state) {
31539				return (-state.tension * state.x) - (state.friction * state.v);
31540			}
31541
31542			function springEvaluateStateWithDerivative(initialState, dt, derivative) {
31543				var state = {
31544					x: initialState.x + derivative.dx * dt,
31545					v: initialState.v + derivative.dv * dt,
31546					tension: initialState.tension,
31547					friction: initialState.friction
31548				};
31549
31550				return {dx: state.v, dv: springAccelerationForState(state)};
31551			}
31552
31553			function springIntegrateState(state, dt) {
31554				var a = {
31555					dx: state.v,
31556					dv: springAccelerationForState(state)
31557				},
31558						b = springEvaluateStateWithDerivative(state, dt * 0.5, a),
31559						c = springEvaluateStateWithDerivative(state, dt * 0.5, b),
31560						d = springEvaluateStateWithDerivative(state, dt, c),
31561						dxdt = 1.0 / 6.0 * (a.dx + 2.0 * (b.dx + c.dx) + d.dx),
31562						dvdt = 1.0 / 6.0 * (a.dv + 2.0 * (b.dv + c.dv) + d.dv);
31563
31564				state.x = state.x + dxdt * dt;
31565				state.v = state.v + dvdt * dt;
31566
31567				return state;
31568			}
31569
31570			return function springRK4Factory(tension, friction, duration) {
31571
31572				var initState = {
31573					x: -1,
31574					v: 0,
31575					tension: null,
31576					friction: null
31577				},
31578						path = [0],
31579						time_lapsed = 0,
31580						tolerance = 1 / 10000,
31581						DT = 16 / 1000,
31582						have_duration, dt, last_state;
31583
31584				tension = parseFloat(tension) || 500;
31585				friction = parseFloat(friction) || 20;
31586				duration = duration || null;
31587
31588				initState.tension = tension;
31589				initState.friction = friction;
31590
31591				have_duration = duration !== null;
31592
31593				/* Calculate the actual time it takes for this animation to complete with the provided conditions. */
31594				if (have_duration) {
31595					/* Run the simulation without a duration. */
31596					time_lapsed = springRK4Factory(tension, friction);
31597					/* Compute the adjusted time delta. */
31598					dt = time_lapsed / duration * DT;
31599				} else {
31600					dt = DT;
31601				}
31602
31603				while (true) {
31604					/* Next/step function .*/
31605					last_state = springIntegrateState(last_state || initState, dt);
31606					/* Store the position. */
31607					path.push(1 + last_state.x);
31608					time_lapsed += 16;
31609					/* If the change threshold is reached, break. */
31610					if (!(Math.abs(last_state.x) > tolerance && Math.abs(last_state.v) > tolerance)) {
31611						break;
31612					}
31613				}
31614
31615				/* If duration is not defined, return the actual time required for completing this animation. Otherwise, return a closure that holds the
31616				 computed path and returns a snapshot of the position according to a given percentComplete. */
31617				return !have_duration ? time_lapsed : function(percentComplete) {
31618					return path[ (percentComplete * (path.length - 1)) | 0 ];
31619				};
31620			};
31621		}());
31622
31623		/* jQuery easings. */
31624		Velocity.Easings = {
31625			linear: function(p) {
31626				return p;
31627			},
31628			swing: function(p) {
31629				return 0.5 - Math.cos(p * Math.PI) / 2;
31630			},
31631			/* Bonus "spring" easing, which is a less exaggerated version of easeInOutElastic. */
31632			spring: function(p) {
31633				return 1 - (Math.cos(p * 4.5 * Math.PI) * Math.exp(-p * 6));
31634			}
31635		};
31636
31637		/* CSS3 and Robert Penner easings. */
31638		$.each(
31639				[
31640					["ease", [0.25, 0.1, 0.25, 1.0]],
31641					["ease-in", [0.42, 0.0, 1.00, 1.0]],
31642					["ease-out", [0.00, 0.0, 0.58, 1.0]],
31643					["ease-in-out", [0.42, 0.0, 0.58, 1.0]],
31644					["easeInSine", [0.47, 0, 0.745, 0.715]],
31645					["easeOutSine", [0.39, 0.575, 0.565, 1]],
31646					["easeInOutSine", [0.445, 0.05, 0.55, 0.95]],
31647					["easeInQuad", [0.55, 0.085, 0.68, 0.53]],
31648					["easeOutQuad", [0.25, 0.46, 0.45, 0.94]],
31649					["easeInOutQuad", [0.455, 0.03, 0.515, 0.955]],
31650					["easeInCubic", [0.55, 0.055, 0.675, 0.19]],
31651					["easeOutCubic", [0.215, 0.61, 0.355, 1]],
31652					["easeInOutCubic", [0.645, 0.045, 0.355, 1]],
31653					["easeInQuart", [0.895, 0.03, 0.685, 0.22]],
31654					["easeOutQuart", [0.165, 0.84, 0.44, 1]],
31655					["easeInOutQuart", [0.77, 0, 0.175, 1]],
31656					["easeInQuint", [0.755, 0.05, 0.855, 0.06]],
31657					["easeOutQuint", [0.23, 1, 0.32, 1]],
31658					["easeInOutQuint", [0.86, 0, 0.07, 1]],
31659					["easeInExpo", [0.95, 0.05, 0.795, 0.035]],
31660					["easeOutExpo", [0.19, 1, 0.22, 1]],
31661					["easeInOutExpo", [1, 0, 0, 1]],
31662					["easeInCirc", [0.6, 0.04, 0.98, 0.335]],
31663					["easeOutCirc", [0.075, 0.82, 0.165, 1]],
31664					["easeInOutCirc", [0.785, 0.135, 0.15, 0.86]]
31665				], function(i, easingArray) {
31666			Velocity.Easings[easingArray[0]] = generateBezier.apply(null, easingArray[1]);
31667		});
31668
31669		/* Determine the appropriate easing type given an easing input. */
31670		function getEasing(value, duration) {
31671			var easing = value;
31672
31673			/* The easing option can either be a string that references a pre-registered easing,
31674			 or it can be a two-/four-item array of integers to be converted into a bezier/spring function. */
31675			if (Type.isString(value)) {
31676				/* Ensure that the easing has been assigned to jQuery's Velocity.Easings object. */
31677				if (!Velocity.Easings[value]) {
31678					easing = false;
31679				}
31680			} else if (Type.isArray(value) && value.length === 1) {
31681				easing = generateStep.apply(null, value);
31682			} else if (Type.isArray(value) && value.length === 2) {
31683				/* springRK4 must be passed the animation's duration. */
31684				/* Note: If the springRK4 array contains non-numbers, generateSpringRK4() returns an easing
31685				 function generated with default tension and friction values. */
31686				easing = generateSpringRK4.apply(null, value.concat([duration]));
31687			} else if (Type.isArray(value) && value.length === 4) {
31688				/* Note: If the bezier array contains non-numbers, generateBezier() returns false. */
31689				easing = generateBezier.apply(null, value);
31690			} else {
31691				easing = false;
31692			}
31693
31694			/* Revert to the Velocity-wide default easing type, or fall back to "swing" (which is also jQuery's default)
31695			 if the Velocity-wide default has been incorrectly modified. */
31696			if (easing === false) {
31697				if (Velocity.Easings[Velocity.defaults.easing]) {
31698					easing = Velocity.defaults.easing;
31699				} else {
31700					easing = EASING_DEFAULT;
31701				}
31702			}
31703
31704			return easing;
31705		}
31706
31707		/*****************
31708		 CSS Stack
31709		 *****************/
31710
31711		/* The CSS object is a highly condensed and performant CSS stack that fully replaces jQuery's.
31712		 It handles the validation, getting, and setting of both standard CSS properties and CSS property hooks. */
31713		/* Note: A "CSS" shorthand is aliased so that our code is easier to read. */
31714		var CSS = Velocity.CSS = {
31715			/*************
31716			 RegEx
31717			 *************/
31718
31719			RegEx: {
31720				isHex: /^#([A-f\d]{3}){1,2}$/i,
31721				/* Unwrap a property value's surrounding text, e.g. "rgba(4, 3, 2, 1)" ==> "4, 3, 2, 1" and "rect(4px 3px 2px 1px)" ==> "4px 3px 2px 1px". */
31722				valueUnwrap: /^[A-z]+\((.*)\)$/i,
31723				wrappedValueAlreadyExtracted: /[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,
31724				/* Split a multi-value property into an array of subvalues, e.g. "rgba(4, 3, 2, 1) 4px 3px 2px 1px" ==> [ "rgba(4, 3, 2, 1)", "4px", "3px", "2px", "1px" ]. */
31725				valueSplit: /([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/ig
31726			},
31727			/************
31728			 Lists
31729			 ************/
31730
31731			Lists: {
31732				colors: ["fill", "stroke", "stopColor", "color", "backgroundColor", "borderColor", "borderTopColor", "borderRightColor", "borderBottomColor", "borderLeftColor", "outlineColor"],
31733				transformsBase: ["translateX", "translateY", "scale", "scaleX", "scaleY", "skewX", "skewY", "rotateZ"],
31734				transforms3D: ["transformPerspective", "translateZ", "scaleZ", "rotateX", "rotateY"],
31735				units: [
31736					"%", // relative
31737					"em", "ex", "ch", "rem", // font relative
31738					"vw", "vh", "vmin", "vmax", // viewport relative
31739					"cm", "mm", "Q", "in", "pc", "pt", "px", // absolute lengths
31740					"deg", "grad", "rad", "turn", // angles
31741					"s", "ms" // time
31742				],
31743				colorNames: {
31744					"aliceblue": "240,248,255",
31745					"antiquewhite": "250,235,215",
31746					"aquamarine": "127,255,212",
31747					"aqua": "0,255,255",
31748					"azure": "240,255,255",
31749					"beige": "245,245,220",
31750					"bisque": "255,228,196",
31751					"black": "0,0,0",
31752					"blanchedalmond": "255,235,205",
31753					"blueviolet": "138,43,226",
31754					"blue": "0,0,255",
31755					"brown": "165,42,42",
31756					"burlywood": "222,184,135",
31757					"cadetblue": "95,158,160",
31758					"chartreuse": "127,255,0",
31759					"chocolate": "210,105,30",
31760					"coral": "255,127,80",
31761					"cornflowerblue": "100,149,237",
31762					"cornsilk": "255,248,220",
31763					"crimson": "220,20,60",
31764					"cyan": "0,255,255",
31765					"darkblue": "0,0,139",
31766					"darkcyan": "0,139,139",
31767					"darkgoldenrod": "184,134,11",
31768					"darkgray": "169,169,169",
31769					"darkgrey": "169,169,169",
31770					"darkgreen": "0,100,0",
31771					"darkkhaki": "189,183,107",
31772					"darkmagenta": "139,0,139",
31773					"darkolivegreen": "85,107,47",
31774					"darkorange": "255,140,0",
31775					"darkorchid": "153,50,204",
31776					"darkred": "139,0,0",
31777					"darksalmon": "233,150,122",
31778					"darkseagreen": "143,188,143",
31779					"darkslateblue": "72,61,139",
31780					"darkslategray": "47,79,79",
31781					"darkturquoise": "0,206,209",
31782					"darkviolet": "148,0,211",
31783					"deeppink": "255,20,147",
31784					"deepskyblue": "0,191,255",
31785					"dimgray": "105,105,105",
31786					"dimgrey": "105,105,105",
31787					"dodgerblue": "30,144,255",
31788					"firebrick": "178,34,34",
31789					"floralwhite": "255,250,240",
31790					"forestgreen": "34,139,34",
31791					"fuchsia": "255,0,255",
31792					"gainsboro": "220,220,220",
31793					"ghostwhite": "248,248,255",
31794					"gold": "255,215,0",
31795					"goldenrod": "218,165,32",
31796					"gray": "128,128,128",
31797					"grey": "128,128,128",
31798					"greenyellow": "173,255,47",
31799					"green": "0,128,0",
31800					"honeydew": "240,255,240",
31801					"hotpink": "255,105,180",
31802					"indianred": "205,92,92",
31803					"indigo": "75,0,130",
31804					"ivory": "255,255,240",
31805					"khaki": "240,230,140",
31806					"lavenderblush": "255,240,245",
31807					"lavender": "230,230,250",
31808					"lawngreen": "124,252,0",
31809					"lemonchiffon": "255,250,205",
31810					"lightblue": "173,216,230",
31811					"lightcoral": "240,128,128",
31812					"lightcyan": "224,255,255",
31813					"lightgoldenrodyellow": "250,250,210",
31814					"lightgray": "211,211,211",
31815					"lightgrey": "211,211,211",
31816					"lightgreen": "144,238,144",
31817					"lightpink": "255,182,193",
31818					"lightsalmon": "255,160,122",
31819					"lightseagreen": "32,178,170",
31820					"lightskyblue": "135,206,250",
31821					"lightslategray": "119,136,153",
31822					"lightsteelblue": "176,196,222",
31823					"lightyellow": "255,255,224",
31824					"limegreen": "50,205,50",
31825					"lime": "0,255,0",
31826					"linen": "250,240,230",
31827					"magenta": "255,0,255",
31828					"maroon": "128,0,0",
31829					"mediumaquamarine": "102,205,170",
31830					"mediumblue": "0,0,205",
31831					"mediumorchid": "186,85,211",
31832					"mediumpurple": "147,112,219",
31833					"mediumseagreen": "60,179,113",
31834					"mediumslateblue": "123,104,238",
31835					"mediumspringgreen": "0,250,154",
31836					"mediumturquoise": "72,209,204",
31837					"mediumvioletred": "199,21,133",
31838					"midnightblue": "25,25,112",
31839					"mintcream": "245,255,250",
31840					"mistyrose": "255,228,225",
31841					"moccasin": "255,228,181",
31842					"navajowhite": "255,222,173",
31843					"navy": "0,0,128",
31844					"oldlace": "253,245,230",
31845					"olivedrab": "107,142,35",
31846					"olive": "128,128,0",
31847					"orangered": "255,69,0",
31848					"orange": "255,165,0",
31849					"orchid": "218,112,214",
31850					"palegoldenrod": "238,232,170",
31851					"palegreen": "152,251,152",
31852					"paleturquoise": "175,238,238",
31853					"palevioletred": "219,112,147",
31854					"papayawhip": "255,239,213",
31855					"peachpuff": "255,218,185",
31856					"peru": "205,133,63",
31857					"pink": "255,192,203",
31858					"plum": "221,160,221",
31859					"powderblue": "176,224,230",
31860					"purple": "128,0,128",
31861					"red": "255,0,0",
31862					"rosybrown": "188,143,143",
31863					"royalblue": "65,105,225",
31864					"saddlebrown": "139,69,19",
31865					"salmon": "250,128,114",
31866					"sandybrown": "244,164,96",
31867					"seagreen": "46,139,87",
31868					"seashell": "255,245,238",
31869					"sienna": "160,82,45",
31870					"silver": "192,192,192",
31871					"skyblue": "135,206,235",
31872					"slateblue": "106,90,205",
31873					"slategray": "112,128,144",
31874					"snow": "255,250,250",
31875					"springgreen": "0,255,127",
31876					"steelblue": "70,130,180",
31877					"tan": "210,180,140",
31878					"teal": "0,128,128",
31879					"thistle": "216,191,216",
31880					"tomato": "255,99,71",
31881					"turquoise": "64,224,208",
31882					"violet": "238,130,238",
31883					"wheat": "245,222,179",
31884					"whitesmoke": "245,245,245",
31885					"white": "255,255,255",
31886					"yellowgreen": "154,205,50",
31887					"yellow": "255,255,0"
31888				}
31889			},
31890			/************
31891			 Hooks
31892			 ************/
31893
31894			/* Hooks allow a subproperty (e.g. "boxShadowBlur") of a compound-value CSS property
31895			 (e.g. "boxShadow: X Y Blur Spread Color") to be animated as if it were a discrete property. */
31896			/* Note: Beyond enabling fine-grained property animation, hooking is necessary since Velocity only
31897			 tweens properties with single numeric values; unlike CSS transitions, Velocity does not interpolate compound-values. */
31898			Hooks: {
31899				/********************
31900				 Registration
31901				 ********************/
31902
31903				/* Templates are a concise way of indicating which subproperties must be individually registered for each compound-value CSS property. */
31904				/* Each template consists of the compound-value's base name, its constituent subproperty names, and those subproperties' default values. */
31905				templates: {
31906					"textShadow": ["Color X Y Blur", "black 0px 0px 0px"],
31907					"boxShadow": ["Color X Y Blur Spread", "black 0px 0px 0px 0px"],
31908					"clip": ["Top Right Bottom Left", "0px 0px 0px 0px"],
31909					"backgroundPosition": ["X Y", "0% 0%"],
31910					"transformOrigin": ["X Y Z", "50% 50% 0px"],
31911					"perspectiveOrigin": ["X Y", "50% 50%"]
31912				},
31913				/* A "registered" hook is one that has been converted from its template form into a live,
31914				 tweenable property. It contains data to associate it with its root property. */
31915				registered: {
31916					/* Note: A registered hook looks like this ==> textShadowBlur: [ "textShadow", 3 ],
31917					 which consists of the subproperty's name, the associated root property's name,
31918					 and the subproperty's position in the root's value. */
31919				},
31920				/* Convert the templates into individual hooks then append them to the registered object above. */
31921				register: function() {
31922					/* Color hooks registration: Colors are defaulted to white -- as opposed to black -- since colors that are
31923					 currently set to "transparent" default to their respective template below when color-animated,
31924					 and white is typically a closer match to transparent than black is. An exception is made for text ("color"),
31925					 which is almost always set closer to black than white. */
31926					for (var i = 0; i < CSS.Lists.colors.length; i++) {
31927						var rgbComponents = (CSS.Lists.colors[i] === "color") ? "0 0 0 1" : "255 255 255 1";
31928						CSS.Hooks.templates[CSS.Lists.colors[i]] = ["Red Green Blue Alpha", rgbComponents];
31929					}
31930
31931					var rootProperty,
31932							hookTemplate,
31933							hookNames;
31934
31935					/* In IE, color values inside compound-value properties are positioned at the end the value instead of at the beginning.
31936					 Thus, we re-arrange the templates accordingly. */
31937					if (IE) {
31938						for (rootProperty in CSS.Hooks.templates) {
31939							if (!CSS.Hooks.templates.hasOwnProperty(rootProperty)) {
31940								continue;
31941							}
31942							hookTemplate = CSS.Hooks.templates[rootProperty];
31943							hookNames = hookTemplate[0].split(" ");
31944
31945							var defaultValues = hookTemplate[1].match(CSS.RegEx.valueSplit);
31946
31947							if (hookNames[0] === "Color") {
31948								/* Reposition both the hook's name and its default value to the end of their respective strings. */
31949								hookNames.push(hookNames.shift());
31950								defaultValues.push(defaultValues.shift());
31951
31952								/* Replace the existing template for the hook's root property. */
31953								CSS.Hooks.templates[rootProperty] = [hookNames.join(" "), defaultValues.join(" ")];
31954							}
31955						}
31956					}
31957
31958					/* Hook registration. */
31959					for (rootProperty in CSS.Hooks.templates) {
31960						if (!CSS.Hooks.templates.hasOwnProperty(rootProperty)) {
31961							continue;
31962						}
31963						hookTemplate = CSS.Hooks.templates[rootProperty];
31964						hookNames = hookTemplate[0].split(" ");
31965
31966						for (var j in hookNames) {
31967							if (!hookNames.hasOwnProperty(j)) {
31968								continue;
31969							}
31970							var fullHookName = rootProperty + hookNames[j],
31971									hookPosition = j;
31972
31973							/* For each hook, register its full name (e.g. textShadowBlur) with its root property (e.g. textShadow)
31974							 and the hook's position in its template's default value string. */
31975							CSS.Hooks.registered[fullHookName] = [rootProperty, hookPosition];
31976						}
31977					}
31978				},
31979				/*****************************
31980				 Injection and Extraction
31981				 *****************************/
31982
31983				/* Look up the root property associated with the hook (e.g. return "textShadow" for "textShadowBlur"). */
31984				/* Since a hook cannot be set directly (the browser won't recognize it), style updating for hooks is routed through the hook's root property. */
31985				getRoot: function(property) {
31986					var hookData = CSS.Hooks.registered[property];
31987
31988					if (hookData) {
31989						return hookData[0];
31990					} else {
31991						/* If there was no hook match, return the property name untouched. */
31992						return property;
31993					}
31994				},
31995				getUnit: function(str, start) {
31996					var unit = (str.substr(start || 0, 5).match(/^[a-z%]+/) || [])[0] || "";
31997
31998					if (unit && CSS.Lists.units.indexOf(unit) >= 0) {
31999						return unit;
32000					}
32001					return "";
32002				},
32003				fixColors: function(str) {
32004					return str.replace(/(rgba?\(\s*)?(\b[a-z]+\b)/g, function($0, $1, $2) {
32005						if (CSS.Lists.colorNames.hasOwnProperty($2)) {
32006							return ($1 ? $1 : "rgba(") + CSS.Lists.colorNames[$2] + ($1 ? "" : ",1)");
32007						}
32008						return $1 + $2;
32009					});
32010				},
32011				/* Convert any rootPropertyValue, null or otherwise, into a space-delimited list of hook values so that
32012				 the targeted hook can be injected or extracted at its standard position. */
32013				cleanRootPropertyValue: function(rootProperty, rootPropertyValue) {
32014					/* If the rootPropertyValue is wrapped with "rgb()", "clip()", etc., remove the wrapping to normalize the value before manipulation. */
32015					if (CSS.RegEx.valueUnwrap.test(rootPropertyValue)) {
32016						rootPropertyValue = rootPropertyValue.match(CSS.RegEx.valueUnwrap)[1];
32017					}
32018
32019					/* If rootPropertyValue is a CSS null-value (from which there's inherently no hook value to extract),
32020					 default to the root's default value as defined in CSS.Hooks.templates. */
32021					/* Note: CSS null-values include "none", "auto", and "transparent". They must be converted into their
32022					 zero-values (e.g. textShadow: "none" ==> textShadow: "0px 0px 0px black") for hook manipulation to proceed. */
32023					if (CSS.Values.isCSSNullValue(rootPropertyValue)) {
32024						rootPropertyValue = CSS.Hooks.templates[rootProperty][1];
32025					}
32026
32027					return rootPropertyValue;
32028				},
32029				/* Extracted the hook's value from its root property's value. This is used to get the starting value of an animating hook. */
32030				extractValue: function(fullHookName, rootPropertyValue) {
32031					var hookData = CSS.Hooks.registered[fullHookName];
32032
32033					if (hookData) {
32034						var hookRoot = hookData[0],
32035								hookPosition = hookData[1];
32036
32037						rootPropertyValue = CSS.Hooks.cleanRootPropertyValue(hookRoot, rootPropertyValue);
32038
32039						/* Split rootPropertyValue into its constituent hook values then grab the desired hook at its standard position. */
32040						return rootPropertyValue.toString().match(CSS.RegEx.valueSplit)[hookPosition];
32041					} else {
32042						/* If the provided fullHookName isn't a registered hook, return the rootPropertyValue that was passed in. */
32043						return rootPropertyValue;
32044					}
32045				},
32046				/* Inject the hook's value into its root property's value. This is used to piece back together the root property
32047				 once Velocity has updated one of its individually hooked values through tweening. */
32048				injectValue: function(fullHookName, hookValue, rootPropertyValue) {
32049					var hookData = CSS.Hooks.registered[fullHookName];
32050
32051					if (hookData) {
32052						var hookRoot = hookData[0],
32053								hookPosition = hookData[1],
32054								rootPropertyValueParts,
32055								rootPropertyValueUpdated;
32056
32057						rootPropertyValue = CSS.Hooks.cleanRootPropertyValue(hookRoot, rootPropertyValue);
32058
32059						/* Split rootPropertyValue into its individual hook values, replace the targeted value with hookValue,
32060						 then reconstruct the rootPropertyValue string. */
32061						rootPropertyValueParts = rootPropertyValue.toString().match(CSS.RegEx.valueSplit);
32062						rootPropertyValueParts[hookPosition] = hookValue;
32063						rootPropertyValueUpdated = rootPropertyValueParts.join(" ");
32064
32065						return rootPropertyValueUpdated;
32066					} else {
32067						/* If the provided fullHookName isn't a registered hook, return the rootPropertyValue that was passed in. */
32068						return rootPropertyValue;
32069					}
32070				}
32071			},
32072			/*******************
32073			 Normalizations
32074			 *******************/
32075
32076			/* Normalizations standardize CSS property manipulation by pollyfilling browser-specific implementations (e.g. opacity)
32077			 and reformatting special properties (e.g. clip, rgba) to look like standard ones. */
32078			Normalizations: {
32079				/* Normalizations are passed a normalization target (either the property's name, its extracted value, or its injected value),
32080				 the targeted element (which may need to be queried), and the targeted property value. */
32081				registered: {
32082					clip: function(type, element, propertyValue) {
32083						switch (type) {
32084							case "name":
32085								return "clip";
32086								/* Clip needs to be unwrapped and stripped of its commas during extraction. */
32087							case "extract":
32088								var extracted;
32089
32090								/* If Velocity also extracted this value, skip extraction. */
32091								if (CSS.RegEx.wrappedValueAlreadyExtracted.test(propertyValue)) {
32092									extracted = propertyValue;
32093								} else {
32094									/* Remove the "rect()" wrapper. */
32095									extracted = propertyValue.toString().match(CSS.RegEx.valueUnwrap);
32096
32097									/* Strip off commas. */
32098									extracted = extracted ? extracted[1].replace(/,(\s+)?/g, " ") : propertyValue;
32099								}
32100
32101								return extracted;
32102								/* Clip needs to be re-wrapped during injection. */
32103							case "inject":
32104								return "rect(" + propertyValue + ")";
32105						}
32106					},
32107					blur: function(type, element, propertyValue) {
32108						switch (type) {
32109							case "name":
32110								return Velocity.State.isFirefox ? "filter" : "-webkit-filter";
32111							case "extract":
32112								var extracted = parseFloat(propertyValue);
32113
32114								/* If extracted is NaN, meaning the value isn't already extracted. */
32115								if (!(extracted || extracted === 0)) {
32116									var blurComponent = propertyValue.toString().match(/blur\(([0-9]+[A-z]+)\)/i);
32117
32118									/* If the filter string had a blur component, return just the blur value and unit type. */
32119									if (blurComponent) {
32120										extracted = blurComponent[1];
32121										/* If the component doesn't exist, default blur to 0. */
32122									} else {
32123										extracted = 0;
32124									}
32125								}
32126
32127								return extracted;
32128								/* Blur needs to be re-wrapped during injection. */
32129							case "inject":
32130								/* For the blur effect to be fully de-applied, it needs to be set to "none" instead of 0. */
32131								if (!parseFloat(propertyValue)) {
32132									return "none";
32133								} else {
32134									return "blur(" + propertyValue + ")";
32135								}
32136						}
32137					},
32138					/* <=IE8 do not support the standard opacity property. They use filter:alpha(opacity=INT) instead. */
32139					opacity: function(type, element, propertyValue) {
32140						if (IE <= 8) {
32141							switch (type) {
32142								case "name":
32143									return "filter";
32144								case "extract":
32145									/* <=IE8 return a "filter" value of "alpha(opacity=\d{1,3})".
32146									 Extract the value and convert it to a decimal value to match the standard CSS opacity property's formatting. */
32147									var extracted = propertyValue.toString().match(/alpha\(opacity=(.*)\)/i);
32148
32149									if (extracted) {
32150										/* Convert to decimal value. */
32151										propertyValue = extracted[1] / 100;
32152									} else {
32153										/* When extracting opacity, default to 1 since a null value means opacity hasn't been set. */
32154										propertyValue = 1;
32155									}
32156
32157									return propertyValue;
32158								case "inject":
32159									/* Opacified elements are required to have their zoom property set to a non-zero value. */
32160									element.style.zoom = 1;
32161
32162									/* Setting the filter property on elements with certain font property combinations can result in a
32163									 highly unappealing ultra-bolding effect. There's no way to remedy this throughout a tween, but dropping the
32164									 value altogether (when opacity hits 1) at leasts ensures that the glitch is gone post-tweening. */
32165									if (parseFloat(propertyValue) >= 1) {
32166										return "";
32167									} else {
32168										/* As per the filter property's spec, convert the decimal value to a whole number and wrap the value. */
32169										return "alpha(opacity=" + parseInt(parseFloat(propertyValue) * 100, 10) + ")";
32170									}
32171							}
32172							/* With all other browsers, normalization is not required; return the same values that were passed in. */
32173						} else {
32174							switch (type) {
32175								case "name":
32176									return "opacity";
32177								case "extract":
32178									return propertyValue;
32179								case "inject":
32180									return propertyValue;
32181							}
32182						}
32183					}
32184				},
32185				/*****************************
32186				 Batched Registrations
32187				 *****************************/
32188
32189				/* Note: Batched normalizations extend the CSS.Normalizations.registered object. */
32190				register: function() {
32191
32192					/*****************
32193					 Transforms
32194					 *****************/
32195
32196					/* Transforms are the subproperties contained by the CSS "transform" property. Transforms must undergo normalization
32197					 so that they can be referenced in a properties map by their individual names. */
32198					/* Note: When transforms are "set", they are actually assigned to a per-element transformCache. When all transform
32199					 setting is complete complete, CSS.flushTransformCache() must be manually called to flush the values to the DOM.
32200					 Transform setting is batched in this way to improve performance: the transform style only needs to be updated
32201					 once when multiple transform subproperties are being animated simultaneously. */
32202					/* Note: IE9 and Android Gingerbread have support for 2D -- but not 3D -- transforms. Since animating unsupported
32203					 transform properties results in the browser ignoring the *entire* transform string, we prevent these 3D values
32204					 from being normalized for these browsers so that tweening skips these properties altogether
32205					 (since it will ignore them as being unsupported by the browser.) */
32206					if ((!IE || IE > 9) && !Velocity.State.isGingerbread) {
32207						/* Note: Since the standalone CSS "perspective" property and the CSS transform "perspective" subproperty
32208						 share the same name, the latter is given a unique token within Velocity: "transformPerspective". */
32209						CSS.Lists.transformsBase = CSS.Lists.transformsBase.concat(CSS.Lists.transforms3D);
32210					}
32211
32212					for (var i = 0; i < CSS.Lists.transformsBase.length; i++) {
32213						/* Wrap the dynamically generated normalization function in a new scope so that transformName's value is
32214						 paired with its respective function. (Otherwise, all functions would take the final for loop's transformName.) */
32215						(function() {
32216							var transformName = CSS.Lists.transformsBase[i];
32217
32218							CSS.Normalizations.registered[transformName] = function(type, element, propertyValue) {
32219								switch (type) {
32220									/* The normalized property name is the parent "transform" property -- the property that is actually set in CSS. */
32221									case "name":
32222										return "transform";
32223										/* Transform values are cached onto a per-element transformCache object. */
32224									case "extract":
32225										/* If this transform has yet to be assigned a value, return its null value. */
32226										if (Data(element) === undefined || Data(element).transformCache[transformName] === undefined) {
32227											/* Scale CSS.Lists.transformsBase default to 1 whereas all other transform properties default to 0. */
32228											return /^scale/i.test(transformName) ? 1 : 0;
32229											/* When transform values are set, they are wrapped in parentheses as per the CSS spec.
32230											 Thus, when extracting their values (for tween calculations), we strip off the parentheses. */
32231										}
32232										return Data(element).transformCache[transformName].replace(/[()]/g, "");
32233									case "inject":
32234										var invalid = false;
32235
32236										/* If an individual transform property contains an unsupported unit type, the browser ignores the *entire* transform property.
32237										 Thus, protect users from themselves by skipping setting for transform values supplied with invalid unit types. */
32238										/* Switch on the base transform type; ignore the axis by removing the last letter from the transform's name. */
32239										switch (transformName.substr(0, transformName.length - 1)) {
32240											/* Whitelist unit types for each transform. */
32241											case "translate":
32242												invalid = !/(%|px|em|rem|vw|vh|\d)$/i.test(propertyValue);
32243												break;
32244												/* Since an axis-free "scale" property is supported as well, a little hack is used here to detect it by chopping off its last letter. */
32245											case "scal":
32246											case "scale":
32247												/* Chrome on Android has a bug in which scaled elements blur if their initial scale
32248												 value is below 1 (which can happen with forcefeeding). Thus, we detect a yet-unset scale property
32249												 and ensure that its first value is always 1. More info: http://stackoverflow.com/questions/10417890/css3-animations-with-transform-causes-blurred-elements-on-webkit/10417962#10417962 */
32250												if (Velocity.State.isAndroid && Data(element).transformCache[transformName] === undefined && propertyValue < 1) {
32251													propertyValue = 1;
32252												}
32253
32254												invalid = !/(\d)$/i.test(propertyValue);
32255												break;
32256											case "skew":
32257												invalid = !/(deg|\d)$/i.test(propertyValue);
32258												break;
32259											case "rotate":
32260												invalid = !/(deg|\d)$/i.test(propertyValue);
32261												break;
32262										}
32263
32264										if (!invalid) {
32265											/* As per the CSS spec, wrap the value in parentheses. */
32266											Data(element).transformCache[transformName] = "(" + propertyValue + ")";
32267										}
32268
32269										/* Although the value is set on the transformCache object, return the newly-updated value for the calling code to process as normal. */
32270										return Data(element).transformCache[transformName];
32271								}
32272							};
32273						})();
32274					}
32275
32276					/*************
32277					 Colors
32278					 *************/
32279
32280					/* Since Velocity only animates a single numeric value per property, color animation is achieved by hooking the individual RGBA components of CSS color properties.
32281					 Accordingly, color values must be normalized (e.g. "#ff0000", "red", and "rgb(255, 0, 0)" ==> "255 0 0 1") so that their components can be injected/extracted by CSS.Hooks logic. */
32282					for (var j = 0; j < CSS.Lists.colors.length; j++) {
32283						/* Wrap the dynamically generated normalization function in a new scope so that colorName's value is paired with its respective function.
32284						 (Otherwise, all functions would take the final for loop's colorName.) */
32285						(function() {
32286							var colorName = CSS.Lists.colors[j];
32287
32288							/* Note: In IE<=8, which support rgb but not rgba, color properties are reverted to rgb by stripping off the alpha component. */
32289							CSS.Normalizations.registered[colorName] = function(type, element, propertyValue) {
32290								switch (type) {
32291									case "name":
32292										return colorName;
32293										/* Convert all color values into the rgb format. (Old IE can return hex values and color names instead of rgb/rgba.) */
32294									case "extract":
32295										var extracted;
32296
32297										/* If the color is already in its hookable form (e.g. "255 255 255 1") due to having been previously extracted, skip extraction. */
32298										if (CSS.RegEx.wrappedValueAlreadyExtracted.test(propertyValue)) {
32299											extracted = propertyValue;
32300										} else {
32301											var converted,
32302													colorNames = {
32303														black: "rgb(0, 0, 0)",
32304														blue: "rgb(0, 0, 255)",
32305														gray: "rgb(128, 128, 128)",
32306														green: "rgb(0, 128, 0)",
32307														red: "rgb(255, 0, 0)",
32308														white: "rgb(255, 255, 255)"
32309													};
32310
32311											/* Convert color names to rgb. */
32312											if (/^[A-z]+$/i.test(propertyValue)) {
32313												if (colorNames[propertyValue] !== undefined) {
32314													converted = colorNames[propertyValue];
32315												} else {
32316													/* If an unmatched color name is provided, default to black. */
32317													converted = colorNames.black;
32318												}
32319												/* Convert hex values to rgb. */
32320											} else if (CSS.RegEx.isHex.test(propertyValue)) {
32321												converted = "rgb(" + CSS.Values.hexToRgb(propertyValue).join(" ") + ")";
32322												/* If the provided color doesn't match any of the accepted color formats, default to black. */
32323											} else if (!(/^rgba?\(/i.test(propertyValue))) {
32324												converted = colorNames.black;
32325											}
32326
32327											/* Remove the surrounding "rgb/rgba()" string then replace commas with spaces and strip
32328											 repeated spaces (in case the value included spaces to begin with). */
32329											extracted = (converted || propertyValue).toString().match(CSS.RegEx.valueUnwrap)[1].replace(/,(\s+)?/g, " ");
32330										}
32331
32332										/* So long as this isn't <=IE8, add a fourth (alpha) component if it's missing and default it to 1 (visible). */
32333										if ((!IE || IE > 8) && extracted.split(" ").length === 3) {
32334											extracted += " 1";
32335										}
32336
32337										return extracted;
32338									case "inject":
32339										/* If we have a pattern then it might already have the right values */
32340										if (/^rgb/.test(propertyValue)) {
32341											return propertyValue;
32342										}
32343
32344										/* If this is IE<=8 and an alpha component exists, strip it off. */
32345										if (IE <= 8) {
32346											if (propertyValue.split(" ").length === 4) {
32347												propertyValue = propertyValue.split(/\s+/).slice(0, 3).join(" ");
32348											}
32349											/* Otherwise, add a fourth (alpha) component if it's missing and default it to 1 (visible). */
32350										} else if (propertyValue.split(" ").length === 3) {
32351											propertyValue += " 1";
32352										}
32353
32354										/* Re-insert the browser-appropriate wrapper("rgb/rgba()"), insert commas, and strip off decimal units
32355										 on all values but the fourth (R, G, and B only accept whole numbers). */
32356										return (IE <= 8 ? "rgb" : "rgba") + "(" + propertyValue.replace(/\s+/g, ",").replace(/\.(\d)+(?=,)/g, "") + ")";
32357								}
32358							};
32359						})();
32360					}
32361
32362					/**************
32363					 Dimensions
32364					 **************/
32365					function augmentDimension(name, element, wantInner) {
32366						var isBorderBox = CSS.getPropertyValue(element, "boxSizing").toString().toLowerCase() === "border-box";
32367
32368						if (isBorderBox === (wantInner || false)) {
32369							/* in box-sizing mode, the CSS width / height accessors already give the outerWidth / outerHeight. */
32370							var i,
32371									value,
32372									augment = 0,
32373									sides = name === "width" ? ["Left", "Right"] : ["Top", "Bottom"],
32374									fields = ["padding" + sides[0], "padding" + sides[1], "border" + sides[0] + "Width", "border" + sides[1] + "Width"];
32375
32376							for (i = 0; i < fields.length; i++) {
32377								value = parseFloat(CSS.getPropertyValue(element, fields[i]));
32378								if (!isNaN(value)) {
32379									augment += value;
32380								}
32381							}
32382							return wantInner ? -augment : augment;
32383						}
32384						return 0;
32385					}
32386					function getDimension(name, wantInner) {
32387						return function(type, element, propertyValue) {
32388							switch (type) {
32389								case "name":
32390									return name;
32391								case "extract":
32392									return parseFloat(propertyValue) + augmentDimension(name, element, wantInner);
32393								case "inject":
32394									return (parseFloat(propertyValue) - augmentDimension(name, element, wantInner)) + "px";
32395							}
32396						};
32397					}
32398					CSS.Normalizations.registered.innerWidth = getDimension("width", true);
32399					CSS.Normalizations.registered.innerHeight = getDimension("height", true);
32400					CSS.Normalizations.registered.outerWidth = getDimension("width");
32401					CSS.Normalizations.registered.outerHeight = getDimension("height");
32402				}
32403			},
32404			/************************
32405			 CSS Property Names
32406			 ************************/
32407
32408			Names: {
32409				/* Camelcase a property name into its JavaScript notation (e.g. "background-color" ==> "backgroundColor").
32410				 Camelcasing is used to normalize property names between and across calls. */
32411				camelCase: function(property) {
32412					return property.replace(/-(\w)/g, function(match, subMatch) {
32413						return subMatch.toUpperCase();
32414					});
32415				},
32416				/* For SVG elements, some properties (namely, dimensional ones) are GET/SET via the element's HTML attributes (instead of via CSS styles). */
32417				SVGAttribute: function(property) {
32418					var SVGAttributes = "width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";
32419
32420					/* Certain browsers require an SVG transform to be applied as an attribute. (Otherwise, application via CSS is preferable due to 3D support.) */
32421					if (IE || (Velocity.State.isAndroid && !Velocity.State.isChrome)) {
32422						SVGAttributes += "|transform";
32423					}
32424
32425					return new RegExp("^(" + SVGAttributes + ")$", "i").test(property);
32426				},
32427				/* Determine whether a property should be set with a vendor prefix. */
32428				/* If a prefixed version of the property exists, return it. Otherwise, return the original property name.
32429				 If the property is not at all supported by the browser, return a false flag. */
32430				prefixCheck: function(property) {
32431					/* If this property has already been checked, return the cached value. */
32432					if (Velocity.State.prefixMatches[property]) {
32433						return [Velocity.State.prefixMatches[property], true];
32434					} else {
32435						var vendors = ["", "Webkit", "Moz", "ms", "O"];
32436
32437						for (var i = 0, vendorsLength = vendors.length; i < vendorsLength; i++) {
32438							var propertyPrefixed;
32439
32440							if (i === 0) {
32441								propertyPrefixed = property;
32442							} else {
32443								/* Capitalize the first letter of the property to conform to JavaScript vendor prefix notation (e.g. webkitFilter). */
32444								propertyPrefixed = vendors[i] + property.replace(/^\w/, function(match) {
32445									return match.toUpperCase();
32446								});
32447							}
32448
32449							/* Check if the browser supports this property as prefixed. */
32450							if (Type.isString(Velocity.State.prefixElement.style[propertyPrefixed])) {
32451								/* Cache the match. */
32452								Velocity.State.prefixMatches[property] = propertyPrefixed;
32453
32454								return [propertyPrefixed, true];
32455							}
32456						}
32457
32458						/* If the browser doesn't support this property in any form, include a false flag so that the caller can decide how to proceed. */
32459						return [property, false];
32460					}
32461				}
32462			},
32463			/************************
32464			 CSS Property Values
32465			 ************************/
32466
32467			Values: {
32468				/* Hex to RGB conversion. Copyright Tim Down: http://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb */
32469				hexToRgb: function(hex) {
32470					var shortformRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i,
32471							longformRegex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,
32472							rgbParts;
32473
32474					hex = hex.replace(shortformRegex, function(m, r, g, b) {
32475						return r + r + g + g + b + b;
32476					});
32477
32478					rgbParts = longformRegex.exec(hex);
32479
32480					return rgbParts ? [parseInt(rgbParts[1], 16), parseInt(rgbParts[2], 16), parseInt(rgbParts[3], 16)] : [0, 0, 0];
32481				},
32482				isCSSNullValue: function(value) {
32483					/* The browser defaults CSS values that have not been set to either 0 or one of several possible null-value strings.
32484					 Thus, we check for both falsiness and these special strings. */
32485					/* Null-value checking is performed to default the special strings to 0 (for the sake of tweening) or their hook
32486					 templates as defined as CSS.Hooks (for the sake of hook injection/extraction). */
32487					/* Note: Chrome returns "rgba(0, 0, 0, 0)" for an undefined color whereas IE returns "transparent". */
32488					return (!value || /^(none|auto|transparent|(rgba\(0, ?0, ?0, ?0\)))$/i.test(value));
32489				},
32490				/* Retrieve a property's default unit type. Used for assigning a unit type when one is not supplied by the user. */
32491				getUnitType: function(property) {
32492					if (/^(rotate|skew)/i.test(property)) {
32493						return "deg";
32494					} else if (/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(property)) {
32495						/* The above properties are unitless. */
32496						return "";
32497					} else {
32498						/* Default to px for all other properties. */
32499						return "px";
32500					}
32501				},
32502				/* HTML elements default to an associated display type when they're not set to display:none. */
32503				/* Note: This function is used for correctly setting the non-"none" display value in certain Velocity redirects, such as fadeIn/Out. */
32504				getDisplayType: function(element) {
32505					var tagName = element && element.tagName.toString().toLowerCase();
32506
32507					if (/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(tagName)) {
32508						return "inline";
32509					} else if (/^(li)$/i.test(tagName)) {
32510						return "list-item";
32511					} else if (/^(tr)$/i.test(tagName)) {
32512						return "table-row";
32513					} else if (/^(table)$/i.test(tagName)) {
32514						return "table";
32515					} else if (/^(tbody)$/i.test(tagName)) {
32516						return "table-row-group";
32517						/* Default to "block" when no match is found. */
32518					} else {
32519						return "block";
32520					}
32521				},
32522				/* The class add/remove functions are used to temporarily apply a "velocity-animating" class to elements while they're animating. */
32523				addClass: function(element, className) {
32524					if (element) {
32525						if (element.classList) {
32526							element.classList.add(className);
32527						} else if (Type.isString(element.className)) {
32528							// Element.className is around 15% faster then set/getAttribute
32529							element.className += (element.className.length ? " " : "") + className;
32530						} else {
32531							// Work around for IE strict mode animating SVG - and anything else that doesn't behave correctly - the same way jQuery does it
32532							var currentClass = element.getAttribute(IE <= 7 ? "className" : "class") || "";
32533
32534							element.setAttribute("class", currentClass + (currentClass ? " " : "") + className);
32535						}
32536					}
32537				},
32538				removeClass: function(element, className) {
32539					if (element) {
32540						if (element.classList) {
32541							element.classList.remove(className);
32542						} else if (Type.isString(element.className)) {
32543							// Element.className is around 15% faster then set/getAttribute
32544							// TODO: Need some jsperf tests on performance - can we get rid of the regex and maybe use split / array manipulation?
32545							element.className = element.className.toString().replace(new RegExp("(^|\\s)" + className.split(" ").join("|") + "(\\s|$)", "gi"), " ");
32546						} else {
32547							// Work around for IE strict mode animating SVG - and anything else that doesn't behave correctly - the same way jQuery does it
32548							var currentClass = element.getAttribute(IE <= 7 ? "className" : "class") || "";
32549
32550							element.setAttribute("class", currentClass.replace(new RegExp("(^|\s)" + className.split(" ").join("|") + "(\s|$)", "gi"), " "));
32551						}
32552					}
32553				}
32554			},
32555			/****************************
32556			 Style Getting & Setting
32557			 ****************************/
32558
32559			/* The singular getPropertyValue, which routes the logic for all normalizations, hooks, and standard CSS properties. */
32560			getPropertyValue: function(element, property, rootPropertyValue, forceStyleLookup) {
32561				/* Get an element's computed property value. */
32562				/* Note: Retrieving the value of a CSS property cannot simply be performed by checking an element's
32563				 style attribute (which only reflects user-defined values). Instead, the browser must be queried for a property's
32564				 *computed* value. You can read more about getComputedStyle here: https://developer.mozilla.org/en/docs/Web/API/window.getComputedStyle */
32565				function computePropertyValue(element, property) {
32566					/* When box-sizing isn't set to border-box, height and width style values are incorrectly computed when an
32567					 element's scrollbars are visible (which expands the element's dimensions). Thus, we defer to the more accurate
32568					 offsetHeight/Width property, which includes the total dimensions for interior, border, padding, and scrollbar.
32569					 We subtract border and padding to get the sum of interior + scrollbar. */
32570					var computedValue = 0;
32571
32572					/* IE<=8 doesn't support window.getComputedStyle, thus we defer to jQuery, which has an extensive array
32573					 of hacks to accurately retrieve IE8 property values. Re-implementing that logic here is not worth bloating the
32574					 codebase for a dying browser. The performance repercussions of using jQuery here are minimal since
32575					 Velocity is optimized to rarely (and sometimes never) query the DOM. Further, the $.css() codepath isn't that slow. */
32576					if (IE <= 8) {
32577						computedValue = $.css(element, property); /* GET */
32578						/* All other browsers support getComputedStyle. The returned live object reference is cached onto its
32579						 associated element so that it does not need to be refetched upon every GET. */
32580					} else {
32581						/* Browsers do not return height and width values for elements that are set to display:"none". Thus, we temporarily
32582						 toggle display to the element type's default value. */
32583						var toggleDisplay = false;
32584
32585						if (/^(width|height)$/.test(property) && CSS.getPropertyValue(element, "display") === 0) {
32586							toggleDisplay = true;
32587							CSS.setPropertyValue(element, "display", CSS.Values.getDisplayType(element));
32588						}
32589
32590						var revertDisplay = function() {
32591							if (toggleDisplay) {
32592								CSS.setPropertyValue(element, "display", "none");
32593							}
32594						};
32595
32596						if (!forceStyleLookup) {
32597							if (property === "height" && CSS.getPropertyValue(element, "boxSizing").toString().toLowerCase() !== "border-box") {
32598								var contentBoxHeight = element.offsetHeight - (parseFloat(CSS.getPropertyValue(element, "borderTopWidth")) || 0) - (parseFloat(CSS.getPropertyValue(element, "borderBottomWidth")) || 0) - (parseFloat(CSS.getPropertyValue(element, "paddingTop")) || 0) - (parseFloat(CSS.getPropertyValue(element, "paddingBottom")) || 0);
32599								revertDisplay();
32600
32601								return contentBoxHeight;
32602							} else if (property === "width" && CSS.getPropertyValue(element, "boxSizing").toString().toLowerCase() !== "border-box") {
32603								var contentBoxWidth = element.offsetWidth - (parseFloat(CSS.getPropertyValue(element, "borderLeftWidth")) || 0) - (parseFloat(CSS.getPropertyValue(element, "borderRightWidth")) || 0) - (parseFloat(CSS.getPropertyValue(element, "paddingLeft")) || 0) - (parseFloat(CSS.getPropertyValue(element, "paddingRight")) || 0);
32604								revertDisplay();
32605
32606								return contentBoxWidth;
32607							}
32608						}
32609
32610						var computedStyle;
32611
32612						/* For elements that Velocity hasn't been called on directly (e.g. when Velocity queries the DOM on behalf
32613						 of a parent of an element its animating), perform a direct getComputedStyle lookup since the object isn't cached. */
32614						if (Data(element) === undefined) {
32615							computedStyle = window.getComputedStyle(element, null); /* GET */
32616							/* If the computedStyle object has yet to be cached, do so now. */
32617						} else if (!Data(element).computedStyle) {
32618							computedStyle = Data(element).computedStyle = window.getComputedStyle(element, null); /* GET */
32619							/* If computedStyle is cached, use it. */
32620						} else {
32621							computedStyle = Data(element).computedStyle;
32622						}
32623
32624						/* IE and Firefox do not return a value for the generic borderColor -- they only return individual values for each border side's color.
32625						 Also, in all browsers, when border colors aren't all the same, a compound value is returned that Velocity isn't setup to parse.
32626						 So, as a polyfill for querying individual border side colors, we just return the top border's color and animate all borders from that value. */
32627						if (property === "borderColor") {
32628							property = "borderTopColor";
32629						}
32630
32631						/* IE9 has a bug in which the "filter" property must be accessed from computedStyle using the getPropertyValue method
32632						 instead of a direct property lookup. The getPropertyValue method is slower than a direct lookup, which is why we avoid it by default. */
32633						if (IE === 9 && property === "filter") {
32634							computedValue = computedStyle.getPropertyValue(property); /* GET */
32635						} else {
32636							computedValue = computedStyle[property];
32637						}
32638
32639						/* Fall back to the property's style value (if defined) when computedValue returns nothing,
32640						 which can happen when the element hasn't been painted. */
32641						if (computedValue === "" || computedValue === null) {
32642							computedValue = element.style[property];
32643						}
32644
32645						revertDisplay();
32646					}
32647
32648					/* For top, right, bottom, and left (TRBL) values that are set to "auto" on elements of "fixed" or "absolute" position,
32649					 defer to jQuery for converting "auto" to a numeric value. (For elements with a "static" or "relative" position, "auto" has the same
32650					 effect as being set to 0, so no conversion is necessary.) */
32651					/* An example of why numeric conversion is necessary: When an element with "position:absolute" has an untouched "left"
32652					 property, which reverts to "auto", left's value is 0 relative to its parent element, but is often non-zero relative
32653					 to its *containing* (not parent) element, which is the nearest "position:relative" ancestor or the viewport (and always the viewport in the case of "position:fixed"). */
32654					if (computedValue === "auto" && /^(top|right|bottom|left)$/i.test(property)) {
32655						var position = computePropertyValue(element, "position"); /* GET */
32656
32657						/* For absolute positioning, jQuery's $.position() only returns values for top and left;
32658						 right and bottom will have their "auto" value reverted to 0. */
32659						/* Note: A jQuery object must be created here since jQuery doesn't have a low-level alias for $.position().
32660						 Not a big deal since we're currently in a GET batch anyway. */
32661						if (position === "fixed" || (position === "absolute" && /top|left/i.test(property))) {
32662							/* Note: jQuery strips the pixel unit from its returned values; we re-add it here to conform with computePropertyValue's behavior. */
32663							computedValue = $(element).position()[property] + "px"; /* GET */
32664						}
32665					}
32666
32667					return computedValue;
32668				}
32669
32670				var propertyValue;
32671
32672				/* If this is a hooked property (e.g. "clipLeft" instead of the root property of "clip"),
32673				 extract the hook's value from a normalized rootPropertyValue using CSS.Hooks.extractValue(). */
32674				if (CSS.Hooks.registered[property]) {
32675					var hook = property,
32676							hookRoot = CSS.Hooks.getRoot(hook);
32677
32678					/* If a cached rootPropertyValue wasn't passed in (which Velocity always attempts to do in order to avoid requerying the DOM),
32679					 query the DOM for the root property's value. */
32680					if (rootPropertyValue === undefined) {
32681						/* Since the browser is now being directly queried, use the official post-prefixing property name for this lookup. */
32682						rootPropertyValue = CSS.getPropertyValue(element, CSS.Names.prefixCheck(hookRoot)[0]); /* GET */
32683					}
32684
32685					/* If this root has a normalization registered, peform the associated normalization extraction. */
32686					if (CSS.Normalizations.registered[hookRoot]) {
32687						rootPropertyValue = CSS.Normalizations.registered[hookRoot]("extract", element, rootPropertyValue);
32688					}
32689
32690					/* Extract the hook's value. */
32691					propertyValue = CSS.Hooks.extractValue(hook, rootPropertyValue);
32692
32693					/* If this is a normalized property (e.g. "opacity" becomes "filter" in <=IE8) or "translateX" becomes "transform"),
32694					 normalize the property's name and value, and handle the special case of transforms. */
32695					/* Note: Normalizing a property is mutually exclusive from hooking a property since hook-extracted values are strictly
32696					 numerical and therefore do not require normalization extraction. */
32697				} else if (CSS.Normalizations.registered[property]) {
32698					var normalizedPropertyName,
32699							normalizedPropertyValue;
32700
32701					normalizedPropertyName = CSS.Normalizations.registered[property]("name", element);
32702
32703					/* Transform values are calculated via normalization extraction (see below), which checks against the element's transformCache.
32704					 At no point do transform GETs ever actually query the DOM; initial stylesheet values are never processed.
32705					 This is because parsing 3D transform matrices is not always accurate and would bloat our codebase;
32706					 thus, normalization extraction defaults initial transform values to their zero-values (e.g. 1 for scaleX and 0 for translateX). */
32707					if (normalizedPropertyName !== "transform") {
32708						normalizedPropertyValue = computePropertyValue(element, CSS.Names.prefixCheck(normalizedPropertyName)[0]); /* GET */
32709
32710						/* If the value is a CSS null-value and this property has a hook template, use that zero-value template so that hooks can be extracted from it. */
32711						if (CSS.Values.isCSSNullValue(normalizedPropertyValue) && CSS.Hooks.templates[property]) {
32712							normalizedPropertyValue = CSS.Hooks.templates[property][1];
32713						}
32714					}
32715
32716					propertyValue = CSS.Normalizations.registered[property]("extract", element, normalizedPropertyValue);
32717				}
32718
32719				/* If a (numeric) value wasn't produced via hook extraction or normalization, query the DOM. */
32720				if (!/^[\d-]/.test(propertyValue)) {
32721					/* For SVG elements, dimensional properties (which SVGAttribute() detects) are tweened via
32722					 their HTML attribute values instead of their CSS style values. */
32723					var data = Data(element);
32724
32725					if (data && data.isSVG && CSS.Names.SVGAttribute(property)) {
32726						/* Since the height/width attribute values must be set manually, they don't reflect computed values.
32727						 Thus, we use use getBBox() to ensure we always get values for elements with undefined height/width attributes. */
32728						if (/^(height|width)$/i.test(property)) {
32729							/* Firefox throws an error if .getBBox() is called on an SVG that isn't attached to the DOM. */
32730							try {
32731								propertyValue = element.getBBox()[property];
32732							} catch (error) {
32733								propertyValue = 0;
32734							}
32735							/* Otherwise, access the attribute value directly. */
32736						} else {
32737							propertyValue = element.getAttribute(property);
32738						}
32739					} else {
32740						propertyValue = computePropertyValue(element, CSS.Names.prefixCheck(property)[0]); /* GET */
32741					}
32742				}
32743
32744				/* Since property lookups are for animation purposes (which entails computing the numeric delta between start and end values),
32745				 convert CSS null-values to an integer of value 0. */
32746				if (CSS.Values.isCSSNullValue(propertyValue)) {
32747					propertyValue = 0;
32748				}
32749
32750				if (Velocity.debug >= 2) {
32751					console.log("Get " + property + ": " + propertyValue);
32752				}
32753
32754				return propertyValue;
32755			},
32756			/* The singular setPropertyValue, which routes the logic for all normalizations, hooks, and standard CSS properties. */
32757			setPropertyValue: function(element, property, propertyValue, rootPropertyValue, scrollData) {
32758				var propertyName = property;
32759
32760				/* In order to be subjected to call options and element queueing, scroll animation is routed through Velocity as if it were a standard CSS property. */
32761				if (property === "scroll") {
32762					/* If a container option is present, scroll the container instead of the browser window. */
32763					if (scrollData.container) {
32764						scrollData.container["scroll" + scrollData.direction] = propertyValue;
32765						/* Otherwise, Velocity defaults to scrolling the browser window. */
32766					} else {
32767						if (scrollData.direction === "Left") {
32768							window.scrollTo(propertyValue, scrollData.alternateValue);
32769						} else {
32770							window.scrollTo(scrollData.alternateValue, propertyValue);
32771						}
32772					}
32773				} else {
32774					/* Transforms (translateX, rotateZ, etc.) are applied to a per-element transformCache object, which is manually flushed via flushTransformCache().
32775					 Thus, for now, we merely cache transforms being SET. */
32776					if (CSS.Normalizations.registered[property] && CSS.Normalizations.registered[property]("name", element) === "transform") {
32777						/* Perform a normalization injection. */
32778						/* Note: The normalization logic handles the transformCache updating. */
32779						CSS.Normalizations.registered[property]("inject", element, propertyValue);
32780
32781						propertyName = "transform";
32782						propertyValue = Data(element).transformCache[property];
32783					} else {
32784						/* Inject hooks. */
32785						if (CSS.Hooks.registered[property]) {
32786							var hookName = property,
32787									hookRoot = CSS.Hooks.getRoot(property);
32788
32789							/* If a cached rootPropertyValue was not provided, query the DOM for the hookRoot's current value. */
32790							rootPropertyValue = rootPropertyValue || CSS.getPropertyValue(element, hookRoot); /* GET */
32791
32792							propertyValue = CSS.Hooks.injectValue(hookName, propertyValue, rootPropertyValue);
32793							property = hookRoot;
32794						}
32795
32796						/* Normalize names and values. */
32797						if (CSS.Normalizations.registered[property]) {
32798							propertyValue = CSS.Normalizations.registered[property]("inject", element, propertyValue);
32799							property = CSS.Normalizations.registered[property]("name", element);
32800						}
32801
32802						/* Assign the appropriate vendor prefix before performing an official style update. */
32803						propertyName = CSS.Names.prefixCheck(property)[0];
32804
32805						/* A try/catch is used for IE<=8, which throws an error when "invalid" CSS values are set, e.g. a negative width.
32806						 Try/catch is avoided for other browsers since it incurs a performance overhead. */
32807						if (IE <= 8) {
32808							try {
32809								element.style[propertyName] = propertyValue;
32810							} catch (error) {
32811								if (Velocity.debug) {
32812									console.log("Browser does not support [" + propertyValue + "] for [" + propertyName + "]");
32813								}
32814							}
32815							/* SVG elements have their dimensional properties (width, height, x, y, cx, etc.) applied directly as attributes instead of as styles. */
32816							/* Note: IE8 does not support SVG elements, so it's okay that we skip it for SVG animation. */
32817						} else {
32818							var data = Data(element);
32819
32820							if (data && data.isSVG && CSS.Names.SVGAttribute(property)) {
32821								/* Note: For SVG attributes, vendor-prefixed property names are never used. */
32822								/* Note: Not all CSS properties can be animated via attributes, but the browser won't throw an error for unsupported properties. */
32823								element.setAttribute(property, propertyValue);
32824							} else {
32825								element.style[propertyName] = propertyValue;
32826							}
32827						}
32828
32829						if (Velocity.debug >= 2) {
32830							console.log("Set " + property + " (" + propertyName + "): " + propertyValue);
32831						}
32832					}
32833				}
32834
32835				/* Return the normalized property name and value in case the caller wants to know how these values were modified before being applied to the DOM. */
32836				return [propertyName, propertyValue];
32837			},
32838			/* To increase performance by batching transform updates into a single SET, transforms are not directly applied to an element until flushTransformCache() is called. */
32839			/* Note: Velocity applies transform properties in the same order that they are chronogically introduced to the element's CSS styles. */
32840			flushTransformCache: function(element) {
32841				var transformString = "",
32842						data = Data(element);
32843
32844				/* Certain browsers require that SVG transforms be applied as an attribute. However, the SVG transform attribute takes a modified version of CSS's transform string
32845				 (units are dropped and, except for skewX/Y, subproperties are merged into their master property -- e.g. scaleX and scaleY are merged into scale(X Y). */
32846				if ((IE || (Velocity.State.isAndroid && !Velocity.State.isChrome)) && data && data.isSVG) {
32847					/* Since transform values are stored in their parentheses-wrapped form, we use a helper function to strip out their numeric values.
32848					 Further, SVG transform properties only take unitless (representing pixels) values, so it's okay that parseFloat() strips the unit suffixed to the float value. */
32849					var getTransformFloat = function(transformProperty) {
32850						return parseFloat(CSS.getPropertyValue(element, transformProperty));
32851					};
32852
32853					/* Create an object to organize all the transforms that we'll apply to the SVG element. To keep the logic simple,
32854					 we process *all* transform properties -- even those that may not be explicitly applied (since they default to their zero-values anyway). */
32855					var SVGTransforms = {
32856						translate: [getTransformFloat("translateX"), getTransformFloat("translateY")],
32857						skewX: [getTransformFloat("skewX")], skewY: [getTransformFloat("skewY")],
32858						/* If the scale property is set (non-1), use that value for the scaleX and scaleY values
32859						 (this behavior mimics the result of animating all these properties at once on HTML elements). */
32860						scale: getTransformFloat("scale") !== 1 ? [getTransformFloat("scale"), getTransformFloat("scale")] : [getTransformFloat("scaleX"), getTransformFloat("scaleY")],
32861						/* Note: SVG's rotate transform takes three values: rotation degrees followed by the X and Y values
32862						 defining the rotation's origin point. We ignore the origin values (default them to 0). */
32863						rotate: [getTransformFloat("rotateZ"), 0, 0]
32864					};
32865
32866					/* Iterate through the transform properties in the user-defined property map order.
32867					 (This mimics the behavior of non-SVG transform animation.) */
32868					$.each(Data(element).transformCache, function(transformName) {
32869						/* Except for with skewX/Y, revert the axis-specific transform subproperties to their axis-free master
32870						 properties so that they match up with SVG's accepted transform properties. */
32871						if (/^translate/i.test(transformName)) {
32872							transformName = "translate";
32873						} else if (/^scale/i.test(transformName)) {
32874							transformName = "scale";
32875						} else if (/^rotate/i.test(transformName)) {
32876							transformName = "rotate";
32877						}
32878
32879						/* Check that we haven't yet deleted the property from the SVGTransforms container. */
32880						if (SVGTransforms[transformName]) {
32881							/* Append the transform property in the SVG-supported transform format. As per the spec, surround the space-delimited values in parentheses. */
32882							transformString += transformName + "(" + SVGTransforms[transformName].join(" ") + ")" + " ";
32883
32884							/* After processing an SVG transform property, delete it from the SVGTransforms container so we don't
32885							 re-insert the same master property if we encounter another one of its axis-specific properties. */
32886							delete SVGTransforms[transformName];
32887						}
32888					});
32889				} else {
32890					var transformValue,
32891							perspective;
32892
32893					/* Transform properties are stored as members of the transformCache object. Concatenate all the members into a string. */
32894					$.each(Data(element).transformCache, function(transformName) {
32895						transformValue = Data(element).transformCache[transformName];
32896
32897						/* Transform's perspective subproperty must be set first in order to take effect. Store it temporarily. */
32898						if (transformName === "transformPerspective") {
32899							perspective = transformValue;
32900							return true;
32901						}
32902
32903						/* IE9 only supports one rotation type, rotateZ, which it refers to as "rotate". */
32904						if (IE === 9 && transformName === "rotateZ") {
32905							transformName = "rotate";
32906						}
32907
32908						transformString += transformName + transformValue + " ";
32909					});
32910
32911					/* If present, set the perspective subproperty first. */
32912					if (perspective) {
32913						transformString = "perspective" + perspective + " " + transformString;
32914					}
32915				}
32916
32917				CSS.setPropertyValue(element, "transform", transformString);
32918			}
32919		};
32920
32921		/* Register hooks and normalizations. */
32922		CSS.Hooks.register();
32923		CSS.Normalizations.register();
32924
32925		/* Allow hook setting in the same fashion as jQuery's $.css(). */
32926		Velocity.hook = function(elements, arg2, arg3) {
32927			var value;
32928
32929			elements = sanitizeElements(elements);
32930
32931			$.each(elements, function(i, element) {
32932				/* Initialize Velocity's per-element data cache if this element hasn't previously been animated. */
32933				if (Data(element) === undefined) {
32934					Velocity.init(element);
32935				}
32936
32937				/* Get property value. If an element set was passed in, only return the value for the first element. */
32938				if (arg3 === undefined) {
32939					if (value === undefined) {
32940						value = CSS.getPropertyValue(element, arg2);
32941					}
32942					/* Set property value. */
32943				} else {
32944					/* sPV returns an array of the normalized propertyName/propertyValue pair used to update the DOM. */
32945					var adjustedSet = CSS.setPropertyValue(element, arg2, arg3);
32946
32947					/* Transform properties don't automatically set. They have to be flushed to the DOM. */
32948					if (adjustedSet[0] === "transform") {
32949						Velocity.CSS.flushTransformCache(element);
32950					}
32951
32952					value = adjustedSet;
32953				}
32954			});
32955
32956			return value;
32957		};
32958
32959		/*****************
32960		 Animation
32961		 *****************/
32962
32963		var animate = function() {
32964			var opts;
32965
32966			/******************
32967			 Call Chain
32968			 ******************/
32969
32970			/* Logic for determining what to return to the call stack when exiting out of Velocity. */
32971			function getChain() {
32972				/* If we are using the utility function, attempt to return this call's promise. If no promise library was detected,
32973				 default to null instead of returning the targeted elements so that utility function's return value is standardized. */
32974				if (isUtility) {
32975					return promiseData.promise || null;
32976					/* Otherwise, if we're using $.fn, return the jQuery-/Zepto-wrapped element set. */
32977				} else {
32978					return elementsWrapped;
32979				}
32980			}
32981
32982			/*************************
32983			 Arguments Assignment
32984			 *************************/
32985
32986			/* To allow for expressive CoffeeScript code, Velocity supports an alternative syntax in which "elements" (or "e"), "properties" (or "p"), and "options" (or "o")
32987			 objects are defined on a container object that's passed in as Velocity's sole argument. */
32988			/* Note: Some browsers automatically populate arguments with a "properties" object. We detect it by checking for its default "names" property. */
32989			var syntacticSugar = (arguments[0] && (arguments[0].p || (($.isPlainObject(arguments[0].properties) && !arguments[0].properties.names) || Type.isString(arguments[0].properties)))),
32990					/* Whether Velocity was called via the utility function (as opposed to on a jQuery/Zepto object). */
32991					isUtility,
32992					/* When Velocity is called via the utility function ($.Velocity()/Velocity()), elements are explicitly
32993					 passed in as the first parameter. Thus, argument positioning varies. We normalize them here. */
32994					elementsWrapped,
32995					argumentIndex;
32996
32997			var elements,
32998					propertiesMap,
32999					options;
33000
33001			/* Detect jQuery/Zepto elements being animated via the $.fn method. */
33002			if (Type.isWrapped(this)) {
33003				isUtility = false;
33004
33005				argumentIndex = 0;
33006				elements = this;
33007				elementsWrapped = this;
33008				/* Otherwise, raw elements are being animated via the utility function. */
33009			} else {
33010				isUtility = true;
33011
33012				argumentIndex = 1;
33013				elements = syntacticSugar ? (arguments[0].elements || arguments[0].e) : arguments[0];
33014			}
33015
33016			/***************
33017			 Promises
33018			 ***************/
33019
33020			var promiseData = {
33021				promise: null,
33022				resolver: null,
33023				rejecter: null
33024			};
33025
33026			/* If this call was made via the utility function (which is the default method of invocation when jQuery/Zepto are not being used), and if
33027			 promise support was detected, create a promise object for this call and store references to its resolver and rejecter methods. The resolve
33028			 method is used when a call completes naturally or is prematurely stopped by the user. In both cases, completeCall() handles the associated
33029			 call cleanup and promise resolving logic. The reject method is used when an invalid set of arguments is passed into a Velocity call. */
33030			/* Note: Velocity employs a call-based queueing architecture, which means that stopping an animating element actually stops the full call that
33031			 triggered it -- not that one element exclusively. Similarly, there is one promise per call, and all elements targeted by a Velocity call are
33032			 grouped together for the purposes of resolving and rejecting a promise. */
33033			if (isUtility && Velocity.Promise) {
33034				promiseData.promise = new Velocity.Promise(function(resolve, reject) {
33035					promiseData.resolver = resolve;
33036					promiseData.rejecter = reject;
33037				});
33038			}
33039
33040			if (syntacticSugar) {
33041				propertiesMap = arguments[0].properties || arguments[0].p;
33042				options = arguments[0].options || arguments[0].o;
33043			} else {
33044				propertiesMap = arguments[argumentIndex];
33045				options = arguments[argumentIndex + 1];
33046			}
33047
33048			elements = sanitizeElements(elements);
33049
33050			if (!elements) {
33051				if (promiseData.promise) {
33052					if (!propertiesMap || !options || options.promiseRejectEmpty !== false) {
33053						promiseData.rejecter();
33054					} else {
33055						promiseData.resolver();
33056					}
33057				}
33058				return;
33059			}
33060
33061			/* The length of the element set (in the form of a nodeList or an array of elements) is defaulted to 1 in case a
33062			 single raw DOM element is passed in (which doesn't contain a length property). */
33063			var elementsLength = elements.length,
33064					elementsIndex = 0;
33065
33066			/***************************
33067			 Argument Overloading
33068			 ***************************/
33069
33070			/* Support is included for jQuery's argument overloading: $.animate(propertyMap [, duration] [, easing] [, complete]).
33071			 Overloading is detected by checking for the absence of an object being passed into options. */
33072			/* Note: The stop/finish/pause/resume actions do not accept animation options, and are therefore excluded from this check. */
33073			if (!/^(stop|finish|finishAll|pause|resume)$/i.test(propertiesMap) && !$.isPlainObject(options)) {
33074				/* The utility function shifts all arguments one position to the right, so we adjust for that offset. */
33075				var startingArgumentPosition = argumentIndex + 1;
33076
33077				options = {};
33078
33079				/* Iterate through all options arguments */
33080				for (var i = startingArgumentPosition; i < arguments.length; i++) {
33081					/* Treat a number as a duration. Parse it out. */
33082					/* Note: The following RegEx will return true if passed an array with a number as its first item.
33083					 Thus, arrays are skipped from this check. */
33084					if (!Type.isArray(arguments[i]) && (/^(fast|normal|slow)$/i.test(arguments[i]) || /^\d/.test(arguments[i]))) {
33085						options.duration = arguments[i];
33086						/* Treat strings and arrays as easings. */
33087					} else if (Type.isString(arguments[i]) || Type.isArray(arguments[i])) {
33088						options.easing = arguments[i];
33089						/* Treat a function as a complete callback. */
33090					} else if (Type.isFunction(arguments[i])) {
33091						options.complete = arguments[i];
33092					}
33093				}
33094			}
33095
33096			/*********************
33097			 Action Detection
33098			 *********************/
33099
33100			/* Velocity's behavior is categorized into "actions": Elements can either be specially scrolled into view,
33101			 or they can be started, stopped, paused, resumed, or reversed . If a literal or referenced properties map is passed in as Velocity's
33102			 first argument, the associated action is "start". Alternatively, "scroll", "reverse", "pause", "resume" or "stop" can be passed in 
33103			 instead of a properties map. */
33104			var action;
33105
33106			switch (propertiesMap) {
33107				case "scroll":
33108					action = "scroll";
33109					break;
33110
33111				case "reverse":
33112					action = "reverse";
33113					break;
33114
33115				case "pause":
33116
33117					/*******************
33118					 Action: Pause
33119					 *******************/
33120
33121					var currentTime = (new Date()).getTime();
33122
33123					/* Handle delay timers */
33124					$.each(elements, function(i, element) {
33125						pauseDelayOnElement(element, currentTime);
33126					});
33127
33128					/* Pause and Resume are call-wide (not on a per element basis). Thus, calling pause or resume on a 
33129					 single element will cause any calls that containt tweens for that element to be paused/resumed
33130					 as well. */
33131
33132					/* Iterate through all calls and pause any that contain any of our elements */
33133					$.each(Velocity.State.calls, function(i, activeCall) {
33134
33135						var found = false;
33136						/* Inactive calls are set to false by the logic inside completeCall(). Skip them. */
33137						if (activeCall) {
33138							/* Iterate through the active call's targeted elements. */
33139							$.each(activeCall[1], function(k, activeElement) {
33140								var queueName = (options === undefined) ? "" : options;
33141
33142								if (queueName !== true && (activeCall[2].queue !== queueName) && !(options === undefined && activeCall[2].queue === false)) {
33143									return true;
33144								}
33145
33146								/* Iterate through the calls targeted by the stop command. */
33147								$.each(elements, function(l, element) {
33148									/* Check that this call was applied to the target element. */
33149									if (element === activeElement) {
33150
33151										/* Set call to paused */
33152										activeCall[5] = {
33153											resume: false
33154										};
33155
33156										/* Once we match an element, we can bounce out to the next call entirely */
33157										found = true;
33158										return false;
33159									}
33160								});
33161
33162								/* Proceed to check next call if we have already matched */
33163								if (found) {
33164									return false;
33165								}
33166							});
33167						}
33168
33169					});
33170
33171					/* Since pause creates no new tweens, exit out of Velocity. */
33172					return getChain();
33173
33174				case "resume":
33175
33176					/*******************
33177					 Action: Resume
33178					 *******************/
33179
33180					/* Handle delay timers */
33181					$.each(elements, function(i, element) {
33182						resumeDelayOnElement(element, currentTime);
33183					});
33184
33185					/* Pause and Resume are call-wide (not on a per elemnt basis). Thus, calling pause or resume on a 
33186					 single element will cause any calls that containt tweens for that element to be paused/resumed
33187					 as well. */
33188
33189					/* Iterate through all calls and pause any that contain any of our elements */
33190					$.each(Velocity.State.calls, function(i, activeCall) {
33191						var found = false;
33192						/* Inactive calls are set to false by the logic inside completeCall(). Skip them. */
33193						if (activeCall) {
33194							/* Iterate through the active call's targeted elements. */
33195							$.each(activeCall[1], function(k, activeElement) {
33196								var queueName = (options === undefined) ? "" : options;
33197
33198								if (queueName !== true && (activeCall[2].queue !== queueName) && !(options === undefined && activeCall[2].queue === false)) {
33199									return true;
33200								}
33201
33202								/* Skip any calls that have never been paused */
33203								if (!activeCall[5]) {
33204									return true;
33205								}
33206
33207								/* Iterate through the calls targeted by the stop command. */
33208								$.each(elements, function(l, element) {
33209									/* Check that this call was applied to the target element. */
33210									if (element === activeElement) {
33211
33212										/* Flag a pause object to be resumed, which will occur during the next tick. In
33213										 addition, the pause object will at that time be deleted */
33214										activeCall[5].resume = true;
33215
33216										/* Once we match an element, we can bounce out to the next call entirely */
33217										found = true;
33218										return false;
33219									}
33220								});
33221
33222								/* Proceed to check next call if we have already matched */
33223								if (found) {
33224									return false;
33225								}
33226							});
33227						}
33228
33229					});
33230
33231					/* Since resume creates no new tweens, exit out of Velocity. */
33232					return getChain();
33233
33234				case "finish":
33235				case "finishAll":
33236				case "stop":
33237					/*******************
33238					 Action: Stop
33239					 *******************/
33240
33241					/* Clear the currently-active delay on each targeted element. */
33242					$.each(elements, function(i, element) {
33243						if (Data(element) && Data(element).delayTimer) {
33244							/* Stop the timer from triggering its cached next() function. */
33245							clearTimeout(Data(element).delayTimer.setTimeout);
33246
33247							/* Manually call the next() function so that the subsequent queue items can progress. */
33248							if (Data(element).delayTimer.next) {
33249								Data(element).delayTimer.next();
33250							}
33251
33252							delete Data(element).delayTimer;
33253						}
33254
33255						/* If we want to finish everything in the queue, we have to iterate through it
33256						 and call each function. This will make them active calls below, which will
33257						 cause them to be applied via the duration setting. */
33258						if (propertiesMap === "finishAll" && (options === true || Type.isString(options))) {
33259							/* Iterate through the items in the element's queue. */
33260							$.each($.queue(element, Type.isString(options) ? options : ""), function(_, item) {
33261								/* The queue array can contain an "inprogress" string, which we skip. */
33262								if (Type.isFunction(item)) {
33263									item();
33264								}
33265							});
33266
33267							/* Clearing the $.queue() array is achieved by resetting it to []. */
33268							$.queue(element, Type.isString(options) ? options : "", []);
33269						}
33270					});
33271
33272					var callsToStop = [];
33273
33274					/* When the stop action is triggered, the elements' currently active call is immediately stopped. The active call might have
33275					 been applied to multiple elements, in which case all of the call's elements will be stopped. When an element
33276					 is stopped, the next item in its animation queue is immediately triggered. */
33277					/* An additional argument may be passed in to clear an element's remaining queued calls. Either true (which defaults to the "fx" queue)
33278					 or a custom queue string can be passed in. */
33279					/* Note: The stop command runs prior to Velocity's Queueing phase since its behavior is intended to take effect *immediately*,
33280					 regardless of the element's current queue state. */
33281
33282					/* Iterate through every active call. */
33283					$.each(Velocity.State.calls, function(i, activeCall) {
33284						/* Inactive calls are set to false by the logic inside completeCall(). Skip them. */
33285						if (activeCall) {
33286							/* Iterate through the active call's targeted elements. */
33287							$.each(activeCall[1], function(k, activeElement) {
33288								/* If true was passed in as a secondary argument, clear absolutely all calls on this element. Otherwise, only
33289								 clear calls associated with the relevant queue. */
33290								/* Call stopping logic works as follows:
33291								 - options === true --> stop current default queue calls (and queue:false calls), including remaining queued ones.
33292								 - options === undefined --> stop current queue:"" call and all queue:false calls.
33293								 - options === false --> stop only queue:false calls.
33294								 - options === "custom" --> stop current queue:"custom" call, including remaining queued ones (there is no functionality to only clear the currently-running queue:"custom" call). */
33295								var queueName = (options === undefined) ? "" : options;
33296
33297								if (queueName !== true && (activeCall[2].queue !== queueName) && !(options === undefined && activeCall[2].queue === false)) {
33298									return true;
33299								}
33300
33301								/* Iterate through the calls targeted by the stop command. */
33302								$.each(elements, function(l, element) {
33303									/* Check that this call was applied to the target element. */
33304									if (element === activeElement) {
33305										/* Optionally clear the remaining queued calls. If we're doing "finishAll" this won't find anything,
33306										 due to the queue-clearing above. */
33307										if (options === true || Type.isString(options)) {
33308											/* Iterate through the items in the element's queue. */
33309											$.each($.queue(element, Type.isString(options) ? options : ""), function(_, item) {
33310												/* The queue array can contain an "inprogress" string, which we skip. */
33311												if (Type.isFunction(item)) {
33312													/* Pass the item's callback a flag indicating that we want to abort from the queue call.
33313													 (Specifically, the queue will resolve the call's associated promise then abort.)  */
33314													item(null, true);
33315												}
33316											});
33317
33318											/* Clearing the $.queue() array is achieved by resetting it to []. */
33319											$.queue(element, Type.isString(options) ? options : "", []);
33320										}
33321
33322										if (propertiesMap === "stop") {
33323											/* Since "reverse" uses cached start values (the previous call's endValues), these values must be
33324											 changed to reflect the final value that the elements were actually tweened to. */
33325											/* Note: If only queue:false animations are currently running on an element, it won't have a tweensContainer
33326											 object. Also, queue:false animations can't be reversed. */
33327											var data = Data(element);
33328											if (data && data.tweensContainer && queueName !== false) {
33329												$.each(data.tweensContainer, function(m, activeTween) {
33330													activeTween.endValue = activeTween.currentValue;
33331												});
33332											}
33333
33334											callsToStop.push(i);
33335										} else if (propertiesMap === "finish" || propertiesMap === "finishAll") {
33336											/* To get active tweens to finish immediately, we forcefully shorten their durations to 1ms so that
33337											 they finish upon the next rAf tick then proceed with normal call completion logic. */
33338											activeCall[2].duration = 1;
33339										}
33340									}
33341								});
33342							});
33343						}
33344					});
33345
33346					/* Prematurely call completeCall() on each matched active call. Pass an additional flag for "stop" to indicate
33347					 that the complete callback and display:none setting should be skipped since we're completing prematurely. */
33348					if (propertiesMap === "stop") {
33349						$.each(callsToStop, function(i, j) {
33350							completeCall(j, true);
33351						});
33352
33353						if (promiseData.promise) {
33354							/* Immediately resolve the promise associated with this stop call since stop runs synchronously. */
33355							promiseData.resolver(elements);
33356						}
33357					}
33358
33359					/* Since we're stopping, and not proceeding with queueing, exit out of Velocity. */
33360					return getChain();
33361
33362				default:
33363					/* Treat a non-empty plain object as a literal properties map. */
33364					if ($.isPlainObject(propertiesMap) && !Type.isEmptyObject(propertiesMap)) {
33365						action = "start";
33366
33367						/****************
33368						 Redirects
33369						 ****************/
33370
33371						/* Check if a string matches a registered redirect (see Redirects above). */
33372					} else if (Type.isString(propertiesMap) && Velocity.Redirects[propertiesMap]) {
33373						opts = $.extend({}, options);
33374
33375						var durationOriginal = opts.duration,
33376								delayOriginal = opts.delay || 0;
33377
33378						/* If the backwards option was passed in, reverse the element set so that elements animate from the last to the first. */
33379						if (opts.backwards === true) {
33380							elements = $.extend(true, [], elements).reverse();
33381						}
33382
33383						/* Individually trigger the redirect for each element in the set to prevent users from having to handle iteration logic in their redirect. */
33384						$.each(elements, function(elementIndex, element) {
33385							/* If the stagger option was passed in, successively delay each element by the stagger value (in ms). Retain the original delay value. */
33386							if (parseFloat(opts.stagger)) {
33387								opts.delay = delayOriginal + (parseFloat(opts.stagger) * elementIndex);
33388							} else if (Type.isFunction(opts.stagger)) {
33389								opts.delay = delayOriginal + opts.stagger.call(element, elementIndex, elementsLength);
33390							}
33391
33392							/* If the drag option was passed in, successively increase/decrease (depending on the presense of opts.backwards)
33393							 the duration of each element's animation, using floors to prevent producing very short durations. */
33394							if (opts.drag) {
33395								/* Default the duration of UI pack effects (callouts and transitions) to 1000ms instead of the usual default duration of 400ms. */
33396								opts.duration = parseFloat(durationOriginal) || (/^(callout|transition)/.test(propertiesMap) ? 1000 : DURATION_DEFAULT);
33397
33398								/* For each element, take the greater duration of: A) animation completion percentage relative to the original duration,
33399								 B) 75% of the original duration, or C) a 200ms fallback (in case duration is already set to a low value).
33400								 The end result is a baseline of 75% of the redirect's duration that increases/decreases as the end of the element set is approached. */
33401								opts.duration = Math.max(opts.duration * (opts.backwards ? 1 - elementIndex / elementsLength : (elementIndex + 1) / elementsLength), opts.duration * 0.75, 200);
33402							}
33403
33404							/* Pass in the call's opts object so that the redirect can optionally extend it. It defaults to an empty object instead of null to
33405							 reduce the opts checking logic required inside the redirect. */
33406							Velocity.Redirects[propertiesMap].call(element, element, opts || {}, elementIndex, elementsLength, elements, promiseData.promise ? promiseData : undefined);
33407						});
33408
33409						/* Since the animation logic resides within the redirect's own code, abort the remainder of this call.
33410						 (The performance overhead up to this point is virtually non-existant.) */
33411						/* Note: The jQuery call chain is kept intact by returning the complete element set. */
33412						return getChain();
33413					} else {
33414						var abortError = "Velocity: First argument (" + propertiesMap + ") was not a property map, a known action, or a registered redirect. Aborting.";
33415
33416						if (promiseData.promise) {
33417							promiseData.rejecter(new Error(abortError));
33418						} else {
33419							console.log(abortError);
33420						}
33421
33422						return getChain();
33423					}
33424			}
33425
33426			/**************************
33427			 Call-Wide Variables
33428			 **************************/
33429
33430			/* A container for CSS unit conversion ratios (e.g. %, rem, and em ==> px) that is used to cache ratios across all elements
33431			 being animated in a single Velocity call. Calculating unit ratios necessitates DOM querying and updating, and is therefore
33432			 avoided (via caching) wherever possible. This container is call-wide instead of page-wide to avoid the risk of using stale
33433			 conversion metrics across Velocity animations that are not immediately consecutively chained. */
33434			var callUnitConversionData = {
33435				lastParent: null,
33436				lastPosition: null,
33437				lastFontSize: null,
33438				lastPercentToPxWidth: null,
33439				lastPercentToPxHeight: null,
33440				lastEmToPx: null,
33441				remToPx: null,
33442				vwToPx: null,
33443				vhToPx: null
33444			};
33445
33446			/* A container for all the ensuing tween data and metadata associated with this call. This container gets pushed to the page-wide
33447			 Velocity.State.calls array that is processed during animation ticking. */
33448			var call = [];
33449
33450			/************************
33451			 Element Processing
33452			 ************************/
33453
33454			/* Element processing consists of three parts -- data processing that cannot go stale and data processing that *can* go stale (i.e. third-party style modifications):
33455			 1) Pre-Queueing: Element-wide variables, including the element's data storage, are instantiated. Call options are prepared. If triggered, the Stop action is executed.
33456			 2) Queueing: The logic that runs once this call has reached its point of execution in the element's $.queue() stack. Most logic is placed here to avoid risking it becoming stale.
33457			 3) Pushing: Consolidation of the tween data followed by its push onto the global in-progress calls container.
33458			 `elementArrayIndex` allows passing index of the element in the original array to value functions.
33459			 If `elementsIndex` were used instead the index would be determined by the elements' per-element queue.
33460			 */
33461			function processElement(element, elementArrayIndex) {
33462
33463				/*************************
33464				 Part I: Pre-Queueing
33465				 *************************/
33466
33467				/***************************
33468				 Element-Wide Variables
33469				 ***************************/
33470
33471				var /* The runtime opts object is the extension of the current call's options and Velocity's page-wide option defaults. */
33472						opts = $.extend({}, Velocity.defaults, options),
33473						/* A container for the processed data associated with each property in the propertyMap.
33474						 (Each property in the map produces its own "tween".) */
33475						tweensContainer = {},
33476						elementUnitConversionData;
33477
33478				/******************
33479				 Element Init
33480				 ******************/
33481
33482				if (Data(element) === undefined) {
33483					Velocity.init(element);
33484				}
33485
33486				/******************
33487				 Option: Delay
33488				 ******************/
33489
33490				/* Since queue:false doesn't respect the item's existing queue, we avoid injecting its delay here (it's set later on). */
33491				/* Note: Velocity rolls its own delay function since jQuery doesn't have a utility alias for $.fn.delay()
33492				 (and thus requires jQuery element creation, which we avoid since its overhead includes DOM querying). */
33493				if (parseFloat(opts.delay) && opts.queue !== false) {
33494					$.queue(element, opts.queue, function(next) {
33495						/* This is a flag used to indicate to the upcoming completeCall() function that this queue entry was initiated by Velocity. See completeCall() for further details. */
33496						Velocity.velocityQueueEntryFlag = true;
33497
33498						/* The ensuing queue item (which is assigned to the "next" argument that $.queue() automatically passes in) will be triggered after a setTimeout delay.
33499						 The setTimeout is stored so that it can be subjected to clearTimeout() if this animation is prematurely stopped via Velocity's "stop" command, and
33500						 delayBegin/delayTime is used to ensure we can "pause" and "resume" a tween that is still mid-delay. */
33501
33502						/* Temporarily store delayed elements to facilite access for global pause/resume */
33503						var callIndex = Velocity.State.delayedElements.count++;
33504						Velocity.State.delayedElements[callIndex] = element;
33505
33506						var delayComplete = (function(index) {
33507							return function() {
33508								/* Clear the temporary element */
33509								Velocity.State.delayedElements[index] = false;
33510
33511								/* Finally, issue the call */
33512								next();
33513							};
33514						})(callIndex);
33515
33516
33517						Data(element).delayBegin = (new Date()).getTime();
33518						Data(element).delay = parseFloat(opts.delay);
33519						Data(element).delayTimer = {
33520							setTimeout: setTimeout(next, parseFloat(opts.delay)),
33521							next: delayComplete
33522						};
33523					});
33524				}
33525
33526				/*********************
33527				 Option: Duration
33528				 *********************/
33529
33530				/* Support for jQuery's named durations. */
33531				switch (opts.duration.toString().toLowerCase()) {
33532					case "fast":
33533						opts.duration = 200;
33534						break;
33535
33536					case "normal":
33537						opts.duration = DURATION_DEFAULT;
33538						break;
33539
33540					case "slow":
33541						opts.duration = 600;
33542						break;
33543
33544					default:
33545						/* Remove the potential "ms" suffix and default to 1 if the user is attempting to set a duration of 0 (in order to produce an immediate style change). */
33546						opts.duration = parseFloat(opts.duration) || 1;
33547				}
33548
33549				/************************
33550				 Global Option: Mock
33551				 ************************/
33552
33553				if (Velocity.mock !== false) {
33554					/* In mock mode, all animations are forced to 1ms so that they occur immediately upon the next rAF tick.
33555					 Alternatively, a multiplier can be passed in to time remap all delays and durations. */
33556					if (Velocity.mock === true) {
33557						opts.duration = opts.delay = 1;
33558					} else {
33559						opts.duration *= parseFloat(Velocity.mock) || 1;
33560						opts.delay *= parseFloat(Velocity.mock) || 1;
33561					}
33562				}
33563
33564				/*******************
33565				 Option: Easing
33566				 *******************/
33567
33568				opts.easing = getEasing(opts.easing, opts.duration);
33569
33570				/**********************
33571				 Option: Callbacks
33572				 **********************/
33573
33574				/* Callbacks must functions. Otherwise, default to null. */
33575				if (opts.begin && !Type.isFunction(opts.begin)) {
33576					opts.begin = null;
33577				}
33578
33579				if (opts.progress && !Type.isFunction(opts.progress)) {
33580					opts.progress = null;
33581				}
33582
33583				if (opts.complete && !Type.isFunction(opts.complete)) {
33584					opts.complete = null;
33585				}
33586
33587				/*********************************
33588				 Option: Display & Visibility
33589				 *********************************/
33590
33591				/* Refer to Velocity's documentation (VelocityJS.org/#displayAndVisibility) for a description of the display and visibility options' behavior. */
33592				/* Note: We strictly check for undefined instead of falsiness because display accepts an empty string value. */
33593				if (opts.display !== undefined && opts.display !== null) {
33594					opts.display = opts.display.toString().toLowerCase();
33595
33596					/* Users can pass in a special "auto" value to instruct Velocity to set the element to its default display value. */
33597					if (opts.display === "auto") {
33598						opts.display = Velocity.CSS.Values.getDisplayType(element);
33599					}
33600				}
33601
33602				if (opts.visibility !== undefined && opts.visibility !== null) {
33603					opts.visibility = opts.visibility.toString().toLowerCase();
33604				}
33605
33606				/**********************
33607				 Option: mobileHA
33608				 **********************/
33609
33610				/* When set to true, and if this is a mobile device, mobileHA automatically enables hardware acceleration (via a null transform hack)
33611				 on animating elements. HA is removed from the element at the completion of its animation. */
33612				/* Note: Android Gingerbread doesn't support HA. If a null transform hack (mobileHA) is in fact set, it will prevent other tranform subproperties from taking effect. */
33613				/* Note: You can read more about the use of mobileHA in Velocity's documentation: VelocityJS.org/#mobileHA. */
33614				opts.mobileHA = (opts.mobileHA && Velocity.State.isMobile && !Velocity.State.isGingerbread);
33615
33616				/***********************
33617				 Part II: Queueing
33618				 ***********************/
33619
33620				/* When a set of elements is targeted by a Velocity call, the set is broken up and each element has the current Velocity call individually queued onto it.
33621				 In this way, each element's existing queue is respected; some elements may already be animating and accordingly should not have this current Velocity call triggered immediately. */
33622				/* In each queue, tween data is processed for each animating property then pushed onto the call-wide calls array. When the last element in the set has had its tweens processed,
33623				 the call array is pushed to Velocity.State.calls for live processing by the requestAnimationFrame tick. */
33624				function buildQueue(next) {
33625					var data, lastTweensContainer;
33626
33627					/*******************
33628					 Option: Begin
33629					 *******************/
33630
33631					/* The begin callback is fired once per call -- not once per elemenet -- and is passed the full raw DOM element set as both its context and its first argument. */
33632					if (opts.begin && elementsIndex === 0) {
33633						/* We throw callbacks in a setTimeout so that thrown errors don't halt the execution of Velocity itself. */
33634						try {
33635							opts.begin.call(elements, elements);
33636						} catch (error) {
33637							setTimeout(function() {
33638								throw error;
33639							}, 1);
33640						}
33641					}
33642
33643					/*****************************************
33644					 Tween Data Construction (for Scroll)
33645					 *****************************************/
33646
33647					/* Note: In order to be subjected to chaining and animation options, scroll's tweening is routed through Velocity as if it were a standard CSS property animation. */
33648					if (action === "scroll") {
33649						/* The scroll action uniquely takes an optional "offset" option -- specified in pixels -- that offsets the targeted scroll position. */
33650						var scrollDirection = (/^x$/i.test(opts.axis) ? "Left" : "Top"),
33651								scrollOffset = parseFloat(opts.offset) || 0,
33652								scrollPositionCurrent,
33653								scrollPositionCurrentAlternate,
33654								scrollPositionEnd;
33655
33656						/* Scroll also uniquely takes an optional "container" option, which indicates the parent element that should be scrolled --
33657						 as opposed to the browser window itself. This is useful for scrolling toward an element that's inside an overflowing parent element. */
33658						if (opts.container) {
33659							/* Ensure that either a jQuery object or a raw DOM element was passed in. */
33660							if (Type.isWrapped(opts.container) || Type.isNode(opts.container)) {
33661								/* Extract the raw DOM element from the jQuery wrapper. */
33662								opts.container = opts.container[0] || opts.container;
33663								/* Note: Unlike other properties in Velocity, the browser's scroll position is never cached since it so frequently changes
33664								 (due to the user's natural interaction with the page). */
33665								scrollPositionCurrent = opts.container["scroll" + scrollDirection]; /* GET */
33666
33667								/* $.position() values are relative to the container's currently viewable area (without taking into account the container's true dimensions
33668								 -- say, for example, if the container was not overflowing). Thus, the scroll end value is the sum of the child element's position *and*
33669								 the scroll container's current scroll position. */
33670								scrollPositionEnd = (scrollPositionCurrent + $(element).position()[scrollDirection.toLowerCase()]) + scrollOffset; /* GET */
33671								/* If a value other than a jQuery object or a raw DOM element was passed in, default to null so that this option is ignored. */
33672							} else {
33673								opts.container = null;
33674							}
33675						} else {
33676							/* If the window itself is being scrolled -- not a containing element -- perform a live scroll position lookup using
33677							 the appropriate cached property names (which differ based on browser type). */
33678							scrollPositionCurrent = Velocity.State.scrollAnchor[Velocity.State["scrollProperty" + scrollDirection]]; /* GET */
33679							/* When scrolling the browser window, cache the alternate axis's current value since window.scrollTo() doesn't let us change only one value at a time. */
33680							scrollPositionCurrentAlternate = Velocity.State.scrollAnchor[Velocity.State["scrollProperty" + (scrollDirection === "Left" ? "Top" : "Left")]]; /* GET */
33681
33682							/* Unlike $.position(), $.offset() values are relative to the browser window's true dimensions -- not merely its currently viewable area --
33683							 and therefore end values do not need to be compounded onto current values. */
33684							scrollPositionEnd = $(element).offset()[scrollDirection.toLowerCase()] + scrollOffset; /* GET */
33685						}
33686
33687						/* Since there's only one format that scroll's associated tweensContainer can take, we create it manually. */
33688						tweensContainer = {
33689							scroll: {
33690								rootPropertyValue: false,
33691								startValue: scrollPositionCurrent,
33692								currentValue: scrollPositionCurrent,
33693								endValue: scrollPositionEnd,
33694								unitType: "",
33695								easing: opts.easing,
33696								scrollData: {
33697									container: opts.container,
33698									direction: scrollDirection,
33699									alternateValue: scrollPositionCurrentAlternate
33700								}
33701							},
33702							element: element
33703						};
33704
33705						if (Velocity.debug) {
33706							console.log("tweensContainer (scroll): ", tweensContainer.scroll, element);
33707						}
33708
33709						/******************************************
33710						 Tween Data Construction (for Reverse)
33711						 ******************************************/
33712
33713						/* Reverse acts like a "start" action in that a property map is animated toward. The only difference is
33714						 that the property map used for reverse is the inverse of the map used in the previous call. Thus, we manipulate
33715						 the previous call to construct our new map: use the previous map's end values as our new map's start values. Copy over all other data. */
33716						/* Note: Reverse can be directly called via the "reverse" parameter, or it can be indirectly triggered via the loop option. (Loops are composed of multiple reverses.) */
33717						/* Note: Reverse calls do not need to be consecutively chained onto a currently-animating element in order to operate on cached values;
33718						 there is no harm to reverse being called on a potentially stale data cache since reverse's behavior is simply defined
33719						 as reverting to the element's values as they were prior to the previous *Velocity* call. */
33720					} else if (action === "reverse") {
33721						data = Data(element);
33722
33723						/* Abort if there is no prior animation data to reverse to. */
33724						if (!data) {
33725							return;
33726						}
33727
33728						if (!data.tweensContainer) {
33729							/* Dequeue the element so that this queue entry releases itself immediately, allowing subsequent queue entries to run. */
33730							$.dequeue(element, opts.queue);
33731
33732							return;
33733						} else {
33734							/*********************
33735							 Options Parsing
33736							 *********************/
33737
33738							/* If the element was hidden via the display option in the previous call,
33739							 revert display to "auto" prior to reversal so that the element is visible again. */
33740							if (data.opts.display === "none") {
33741								data.opts.display = "auto";
33742							}
33743
33744							if (data.opts.visibility === "hidden") {
33745								data.opts.visibility = "visible";
33746							}
33747
33748							/* If the loop option was set in the previous call, disable it so that "reverse" calls aren't recursively generated.
33749							 Further, remove the previous call's callback options; typically, users do not want these to be refired. */
33750							data.opts.loop = false;
33751							data.opts.begin = null;
33752							data.opts.complete = null;
33753
33754							/* Since we're extending an opts object that has already been extended with the defaults options object,
33755							 we remove non-explicitly-defined properties that are auto-assigned values. */
33756							if (!options.easing) {
33757								delete opts.easing;
33758							}
33759
33760							if (!options.duration) {
33761								delete opts.duration;
33762							}
33763
33764							/* The opts object used for reversal is an extension of the options object optionally passed into this
33765							 reverse call plus the options used in the previous Velocity call. */
33766							opts = $.extend({}, data.opts, opts);
33767
33768							/*************************************
33769							 Tweens Container Reconstruction
33770							 *************************************/
33771
33772							/* Create a deepy copy (indicated via the true flag) of the previous call's tweensContainer. */
33773							lastTweensContainer = $.extend(true, {}, data ? data.tweensContainer : null);
33774
33775							/* Manipulate the previous tweensContainer by replacing its end values and currentValues with its start values. */
33776							for (var lastTween in lastTweensContainer) {
33777								/* In addition to tween data, tweensContainers contain an element property that we ignore here. */
33778								if (lastTweensContainer.hasOwnProperty(lastTween) && lastTween !== "element") {
33779									var lastStartValue = lastTweensContainer[lastTween].startValue;
33780
33781									lastTweensContainer[lastTween].startValue = lastTweensContainer[lastTween].currentValue = lastTweensContainer[lastTween].endValue;
33782									lastTweensContainer[lastTween].endValue = lastStartValue;
33783
33784									/* Easing is the only option that embeds into the individual tween data (since it can be defined on a per-property basis).
33785									 Accordingly, every property's easing value must be updated when an options object is passed in with a reverse call.
33786									 The side effect of this extensibility is that all per-property easing values are forcefully reset to the new value. */
33787									if (!Type.isEmptyObject(options)) {
33788										lastTweensContainer[lastTween].easing = opts.easing;
33789									}
33790
33791									if (Velocity.debug) {
33792										console.log("reverse tweensContainer (" + lastTween + "): " + JSON.stringify(lastTweensContainer[lastTween]), element);
33793									}
33794								}
33795							}
33796
33797							tweensContainer = lastTweensContainer;
33798						}
33799
33800						/*****************************************
33801						 Tween Data Construction (for Start)
33802						 *****************************************/
33803
33804					} else if (action === "start") {
33805
33806						/*************************
33807						 Value Transferring
33808						 *************************/
33809
33810						/* If this queue entry follows a previous Velocity-initiated queue entry *and* if this entry was created
33811						 while the element was in the process of being animated by Velocity, then this current call is safe to use
33812						 the end values from the prior call as its start values. Velocity attempts to perform this value transfer
33813						 process whenever possible in order to avoid requerying the DOM. */
33814						/* If values aren't transferred from a prior call and start values were not forcefed by the user (more on this below),
33815						 then the DOM is queried for the element's current values as a last resort. */
33816						/* Note: Conversely, animation reversal (and looping) *always* perform inter-call value transfers; they never requery the DOM. */
33817
33818						data = Data(element);
33819
33820						/* The per-element isAnimating flag is used to indicate whether it's safe (i.e. the data isn't stale)
33821						 to transfer over end values to use as start values. If it's set to true and there is a previous
33822						 Velocity call to pull values from, do so. */
33823						if (data && data.tweensContainer && data.isAnimating === true) {
33824							lastTweensContainer = data.tweensContainer;
33825						}
33826
33827						/***************************
33828						 Tween Data Calculation
33829						 ***************************/
33830
33831						/* This function parses property data and defaults endValue, easing, and startValue as appropriate. */
33832						/* Property map values can either take the form of 1) a single value representing the end value,
33833						 or 2) an array in the form of [ endValue, [, easing] [, startValue] ].
33834						 The optional third parameter is a forcefed startValue to be used instead of querying the DOM for
33835						 the element's current value. Read Velocity's docmentation to learn more about forcefeeding: VelocityJS.org/#forcefeeding */
33836						var parsePropertyValue = function(valueData, skipResolvingEasing) {
33837							var endValue, easing, startValue;
33838
33839							/* If we have a function as the main argument then resolve it first, in case it returns an array that needs to be split */
33840							if (Type.isFunction(valueData)) {
33841								valueData = valueData.call(element, elementArrayIndex, elementsLength);
33842							}
33843
33844							/* Handle the array format, which can be structured as one of three potential overloads:
33845							 A) [ endValue, easing, startValue ], B) [ endValue, easing ], or C) [ endValue, startValue ] */
33846							if (Type.isArray(valueData)) {
33847								/* endValue is always the first item in the array. Don't bother validating endValue's value now
33848								 since the ensuing property cycling logic does that. */
33849								endValue = valueData[0];
33850
33851								/* Two-item array format: If the second item is a number, function, or hex string, treat it as a
33852								 start value since easings can only be non-hex strings or arrays. */
33853								if ((!Type.isArray(valueData[1]) && /^[\d-]/.test(valueData[1])) || Type.isFunction(valueData[1]) || CSS.RegEx.isHex.test(valueData[1])) {
33854									startValue = valueData[1];
33855									/* Two or three-item array: If the second item is a non-hex string easing name or an array, treat it as an easing. */
33856								} else if ((Type.isString(valueData[1]) && !CSS.RegEx.isHex.test(valueData[1]) && Velocity.Easings[valueData[1]]) || Type.isArray(valueData[1])) {
33857									easing = skipResolvingEasing ? valueData[1] : getEasing(valueData[1], opts.duration);
33858
33859									/* Don't bother validating startValue's value now since the ensuing property cycling logic inherently does that. */
33860									startValue = valueData[2];
33861								} else {
33862									startValue = valueData[1] || valueData[2];
33863								}
33864								/* Handle the single-value format. */
33865							} else {
33866								endValue = valueData;
33867							}
33868
33869							/* Default to the call's easing if a per-property easing type was not defined. */
33870							if (!skipResolvingEasing) {
33871								easing = easing || opts.easing;
33872							}
33873
33874							/* If functions were passed in as values, pass the function the current element as its context,
33875							 plus the element's index and the element set's size as arguments. Then, assign the returned value. */
33876							if (Type.isFunction(endValue)) {
33877								endValue = endValue.call(element, elementArrayIndex, elementsLength);
33878							}
33879
33880							if (Type.isFunction(startValue)) {
33881								startValue = startValue.call(element, elementArrayIndex, elementsLength);
33882							}
33883
33884							/* Allow startValue to be left as undefined to indicate to the ensuing code that its value was not forcefed. */
33885							return [endValue || 0, easing, startValue];
33886						};
33887
33888						var fixPropertyValue = function(property, valueData) {
33889							/* In case this property is a hook, there are circumstances where we will intend to work on the hook's root property and not the hooked subproperty. */
33890							var rootProperty = CSS.Hooks.getRoot(property),
33891									rootPropertyValue = false,
33892									/* Parse out endValue, easing, and startValue from the property's data. */
33893									endValue = valueData[0],
33894									easing = valueData[1],
33895									startValue = valueData[2],
33896									pattern;
33897
33898							/**************************
33899							 Start Value Sourcing
33900							 **************************/
33901
33902							/* Other than for the dummy tween property, properties that are not supported by the browser (and do not have an associated normalization) will
33903							 inherently produce no style changes when set, so they are skipped in order to decrease animation tick overhead.
33904							 Property support is determined via prefixCheck(), which returns a false flag when no supported is detected. */
33905							/* Note: Since SVG elements have some of their properties directly applied as HTML attributes,
33906							 there is no way to check for their explicit browser support, and so we skip skip this check for them. */
33907							if ((!data || !data.isSVG) && rootProperty !== "tween" && CSS.Names.prefixCheck(rootProperty)[1] === false && CSS.Normalizations.registered[rootProperty] === undefined) {
33908								if (Velocity.debug) {
33909									console.log("Skipping [" + rootProperty + "] due to a lack of browser support.");
33910								}
33911								return;
33912							}
33913
33914							/* If the display option is being set to a non-"none" (e.g. "block") and opacity (filter on IE<=8) is being
33915							 animated to an endValue of non-zero, the user's intention is to fade in from invisible, thus we forcefeed opacity
33916							 a startValue of 0 if its startValue hasn't already been sourced by value transferring or prior forcefeeding. */
33917							if (((opts.display !== undefined && opts.display !== null && opts.display !== "none") || (opts.visibility !== undefined && opts.visibility !== "hidden")) && /opacity|filter/.test(property) && !startValue && endValue !== 0) {
33918								startValue = 0;
33919							}
33920
33921							/* If values have been transferred from the previous Velocity call, extract the endValue and rootPropertyValue
33922							 for all of the current call's properties that were *also* animated in the previous call. */
33923							/* Note: Value transferring can optionally be disabled by the user via the _cacheValues option. */
33924							if (opts._cacheValues && lastTweensContainer && lastTweensContainer[property]) {
33925								if (startValue === undefined) {
33926									startValue = lastTweensContainer[property].endValue + lastTweensContainer[property].unitType;
33927								}
33928
33929								/* The previous call's rootPropertyValue is extracted from the element's data cache since that's the
33930								 instance of rootPropertyValue that gets freshly updated by the tweening process, whereas the rootPropertyValue
33931								 attached to the incoming lastTweensContainer is equal to the root property's value prior to any tweening. */
33932								rootPropertyValue = data.rootPropertyValueCache[rootProperty];
33933								/* If values were not transferred from a previous Velocity call, query the DOM as needed. */
33934							} else {
33935								/* Handle hooked properties. */
33936								if (CSS.Hooks.registered[property]) {
33937									if (startValue === undefined) {
33938										rootPropertyValue = CSS.getPropertyValue(element, rootProperty); /* GET */
33939										/* Note: The following getPropertyValue() call does not actually trigger a DOM query;
33940										 getPropertyValue() will extract the hook from rootPropertyValue. */
33941										startValue = CSS.getPropertyValue(element, property, rootPropertyValue);
33942										/* If startValue is already defined via forcefeeding, do not query the DOM for the root property's value;
33943										 just grab rootProperty's zero-value template from CSS.Hooks. This overwrites the element's actual
33944										 root property value (if one is set), but this is acceptable since the primary reason users forcefeed is
33945										 to avoid DOM queries, and thus we likewise avoid querying the DOM for the root property's value. */
33946									} else {
33947										/* Grab this hook's zero-value template, e.g. "0px 0px 0px black". */
33948										rootPropertyValue = CSS.Hooks.templates[rootProperty][1];
33949									}
33950									/* Handle non-hooked properties that haven't already been defined via forcefeeding. */
33951								} else if (startValue === undefined) {
33952									startValue = CSS.getPropertyValue(element, property); /* GET */
33953								}
33954							}
33955
33956							/**************************
33957							 Value Data Extraction
33958							 **************************/
33959
33960							var separatedValue,
33961									endValueUnitType,
33962									startValueUnitType,
33963									operator = false;
33964
33965							/* Separates a property value into its numeric value and its unit type. */
33966							var separateValue = function(property, value) {
33967								var unitType,
33968										numericValue;
33969
33970								numericValue = (value || "0")
33971										.toString()
33972										.toLowerCase()
33973										/* Match the unit type at the end of the value. */
33974										.replace(/[%A-z]+$/, function(match) {
33975											/* Grab the unit type. */
33976											unitType = match;
33977
33978											/* Strip the unit type off of value. */
33979											return "";
33980										});
33981
33982								/* If no unit type was supplied, assign one that is appropriate for this property (e.g. "deg" for rotateZ or "px" for width). */
33983								if (!unitType) {
33984									unitType = CSS.Values.getUnitType(property);
33985								}
33986
33987								return [numericValue, unitType];
33988							};
33989
33990							if (startValue !== endValue && Type.isString(startValue) && Type.isString(endValue)) {
33991								pattern = "";
33992								var iStart = 0, // index in startValue
33993										iEnd = 0, // index in endValue
33994										aStart = [], // array of startValue numbers
33995										aEnd = [], // array of endValue numbers
33996										inCalc = 0, // Keep track of being inside a "calc()" so we don't duplicate it
33997										inRGB = 0, // Keep track of being inside an RGB as we can't use fractional values
33998										inRGBA = 0; // Keep track of being inside an RGBA as we must pass fractional for the alpha channel
33999
34000								startValue = CSS.Hooks.fixColors(startValue);
34001								endValue = CSS.Hooks.fixColors(endValue);
34002								while (iStart < startValue.length && iEnd < endValue.length) {
34003									var cStart = startValue[iStart],
34004											cEnd = endValue[iEnd];
34005
34006									if (/[\d\.]/.test(cStart) && /[\d\.]/.test(cEnd)) {
34007										var tStart = cStart, // temporary character buffer
34008												tEnd = cEnd, // temporary character buffer
34009												dotStart = ".", // Make sure we can only ever match a single dot in a decimal
34010												dotEnd = "."; // Make sure we can only ever match a single dot in a decimal
34011
34012										while (++iStart < startValue.length) {
34013											cStart = startValue[iStart];
34014											if (cStart === dotStart) {
34015												dotStart = ".."; // Can never match two characters
34016											} else if (!/\d/.test(cStart)) {
34017												break;
34018											}
34019											tStart += cStart;
34020										}
34021										while (++iEnd < endValue.length) {
34022											cEnd = endValue[iEnd];
34023											if (cEnd === dotEnd) {
34024												dotEnd = ".."; // Can never match two characters
34025											} else if (!/\d/.test(cEnd)) {
34026												break;
34027											}
34028											tEnd += cEnd;
34029										}
34030										var uStart = CSS.Hooks.getUnit(startValue, iStart), // temporary unit type
34031												uEnd = CSS.Hooks.getUnit(endValue, iEnd); // temporary unit type
34032
34033										iStart += uStart.length;
34034										iEnd += uEnd.length;
34035										if (uStart === uEnd) {
34036											// Same units
34037											if (tStart === tEnd) {
34038												// Same numbers, so just copy over
34039												pattern += tStart + uStart;
34040											} else {
34041												// Different numbers, so store them
34042												pattern += "{" + aStart.length + (inRGB ? "!" : "") + "}" + uStart;
34043												aStart.push(parseFloat(tStart));
34044												aEnd.push(parseFloat(tEnd));
34045											}
34046										} else {
34047											// Different units, so put into a "calc(from + to)" and animate each side to/from zero
34048											var nStart = parseFloat(tStart),
34049													nEnd = parseFloat(tEnd);
34050
34051											pattern += (inCalc < 5 ? "calc" : "") + "("
34052													+ (nStart ? "{" + aStart.length + (inRGB ? "!" : "") + "}" : "0") + uStart
34053													+ " + "
34054													+ (nEnd ? "{" + (aStart.length + 1) + (inRGB ? "!" : "") + "}" : "0") + uEnd
34055													+ ")";
34056											if (nStart) {
34057												aStart.push(parseFloat(tStart));
34058												aStart.push(parseFloat(0));
34059											}
34060											if (nEnd) {
34061												aEnd.push(parseFloat(0));
34062												aEnd.push(parseFloat(tEnd));
34063											}
34064										}
34065									} else if (cStart === cEnd) {
34066										pattern += cStart;
34067										iStart++;
34068										iEnd++;
34069										// Keep track of being inside a calc()
34070										if (inCalc === 0 && cStart === "c"
34071												|| inCalc === 1 && cStart === "a"
34072												|| inCalc === 2 && cStart === "l"
34073												|| inCalc === 3 && cStart === "c"
34074												|| inCalc >= 4 && cStart === "("
34075												) {
34076											inCalc++;
34077										} else if ((inCalc && inCalc < 5)
34078												|| inCalc >= 4 && cStart === ")" && --inCalc < 5) {
34079											inCalc = 0;
34080										}
34081										// Keep track of being inside an rgb() / rgba()
34082										if (inRGB === 0 && cStart === "r"
34083												|| inRGB === 1 && cStart === "g"
34084												|| inRGB === 2 && cStart === "b"
34085												|| inRGB === 3 && cStart === "a"
34086												|| inRGB >= 3 && cStart === "("
34087												) {
34088											if (inRGB === 3 && cStart === "a") {
34089												inRGBA = 1;
34090											}
34091											inRGB++;
34092										} else if (inRGBA && cStart === ",") {
34093											if (++inRGBA > 3) {
34094												inRGB = inRGBA = 0;
34095											}
34096										} else if ((inRGBA && inRGB < (inRGBA ? 5 : 4))
34097												|| inRGB >= (inRGBA ? 4 : 3) && cStart === ")" && --inRGB < (inRGBA ? 5 : 4)) {
34098											inRGB = inRGBA = 0;
34099										}
34100									} else {
34101										inCalc = 0;
34102										// TODO: changing units, fixing colours
34103										break;
34104									}
34105								}
34106								if (iStart !== startValue.length || iEnd !== endValue.length) {
34107									if (Velocity.debug) {
34108										console.error("Trying to pattern match mis-matched strings [\"" + endValue + "\", \"" + startValue + "\"]");
34109									}
34110									pattern = undefined;
34111								}
34112								if (pattern) {
34113									if (aStart.length) {
34114										if (Velocity.debug) {
34115											console.log("Pattern found \"" + pattern + "\" -> ", aStart, aEnd, "[" + startValue + "," + endValue + "]");
34116										}
34117										startValue = aStart;
34118										endValue = aEnd;
34119										endValueUnitType = startValueUnitType = "";
34120									} else {
34121										pattern = undefined;
34122									}
34123								}
34124							}
34125
34126							if (!pattern) {
34127								/* Separate startValue. */
34128								separatedValue = separateValue(property, startValue);
34129								startValue = separatedValue[0];
34130								startValueUnitType = separatedValue[1];
34131
34132								/* Separate endValue, and extract a value operator (e.g. "+=", "-=") if one exists. */
34133								separatedValue = separateValue(property, endValue);
34134								endValue = separatedValue[0].replace(/^([+-\/*])=/, function(match, subMatch) {
34135									operator = subMatch;
34136
34137									/* Strip the operator off of the value. */
34138									return "";
34139								});
34140								endValueUnitType = separatedValue[1];
34141
34142								/* Parse float values from endValue and startValue. Default to 0 if NaN is returned. */
34143								startValue = parseFloat(startValue) || 0;
34144								endValue = parseFloat(endValue) || 0;
34145
34146								/***************************************
34147								 Property-Specific Value Conversion
34148								 ***************************************/
34149
34150								/* Custom support for properties that don't actually accept the % unit type, but where pollyfilling is trivial and relatively foolproof. */
34151								if (endValueUnitType === "%") {
34152									/* A %-value fontSize/lineHeight is relative to the parent's fontSize (as opposed to the parent's dimensions),
34153									 which is identical to the em unit's behavior, so we piggyback off of that. */
34154									if (/^(fontSize|lineHeight)$/.test(property)) {
34155										/* Convert % into an em decimal value. */
34156										endValue = endValue / 100;
34157										endValueUnitType = "em";
34158										/* For scaleX and scaleY, convert the value into its decimal format and strip off the unit type. */
34159									} else if (/^scale/.test(property)) {
34160										endValue = endValue / 100;
34161										endValueUnitType = "";
34162										/* For RGB components, take the defined percentage of 255 and strip off the unit type. */
34163									} else if (/(Red|Green|Blue)$/i.test(property)) {
34164										endValue = (endValue / 100) * 255;
34165										endValueUnitType = "";
34166									}
34167								}
34168							}
34169
34170							/***************************
34171							 Unit Ratio Calculation
34172							 ***************************/
34173
34174							/* When queried, the browser returns (most) CSS property values in pixels. Therefore, if an endValue with a unit type of
34175							 %, em, or rem is animated toward, startValue must be converted from pixels into the same unit type as endValue in order
34176							 for value manipulation logic (increment/decrement) to proceed. Further, if the startValue was forcefed or transferred
34177							 from a previous call, startValue may also not be in pixels. Unit conversion logic therefore consists of two steps:
34178							 1) Calculating the ratio of %/em/rem/vh/vw relative to pixels
34179							 2) Converting startValue into the same unit of measurement as endValue based on these ratios. */
34180							/* Unit conversion ratios are calculated by inserting a sibling node next to the target node, copying over its position property,
34181							 setting values with the target unit type then comparing the returned pixel value. */
34182							/* Note: Even if only one of these unit types is being animated, all unit ratios are calculated at once since the overhead
34183							 of batching the SETs and GETs together upfront outweights the potential overhead
34184							 of layout thrashing caused by re-querying for uncalculated ratios for subsequently-processed properties. */
34185							/* Todo: Shift this logic into the calls' first tick instance so that it's synced with RAF. */
34186							var calculateUnitRatios = function() {
34187
34188								/************************
34189								 Same Ratio Checks
34190								 ************************/
34191
34192								/* The properties below are used to determine whether the element differs sufficiently from this call's
34193								 previously iterated element to also differ in its unit conversion ratios. If the properties match up with those
34194								 of the prior element, the prior element's conversion ratios are used. Like most optimizations in Velocity,
34195								 this is done to minimize DOM querying. */
34196								var sameRatioIndicators = {
34197									myParent: element.parentNode || document.body, /* GET */
34198									position: CSS.getPropertyValue(element, "position"), /* GET */
34199									fontSize: CSS.getPropertyValue(element, "fontSize") /* GET */
34200								},
34201										/* Determine if the same % ratio can be used. % is based on the element's position value and its parent's width and height dimensions. */
34202										samePercentRatio = ((sameRatioIndicators.position === callUnitConversionData.lastPosition) && (sameRatioIndicators.myParent === callUnitConversionData.lastParent)),
34203										/* Determine if the same em ratio can be used. em is relative to the element's fontSize. */
34204										sameEmRatio = (sameRatioIndicators.fontSize === callUnitConversionData.lastFontSize);
34205
34206								/* Store these ratio indicators call-wide for the next element to compare against. */
34207								callUnitConversionData.lastParent = sameRatioIndicators.myParent;
34208								callUnitConversionData.lastPosition = sameRatioIndicators.position;
34209								callUnitConversionData.lastFontSize = sameRatioIndicators.fontSize;
34210
34211								/***************************
34212								 Element-Specific Units
34213								 ***************************/
34214
34215								/* Note: IE8 rounds to the nearest pixel when returning CSS values, thus we perform conversions using a measurement
34216								 of 100 (instead of 1) to give our ratios a precision of at least 2 decimal values. */
34217								var measurement = 100,
34218										unitRatios = {};
34219
34220								if (!sameEmRatio || !samePercentRatio) {
34221									var dummy = data && data.isSVG ? document.createElementNS("http://www.w3.org/2000/svg", "rect") : document.createElement("div");
34222
34223									Velocity.init(dummy);
34224									sameRatioIndicators.myParent.appendChild(dummy);
34225
34226									/* To accurately and consistently calculate conversion ratios, the element's cascaded overflow and box-sizing are stripped.
34227									 Similarly, since width/height can be artificially constrained by their min-/max- equivalents, these are controlled for as well. */
34228									/* Note: Overflow must be also be controlled for per-axis since the overflow property overwrites its per-axis values. */
34229									$.each(["overflow", "overflowX", "overflowY"], function(i, property) {
34230										Velocity.CSS.setPropertyValue(dummy, property, "hidden");
34231									});
34232									Velocity.CSS.setPropertyValue(dummy, "position", sameRatioIndicators.position);
34233									Velocity.CSS.setPropertyValue(dummy, "fontSize", sameRatioIndicators.fontSize);
34234									Velocity.CSS.setPropertyValue(dummy, "boxSizing", "content-box");
34235
34236									/* width and height act as our proxy properties for measuring the horizontal and vertical % ratios. */
34237									$.each(["minWidth", "maxWidth", "width", "minHeight", "maxHeight", "height"], function(i, property) {
34238										Velocity.CSS.setPropertyValue(dummy, property, measurement + "%");
34239									});
34240									/* paddingLeft arbitrarily acts as our proxy property for the em ratio. */
34241									Velocity.CSS.setPropertyValue(dummy, "paddingLeft", measurement + "em");
34242
34243									/* Divide the returned value by the measurement to get the ratio between 1% and 1px. Default to 1 since working with 0 can produce Infinite. */
34244									unitRatios.percentToPxWidth = callUnitConversionData.lastPercentToPxWidth = (parseFloat(CSS.getPropertyValue(dummy, "width", null, true)) || 1) / measurement; /* GET */
34245									unitRatios.percentToPxHeight = callUnitConversionData.lastPercentToPxHeight = (parseFloat(CSS.getPropertyValue(dummy, "height", null, true)) || 1) / measurement; /* GET */
34246									unitRatios.emToPx = callUnitConversionData.lastEmToPx = (parseFloat(CSS.getPropertyValue(dummy, "paddingLeft")) || 1) / measurement; /* GET */
34247
34248									sameRatioIndicators.myParent.removeChild(dummy);
34249								} else {
34250									unitRatios.emToPx = callUnitConversionData.lastEmToPx;
34251									unitRatios.percentToPxWidth = callUnitConversionData.lastPercentToPxWidth;
34252									unitRatios.percentToPxHeight = callUnitConversionData.lastPercentToPxHeight;
34253								}
34254
34255								/***************************
34256								 Element-Agnostic Units
34257								 ***************************/
34258
34259								/* Whereas % and em ratios are determined on a per-element basis, the rem unit only needs to be checked
34260								 once per call since it's exclusively dependant upon document.body's fontSize. If this is the first time
34261								 that calculateUnitRatios() is being run during this call, remToPx will still be set to its default value of null,
34262								 so we calculate it now. */
34263								if (callUnitConversionData.remToPx === null) {
34264									/* Default to browsers' default fontSize of 16px in the case of 0. */
34265									callUnitConversionData.remToPx = parseFloat(CSS.getPropertyValue(document.body, "fontSize")) || 16; /* GET */
34266								}
34267
34268								/* Similarly, viewport units are %-relative to the window's inner dimensions. */
34269								if (callUnitConversionData.vwToPx === null) {
34270									callUnitConversionData.vwToPx = parseFloat(window.innerWidth) / 100; /* GET */
34271									callUnitConversionData.vhToPx = parseFloat(window.innerHeight) / 100; /* GET */
34272								}
34273
34274								unitRatios.remToPx = callUnitConversionData.remToPx;
34275								unitRatios.vwToPx = callUnitConversionData.vwToPx;
34276								unitRatios.vhToPx = callUnitConversionData.vhToPx;
34277
34278								if (Velocity.debug >= 1) {
34279									console.log("Unit ratios: " + JSON.stringify(unitRatios), element);
34280								}
34281								return unitRatios;
34282							};
34283
34284							/********************
34285							 Unit Conversion
34286							 ********************/
34287
34288							/* The * and / operators, which are not passed in with an associated unit, inherently use startValue's unit. Skip value and unit conversion. */
34289							if (/[\/*]/.test(operator)) {
34290								endValueUnitType = startValueUnitType;
34291								/* If startValue and endValue differ in unit type, convert startValue into the same unit type as endValue so that if endValueUnitType
34292								 is a relative unit (%, em, rem), the values set during tweening will continue to be accurately relative even if the metrics they depend
34293								 on are dynamically changing during the course of the animation. Conversely, if we always normalized into px and used px for setting values, the px ratio
34294								 would become stale if the original unit being animated toward was relative and the underlying metrics change during the animation. */
34295								/* Since 0 is 0 in any unit type, no conversion is necessary when startValue is 0 -- we just start at 0 with endValueUnitType. */
34296							} else if ((startValueUnitType !== endValueUnitType) && startValue !== 0) {
34297								/* Unit conversion is also skipped when endValue is 0, but *startValueUnitType* must be used for tween values to remain accurate. */
34298								/* Note: Skipping unit conversion here means that if endValueUnitType was originally a relative unit, the animation won't relatively
34299								 match the underlying metrics if they change, but this is acceptable since we're animating toward invisibility instead of toward visibility,
34300								 which remains past the point of the animation's completion. */
34301								if (endValue === 0) {
34302									endValueUnitType = startValueUnitType;
34303								} else {
34304									/* By this point, we cannot avoid unit conversion (it's undesirable since it causes layout thrashing).
34305									 If we haven't already, we trigger calculateUnitRatios(), which runs once per element per call. */
34306									elementUnitConversionData = elementUnitConversionData || calculateUnitRatios();
34307
34308									/* The following RegEx matches CSS properties that have their % values measured relative to the x-axis. */
34309									/* Note: W3C spec mandates that all of margin and padding's properties (even top and bottom) are %-relative to the *width* of the parent element. */
34310									var axis = (/margin|padding|left|right|width|text|word|letter/i.test(property) || /X$/.test(property) || property === "x") ? "x" : "y";
34311
34312									/* In order to avoid generating n^2 bespoke conversion functions, unit conversion is a two-step process:
34313									 1) Convert startValue into pixels. 2) Convert this new pixel value into endValue's unit type. */
34314									switch (startValueUnitType) {
34315										case "%":
34316											/* Note: translateX and translateY are the only properties that are %-relative to an element's own dimensions -- not its parent's dimensions.
34317											 Velocity does not include a special conversion process to account for this behavior. Therefore, animating translateX/Y from a % value
34318											 to a non-% value will produce an incorrect start value. Fortunately, this sort of cross-unit conversion is rarely done by users in practice. */
34319											startValue *= (axis === "x" ? elementUnitConversionData.percentToPxWidth : elementUnitConversionData.percentToPxHeight);
34320											break;
34321
34322										case "px":
34323											/* px acts as our midpoint in the unit conversion process; do nothing. */
34324											break;
34325
34326										default:
34327											startValue *= elementUnitConversionData[startValueUnitType + "ToPx"];
34328									}
34329
34330									/* Invert the px ratios to convert into to the target unit. */
34331									switch (endValueUnitType) {
34332										case "%":
34333											startValue *= 1 / (axis === "x" ? elementUnitConversionData.percentToPxWidth : elementUnitConversionData.percentToPxHeight);
34334											break;
34335
34336										case "px":
34337											/* startValue is already in px, do nothing; we're done. */
34338											break;
34339
34340										default:
34341											startValue *= 1 / elementUnitConversionData[endValueUnitType + "ToPx"];
34342									}
34343								}
34344							}
34345
34346							/*********************
34347							 Relative Values
34348							 *********************/
34349
34350							/* Operator logic must be performed last since it requires unit-normalized start and end values. */
34351							/* Note: Relative *percent values* do not behave how most people think; while one would expect "+=50%"
34352							 to increase the property 1.5x its current value, it in fact increases the percent units in absolute terms:
34353							 50 points is added on top of the current % value. */
34354							switch (operator) {
34355								case "+":
34356									endValue = startValue + endValue;
34357									break;
34358
34359								case "-":
34360									endValue = startValue - endValue;
34361									break;
34362
34363								case "*":
34364									endValue = startValue * endValue;
34365									break;
34366
34367								case "/":
34368									endValue = startValue / endValue;
34369									break;
34370							}
34371
34372							/**************************
34373							 tweensContainer Push
34374							 **************************/
34375
34376							/* Construct the per-property tween object, and push it to the element's tweensContainer. */
34377							tweensContainer[property] = {
34378								rootPropertyValue: rootPropertyValue,
34379								startValue: startValue,
34380								currentValue: startValue,
34381								endValue: endValue,
34382								unitType: endValueUnitType,
34383								easing: easing
34384							};
34385							if (pattern) {
34386								tweensContainer[property].pattern = pattern;
34387							}
34388
34389							if (Velocity.debug) {
34390								console.log("tweensContainer (" + property + "): " + JSON.stringify(tweensContainer[property]), element);
34391							}
34392						};
34393
34394						/* Create a tween out of each property, and append its associated data to tweensContainer. */
34395						for (var property in propertiesMap) {
34396
34397							if (!propertiesMap.hasOwnProperty(property)) {
34398								continue;
34399							}
34400							/* The original property name's format must be used for the parsePropertyValue() lookup,
34401							 but we then use its camelCase styling to normalize it for manipulation. */
34402							var propertyName = CSS.Names.camelCase(property),
34403									valueData = parsePropertyValue(propertiesMap[property]);
34404
34405							/* Find shorthand color properties that have been passed a hex string. */
34406							/* Would be quicker to use CSS.Lists.colors.includes() if possible */
34407							if (CSS.Lists.colors.indexOf(propertyName) >= 0) {
34408								/* Parse the value data for each shorthand. */
34409								var endValue = valueData[0],
34410										easing = valueData[1],
34411										startValue = valueData[2];
34412
34413								if (CSS.RegEx.isHex.test(endValue)) {
34414									/* Convert the hex strings into their RGB component arrays. */
34415									var colorComponents = ["Red", "Green", "Blue"],
34416											endValueRGB = CSS.Values.hexToRgb(endValue),
34417											startValueRGB = startValue ? CSS.Values.hexToRgb(startValue) : undefined;
34418
34419									/* Inject the RGB component tweens into propertiesMap. */
34420									for (var i = 0; i < colorComponents.length; i++) {
34421										var dataArray = [endValueRGB[i]];
34422
34423										if (easing) {
34424											dataArray.push(easing);
34425										}
34426
34427										if (startValueRGB !== undefined) {
34428											dataArray.push(startValueRGB[i]);
34429										}
34430
34431										fixPropertyValue(propertyName + colorComponents[i], dataArray);
34432									}
34433									/* If we have replaced a shortcut color value then don't update the standard property name */
34434									continue;
34435								}
34436							}
34437							fixPropertyValue(propertyName, valueData);
34438						}
34439
34440						/* Along with its property data, store a reference to the element itself onto tweensContainer. */
34441						tweensContainer.element = element;
34442					}
34443
34444					/*****************
34445					 Call Push
34446					 *****************/
34447
34448					/* Note: tweensContainer can be empty if all of the properties in this call's property map were skipped due to not
34449					 being supported by the browser. The element property is used for checking that the tweensContainer has been appended to. */
34450					if (tweensContainer.element) {
34451						/* Apply the "velocity-animating" indicator class. */
34452						CSS.Values.addClass(element, "velocity-animating");
34453
34454						/* The call array houses the tweensContainers for each element being animated in the current call. */
34455						call.push(tweensContainer);
34456
34457						data = Data(element);
34458
34459						if (data) {
34460							/* Store the tweensContainer and options if we're working on the default effects queue, so that they can be used by the reverse command. */
34461							if (opts.queue === "") {
34462
34463								data.tweensContainer = tweensContainer;
34464								data.opts = opts;
34465							}
34466
34467							/* Switch on the element's animating flag. */
34468							data.isAnimating = true;
34469						}
34470
34471						/* Once the final element in this call's element set has been processed, push the call array onto
34472						 Velocity.State.calls for the animation tick to immediately begin processing. */
34473						if (elementsIndex === elementsLength - 1) {
34474							/* Add the current call plus its associated metadata (the element set and the call's options) onto the global call container.
34475							 Anything on this call container is subjected to tick() processing. */
34476							Velocity.State.calls.push([call, elements, opts, null, promiseData.resolver, null, 0]);
34477
34478							/* If the animation tick isn't running, start it. (Velocity shuts it off when there are no active calls to process.) */
34479							if (Velocity.State.isTicking === false) {
34480								Velocity.State.isTicking = true;
34481
34482								/* Start the tick loop. */
34483								tick();
34484							}
34485						} else {
34486							elementsIndex++;
34487						}
34488					}
34489				}
34490
34491				/* When the queue option is set to false, the call skips the element's queue and fires immediately. */
34492				if (opts.queue === false) {
34493					/* Since this buildQueue call doesn't respect the element's existing queue (which is where a delay option would have been appended),
34494					 we manually inject the delay property here with an explicit setTimeout. */
34495					if (opts.delay) {
34496
34497						/* Temporarily store delayed elements to facilitate access for global pause/resume */
34498						var callIndex = Velocity.State.delayedElements.count++;
34499						Velocity.State.delayedElements[callIndex] = element;
34500
34501						var delayComplete = (function(index) {
34502							return function() {
34503								/* Clear the temporary element */
34504								Velocity.State.delayedElements[index] = false;
34505
34506								/* Finally, issue the call */
34507								buildQueue();
34508							};
34509						})(callIndex);
34510
34511						Data(element).delayBegin = (new Date()).getTime();
34512						Data(element).delay = parseFloat(opts.delay);
34513						Data(element).delayTimer = {
34514							setTimeout: setTimeout(buildQueue, parseFloat(opts.delay)),
34515							next: delayComplete
34516						};
34517					} else {
34518						buildQueue();
34519					}
34520					/* Otherwise, the call undergoes element queueing as normal. */
34521					/* Note: To interoperate with jQuery, Velocity uses jQuery's own $.queue() stack for queuing logic. */
34522				} else {
34523					$.queue(element, opts.queue, function(next, clearQueue) {
34524						/* If the clearQueue flag was passed in by the stop command, resolve this call's promise. (Promises can only be resolved once,
34525						 so it's fine if this is repeatedly triggered for each element in the associated call.) */
34526						if (clearQueue === true) {
34527							if (promiseData.promise) {
34528								promiseData.resolver(elements);
34529							}
34530
34531							/* Do not continue with animation queueing. */
34532							return true;
34533						}
34534
34535						/* This flag indicates to the upcoming completeCall() function that this queue entry was initiated by Velocity.
34536						 See completeCall() for further details. */
34537						Velocity.velocityQueueEntryFlag = true;
34538
34539						buildQueue(next);
34540					});
34541				}
34542
34543				/*********************
34544				 Auto-Dequeuing
34545				 *********************/
34546
34547				/* As per jQuery's $.queue() behavior, to fire the first non-custom-queue entry on an element, the element
34548				 must be dequeued if its queue stack consists *solely* of the current call. (This can be determined by checking
34549				 for the "inprogress" item that jQuery prepends to active queue stack arrays.) Regardless, whenever the element's
34550				 queue is further appended with additional items -- including $.delay()'s or even $.animate() calls, the queue's
34551				 first entry is automatically fired. This behavior contrasts that of custom queues, which never auto-fire. */
34552				/* Note: When an element set is being subjected to a non-parallel Velocity call, the animation will not begin until
34553				 each one of the elements in the set has reached the end of its individually pre-existing queue chain. */
34554				/* Note: Unfortunately, most people don't fully grasp jQuery's powerful, yet quirky, $.queue() function.
34555				 Lean more here: http://stackoverflow.com/questions/1058158/can-somebody-explain-jquery-queue-to-me */
34556				if ((opts.queue === "" || opts.queue === "fx") && $.queue(element)[0] !== "inprogress") {
34557					$.dequeue(element);
34558				}
34559			}
34560
34561			/**************************
34562			 Element Set Iteration
34563			 **************************/
34564
34565			/* If the "nodeType" property exists on the elements variable, we're animating a single element.
34566			 Place it in an array so that $.each() can iterate over it. */
34567			$.each(elements, function(i, element) {
34568				/* Ensure each element in a set has a nodeType (is a real element) to avoid throwing errors. */
34569				if (Type.isNode(element)) {
34570					processElement(element, i);
34571				}
34572			});
34573
34574			/******************
34575			 Option: Loop
34576			 ******************/
34577
34578			/* The loop option accepts an integer indicating how many times the element should loop between the values in the
34579			 current call's properties map and the element's property values prior to this call. */
34580			/* Note: The loop option's logic is performed here -- after element processing -- because the current call needs
34581			 to undergo its queue insertion prior to the loop option generating its series of constituent "reverse" calls,
34582			 which chain after the current call. Two reverse calls (two "alternations") constitute one loop. */
34583			opts = $.extend({}, Velocity.defaults, options);
34584			opts.loop = parseInt(opts.loop, 10);
34585			var reverseCallsCount = (opts.loop * 2) - 1;
34586
34587			if (opts.loop) {
34588				/* Double the loop count to convert it into its appropriate number of "reverse" calls.
34589				 Subtract 1 from the resulting value since the current call is included in the total alternation count. */
34590				for (var x = 0; x < reverseCallsCount; x++) {
34591					/* Since the logic for the reverse action occurs inside Queueing and therefore this call's options object
34592					 isn't parsed until then as well, the current call's delay option must be explicitly passed into the reverse
34593					 call so that the delay logic that occurs inside *Pre-Queueing* can process it. */
34594					var reverseOptions = {
34595						delay: opts.delay,
34596						progress: opts.progress
34597					};
34598
34599					/* If a complete callback was passed into this call, transfer it to the loop redirect's final "reverse" call
34600					 so that it's triggered when the entire redirect is complete (and not when the very first animation is complete). */
34601					if (x === reverseCallsCount - 1) {
34602						reverseOptions.display = opts.display;
34603						reverseOptions.visibility = opts.visibility;
34604						reverseOptions.complete = opts.complete;
34605					}
34606
34607					animate(elements, "reverse", reverseOptions);
34608				}
34609			}
34610
34611			/***************
34612			 Chaining
34613			 ***************/
34614
34615			/* Return the elements back to the call chain, with wrapped elements taking precedence in case Velocity was called via the $.fn. extension. */
34616			return getChain();
34617		};
34618
34619		/* Turn Velocity into the animation function, extended with the pre-existing Velocity object. */
34620		Velocity = $.extend(animate, Velocity);
34621		/* For legacy support, also expose the literal animate method. */
34622		Velocity.animate = animate;
34623
34624		/**************
34625		 Timing
34626		 **************/
34627
34628		/* Ticker function. */
34629		var ticker = window.requestAnimationFrame || rAFShim;
34630
34631		/* Inactive browser tabs pause rAF, which results in all active animations immediately sprinting to their completion states when the tab refocuses.
34632		 To get around this, we dynamically switch rAF to setTimeout (which the browser *doesn't* pause) when the tab loses focus. We skip this for mobile
34633		 devices to avoid wasting battery power on inactive tabs. */
34634		/* Note: Tab focus detection doesn't work on older versions of IE, but that's okay since they don't support rAF to begin with. */
34635		if (!Velocity.State.isMobile && document.hidden !== undefined) {
34636			var updateTicker = function() {
34637				/* Reassign the rAF function (which the global tick() function uses) based on the tab's focus state. */
34638				if (document.hidden) {
34639					ticker = function(callback) {
34640						/* The tick function needs a truthy first argument in order to pass its internal timestamp check. */
34641						return setTimeout(function() {
34642							callback(true);
34643						}, 16);
34644					};
34645
34646					/* The rAF loop has been paused by the browser, so we manually restart the tick. */
34647					tick();
34648				} else {
34649					ticker = window.requestAnimationFrame || rAFShim;
34650				}
34651			};
34652
34653			/* Page could be sitting in the background at this time (i.e. opened as new tab) so making sure we use correct ticker from the start */
34654			updateTicker();
34655
34656			/* And then run check again every time visibility changes */
34657			document.addEventListener("visibilitychange", updateTicker);
34658		}
34659
34660		/************
34661		 Tick
34662		 ************/
34663
34664		/* Note: All calls to Velocity are pushed to the Velocity.State.calls array, which is fully iterated through upon each tick. */
34665		function tick(timestamp) {
34666			/* An empty timestamp argument indicates that this is the first tick occurence since ticking was turned on.
34667			 We leverage this metadata to fully ignore the first tick pass since RAF's initial pass is fired whenever
34668			 the browser's next tick sync time occurs, which results in the first elements subjected to Velocity
34669			 calls being animated out of sync with any elements animated immediately thereafter. In short, we ignore
34670			 the first RAF tick pass so that elements being immediately consecutively animated -- instead of simultaneously animated
34671			 by the same Velocity call -- are properly batched into the same initial RAF tick and consequently remain in sync thereafter. */
34672			if (timestamp) {
34673				/* We normally use RAF's high resolution timestamp but as it can be significantly offset when the browser is
34674				 under high stress we give the option for choppiness over allowing the browser to drop huge chunks of frames.
34675				 We use performance.now() and shim it if it doesn't exist for when the tab is hidden. */
34676				var timeCurrent = Velocity.timestamp && timestamp !== true ? timestamp : performance.now();
34677
34678				/********************
34679				 Call Iteration
34680				 ********************/
34681
34682				var callsLength = Velocity.State.calls.length;
34683
34684				/* To speed up iterating over this array, it is compacted (falsey items -- calls that have completed -- are removed)
34685				 when its length has ballooned to a point that can impact tick performance. This only becomes necessary when animation
34686				 has been continuous with many elements over a long period of time; whenever all active calls are completed, completeCall() clears Velocity.State.calls. */
34687				if (callsLength > 10000) {
34688					Velocity.State.calls = compactSparseArray(Velocity.State.calls);
34689					callsLength = Velocity.State.calls.length;
34690				}
34691
34692				/* Iterate through each active call. */
34693				for (var i = 0; i < callsLength; i++) {
34694					/* When a Velocity call is completed, its Velocity.State.calls entry is set to false. Continue on to the next call. */
34695					if (!Velocity.State.calls[i]) {
34696						continue;
34697					}
34698
34699					/************************
34700					 Call-Wide Variables
34701					 ************************/
34702
34703					var callContainer = Velocity.State.calls[i],
34704							call = callContainer[0],
34705							opts = callContainer[2],
34706							timeStart = callContainer[3],
34707							firstTick = !!timeStart,
34708							tweenDummyValue = null,
34709							pauseObject = callContainer[5],
34710							millisecondsEllapsed = callContainer[6];
34711
34712
34713
34714					/* If timeStart is undefined, then this is the first time that this call has been processed by tick().
34715					 We assign timeStart now so that its value is as close to the real animation start time as possible.
34716					 (Conversely, had timeStart been defined when this call was added to Velocity.State.calls, the delay
34717					 between that time and now would cause the first few frames of the tween to be skipped since
34718					 percentComplete is calculated relative to timeStart.) */
34719					/* Further, subtract 16ms (the approximate resolution of RAF) from the current time value so that the
34720					 first tick iteration isn't wasted by animating at 0% tween completion, which would produce the
34721					 same style value as the element's current value. */
34722					if (!timeStart) {
34723						timeStart = Velocity.State.calls[i][3] = timeCurrent - 16;
34724					}
34725
34726					/* If a pause object is present, skip processing unless it has been set to resume */
34727					if (pauseObject) {
34728						if (pauseObject.resume === true) {
34729							/* Update the time start to accomodate the paused completion amount */
34730							timeStart = callContainer[3] = Math.round(timeCurrent - millisecondsEllapsed - 16);
34731
34732							/* Remove pause object after processing */
34733							callContainer[5] = null;
34734						} else {
34735							continue;
34736						}
34737					}
34738
34739					millisecondsEllapsed = callContainer[6] = timeCurrent - timeStart;
34740
34741					/* The tween's completion percentage is relative to the tween's start time, not the tween's start value
34742					 (which would result in unpredictable tween durations since JavaScript's timers are not particularly accurate).
34743					 Accordingly, we ensure that percentComplete does not exceed 1. */
34744					var percentComplete = Math.min((millisecondsEllapsed) / opts.duration, 1);
34745
34746					/**********************
34747					 Element Iteration
34748					 **********************/
34749
34750					/* For every call, iterate through each of the elements in its set. */
34751					for (var j = 0, callLength = call.length; j < callLength; j++) {
34752						var tweensContainer = call[j],
34753								element = tweensContainer.element;
34754
34755						/* Check to see if this element has been deleted midway through the animation by checking for the
34756						 continued existence of its data cache. If it's gone, or the element is currently paused, skip animating this element. */
34757						if (!Data(element)) {
34758							continue;
34759						}
34760
34761						var transformPropertyExists = false;
34762
34763						/**********************************
34764						 Display & Visibility Toggling
34765						 **********************************/
34766
34767						/* If the display option is set to non-"none", set it upfront so that the element can become visible before tweening begins.
34768						 (Otherwise, display's "none" value is set in completeCall() once the animation has completed.) */
34769						if (opts.display !== undefined && opts.display !== null && opts.display !== "none") {
34770							if (opts.display === "flex") {
34771								var flexValues = ["-webkit-box", "-moz-box", "-ms-flexbox", "-webkit-flex"];
34772
34773								$.each(flexValues, function(i, flexValue) {
34774									CSS.setPropertyValue(element, "display", flexValue);
34775								});
34776							}
34777
34778							CSS.setPropertyValue(element, "display", opts.display);
34779						}
34780
34781						/* Same goes with the visibility option, but its "none" equivalent is "hidden". */
34782						if (opts.visibility !== undefined && opts.visibility !== "hidden") {
34783							CSS.setPropertyValue(element, "visibility", opts.visibility);
34784						}
34785
34786						/************************
34787						 Property Iteration
34788						 ************************/
34789
34790						/* For every element, iterate through each property. */
34791						for (var property in tweensContainer) {
34792							/* Note: In addition to property tween data, tweensContainer contains a reference to its associated element. */
34793							if (tweensContainer.hasOwnProperty(property) && property !== "element") {
34794								var tween = tweensContainer[property],
34795										currentValue,
34796										/* Easing can either be a pre-genereated function or a string that references a pre-registered easing
34797										 on the Velocity.Easings object. In either case, return the appropriate easing *function*. */
34798										easing = Type.isString(tween.easing) ? Velocity.Easings[tween.easing] : tween.easing;
34799
34800								/******************************
34801								 Current Value Calculation
34802								 ******************************/
34803
34804								if (Type.isString(tween.pattern)) {
34805									var patternReplace = percentComplete === 1 ?
34806											function($0, index, round) {
34807												var result = tween.endValue[index];
34808
34809												return round ? Math.round(result) : result;
34810											} :
34811											function($0, index, round) {
34812												var startValue = tween.startValue[index],
34813														tweenDelta = tween.endValue[index] - startValue,
34814														result = startValue + (tweenDelta * easing(percentComplete, opts, tweenDelta));
34815
34816												return round ? Math.round(result) : result;
34817											};
34818
34819									currentValue = tween.pattern.replace(/{(\d+)(!)?}/g, patternReplace);
34820								} else if (percentComplete === 1) {
34821									/* If this is the last tick pass (if we've reached 100% completion for this tween),
34822									 ensure that currentValue is explicitly set to its target endValue so that it's not subjected to any rounding. */
34823									currentValue = tween.endValue;
34824								} else {
34825									/* Otherwise, calculate currentValue based on the current delta from startValue. */
34826									var tweenDelta = tween.endValue - tween.startValue;
34827
34828									currentValue = tween.startValue + (tweenDelta * easing(percentComplete, opts, tweenDelta));
34829									/* If no value change is occurring, don't proceed with DOM updating. */
34830								}
34831								if (!firstTick && (currentValue === tween.currentValue)) {
34832									continue;
34833								}
34834
34835								tween.currentValue = currentValue;
34836
34837								/* If we're tweening a fake 'tween' property in order to log transition values, update the one-per-call variable so that
34838								 it can be passed into the progress callback. */
34839								if (property === "tween") {
34840									tweenDummyValue = currentValue;
34841								} else {
34842									/******************
34843									 Hooks: Part I
34844									 ******************/
34845									var hookRoot;
34846
34847									/* For hooked properties, the newly-updated rootPropertyValueCache is cached onto the element so that it can be used
34848									 for subsequent hooks in this call that are associated with the same root property. If we didn't cache the updated
34849									 rootPropertyValue, each subsequent update to the root property in this tick pass would reset the previous hook's
34850									 updates to rootPropertyValue prior to injection. A nice performance byproduct of rootPropertyValue caching is that
34851									 subsequently chained animations using the same hookRoot but a different hook can use this cached rootPropertyValue. */
34852									if (CSS.Hooks.registered[property]) {
34853										hookRoot = CSS.Hooks.getRoot(property);
34854
34855										var rootPropertyValueCache = Data(element).rootPropertyValueCache[hookRoot];
34856
34857										if (rootPropertyValueCache) {
34858											tween.rootPropertyValue = rootPropertyValueCache;
34859										}
34860									}
34861
34862									/*****************
34863									 DOM Update
34864									 *****************/
34865
34866									/* setPropertyValue() returns an array of the property name and property value post any normalization that may have been performed. */
34867									/* Note: To solve an IE<=8 positioning bug, the unit type is dropped when setting a property value of 0. */
34868									var adjustedSetData = CSS.setPropertyValue(element, /* SET */
34869											property,
34870											tween.currentValue + (IE < 9 && parseFloat(currentValue) === 0 ? "" : tween.unitType),
34871											tween.rootPropertyValue,
34872											tween.scrollData);
34873
34874									/*******************
34875									 Hooks: Part II
34876									 *******************/
34877
34878									/* Now that we have the hook's updated rootPropertyValue (the post-processed value provided by adjustedSetData), cache it onto the element. */
34879									if (CSS.Hooks.registered[property]) {
34880										/* Since adjustedSetData contains normalized data ready for DOM updating, the rootPropertyValue needs to be re-extracted from its normalized form. ?? */
34881										if (CSS.Normalizations.registered[hookRoot]) {
34882											Data(element).rootPropertyValueCache[hookRoot] = CSS.Normalizations.registered[hookRoot]("extract", null, adjustedSetData[1]);
34883										} else {
34884											Data(element).rootPropertyValueCache[hookRoot] = adjustedSetData[1];
34885										}
34886									}
34887
34888									/***************
34889									 Transforms
34890									 ***************/
34891
34892									/* Flag whether a transform property is being animated so that flushTransformCache() can be triggered once this tick pass is complete. */
34893									if (adjustedSetData[0] === "transform") {
34894										transformPropertyExists = true;
34895									}
34896
34897								}
34898							}
34899						}
34900
34901						/****************
34902						 mobileHA
34903						 ****************/
34904
34905						/* If mobileHA is enabled, set the translate3d transform to null to force hardware acceleration.
34906						 It's safe to override this property since Velocity doesn't actually support its animation (hooks are used in its place). */
34907						if (opts.mobileHA) {
34908							/* Don't set the null transform hack if we've already done so. */
34909							if (Data(element).transformCache.translate3d === undefined) {
34910								/* All entries on the transformCache object are later concatenated into a single transform string via flushTransformCache(). */
34911								Data(element).transformCache.translate3d = "(0px, 0px, 0px)";
34912
34913								transformPropertyExists = true;
34914							}
34915						}
34916
34917						if (transformPropertyExists) {
34918							CSS.flushTransformCache(element);
34919						}
34920					}
34921
34922					/* The non-"none" display value is only applied to an element once -- when its associated call is first ticked through.
34923					 Accordingly, it's set to false so that it isn't re-processed by this call in the next tick. */
34924					if (opts.display !== undefined && opts.display !== "none") {
34925						Velocity.State.calls[i][2].display = false;
34926					}
34927					if (opts.visibility !== undefined && opts.visibility !== "hidden") {
34928						Velocity.State.calls[i][2].visibility = false;
34929					}
34930
34931					/* Pass the elements and the timing data (percentComplete, msRemaining, timeStart, tweenDummyValue) into the progress callback. */
34932					if (opts.progress) {
34933						opts.progress.call(callContainer[1],
34934								callContainer[1],
34935								percentComplete,
34936								Math.max(0, (timeStart + opts.duration) - timeCurrent),
34937								timeStart,
34938								tweenDummyValue);
34939					}
34940
34941					/* If this call has finished tweening, pass its index to completeCall() to handle call cleanup. */
34942					if (percentComplete === 1) {
34943						completeCall(i);
34944					}
34945				}
34946			}
34947
34948			/* Note: completeCall() sets the isTicking flag to false when the last call on Velocity.State.calls has completed. */
34949			if (Velocity.State.isTicking) {
34950				ticker(tick);
34951			}
34952		}
34953
34954		/**********************
34955		 Call Completion
34956		 **********************/
34957
34958		/* Note: Unlike tick(), which processes all active calls at once, call completion is handled on a per-call basis. */
34959		function completeCall(callIndex, isStopped) {
34960			/* Ensure the call exists. */
34961			if (!Velocity.State.calls[callIndex]) {
34962				return false;
34963			}
34964
34965			/* Pull the metadata from the call. */
34966			var call = Velocity.State.calls[callIndex][0],
34967					elements = Velocity.State.calls[callIndex][1],
34968					opts = Velocity.State.calls[callIndex][2],
34969					resolver = Velocity.State.calls[callIndex][4];
34970
34971			var remainingCallsExist = false;
34972
34973			/*************************
34974			 Element Finalization
34975			 *************************/
34976
34977			for (var i = 0, callLength = call.length; i < callLength; i++) {
34978				var element = call[i].element;
34979
34980				/* If the user set display to "none" (intending to hide the element), set it now that the animation has completed. */
34981				/* Note: display:none isn't set when calls are manually stopped (via Velocity("stop"). */
34982				/* Note: Display gets ignored with "reverse" calls and infinite loops, since this behavior would be undesirable. */
34983				if (!isStopped && !opts.loop) {
34984					if (opts.display === "none") {
34985						CSS.setPropertyValue(element, "display", opts.display);
34986					}
34987
34988					if (opts.visibility === "hidden") {
34989						CSS.setPropertyValue(element, "visibility", opts.visibility);
34990					}
34991				}
34992
34993				/* If the element's queue is empty (if only the "inprogress" item is left at position 0) or if its queue is about to run
34994				 a non-Velocity-initiated entry, turn off the isAnimating flag. A non-Velocity-initiatied queue entry's logic might alter
34995				 an element's CSS values and thereby cause Velocity's cached value data to go stale. To detect if a queue entry was initiated by Velocity,
34996				 we check for the existence of our special Velocity.queueEntryFlag declaration, which minifiers won't rename since the flag
34997				 is assigned to jQuery's global $ object and thus exists out of Velocity's own scope. */
34998				var data = Data(element);
34999
35000				if (opts.loop !== true && ($.queue(element)[1] === undefined || !/\.velocityQueueEntryFlag/i.test($.queue(element)[1]))) {
35001					/* The element may have been deleted. Ensure that its data cache still exists before acting on it. */
35002					if (data) {
35003						data.isAnimating = false;
35004						/* Clear the element's rootPropertyValueCache, which will become stale. */
35005						data.rootPropertyValueCache = {};
35006
35007						var transformHAPropertyExists = false;
35008						/* If any 3D transform subproperty is at its default value (regardless of unit type), remove it. */
35009						$.each(CSS.Lists.transforms3D, function(i, transformName) {
35010							var defaultValue = /^scale/.test(transformName) ? 1 : 0,
35011									currentValue = data.transformCache[transformName];
35012
35013							if (data.transformCache[transformName] !== undefined && new RegExp("^\\(" + defaultValue + "[^.]").test(currentValue)) {
35014								transformHAPropertyExists = true;
35015
35016								delete data.transformCache[transformName];
35017							}
35018						});
35019
35020						/* Mobile devices have hardware acceleration removed at the end of the animation in order to avoid hogging the GPU's memory. */
35021						if (opts.mobileHA) {
35022							transformHAPropertyExists = true;
35023							delete data.transformCache.translate3d;
35024						}
35025
35026						/* Flush the subproperty removals to the DOM. */
35027						if (transformHAPropertyExists) {
35028							CSS.flushTransformCache(element);
35029						}
35030
35031						/* Remove the "velocity-animating" indicator class. */
35032						CSS.Values.removeClass(element, "velocity-animating");
35033					}
35034				}
35035
35036				/*********************
35037				 Option: Complete
35038				 *********************/
35039
35040				/* Complete is fired once per call (not once per element) and is passed the full raw DOM element set as both its context and its first argument. */
35041				/* Note: Callbacks aren't fired when calls are manually stopped (via Velocity("stop"). */
35042				if (!isStopped && opts.complete && !opts.loop && (i === callLength - 1)) {
35043					/* We throw callbacks in a setTimeout so that thrown errors don't halt the execution of Velocity itself. */
35044					try {
35045						opts.complete.call(elements, elements);
35046					} catch (error) {
35047						setTimeout(function() {
35048							throw error;
35049						}, 1);
35050					}
35051				}
35052
35053				/**********************
35054				 Promise Resolving
35055				 **********************/
35056
35057				/* Note: Infinite loops don't return promises. */
35058				if (resolver && opts.loop !== true) {
35059					resolver(elements);
35060				}
35061
35062				/****************************
35063				 Option: Loop (Infinite)
35064				 ****************************/
35065
35066				if (data && opts.loop === true && !isStopped) {
35067					/* If a rotateX/Y/Z property is being animated by 360 deg with loop:true, swap tween start/end values to enable
35068					 continuous iterative rotation looping. (Otherise, the element would just rotate back and forth.) */
35069					$.each(data.tweensContainer, function(propertyName, tweenContainer) {
35070						if (/^rotate/.test(propertyName) && ((parseFloat(tweenContainer.startValue) - parseFloat(tweenContainer.endValue)) % 360 === 0)) {
35071							var oldStartValue = tweenContainer.startValue;
35072
35073							tweenContainer.startValue = tweenContainer.endValue;
35074							tweenContainer.endValue = oldStartValue;
35075						}
35076
35077						if (/^backgroundPosition/.test(propertyName) && parseFloat(tweenContainer.endValue) === 100 && tweenContainer.unitType === "%") {
35078							tweenContainer.endValue = 0;
35079							tweenContainer.startValue = 100;
35080						}
35081					});
35082
35083					Velocity(element, "reverse", {loop: true, delay: opts.delay});
35084				}
35085
35086				/***************
35087				 Dequeueing
35088				 ***************/
35089
35090				/* Fire the next call in the queue so long as this call's queue wasn't set to false (to trigger a parallel animation),
35091				 which would have already caused the next call to fire. Note: Even if the end of the animation queue has been reached,
35092				 $.dequeue() must still be called in order to completely clear jQuery's animation queue. */
35093				if (opts.queue !== false) {
35094					$.dequeue(element, opts.queue);
35095				}
35096			}
35097
35098			/************************
35099			 Calls Array Cleanup
35100			 ************************/
35101
35102			/* Since this call is complete, set it to false so that the rAF tick skips it. This array is later compacted via compactSparseArray().
35103			 (For performance reasons, the call is set to false instead of being deleted from the array: http://www.html5rocks.com/en/tutorials/speed/v8/) */
35104			Velocity.State.calls[callIndex] = false;
35105
35106			/* Iterate through the calls array to determine if this was the final in-progress animation.
35107			 If so, set a flag to end ticking and clear the calls array. */
35108			for (var j = 0, callsLength = Velocity.State.calls.length; j < callsLength; j++) {
35109				if (Velocity.State.calls[j] !== false) {
35110					remainingCallsExist = true;
35111
35112					break;
35113				}
35114			}
35115
35116			if (remainingCallsExist === false) {
35117				/* tick() will detect this flag upon its next iteration and subsequently turn itself off. */
35118				Velocity.State.isTicking = false;
35119
35120				/* Clear the calls array so that its length is reset. */
35121				delete Velocity.State.calls;
35122				Velocity.State.calls = [];
35123			}
35124		}
35125
35126		/******************
35127		 Frameworks
35128		 ******************/
35129
35130		/* Both jQuery and Zepto allow their $.fn object to be extended to allow wrapped elements to be subjected to plugin calls.
35131		 If either framework is loaded, register a "velocity" extension pointing to Velocity's core animate() method.  Velocity
35132		 also registers itself onto a global container (window.jQuery || window.Zepto || window) so that certain features are
35133		 accessible beyond just a per-element scope. This master object contains an .animate() method, which is later assigned to $.fn
35134		 (if jQuery or Zepto are present). Accordingly, Velocity can both act on wrapped DOM elements and stand alone for targeting raw DOM elements. */
35135		global.Velocity = Velocity;
35136
35137		if (global !== window) {
35138			/* Assign the element function to Velocity's core animate() method. */
35139			global.fn.velocity = animate;
35140			/* Assign the object function's defaults to Velocity's global defaults object. */
35141			global.fn.velocity.defaults = Velocity.defaults;
35142		}
35143
35144		/***********************
35145		 Packaged Redirects
35146		 ***********************/
35147
35148		/* slideUp, slideDown */
35149		$.each(["Down", "Up"], function(i, direction) {
35150			Velocity.Redirects["slide" + direction] = function(element, options, elementsIndex, elementsSize, elements, promiseData) {
35151				var opts = $.extend({}, options),
35152						begin = opts.begin,
35153						complete = opts.complete,
35154						inlineValues = {},
35155						computedValues = {height: "", marginTop: "", marginBottom: "", paddingTop: "", paddingBottom: ""};
35156
35157				if (opts.display === undefined) {
35158					/* Show the element before slideDown begins and hide the element after slideUp completes. */
35159					/* Note: Inline elements cannot have dimensions animated, so they're reverted to inline-block. */
35160					opts.display = (direction === "Down" ? (Velocity.CSS.Values.getDisplayType(element) === "inline" ? "inline-block" : "block") : "none");
35161				}
35162
35163				opts.begin = function() {
35164					/* If the user passed in a begin callback, fire it now. */
35165					if (elementsIndex === 0 && begin) {
35166						begin.call(elements, elements);
35167					}
35168
35169					/* Cache the elements' original vertical dimensional property values so that we can animate back to them. */
35170					for (var property in computedValues) {
35171						if (!computedValues.hasOwnProperty(property)) {
35172							continue;
35173						}
35174						inlineValues[property] = element.style[property];
35175
35176						/* For slideDown, use forcefeeding to animate all vertical properties from 0. For slideUp,
35177						 use forcefeeding to start from computed values and animate down to 0. */
35178						var propertyValue = CSS.getPropertyValue(element, property);
35179						computedValues[property] = (direction === "Down") ? [propertyValue, 0] : [0, propertyValue];
35180					}
35181
35182					/* Force vertical overflow content to clip so that sliding works as expected. */
35183					inlineValues.overflow = element.style.overflow;
35184					element.style.overflow = "hidden";
35185				};
35186
35187				opts.complete = function() {
35188					/* Reset element to its pre-slide inline values once its slide animation is complete. */
35189					for (var property in inlineValues) {
35190						if (inlineValues.hasOwnProperty(property)) {
35191							element.style[property] = inlineValues[property];
35192						}
35193					}
35194
35195					/* If the user passed in a complete callback, fire it now. */
35196					if (elementsIndex === elementsSize - 1) {
35197						if (complete) {
35198							complete.call(elements, elements);
35199						}
35200						if (promiseData) {
35201							promiseData.resolver(elements);
35202						}
35203					}
35204				};
35205
35206				Velocity(element, computedValues, opts);
35207			};
35208		});
35209
35210		/* fadeIn, fadeOut */
35211		$.each(["In", "Out"], function(i, direction) {
35212			Velocity.Redirects["fade" + direction] = function(element, options, elementsIndex, elementsSize, elements, promiseData) {
35213				var opts = $.extend({}, options),
35214						complete = opts.complete,
35215						propertiesMap = {opacity: (direction === "In") ? 1 : 0};
35216
35217				/* Since redirects are triggered individually for each element in the animated set, avoid repeatedly triggering
35218				 callbacks by firing them only when the final element has been reached. */
35219				if (elementsIndex !== 0) {
35220					opts.begin = null;
35221				}
35222				if (elementsIndex !== elementsSize - 1) {
35223					opts.complete = null;
35224				} else {
35225					opts.complete = function() {
35226						if (complete) {
35227							complete.call(elements, elements);
35228						}
35229						if (promiseData) {
35230							promiseData.resolver(elements);
35231						}
35232					};
35233				}
35234
35235				/* If a display was passed in, use it. Otherwise, default to "none" for fadeOut or the element-specific default for fadeIn. */
35236				/* Note: We allow users to pass in "null" to skip display setting altogether. */
35237				if (opts.display === undefined) {
35238					opts.display = (direction === "In" ? "auto" : "none");
35239				}
35240
35241				Velocity(this, propertiesMap, opts);
35242			};
35243		});
35244
35245		return Velocity;
35246	}((window.jQuery || window.Zepto || window), window, (window ? window.document : undefined));
35247}));
35248
35249/******************
35250 Known Issues
35251 ******************/
35252
35253/* The CSS spec mandates that the translateX/Y/Z transforms are %-relative to the element itself -- not its parent.
35254 Velocity, however, doesn't make this distinction. Thus, converting to or from the % unit with these subproperties
35255 will produce an inaccurate conversion value. The same issue exists with the cx/cy attributes of SVG circles and ellipses. */
35256
35257},{}],30:[function(require,module,exports){
35258/* 
35259 * vidim v1.0.1
35260 * 2018-08-24T13:55:53.385Z
35261 * https://github.com/OriginalEXE/vidim 
35262 * 
35263 * Made by Ante Sepic 
35264 */
35265(function (global, factory) {
35266	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
35267	typeof define === 'function' && define.amd ? define(factory) :
35268	(global.vidim = factory());
35269}(this, (function () { 'use strict';
35270
35271function createCommonjsModule(fn, module) {
35272	return module = { exports: {} }, fn(module, module.exports), module.exports;
35273}
35274
35275var componentEmitter = createCommonjsModule(function (module) {
35276/**
35277 * Expose `Emitter`.
35278 */
35279
35280{
35281  module.exports = Emitter;
35282}
35283
35284/**
35285 * Initialize a new `Emitter`.
35286 *
35287 * @api public
35288 */
35289
35290function Emitter(obj) {
35291  if (obj) return mixin(obj);
35292}
35293
35294/**
35295 * Mixin the emitter properties.
35296 *
35297 * @param {Object} obj
35298 * @return {Object}
35299 * @api private
35300 */
35301
35302function mixin(obj) {
35303  for (var key in Emitter.prototype) {
35304    obj[key] = Emitter.prototype[key];
35305  }
35306  return obj;
35307}
35308
35309/**
35310 * Listen on the given `event` with `fn`.
35311 *
35312 * @param {String} event
35313 * @param {Function} fn
35314 * @return {Emitter}
35315 * @api public
35316 */
35317
35318Emitter.prototype.on =
35319Emitter.prototype.addEventListener = function(event, fn){
35320  this._callbacks = this._callbacks || {};
35321  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])
35322    .push(fn);
35323  return this;
35324};
35325
35326/**
35327 * Adds an `event` listener that will be invoked a single
35328 * time then automatically removed.
35329 *
35330 * @param {String} event
35331 * @param {Function} fn
35332 * @return {Emitter}
35333 * @api public
35334 */
35335
35336Emitter.prototype.once = function(event, fn){
35337  function on() {
35338    this.off(event, on);
35339    fn.apply(this, arguments);
35340  }
35341
35342  on.fn = fn;
35343  this.on(event, on);
35344  return this;
35345};
35346
35347/**
35348 * Remove the given callback for `event` or all
35349 * registered callbacks.
35350 *
35351 * @param {String} event
35352 * @param {Function} fn
35353 * @return {Emitter}
35354 * @api public
35355 */
35356
35357Emitter.prototype.off =
35358Emitter.prototype.removeListener =
35359Emitter.prototype.removeAllListeners =
35360Emitter.prototype.removeEventListener = function(event, fn){
35361  this._callbacks = this._callbacks || {};
35362
35363  // all
35364  if (0 == arguments.length) {
35365    this._callbacks = {};
35366    return this;
35367  }
35368
35369  // specific event
35370  var callbacks = this._callbacks['$' + event];
35371  if (!callbacks) return this;
35372
35373  // remove all handlers
35374  if (1 == arguments.length) {
35375    delete this._callbacks['$' + event];
35376    return this;
35377  }
35378
35379  // remove specific handler
35380  var cb;
35381  for (var i = 0; i < callbacks.length; i++) {
35382    cb = callbacks[i];
35383    if (cb === fn || cb.fn === fn) {
35384      callbacks.splice(i, 1);
35385      break;
35386    }
35387  }
35388  return this;
35389};
35390
35391/**
35392 * Emit `event` with the given args.
35393 *
35394 * @param {String} event
35395 * @param {Mixed} ...
35396 * @return {Emitter}
35397 */
35398
35399Emitter.prototype.emit = function(event){
35400  this._callbacks = this._callbacks || {};
35401  var args = [].slice.call(arguments, 1)
35402    , callbacks = this._callbacks['$' + event];
35403
35404  if (callbacks) {
35405    callbacks = callbacks.slice(0);
35406    for (var i = 0, len = callbacks.length; i < len; ++i) {
35407      callbacks[i].apply(this, args);
35408    }
35409  }
35410
35411  return this;
35412};
35413
35414/**
35415 * Return array of callbacks for `event`.
35416 *
35417 * @param {String} event
35418 * @return {Array}
35419 * @api public
35420 */
35421
35422Emitter.prototype.listeners = function(event){
35423  this._callbacks = this._callbacks || {};
35424  return this._callbacks['$' + event] || [];
35425};
35426
35427/**
35428 * Check if this emitter has `event` handlers.
35429 *
35430 * @param {String} event
35431 * @return {Boolean}
35432 * @api public
35433 */
35434
35435Emitter.prototype.hasListeners = function(event){
35436  return !! this.listeners(event).length;
35437};
35438});
35439
35440// Simple utility function for setting default values
35441function setDefaults(object, defaults) {
35442
35443  var defaultsKeys = Object.keys(defaults);
35444
35445  defaultsKeys.forEach(function (key) {
35446
35447    if (!object.hasOwnProperty(key)) {
35448
35449      object[key] = defaults[key];
35450    }
35451  });
35452}
35453
35454// Utility function for when we need to accept the DOM element
35455function getElement(query) {
35456  var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;
35457
35458
35459  if ('string' === typeof query) {
35460
35461    return parent.querySelector(query);
35462  }
35463
35464  return query;
35465}
35466
35467// Thanks underscore.js :)
35468function throttle(func, wait) {
35469  var timeout, context, args, result;
35470  var previous = 0;
35471
35472  var later = function later() {
35473    previous = Date.now();
35474    timeout = null;
35475    result = func.apply(context, args);
35476    if (!timeout) context = args = null;
35477  };
35478
35479  var throttled = function throttled() {
35480    var now = Date.now();
35481    if (!previous) previous = now;
35482    var remaining = wait - (now - previous);
35483    context = this;
35484    args = arguments;
35485    if (remaining <= 0 || remaining > wait) {
35486      if (timeout) {
35487        clearTimeout(timeout);
35488        timeout = null;
35489      }
35490      previous = now;
35491      result = func.apply(context, args);
35492      if (!timeout) context = args = null;
35493    } else if (!timeout) {
35494      timeout = setTimeout(later, remaining);
35495    }
35496    return result;
35497  };
35498
35499  throttled.cancel = function () {
35500    clearTimeout(timeout);
35501    previous = 0;
35502    timeout = context = args = null;
35503  };
35504
35505  return throttled;
35506}
35507
35508// Fires once the DOM is ready
35509function ready(fn) {
35510
35511  if (document.readyState != 'loading') {
35512
35513    fn();
35514  } else {
35515
35516    document.addEventListener('DOMContentLoaded', fn);
35517  }
35518}
35519
35520var utility = Object.freeze({
35521	setDefaults: setDefaults,
35522	getElement: getElement,
35523	throttle: throttle,
35524	ready: ready
35525});
35526
35527var html5Provider = function (vidim) {
35528
35529  /**
35530   * Defaults specific to this provider
35531   * @type {Object}
35532   */
35533  var defaults = {
35534    preload: 'auto'
35535  };
35536
35537  /**
35538   * Provider definition object
35539   * @type {Object}
35540   */
35541  var vidimHTML5Provider = {
35542
35543    /**
35544     * Initial provider setup
35545     */
35546    _initializeProvider: function _initializeProvider() {
35547
35548      setDefaults(this._options, defaults);
35549
35550      this._constructPlayer();
35551      this._dispatch();
35552      this._listen();
35553    },
35554
35555    /**
35556     * Sets up the actual player
35557     */
35558    _constructPlayer: function _constructPlayer() {
35559
35560      this.el = document.createElement('video');
35561
35562      this.el.setAttribute('playsinline', '');
35563
35564      if (this._options.loop) {
35565
35566        this.el.setAttribute('loop', '');
35567      }
35568
35569      if (this._options.autoplay) {
35570
35571        this.el.setAttribute('autoplay', '');
35572      }
35573
35574      if (this._options.preload) {
35575
35576        this.el.setAttribute('preload', this._options.preload);
35577      }
35578
35579      if (this._options.muted) {
35580
35581        this.el.muted = true;
35582      }
35583
35584      this.el.style.position = 'absolute';
35585      this.el.style.left = '50%';
35586      this.el.style.top = '50%';
35587      this.el.style.transform = 'translate(-50%, -50%)';
35588      this.el.style.webkitTransform = 'translate(-50%, -50%)';
35589      this.el.style.msTransform = 'translate(-50%, -50%)';
35590      this.el.style.oTransform = 'translate(-50%, -50%)';
35591      this.el.style.mozTransform = 'translate(-50%, -50%)';
35592      this.el.style.minWidth = 'calc( 100% + 2px )';
35593      this.el.style.minHeight = 'calc( 100% + 2px )';
35594      this.el.style.opacity = '0';
35595
35596      var src = this._options.src;
35597
35598      if (src.length && 'string' !== typeof src) {
35599
35600        for (var i = 0; i < src.length; i++) {
35601
35602          var source = document.createElement('source');
35603
35604          source.setAttribute('type', src[i].type);
35605          source.setAttribute('src', src[i].src);
35606
35607          this.el.appendChild(source);
35608        }
35609      }
35610
35611      this.wrapper.appendChild(this.el);
35612
35613      if (this._options.startAt) {
35614
35615        this.el.currentTime = this._options.startAt;
35616      }
35617
35618      if ('function' === typeof this._options.onReady) {
35619
35620        this._options.onReady(this);
35621      }
35622
35623      this.emit('ready');
35624
35625      this._constructOverlay();
35626
35627      this.resize();
35628    },
35629
35630    /**
35631     * Dispatches normalized events
35632     */
35633    _dispatch: function _dispatch() {
35634      var _this = this;
35635
35636      this.el.addEventListener('play', function () {
35637
35638        _this.emit('play', _this);
35639      }, false);
35640
35641      this.el.addEventListener('pause', function () {
35642
35643        _this.emit('pause', _this);
35644      }, false);
35645
35646      this.el.addEventListener('ended', function () {
35647
35648        _this.emit('end', _this);
35649      }, false);
35650
35651      this.el.addEventListener('canplay', function () {
35652
35653        _this.emit('canplay', _this);
35654      }, false);
35655
35656      this.el.addEventListener('canplaythrough', function () {
35657
35658        _this.emit('canplaythrough', _this);
35659      }, false);
35660    },
35661
35662    /**
35663     * Any event listeners that are important to this provider
35664     */
35665    _listen: function _listen() {
35666      var _this2 = this;
35667
35668      // Make sure we show the player once playback starts
35669      this.on('play', function () {
35670
35671        _this2.el.style.opacity = '1';
35672      });
35673
35674      // If the poster is hidden initially, set it once the play event happens
35675      if (!this._options.showPosterBeforePlay) {
35676
35677        this.once('play', function () {
35678
35679          _this2.wrapper.style.backgroundImage = 'url(\'' + _this2._options.poster + '\')';
35680        });
35681      }
35682
35683      // Show poster on playback end
35684      if (this._options.showPosterOnEnd) {
35685
35686        this.on('end', function () {
35687
35688          _this2.el.style.opacity = '0';
35689        });
35690      }
35691
35692      // Show poster on playback pause
35693      if (this._options.showPosterOnPause) {
35694
35695        this.on('pause', function () {
35696
35697          _this2.el.style.opacity = '0';
35698        });
35699      }
35700    },
35701
35702    /**
35703     * Starts the video playback
35704     */
35705    play: function play() {
35706
35707      this.el.play();
35708
35709      return this;
35710    },
35711
35712    /**
35713     * Pauses the video playback
35714     */
35715    pause: function pause() {
35716
35717      this.el.pause();
35718
35719      return this;
35720    },
35721
35722    /**
35723     * Sets the player volume
35724     * @param {Number} [volume=100] Min = 0, Max = 100
35725     */
35726    setVolume: function setVolume() {
35727      var volume = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;
35728
35729
35730      this.el.volume = parseFloat(volume / 100);
35731
35732      return this;
35733    },
35734
35735    /**
35736     * Gets the player volume
35737     * @returns {Number} Current player volume
35738     */
35739    getVolume: function getVolume() {
35740
35741      return this.el.volume * 100;
35742    },
35743
35744    /**
35745     * Mutes the player
35746     */
35747    mute: function mute() {
35748
35749      this.el.muted = true;
35750
35751      return this;
35752    },
35753
35754    /**
35755     * Unmutes the server
35756     */
35757    unMute: function unMute() {
35758
35759      this.el.muted = false;
35760
35761      return this;
35762    },
35763
35764    /**
35765     * Sets the time player should seek to
35766     * @param {Number} [time=0] Amount of seconds in the video to seek to
35767     */
35768    setTime: function setTime() {
35769      var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
35770
35771
35772      this.el.currentTime = time;
35773
35774      return this;
35775    },
35776
35777    /**
35778     * Gets the time video playback is currently at
35779     * @returns {Number} Number of seconds from start to the current position
35780     */
35781    getTime: function getTime() {
35782
35783      return this.el.currentTime;
35784    },
35785
35786    /**
35787     * Gets video duration in seconds
35788     * @returns {Number} Length of the video in seconds
35789     */
35790    getDuration: function getDuration() {
35791
35792      return this.el.duration;
35793    },
35794
35795    /**
35796     * Hides the media and shows the poster behind it
35797     */
35798    showPoster: function showPoster() {
35799
35800      this.pause().el.style.opacity = '0';
35801    },
35802
35803    /**
35804     * Changes the source of the current video
35805     * @param {Object} src Hash of video types and sources
35806     */
35807    changeSource: function changeSource(src) {
35808      var newPoster = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
35809
35810
35811      this.el.innerHTML = '';
35812
35813      if (src.length && 'string' !== typeof src) {
35814
35815        for (var i = 0; i < src.length; i++) {
35816
35817          var source = document.createElement('source');
35818
35819          source.setAttribute('type', src[i].type);
35820          source.setAttribute('src', src[i].src);
35821
35822          this.el.appendChild(source);
35823        }
35824      }
35825
35826      this.el.load && this.el.load();
35827
35828      if (this._options.startAt) {
35829
35830        this.el.currentTime = this._options.startAt;
35831      }
35832
35833      if (newPoster) {
35834
35835        var oldPoster = this._options.poster;
35836
35837        if (-1 !== this.wrapper.style.backgroundImage.indexOf(oldPoster)) {
35838
35839          this.wrapper.style.backgroundImage = 'url(\'' + newPoster + '\')';
35840        }
35841
35842        this._options.poster = newPoster;
35843      }
35844    },
35845
35846    /**
35847     * Destroys and unloads the player
35848     */
35849    destroy: function destroy() {
35850
35851      this.emit('destroy');
35852
35853      this.el.pause && this.el.pause();
35854      this.el.src = '';
35855      this.el.load && this.el.load();
35856
35857      // We wrap this next part in try...catch in case the element is already
35858      // gone for some reason
35859      try {
35860        this.wrapper.parentNode.removeChild(this.wrapper);
35861      } catch (e) {
35862
35863        // do nothing here
35864
35865      }
35866
35867      vidim.deleteInstance(this.vidimID);
35868
35869      delete this.container.vidimID;
35870
35871      this.off();
35872    },
35873
35874    /**
35875     * Resizes the player to provide the best viewing experience
35876     */
35877    resize: function resize() {
35878
35879      if (!this.el) {
35880
35881        return;
35882      }
35883
35884      var containerHeight = this.container.offsetHeight,
35885          containerWidth = this.container.offsetWidth;
35886
35887      if ('BODY' === this.container.nodeName) {
35888
35889        containerWidth = window.innerWidth;
35890        containerHeight = window.innerHeight;
35891      }
35892
35893      if (1 < this._options.ratio && containerWidth / containerHeight < this._options.ratio || 1 > this._options.ratio && containerHeight / containerWidth < this._options.ratio) {
35894
35895        this.el.style.maxHeight = 'calc( 100% + 2px )';
35896        this.el.style.maxWidth = '';
35897      } else {
35898
35899        this.el.style.maxHeight = '';
35900        this.el.style.maxWidth = 'calc( 100% + 2px )';
35901      }
35902
35903      this.emit('resize');
35904    }
35905  };
35906
35907  vidim.registerProvider('HTML5', vidimHTML5Provider);
35908};
35909
35910/* global YT:false */
35911
35912/**
35913 * Will be set to true once YouTube API is ready
35914 * @type {Boolean}
35915 */
35916var isAPIReady = false;
35917
35918var YouTubeProvider = function (vidim) {
35919
35920  /**
35921   * Defaults specific to this provider
35922   * @type {Object}
35923   */
35924  var defaults = {
35925    quality: 'hd1080'
35926  };
35927
35928  /**
35929   * Provider definition object
35930   * @type {Object}
35931   */
35932  var vidimYouTubeProvider = {
35933
35934    /**
35935     * Initial provider setup
35936     */
35937    _initializeProvider: function _initializeProvider() {
35938      var _this = this;
35939
35940      if (isAPIReady) {
35941
35942        setDefaults(this._options, defaults);
35943
35944        this._constructPlayer();
35945        this._listen();
35946      } else {
35947
35948        window.addEventListener('vidimYouTubeAPIReady', function () {
35949
35950          setDefaults(_this._options, defaults);
35951
35952          _this._constructPlayer();
35953          _this._listen();
35954        }, false);
35955      }
35956    },
35957
35958    /**
35959     * Sets up the actual player
35960     */
35961    _constructPlayer: function _constructPlayer() {
35962      var _this2 = this;
35963
35964      // Check if YouTube ID was given, and if not, try to extract it from url
35965      if (11 === this._options.src.length) {
35966
35967        this.videoID = this._options.src;
35968      } else {
35969
35970        var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/;
35971
35972        var videoMatch = this._options.src.match(regex);
35973
35974        if (!videoMatch || 11 !== videoMatch[2].length) {
35975
35976          return new Error('Provided source is not a valid YouTube url');
35977        }
35978
35979        this.videoID = videoMatch[2];
35980      }
35981
35982      // Create a temporary dom element that will be replaced by the
35983      // YouTube iframe
35984      var toBeReplaced = document.createElement('div');
35985
35986      this.wrapper.appendChild(toBeReplaced);
35987
35988      var playerParams = {
35989        videoId: this.videoID,
35990        playerVars: {
35991          allowfullscreen: false,
35992          controls: 0,
35993          enablejsapi: 1,
35994          disablekb: 1,
35995          fs: 0,
35996          iv_load_policy: 3,
35997          modestbranding: 1,
35998          origin: typeof window.location.origin !== 'undefined' ? window.location.origin : window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : ''),
35999          playsinline: 1,
36000          rel: 0,
36001          showinfo: 0,
36002          start: this._options.startAt,
36003          autoplay: +this._options.autoplay
36004        },
36005        events: {
36006          'onReady': function onReady() {
36007
36008            if (_this2._options.muted) {
36009
36010              _this2.mute();
36011            }
36012
36013            _this2.player.setPlaybackQuality(_this2._options.quality);
36014
36015            if ('function' === typeof _this2._options.onReady) {
36016
36017              _this2._options.onReady(_this2);
36018            }
36019
36020            _this2.emit('ready');
36021
36022            if (_this2._options.loop) {
36023
36024              var loopInterval = void 0;
36025
36026              _this2.on('play', function () {
36027
36028                loopInterval = setInterval(function () {
36029
36030                  if (_this2.getTime() === 0 || _this2.getTime() + 0.15 > _this2.getDuration()) {
36031
36032                    _this2.setTime(0);
36033                    _this2.play();
36034                  }
36035                }, 100);
36036              });
36037
36038              _this2.on('pause', function () {
36039
36040                clearInterval(loopInterval);
36041              });
36042
36043              _this2.on('destroy', function () {
36044
36045                clearInterval(loopInterval);
36046              });
36047            }
36048          },
36049          'onStateChange': function onStateChange(e) {
36050
36051            switch (e.data) {
36052
36053              case 0:
36054                _this2.emit('end', _this2);
36055                break;
36056
36057              case 1:
36058                _this2.emit('play', _this2);
36059                break;
36060
36061              case 2:
36062                _this2.emit('pause', _this2);
36063                break;
36064
36065              case 3:
36066                _this2.emit('buffering', _this2);
36067                break;
36068
36069            }
36070          }
36071        }
36072      };
36073
36074      if (this._options.loop) {
36075
36076        playerParams.playerVars.playlist = this.videoID;
36077        playerParams.playerVars.loop = 1;
36078      }
36079
36080      this.player = new YT.Player(toBeReplaced, playerParams);
36081
36082      this.el = this.player.getIframe();
36083
36084      this.el.style.position = 'absolute';
36085      this.el.style.left = '50%';
36086      this.el.style.top = '50%';
36087      this.el.style.transform = 'translate(-50%, -50%)';
36088      this.el.style.webkitTransform = 'translate(-50%, -50%)';
36089      this.el.style.msTransform = 'translate(-50%, -50%)';
36090      this.el.style.oTransform = 'translate(-50%, -50%)';
36091      this.el.style.mozTransform = 'translate(-50%, -50%)';
36092      this.el.style.minWidth = 'calc( 100% + 2px )';
36093      this.el.style.minHeight = 'calc( 100% + 2px )';
36094      this.el.style.opacity = '0';
36095
36096      this._constructOverlay();
36097
36098      this.resize();
36099    },
36100
36101    /**
36102     * Any event listeners that are important to this provider
36103     */
36104    _listen: function _listen() {
36105      var _this3 = this;
36106
36107      // Make sure we show the player once playback starts
36108      this.on('play', function () {
36109
36110        _this3.el.style.opacity = '1';
36111      });
36112
36113      // If the poster is hidden initially, set it once the play event happens
36114      if (!this._options.showPosterBeforePlay) {
36115
36116        this.once('play', function () {
36117
36118          _this3.wrapper.style.backgroundImage = 'url(\'' + _this3._options.poster + '\')';
36119        });
36120      }
36121
36122      // Show poster on playback end
36123      if (this._options.showPosterOnEnd) {
36124
36125        this.on('end', function () {
36126
36127          _this3.el.style.opacity = '0';
36128        });
36129      } else {
36130
36131        // We don't want to display YouTube play button over our video,
36132        // this is a hacky way to stop that from happening
36133        this.on('end', function () {
36134
36135          _this3.player.seekTo(_this3.player.getDuration());
36136          _this3.player.playVideo();
36137          _this3.player.pauseVideo();
36138        });
36139      }
36140
36141      // Show poster on playback pause
36142      if (this._options.showPosterOnPause) {
36143
36144        this.on('pause', function () {
36145
36146          _this3.el.style.opacity = '0';
36147        });
36148      }
36149    },
36150
36151    /**
36152     * Starts the video playback
36153     */
36154    play: function play() {
36155
36156      this.player.playVideo();
36157
36158      return this;
36159    },
36160
36161    /**
36162     * Pauses the video playback
36163     */
36164    pause: function pause() {
36165
36166      this.player.pauseVideo();
36167
36168      return this;
36169    },
36170
36171    /**
36172     * Sets the player volume
36173     * @param {Number} [volume=100] Min = 0, Max = 100
36174     */
36175    setVolume: function setVolume() {
36176      var volume = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;
36177
36178
36179      this.player.setVolume(volume);
36180
36181      return this;
36182    },
36183
36184    /**
36185     * Gets the player volume
36186     * @returns {Number} Current player volume
36187     */
36188    getVolume: function getVolume() {
36189
36190      return this.getVolume();
36191    },
36192
36193    /**
36194     * Mutes the player
36195     */
36196    mute: function mute() {
36197
36198      this.player.mute();
36199
36200      return this;
36201    },
36202
36203    /**
36204     * Unmutes the server
36205     */
36206    unMute: function unMute() {
36207
36208      this.player.unMute();
36209
36210      return this;
36211    },
36212
36213    /**
36214     * Sets the time player should seek to
36215     * @param {Number} [time=0] Amount of seconds in the video to seek to
36216     */
36217    setTime: function setTime() {
36218      var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
36219
36220
36221      this.player.seekTo(time, true);
36222
36223      return this;
36224    },
36225
36226    /**
36227     * Gets the time video playback is currently at
36228     * @returns {Number} Number of seconds from start to the current position
36229     */
36230    getTime: function getTime() {
36231
36232      return this.player.getCurrentTime();
36233    },
36234
36235    /**
36236     * Gets video duration in seconds
36237     * @returns {Number} Length of the video in seconds
36238     */
36239    getDuration: function getDuration() {
36240
36241      return this.player.getDuration();
36242    },
36243
36244    /**
36245     * Hides the media and shows the poster behind it
36246     */
36247    showPoster: function showPoster() {
36248
36249      this.pause().el.style.opacity = '0';
36250    },
36251
36252    /**
36253     * Changes the source of the current video
36254     * @param {Object} src Hash of video types and sources
36255     */
36256    changeSource: function changeSource(src) {
36257      var newPoster = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
36258
36259
36260      if (11 === src.length) {
36261
36262        this.videoID = src;
36263      } else {
36264
36265        var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/;
36266
36267        var videoMatch = src.match(regex);
36268
36269        if (!videoMatch || 11 !== videoMatch[2].length) {
36270
36271          return new Error('Provided source is not a valid YouTube url');
36272        }
36273
36274        this.videoID = videoMatch[2];
36275      }
36276
36277      this.player.loadPlaylist(this.videoID, 0, this._options.startAt, this._options.quality);
36278
36279      this.player.setLoop(this._options.loop);
36280
36281      if (newPoster) {
36282
36283        var oldPoster = this._options.poster;
36284
36285        if (-1 !== this.wrapper.style.backgroundImage.indexOf(oldPoster)) {
36286
36287          this.wrapper.style.backgroundImage = 'url(\'' + newPoster + '\')';
36288        }
36289
36290        this._options.poster = newPoster;
36291      }
36292    },
36293
36294    /**
36295     * Destroys and unloads the player
36296     */
36297    destroy: function destroy() {
36298
36299      this.emit('destroy');
36300
36301      this.player.destroy();
36302
36303      // We wrap this next part in try...catch in case the element is already
36304      // gone for some reason
36305      try {
36306        this.wrapper.parentNode.removeChild(this.wrapper);
36307      } catch (e) {
36308
36309        // do nothing here
36310
36311      }
36312
36313      vidim.deleteInstance(this.vidimID);
36314
36315      delete this.container.vidimID;
36316
36317      this.off();
36318    },
36319
36320    /**
36321     * Resizes the player to provide the best viewing experience
36322     */
36323    resize: function resize() {
36324
36325      if (!this.el) {
36326
36327        return;
36328      }
36329
36330      var containerHeight = this.container.offsetHeight,
36331          containerWidth = this.container.offsetWidth;
36332
36333      if ('BODY' === this.container.nodeName) {
36334
36335        containerWidth = window.innerWidth;
36336        containerHeight = window.innerHeight;
36337      }
36338
36339      if (1 < this._options.ratio && containerWidth / containerHeight < this._options.ratio || 1 > this._options.ratio && containerHeight / containerWidth < this._options.ratio) {
36340
36341        this.el.style.maxHeight = 'calc( 100% + 2px )';
36342        this.el.style.maxWidth = '';
36343
36344        this.el.style.height = '';
36345        this.el.style.width = this.el.offsetHeight * this._options.ratio + 200 + 'px';
36346      } else {
36347
36348        this.el.style.maxHeight = '';
36349        this.el.style.maxWidth = 'calc( 100% + 2px )';
36350
36351        this.el.style.height = this.el.offsetWidth / this._options.ratio + 'px';
36352        this.el.style.width = '';
36353
36354        if (this.el.offsetHeight < this.wrapper.offsetHeight + 140) {
36355
36356          this.el.style.height = this.el.offsetWidth / this._options.ratio + 140 + 'px';
36357        }
36358      }
36359
36360      this.emit('resize');
36361    }
36362  };
36363
36364  vidim.registerProvider('YouTube', vidimYouTubeProvider);
36365};
36366
36367// Load the YouTube API
36368var tag = document.createElement('script');
36369
36370tag.src = 'https://www.youtube.com/iframe_api';
36371
36372document.querySelector('body').appendChild(tag);
36373
36374// Create our custom event
36375var event = document.createEvent('Event');
36376
36377event.initEvent('vidimYouTubeAPIReady', true, true);
36378
36379// Finaly, make sure we trigger that event once the API is ready
36380if ('undefined' === typeof window.onYouTubeIframeAPIReady) {
36381
36382  window.onYouTubeIframeAPIReady = function () {
36383
36384    window.vidimYouTubeAPIReady = true;
36385
36386    isAPIReady = true;
36387
36388    window.dispatchEvent(event);
36389  };
36390} else {
36391
36392  var oldOnYouTubeIframeAPIReady = window.onYouTubeIframeAPIReady;
36393
36394  window.onYouTubeIframeAPIReady = function () {
36395
36396    oldOnYouTubeIframeAPIReady();
36397
36398    window.vidimYouTubeAPIReady = true;
36399
36400    isAPIReady = true;
36401
36402    window.dispatchEvent(event);
36403  };
36404}
36405
36406var index = ((function factory(global) {
36407
36408  if ('undefined' === typeof global.document) {
36409
36410    return;
36411  }
36412
36413  /**
36414   * Instance ID counter
36415   * @type {Number}
36416   */
36417  var ID = 0;
36418
36419  /**
36420   * Hashmap of instances
36421   * @type {Object}
36422   */
36423  var instances = {};
36424
36425  /**
36426   * Default options
36427   * @type {Object}
36428   */
36429  var defaults = {
36430    wrapperClass: '',
36431    overlayClass: '',
36432    src: false,
36433    type: 'HTML5',
36434    ratio: 1.7778,
36435    autoplay: true,
36436    loop: true,
36437    poster: '',
36438    showPosterBeforePlay: true,
36439    showPosterOnEnd: false,
36440    showPosterOnPause: false,
36441    zIndex: 0,
36442    autoResize: true,
36443    muted: true,
36444    startAt: 0,
36445    onReady: false
36446  };
36447
36448  /**
36449   * Stores a list of option keys that the user provided, used for setting more
36450   * sensible defaults
36451   * @type {Array}
36452   */
36453  var optionsProvided = [];
36454
36455  /**
36456   * Hashmap of providers
36457   * @type {Object}
36458   */
36459  var providers = {};
36460
36461  /**
36462   * Register a provider for handling media embeds
36463   * @param  {String} type Short identifier for the media type handled
36464   * @param  {Function|Object} Object or a function that returns object
36465   */
36466  function registerProvider(type, provider) {
36467
36468    if ('function' === typeof provider) {
36469
36470      providers[type] = provider.call(global, defaults);
36471    } else {
36472
36473      providers[type] = provider;
36474    }
36475  }
36476
36477  /**
36478   * Get instance by its ID
36479   * @param  {integer} id Instance ID
36480   * @returns {null|Object} null or instance if found
36481   */
36482  function getInstanceFromID(id) {
36483
36484    if (!instances[id]) {
36485
36486      return null;
36487    }
36488
36489    return instances[id];
36490  }
36491
36492  /**
36493   * Get instance from the container element
36494   * @param   {Object|string} element DOM element or a query string
36495   * @returns {null|Object} null or instance if found
36496   */
36497  function getInstanceFromElement(element) {
36498
36499    element = getElement(element);
36500
36501    if ('undefined' === typeof element.vidimID || !instances[element.vidimID]) {
36502
36503      return null;
36504    }
36505
36506    return instances[element.vidimID];
36507  }
36508
36509  /**
36510   * Destroys all active instances
36511   */
36512  function destroyAllInstances() {
36513
36514    for (var key in instances) {
36515
36516      instances[key].hasOwnProperty('destroy') && instances[key].destroy();
36517    }
36518
36519    instances = {};
36520  }
36521
36522  /**
36523   * Delete instance from the instances hash
36524   * NOTE: this will not destroy the instance, only remove it from the
36525   * instances hash. Call the destroy() method on the instance itself if you
36526   * want to destroy it
36527   * @param {string} id Instance ID
36528   */
36529  function deleteInstance(id) {
36530
36531    delete instances[id];
36532  }
36533
36534  // API method for scanning the DOM and initializing vide instances from
36535  // data-vide attribute
36536
36537  /**
36538   * Scan the DOM for elements that have data-vidim attribute and initialize
36539   * new vidim instance based on that attribute
36540   */
36541  function scanDOM() {
36542
36543    var vidimElements = document.querySelectorAll('[data-vidim]');
36544
36545    if (!vidimElements.length) {
36546
36547      return;
36548    }
36549
36550    for (var i = 0; i < vidimElements.length; i++) {
36551
36552      var element = vidimElements[i];
36553      var options = element.getAttribute('data-vidim');
36554
36555      if ('undefined' !== typeof element.vidimID) {
36556
36557        // this element already has an instance of vidim
36558        continue;
36559      }
36560
36561      try {
36562
36563        // The things we do to avoid eval...
36564        var regex = /({|,)(?:\s*)(?:')?([A-Za-z_$\.][A-Za-z0-9_ \-\.$]*)(?:')?(?:\s*):/g;
36565
36566        var fixedOptions = options.replace(regex, '$1"$2":').replace(/:\s?'/g, ':"').replace(/'\s?}/g, '"}').replace(/',"/g, '","');
36567
36568        var parsedOptions = JSON.parse(fixedOptions);
36569
36570        new vidim(element, parsedOptions);
36571      } catch (e) {
36572
36573        // do nothing
36574
36575      }
36576    }
36577  }
36578
36579  /**
36580   * Used for instantiating new instances
36581   * @param {Object|string} element DOM element or a query string
36582   * @param {Object} [options={}] Options hash
36583   */
36584  function vidim(element) {
36585    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
36586
36587
36588    Object.keys(options).forEach(function (key) {
36589
36590      optionsProvided.push(key);
36591    });
36592
36593    // Set defaults
36594    setDefaults(options, defaults);
36595
36596    if (options.src && !providers[options.type]) {
36597
36598      return new Error('No provider can handle type: \'' + options.type + '\'');
36599    }
36600
36601    if ('string' === typeof options.ratio) {
36602
36603      if ('4/3' === options.ratio) {
36604
36605        options.ratio = 4 / 3;
36606      } else {
36607
36608        options.ratio = 16 / 9;
36609      }
36610    }
36611
36612    this._options = options;
36613    this.container = getElement(element);
36614
36615    if (!this.container) {
36616
36617      return new Error('Could not find the container: ' + element);
36618    }
36619
36620    // Set more sensitive defaults
36621    if (-1 === optionsProvided.indexOf('zIndex') && 'BODY' === this.container.nodeName) {
36622
36623      this._options.zIndex = -1;
36624    }
36625
36626    this._initialize();
36627  }
36628
36629  var prototype = vidim.prototype;
36630
36631  /**
36632   * Initializes the instance and does the work common to all providers
36633   */
36634  prototype._initialize = function () {
36635
36636    // Assign a unique ID to this instance, and make sure we store it on the
36637    // container for convenience
36638    this.vidimID = ID++;
36639    this.container.vidimID = this.vidimID;
36640
36641    instances[this.vidimID] = this;
36642
36643    // Add emitter interface to our instance
36644    componentEmitter(this);
36645
36646    // Check if poster was provided but the source was not,
36647    // in that case we fake a simple provider interface that only displays a
36648    // poster
36649    if (!this._options.src && this._options.poster) {
36650
36651      this._constructWrapper();
36652
36653      this.destroy = function () {
36654
36655        this.emit('destroy');
36656
36657        // We wrap this next part in try...catch in case the element is already
36658        // gone for some reason
36659        try {
36660          this.wrapper.parentNode.removeChild(this.wrapper);
36661        } catch (e) {
36662
36663          // do nothing here
36664
36665        }
36666
36667        vidim.deleteInstance(this.vidimID);
36668
36669        delete this.container.vidimID;
36670
36671        this.off();
36672      };
36673
36674      return;
36675    }
36676
36677    var provider = providers[this._options.type];
36678
36679    for (var key in provider) {
36680
36681      this[key] = provider[key];
36682    }
36683
36684    if ('function' !== typeof this._initializeProvider) {
36685
36686      return new Error('Provider is missing method: _initializeProvider');
36687    }
36688
36689    this._constructWrapper();
36690    this._initializeProvider();
36691
36692    if (this._options.autoResize) {
36693
36694      window.addEventListener('resize', throttle(this.resize, 200).bind(this), false);
36695    }
36696
36697    this.resize();
36698  };
36699
36700  /**
36701   * Generates a wrapper that is used for holding the media
36702   */
36703  prototype._constructWrapper = function () {
36704
36705    var containerStyle = getComputedStyle(this.container, null);
36706
36707    if ('static' === containerStyle.getPropertyValue('position')) {
36708
36709      this.container.style.position = 'relative';
36710    }
36711
36712    this.wrapper = document.createElement('div');
36713
36714    if ('BODY' === this.container.nodeName) {
36715
36716      this.wrapper.style.position = 'fixed';
36717    } else {
36718
36719      this.wrapper.style.position = 'absolute';
36720    }
36721
36722    if (this._options.wrapperClass) {
36723
36724      if ('function' === typeof this._options.wrapperClass) {
36725
36726        this.wrapper.classList.add(this._options.wrapperClass.call(this));
36727      } else {
36728
36729        this.wrapper.classList.add(this._options.wrapperClass);
36730      }
36731    }
36732
36733    this.wrapper.style.left = 0;
36734    this.wrapper.style.top = 0;
36735    this.wrapper.style.height = '100%';
36736    this.wrapper.style.width = '100%';
36737    this.wrapper.style.overflow = 'hidden';
36738    this.wrapper.style.zIndex = parseInt(this._options.zIndex, 10);
36739
36740    if (this._options.poster) {
36741
36742      this.wrapper.style.backgroundSize = 'cover';
36743      this.wrapper.style.backgroundPosition = 'center center';
36744      this.wrapper.style.backgroundRepear = 'no-repeat';
36745
36746      if (this._options.showPosterBeforePlay) {
36747
36748        this.wrapper.style.backgroundImage = 'url(\'' + this._options.poster + '\')';
36749      }
36750    }
36751
36752    this.container.insertBefore(this.wrapper, this.container.firstChild);
36753  };
36754
36755  /**
36756   * Generates an overlay that is placed above the media to prevent interaction
36757   */
36758  prototype._constructOverlay = function () {
36759
36760    this.overlay = document.createElement('div');
36761
36762    this.overlay.style.position = 'absolute';
36763
36764    if (this._options.overlayClass) {
36765
36766      if ('function' === typeof this._options.overlayClass) {
36767
36768        this.overlay.classList.add(this._options.overlayClass.call(this));
36769      } else {
36770
36771        this.overlay.classList.add(this._options.overlayClass);
36772      }
36773    }
36774
36775    this.overlay.style.left = 0;
36776    this.overlay.style.top = 0;
36777    this.overlay.style.height = '100%';
36778    this.overlay.style.width = '100%';
36779
36780    this.wrapper.appendChild(this.overlay);
36781  };
36782
36783  // Provide method for retrieving vidim instance by its id
36784  vidim.getInstanceFromID = getInstanceFromID;
36785
36786  // Provide method for retrieving vidim instance from the container element
36787  vidim.getInstanceFromElement = getInstanceFromElement;
36788
36789  // Provide method for registering new providers
36790  vidim.registerProvider = registerProvider;
36791
36792  // Provide method for destroying all instances
36793  vidim.destroyAllInstances = destroyAllInstances;
36794
36795  // Provide method for deleting the instance from instances hash
36796  vidim.deleteInstance = deleteInstance;
36797
36798  // Export our utils functions as well so providers can make use of them
36799  vidim.utility = utility;
36800
36801  // Provide method for scanning the DOM and initializing vidim from attribute
36802  vidim.scanDOM = scanDOM;
36803
36804  // Initialize providers
36805  html5Provider(vidim);
36806  YouTubeProvider(vidim);
36807
36808  // Parse the DOM an auto initialize based on the [data-vidim] attribute
36809  ready(scanDOM);
36810
36811  return vidim;
36812}))('undefined' !== typeof window ? window : undefined);
36813
36814return index;
36815
36816})));
36817
36818},{}]},{},[6]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.