PageSourceSearch

https://youbethejudge.org.uk/main.js?v=4Y61u2LR9vKJp0dhBkn3rqt6XX8lP3MwIIWSCxLSqWA

js youbethejudge.org.uk collected 2026-10-08 16:37:43 UTC 310,494 bytes, 8,667 lines download raw bytes

vendor: 1,456 bytes, lines 1-33
1"use strict";
2(() => {
3  var __create = Object.create;
4  var __defProp = Object.defineProperty;
5  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6  var __getOwnPropNames = Object.getOwnPropertyNames;
7  var __getProtoOf = Object.getPrototypeOf;
8  var __hasOwnProp = Object.prototype.hasOwnProperty;
9  var __commonJS = (cb, mod) => function __require() {
10    try {
11      return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
12    } catch (e) {
13      throw mod = 0, e;
14    }
15  };
16  var __copyProps = (to, from, except, desc) => {
17    if (from && typeof from === "object" || typeof from === "function") {
18      for (let key of __getOwnPropNames(from))
19        if (!__hasOwnProp.call(to, key) && key !== except)
20          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
21    }
22    return to;
23  };
24  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
25    // If the importer is in node compatibility mode or this is not an ESM
26    // file that has been converted to a CommonJS file using a Babel-
27    // compatible transform (i.e. "__esModule" has not been set), then set
28    // "default" to the CommonJS "module.exports" for node compatibility.
29    isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
30    mod
31  ));
32
33  
vendor: 28,393 bytes, lines 33-686
33// node_modules/fuzzysort/fuzzysort.js
34  var require_fuzzysort = __commonJS({
35    "node_modules/fuzzysort/fuzzysort.js"(exports, module) {
36      ((root, UMD) => {
37        if (typeof define === "function" && define.amd) define([], UMD);
38        else if (typeof module === "object" && module.exports) module.exports = UMD();
39        else root["fuzzysort"] = UMD();
40      })(exports, (_) => {
41        "use strict";
42        var single = (search, target) => {
43          if (!search || !target) return NULL;
44          var preparedSearch = getPreparedSearch(search);
45          if (!isPrepared(target)) target = getPrepared(target);
46          var searchBitflags = preparedSearch.bitflags;
47          if ((searchBitflags & target._bitflags) !== searchBitflags) return NULL;
48          return algorithm(preparedSearch, target);
49        };
50        var go = (search, targets, options) => {
51          if (!search) return options?.all ? all(targets, options) : noResults;
52          var preparedSearch = getPreparedSearch(search);
53          var searchBitflags = preparedSearch.bitflags;
54          var containsSpace = preparedSearch.containsSpace;
55          var threshold = denormalizeScore(options?.threshold || 0);
56          var limit = options?.limit || INFINITY;
57          var resultsLen = 0;
58          var limitedCount = 0;
59          var targetsLen = targets.length;
60          function push_result(result2) {
61            if (resultsLen < limit) {
62              q.add(result2);
63              ++resultsLen;
64            } else {
65              ++limitedCount;
66              if (result2._score > q.peek()._score) q.replaceTop(result2);
67            }
68          }
69          if (options?.key) {
70            var key = options.key;
71            for (var i = 0; i < targetsLen; ++i) {
72              var obj = targets[i];
73              var target = getValue(obj, key);
74              if (!target) continue;
75              if (!isPrepared(target)) target = getPrepared(target);
76              if ((searchBitflags & target._bitflags) !== searchBitflags) continue;
77              var result = algorithm(preparedSearch, target);
78              if (result === NULL) continue;
79              if (result._score < threshold) continue;
80              result.obj = obj;
81              push_result(result);
82            }
83          } else if (options?.keys) {
84            var keys = options.keys;
85            var keysLen = keys.length;
86            outer: for (var i = 0; i < targetsLen; ++i) {
87              var obj = targets[i];
88              {
89                var keysBitflags = 0;
90                for (var keyI = 0; keyI < keysLen; ++keyI) {
91                  var key = keys[keyI];
92                  var target = getValue(obj, key);
93                  if (!target) {
94                    tmpTargets[keyI] = noTarget;
95                    continue;
96                  }
97                  if (!isPrepared(target)) target = getPrepared(target);
98                  tmpTargets[keyI] = target;
99                  keysBitflags |= target._bitflags;
100                }
101                if ((searchBitflags & keysBitflags) !== searchBitflags) continue;
102              }
103              if (containsSpace) for (let i2 = 0; i2 < preparedSearch.spaceSearches.length; i2++) keysSpacesBestScores[i2] = NEGATIVE_INFINITY;
104              for (var keyI = 0; keyI < keysLen; ++keyI) {
105                target = tmpTargets[keyI];
106                if (target === noTarget) {
107                  tmpResults[keyI] = noTarget;
108                  continue;
109                }
110                tmpResults[keyI] = algorithm(
111                  preparedSearch,
112                  target,
113                  /*allowSpaces=*/
114                  false,
115                  /*allowPartialMatch=*/
116                  containsSpace
117                );
118                if (tmpResults[keyI] === NULL) {
119                  tmpResults[keyI] = noTarget;
120                  continue;
121                }
122                if (containsSpace) for (let i2 = 0; i2 < preparedSearch.spaceSearches.length; i2++) {
123                  if (allowPartialMatchScores[i2] > -1e3) {
124                    if (keysSpacesBestScores[i2] > NEGATIVE_INFINITY) {
125                      var tmp = (keysSpacesBestScores[i2] + allowPartialMatchScores[i2]) / 4;
126                      if (tmp > keysSpacesBestScores[i2]) keysSpacesBestScores[i2] = tmp;
127                    }
128                  }
129                  if (allowPartialMatchScores[i2] > keysSpacesBestScores[i2]) keysSpacesBestScores[i2] = allowPartialMatchScores[i2];
130                }
131              }
132              if (containsSpace) {
133                for (let i2 = 0; i2 < preparedSearch.spaceSearches.length; i2++) {
134                  if (keysSpacesBestScores[i2] === NEGATIVE_INFINITY) continue outer;
135                }
136              } else {
137                var hasAtLeast1Match = false;
138                for (let i2 = 0; i2 < keysLen; i2++) {
139                  if (tmpResults[i2]._score !== NEGATIVE_INFINITY) {
140                    hasAtLeast1Match = true;
141                    break;
142                  }
143                }
144                if (!hasAtLeast1Match) continue;
145              }
146              var objResults = new KeysResult(keysLen);
147              for (let i2 = 0; i2 < keysLen; i2++) {
148                objResults[i2] = tmpResults[i2];
149              }
150              if (containsSpace) {
151                var score = 0;
152                for (let i2 = 0; i2 < preparedSearch.spaceSearches.length; i2++) score += keysSpacesBestScores[i2];
153              } else {
154                var score = NEGATIVE_INFINITY;
155                for (let i2 = 0; i2 < keysLen; i2++) {
156                  var result = objResults[i2];
157                  if (result._score > -1e3) {
158                    if (score > NEGATIVE_INFINITY) {
159                      var tmp = (score + result._score) / 4;
160                      if (tmp > score) score = tmp;
161                    }
162                  }
163                  if (result._score > score) score = result._score;
164                }
165              }
166              objResults.obj = obj;
167              objResults._score = score;
168              if (options?.scoreFn) {
169                score = options.scoreFn(objResults);
170                if (!score) continue;
171                score = denormalizeScore(score);
172                objResults._score = score;
173              }
174              if (score < threshold) continue;
175              push_result(objResults);
176            }
177          } else {
178            for (var i = 0; i < targetsLen; ++i) {
179              var target = targets[i];
180              if (!target) continue;
181              if (!isPrepared(target)) target = getPrepared(target);
182              if ((searchBitflags & target._bitflags) !== searchBitflags) continue;
183              var result = algorithm(preparedSearch, target);
184              if (result === NULL) continue;
185              if (result._score < threshold) continue;
186              push_result(result);
187            }
188          }
189          if (resultsLen === 0) return noResults;
190          var results = new Array(resultsLen);
191          for (var i = resultsLen - 1; i >= 0; --i) results[i] = q.poll();
192          results.total = resultsLen + limitedCount;
193          return results;
194        };
195        var highlight = (result, open = "<b>", close = "</b>") => {
196          var callback = typeof open === "function" ? open : void 0;
197          var target = result.target;
198          var targetLen = target.length;
199          var indexes = result.indexes;
200          var highlighted = "";
201          var matchI = 0;
202          var indexesI = 0;
203          var opened = false;
204          var parts = [];
205          for (var i = 0; i < targetLen; ++i) {
206            var char = target[i];
207            if (indexes[indexesI] === i) {
208              ++indexesI;
209              if (!opened) {
210                opened = true;
211                if (callback) {
212                  parts.push(highlighted);
213                  highlighted = "";
214                } else {
215                  highlighted += open;
216                }
217              }
218              if (indexesI === indexes.length) {
219                if (callback) {
220                  highlighted += char;
221                  parts.push(callback(highlighted, matchI++));
222                  highlighted = "";
223                  parts.push(target.substr(i + 1));
224                } else {
225                  highlighted += char + close + target.substr(i + 1);
226                }
227                break;
228              }
229            } else {
230              if (opened) {
231                opened = false;
232                if (callback) {
233                  parts.push(callback(highlighted, matchI++));
234                  highlighted = "";
235                } else {
236                  highlighted += close;
237                }
238              }
239            }
240            highlighted += char;
241          }
242          return callback ? parts : highlighted;
243        };
244        var prepare = (target) => {
245          if (typeof target === "number") target = "" + target;
246          else if (typeof target !== "string") target = "";
247          var info = prepareLowerInfo(target);
248          return new_result(target, { _targetLower: info._lower, _targetLowerCodes: info.lowerCodes, _bitflags: info.bitflags });
249        };
250        var cleanup2 = () => {
251          preparedCache.clear();
252          preparedSearchCache.clear();
253        };
254        class Result {
255          get ["indexes"]() {
256            return this._indexes.slice(0, this._indexes.len).sort((a, b) => a - b);
257          }
258          set ["indexes"](indexes) {
259            return this._indexes = indexes;
260          }
261          ["highlight"](open, close) {
262            return highlight(this, open, close);
263          }
264          get ["score"]() {
265            return normalizeScore(this._score);
266          }
267          set ["score"](score) {
268            this._score = denormalizeScore(score);
269          }
270        }
271        class KeysResult extends Array {
272          get ["score"]() {
273            return normalizeScore(this._score);
274          }
275          set ["score"](score) {
276            this._score = denormalizeScore(score);
277          }
278        }
279        var new_result = (target, options) => {
280          const result = new Result();
281          result["target"] = target;
282          result["obj"] = options.obj ?? NULL;
283          result._score = options._score ?? NEGATIVE_INFINITY;
284          result._indexes = options._indexes ?? [];
285          result._targetLower = options._targetLower ?? "";
286          result._targetLowerCodes = options._targetLowerCodes ?? NULL;
287          result._nextBeginningIndexes = options._nextBeginningIndexes ?? NULL;
288          result._bitflags = options._bitflags ?? 0;
289          return result;
290        };
291        var normalizeScore = (score) => {
292          if (score === NEGATIVE_INFINITY) return 0;
293          if (score > 1) return score;
294          return Math.E ** (((-score + 1) ** 0.04307 - 1) * -2);
295        };
296        var denormalizeScore = (normalizedScore) => {
297          if (normalizedScore === 0) return NEGATIVE_INFINITY;
298          if (normalizedScore > 1) return normalizedScore;
299          return 1 - Math.pow(Math.log(normalizedScore) / -2 + 1, 1 / 0.04307);
300        };
301        var prepareSearch = (search) => {
302          if (typeof search === "number") search = "" + search;
303          else if (typeof search !== "string") search = "";
304          search = search.trim();
305          var info = prepareLowerInfo(search);
306          var spaceSearches = [];
307          if (info.containsSpace) {
308            var searches = search.split(/\s+/);
309            searches = [...new Set(searches)];
310            for (var i = 0; i < searches.length; i++) {
311              if (searches[i] === "") continue;
312              var _info = prepareLowerInfo(searches[i]);
313              spaceSearches.push({ lowerCodes: _info.lowerCodes, _lower: searches[i].toLowerCase(), containsSpace: false });
314            }
315          }
316          return { lowerCodes: info.lowerCodes, _lower: info._lower, containsSpace: info.containsSpace, bitflags: info.bitflags, spaceSearches };
317        };
318        var getPrepared = (target) => {
319          if (target.length > 999) return prepare(target);
320          var targetPrepared = preparedCache.get(target);
321          if (targetPrepared !== void 0) return targetPrepared;
322          targetPrepared = prepare(target);
323          preparedCache.set(target, targetPrepared);
324          return targetPrepared;
325        };
326        var getPreparedSearch = (search) => {
327          if (search.length > 999) return prepareSearch(search);
328          var searchPrepared = preparedSearchCache.get(search);
329          if (searchPrepared !== void 0) return searchPrepared;
330          searchPrepared = prepareSearch(search);
331          preparedSearchCache.set(search, searchPrepared);
332          return searchPrepared;
333        };
334        var all = (targets, options) => {
335          var results = [];
336          results.total = targets.length;
337          var limit = options?.limit || INFINITY;
338          if (options?.key) {
339            for (var i = 0; i < targets.length; i++) {
340              var obj = targets[i];
341              var target = getValue(obj, options.key);
342              if (target == NULL) continue;
343              if (!isPrepared(target)) target = getPrepared(target);
344              var result = new_result(target.target, { _score: target._score, obj });
345              results.push(result);
346              if (results.length >= limit) return results;
347            }
348          } else if (options?.keys) {
349            for (var i = 0; i < targets.length; i++) {
350              var obj = targets[i];
351              var objResults = new KeysResult(options.keys.length);
352              for (var keyI = options.keys.length - 1; keyI >= 0; --keyI) {
353                var target = getValue(obj, options.keys[keyI]);
354                if (!target) {
355                  objResults[keyI] = noTarget;
356                  continue;
357                }
358                if (!isPrepared(target)) target = getPrepared(target);
359                target._score = NEGATIVE_INFINITY;
360                target._indexes.len = 0;
361                objResults[keyI] = target;
362              }
363              objResults.obj = obj;
364              objResults._score = NEGATIVE_INFINITY;
365              results.push(objResults);
366              if (results.length >= limit) return results;
367            }
368          } else {
369            for (var i = 0; i < targets.length; i++) {
370              var target = targets[i];
371              if (target == NULL) continue;
372              if (!isPrepared(target)) target = getPrepared(target);
373              target._score = NEGATIVE_INFINITY;
374              target._indexes.len = 0;
375              results.push(target);
376              if (results.length >= limit) return results;
377            }
378          }
379          return results;
380        };
381        var algorithm = (preparedSearch, prepared, allowSpaces = false, allowPartialMatch = false) => {
382          if (allowSpaces === false && preparedSearch.containsSpace) return algorithmSpaces(preparedSearch, prepared, allowPartialMatch);
383          var searchLower = preparedSearch._lower;
384          var searchLowerCodes = preparedSearch.lowerCodes;
385          var searchLowerCode = searchLowerCodes[0];
386          var targetLowerCodes = prepared._targetLowerCodes;
387          var searchLen = searchLowerCodes.length;
388          var targetLen = targetLowerCodes.length;
389          var searchI = 0;
390          var targetI = 0;
391          var matchesSimpleLen = 0;
392          for (; ; ) {
393            var isMatch = searchLowerCode === targetLowerCodes[targetI];
394            if (isMatch) {
395              matchesSimple[matchesSimpleLen++] = targetI;
396              ++searchI;
397              if (searchI === searchLen) break;
398              searchLowerCode = searchLowerCodes[searchI];
399            }
400            ++targetI;
401            if (targetI >= targetLen) return NULL;
402          }
403          var searchI = 0;
404          var successStrict = false;
405          var matchesStrictLen = 0;
406          var nextBeginningIndexes = prepared._nextBeginningIndexes;
407          if (nextBeginningIndexes === NULL) nextBeginningIndexes = prepared._nextBeginningIndexes = prepareNextBeginningIndexes(prepared.target);
408          targetI = matchesSimple[0] === 0 ? 0 : nextBeginningIndexes[matchesSimple[0] - 1];
409          var backtrackCount = 0;
410          if (targetI !== targetLen) for (; ; ) {
411            if (targetI >= targetLen) {
412              if (searchI <= 0) break;
413              ++backtrackCount;
414              if (backtrackCount > 200) break;
415              --searchI;
416              var lastMatch = matchesStrict[--matchesStrictLen];
417              targetI = nextBeginningIndexes[lastMatch];
418            } else {
419              var isMatch = searchLowerCodes[searchI] === targetLowerCodes[targetI];
420              if (isMatch) {
421                matchesStrict[matchesStrictLen++] = targetI;
422                ++searchI;
423                if (searchI === searchLen) {
424                  successStrict = true;
425                  break;
426                }
427                ++targetI;
428              } else {
429                targetI = nextBeginningIndexes[targetI];
430              }
431            }
432          }
433          var substringIndex = searchLen <= 1 ? -1 : prepared._targetLower.indexOf(searchLower, matchesSimple[0]);
434          var isSubstring = !!~substringIndex;
435          var isSubstringBeginning = !isSubstring ? false : substringIndex === 0 || prepared._nextBeginningIndexes[substringIndex - 1] === substringIndex;
436          if (isSubstring && !isSubstringBeginning) {
437            for (var i = 0; i < nextBeginningIndexes.length; i = nextBeginningIndexes[i]) {
438              if (i <= substringIndex) continue;
439              for (var s = 0; s < searchLen; s++) if (searchLowerCodes[s] !== prepared._targetLowerCodes[i + s]) break;
440              if (s === searchLen) {
441                substringIndex = i;
442                isSubstringBeginning = true;
443                break;
444              }
445            }
446          }
447          var calculateScore = (matches2) => {
448            var score2 = 0;
449            var extraMatchGroupCount = 0;
450            for (var i2 = 1; i2 < searchLen; ++i2) {
451              if (matches2[i2] - matches2[i2 - 1] !== 1) {
452                score2 -= matches2[i2];
453                ++extraMatchGroupCount;
454              }
455            }
456            var unmatchedDistance = matches2[searchLen - 1] - matches2[0] - (searchLen - 1);
457            score2 -= (12 + unmatchedDistance) * extraMatchGroupCount;
458            if (matches2[0] !== 0) score2 -= matches2[0] * matches2[0] * 0.2;
459            if (!successStrict) {
460              score2 *= 1e3;
461            } else {
462              var uniqueBeginningIndexes = 1;
463              for (var i2 = nextBeginningIndexes[0]; i2 < targetLen; i2 = nextBeginningIndexes[i2]) ++uniqueBeginningIndexes;
464              if (uniqueBeginningIndexes > 24) score2 *= (uniqueBeginningIndexes - 24) * 10;
465            }
466            score2 -= (targetLen - searchLen) / 2;
467            if (isSubstring) score2 /= 1 + searchLen * searchLen * 1;
468            if (isSubstringBeginning) score2 /= 1 + searchLen * searchLen * 1;
469            score2 -= (targetLen - searchLen) / 2;
470            return score2;
471          };
472          if (!successStrict) {
473            if (isSubstring) for (var i = 0; i < searchLen; ++i) matchesSimple[i] = substringIndex + i;
474            var matchesBest = matchesSimple;
475            var score = calculateScore(matchesBest);
476          } else {
477            if (isSubstringBeginning) {
478              for (var i = 0; i < searchLen; ++i) matchesSimple[i] = substringIndex + i;
479              var matchesBest = matchesSimple;
480              var score = calculateScore(matchesSimple);
481            } else {
482              var matchesBest = matchesStrict;
483              var score = calculateScore(matchesStrict);
484            }
485          }
486          prepared._score = score;
487          for (var i = 0; i < searchLen; ++i) prepared._indexes[i] = matchesBest[i];
488          prepared._indexes.len = searchLen;
489          const result = new Result();
490          result.target = prepared.target;
491          result._score = prepared._score;
492          result._indexes = prepared._indexes;
493          return result;
494        };
495        var algorithmSpaces = (preparedSearch, target, allowPartialMatch) => {
496          var seen_indexes = /* @__PURE__ */ new Set();
497          var score = 0;
498          var result = NULL;
499          var first_seen_index_last_search = 0;
500          var searches = preparedSearch.spaceSearches;
501          var searchesLen = searches.length;
502          var changeslen = 0;
503          var resetNextBeginningIndexes = () => {
504            for (let i2 = changeslen - 1; i2 >= 0; i2--) target._nextBeginningIndexes[nextBeginningIndexesChanges[i2 * 2 + 0]] = nextBeginningIndexesChanges[i2 * 2 + 1];
505          };
506          var hasAtLeast1Match = false;
507          for (var i = 0; i < searchesLen; ++i) {
508            allowPartialMatchScores[i] = NEGATIVE_INFINITY;
509            var search = searches[i];
510            result = algorithm(search, target);
511            if (allowPartialMatch) {
512              if (result === NULL) continue;
513              hasAtLeast1Match = true;
514            } else {
515              if (result === NULL) {
516                resetNextBeginningIndexes();
517                return NULL;
518              }
519            }
520            var isTheLastSearch = i === searchesLen - 1;
521            if (!isTheLastSearch) {
522              var indexes = result._indexes;
523              var indexesIsConsecutiveSubstring = true;
524              for (let i2 = 0; i2 < indexes.len - 1; i2++) {
525                if (indexes[i2 + 1] - indexes[i2] !== 1) {
526                  indexesIsConsecutiveSubstring = false;
527                  break;
528                }
529              }
530              if (indexesIsConsecutiveSubstring) {
531                var newBeginningIndex = indexes[indexes.len - 1] + 1;
532                var toReplace = target._nextBeginningIndexes[newBeginningIndex - 1];
533                for (let i2 = newBeginningIndex - 1; i2 >= 0; i2--) {
534                  if (toReplace !== target._nextBeginningIndexes[i2]) break;
535                  target._nextBeginningIndexes[i2] = newBeginningIndex;
536                  nextBeginningIndexesChanges[changeslen * 2 + 0] = i2;
537                  nextBeginningIndexesChanges[changeslen * 2 + 1] = toReplace;
538                  changeslen++;
539                }
540              }
541            }
542            score += result._score / searchesLen;
543            allowPartialMatchScores[i] = result._score / searchesLen;
544            if (result._indexes[0] < first_seen_index_last_search) {
545              score -= (first_seen_index_last_search - result._indexes[0]) * 2;
546            }
547            first_seen_index_last_search = result._indexes[0];
548            for (var j = 0; j < result._indexes.len; ++j) seen_indexes.add(result._indexes[j]);
549          }
550          if (allowPartialMatch && !hasAtLeast1Match) return NULL;
551          resetNextBeginningIndexes();
552          var allowSpacesResult = algorithm(
553            preparedSearch,
554            target,
555            /*allowSpaces=*/
556            true
557          );
558          if (allowSpacesResult !== NULL && allowSpacesResult._score > score) {
559            if (allowPartialMatch) {
560              for (var i = 0; i < searchesLen; ++i) {
561                allowPartialMatchScores[i] = allowSpacesResult._score / searchesLen;
562              }
563            }
564            return allowSpacesResult;
565          }
566          if (allowPartialMatch) result = target;
567          result._score = score;
568          var i = 0;
569          for (let index2 of seen_indexes) result._indexes[i++] = index2;
570          result._indexes.len = i;
571          return result;
572        };
573        var remove_accents = (str) => str.replace(/\p{Script=Latin}+/gu, (match) => match.normalize("NFD")).replace(/[\u0300-\u036f]/g, "");
574        var prepareLowerInfo = (str) => {
575          str = remove_accents(str);
576          var strLen = str.length;
577          var lower = str.toLowerCase();
578          var lowerCodes = [];
579          var bitflags = 0;
580          var containsSpace = false;
581          for (var i = 0; i < strLen; ++i) {
582            var lowerCode = lowerCodes[i] = lower.charCodeAt(i);
583            if (lowerCode === 32) {
584              containsSpace = true;
585              continue;
586            }
587            var bit = lowerCode >= 97 && lowerCode <= 122 ? lowerCode - 97 : lowerCode >= 48 && lowerCode <= 57 ? 26 : lowerCode <= 127 ? 30 : 31;
588            bitflags |= 1 << bit;
589          }
590          return { lowerCodes, bitflags, containsSpace, _lower: lower };
591        };
592        var prepareBeginningIndexes = (target) => {
593          var targetLen = target.length;
594          var beginningIndexes = [];
595          var beginningIndexesLen = 0;
596          var wasUpper = false;
597          var wasAlphanum = false;
598          for (var i = 0; i < targetLen; ++i) {
599            var targetCode = target.charCodeAt(i);
600            var isUpper = targetCode >= 65 && targetCode <= 90;
601            var isAlphanum = isUpper || targetCode >= 97 && targetCode <= 122 || targetCode >= 48 && targetCode <= 57;
602            var isBeginning = isUpper && !wasUpper || !wasAlphanum || !isAlphanum;
603            wasUpper = isUpper;
604            wasAlphanum = isAlphanum;
605            if (isBeginning) beginningIndexes[beginningIndexesLen++] = i;
606          }
607          return beginningIndexes;
608        };
609        var prepareNextBeginningIndexes = (target) => {
610          target = remove_accents(target);
611          var targetLen = target.length;
612          var beginningIndexes = prepareBeginningIndexes(target);
613          var nextBeginningIndexes = [];
614          var lastIsBeginning = beginningIndexes[0];
615          var lastIsBeginningI = 0;
616          for (var i = 0; i < targetLen; ++i) {
617            if (lastIsBeginning > i) {
618              nextBeginningIndexes[i] = lastIsBeginning;
619            } else {
620              lastIsBeginning = beginningIndexes[++lastIsBeginningI];
621              nextBeginningIndexes[i] = lastIsBeginning === void 0 ? targetLen : lastIsBeginning;
622            }
623          }
624          return nextBeginningIndexes;
625        };
626        var preparedCache = /* @__PURE__ */ new Map();
627        var preparedSearchCache = /* @__PURE__ */ new Map();
628        var matchesSimple = [];
629        var matchesStrict = [];
630        var nextBeginningIndexesChanges = [];
631        var keysSpacesBestScores = [];
632        var allowPartialMatchScores = [];
633        var tmpTargets = [];
634        var tmpResults = [];
635        var getValue = (obj, prop) => {
636          var tmp = obj[prop];
637          if (tmp !== void 0) return tmp;
638          if (typeof prop === "function") return prop(obj);
639          var segs = prop;
640          if (!Array.isArray(prop)) segs = prop.split(".");
641          var len = segs.length;
642          var i = -1;
643          while (obj && ++i < len) obj = obj[segs[i]];
644          return obj;
645        };
646        var isPrepared = (x) => {
647          return typeof x === "object" && typeof x._bitflags === "number";
648        };
649        var INFINITY = Infinity;
650        var NEGATIVE_INFINITY = -INFINITY;
651        var noResults = [];
652        noResults.total = 0;
653        var NULL = null;
654        var noTarget = prepare("");
655        var fastpriorityqueue = (r) => {
656          var e = [], o = 0, a = {}, v = (r2) => {
657            for (var a2 = 0, v2 = e[a2], c = 1; c < o; ) {
658              var s = c + 1;
659              a2 = c, s < o && e[s]._score < e[c]._score && (a2 = s), e[a2 - 1 >> 1] = e[a2], c = 1 + (a2 << 1);
660            }
661            for (var f = a2 - 1 >> 1; a2 > 0 && v2._score < e[f]._score; f = (a2 = f) - 1 >> 1) e[a2] = e[f];
662            e[a2] = v2;
663          };
664          return a.add = ((r2) => {
665            var a2 = o;
666            e[o++] = r2;
667            for (var v2 = a2 - 1 >> 1; a2 > 0 && r2._score < e[v2]._score; v2 = (a2 = v2) - 1 >> 1) e[a2] = e[v2];
668            e[a2] = r2;
669          }), a.poll = ((r2) => {
670            if (0 !== o) {
671              var a2 = e[0];
672              return e[0] = e[--o], v(), a2;
673            }
674          }), a.peek = ((r2) => {
675            if (0 !== o) return e[0];
676          }), a.replaceTop = ((r2) => {
677            e[0] = r2, v();
678          }), a;
679        };
680        var q = fastpriorityqueue();
681        return { "single": single, "go": go, "prepare": prepare, "cleanup": cleanup2 };
682      });
683    }
684  });
685
686  
vendor: 110,605 bytes, lines 686-4085
686// node_modules/alpinejs/dist/module.esm.js
687  var flushPending = false;
688  var flushing = false;
689  var queue = [];
690  var lastFlushedIndex = -1;
691  var transactionActive = false;
692  function scheduler(callback) {
693    queueJob(callback);
694  }
695  function startTransaction() {
696    transactionActive = true;
697  }
698  function commitTransaction() {
699    transactionActive = false;
700    queueFlush();
701  }
702  function queueJob(job) {
703    if (!queue.includes(job))
704      queue.push(job);
705    queueFlush();
706  }
707  function dequeueJob(job) {
708    let index2 = queue.indexOf(job);
709    if (index2 !== -1 && index2 > lastFlushedIndex)
710      queue.splice(index2, 1);
711  }
712  function queueFlush() {
713    if (!flushing && !flushPending) {
714      if (transactionActive)
715        return;
716      flushPending = true;
717      queueMicrotask(flushJobs);
718    }
719  }
720  function flushJobs() {
721    flushPending = false;
722    flushing = true;
723    for (let i = 0; i < queue.length; i++) {
724      queue[i]();
725      lastFlushedIndex = i;
726    }
727    queue.length = 0;
728    lastFlushedIndex = -1;
729    flushing = false;
730  }
731  var reactive;
732  var effect;
733  var release;
734  var raw;
735  var shouldSchedule = true;
736  function disableEffectScheduling(callback) {
737    shouldSchedule = false;
738    callback();
739    shouldSchedule = true;
740  }
741  function setReactivityEngine(engine) {
742    reactive = engine.reactive;
743    release = engine.release;
744    effect = (callback) => engine.effect(callback, { scheduler: (task) => {
745      if (shouldSchedule) {
746        scheduler(task);
747      } else {
748        task();
749      }
750    } });
751    raw = engine.raw;
752  }
753  function overrideEffect(override) {
754    effect = override;
755  }
756  function elementBoundEffect(el) {
757    let cleanup2 = () => {
758    };
759    let wrappedEffect = (callback) => {
760      let effectReference = effect(callback);
761      if (!el._x_effects) {
762        el._x_effects = /* @__PURE__ */ new Set();
763        el._x_runEffects = () => {
764          el._x_effects.forEach((i) => i());
765        };
766      }
767      el._x_effects.add(effectReference);
768      cleanup2 = () => {
769        if (effectReference === void 0)
770          return;
771        el._x_effects.delete(effectReference);
772        release(effectReference);
773      };
774      return effectReference;
775    };
776    return [wrappedEffect, () => {
777      cleanup2();
778    }];
779  }
780  function watch(getter, callback) {
781    let firstTime = true;
782    let oldValue;
783    let oldValueJSON;
784    let effectReference = effect(() => {
785      let value = getter();
786      let newJSON = JSON.stringify(value);
787      if (!firstTime) {
788        if (typeof value === "object" || value !== oldValue) {
789          let previousValue = typeof oldValue === "object" ? JSON.parse(oldValueJSON) : oldValue;
790          queueMicrotask(() => {
791            callback(value, previousValue);
792          });
793        }
794      }
795      oldValue = value;
796      oldValueJSON = newJSON;
797      firstTime = false;
798    });
799    return () => release(effectReference);
800  }
801  async function transaction(callback) {
802    startTransaction();
803    try {
804      await callback();
805      await Promise.resolve();
806    } finally {
807      commitTransaction();
808    }
809  }
810  var onAttributeAddeds = [];
811  var onElRemoveds = [];
812  var onElAddeds = [];
813  function onElAdded(callback) {
814    onElAddeds.push(callback);
815  }
816  function onElRemoved(el, callback) {
817    if (typeof callback === "function") {
818      if (!el._x_cleanups)
819        el._x_cleanups = [];
820      el._x_cleanups.push(callback);
821    } else {
822      callback = el;
823      onElRemoveds.push(callback);
824    }
825  }
826  function onAttributesAdded(callback) {
827    onAttributeAddeds.push(callback);
828  }
829  function onAttributeRemoved(el, name, callback) {
830    if (!el._x_attributeCleanups)
831      el._x_attributeCleanups = {};
832    if (!el._x_attributeCleanups[name])
833      el._x_attributeCleanups[name] = [];
834    el._x_attributeCleanups[name].push(callback);
835  }
836  function cleanupAttributes(el, names) {
837    if (!el._x_attributeCleanups)
838      return;
839    Object.entries(el._x_attributeCleanups).forEach(([name, value]) => {
840      if (names === void 0 || names.includes(name)) {
841        value.forEach((i) => i());
842        delete el._x_attributeCleanups[name];
843      }
844    });
845  }
846  function cleanupElement(el) {
847    el._x_effects?.forEach(dequeueJob);
848    while (el._x_cleanups?.length)
849      el._x_cleanups.pop()();
850  }
851  var observer = new MutationObserver(onMutate);
852  var currentlyObserving = false;
853  function startObservingMutations() {
854    observer.observe(document, { subtree: true, childList: true, attributes: true, attributeOldValue: true });
855    currentlyObserving = true;
856  }
857  function stopObservingMutations() {
858    flushObserver();
859    observer.disconnect();
860    currentlyObserving = false;
861  }
862  var queuedMutations = [];
863  function flushObserver() {
864    let records = observer.takeRecords();
865    queuedMutations.push(() => records.length > 0 && onMutate(records));
866    let queueLengthWhenTriggered = queuedMutations.length;
867    queueMicrotask(() => {
868      if (queuedMutations.length === queueLengthWhenTriggered) {
869        while (queuedMutations.length > 0)
870          queuedMutations.shift()();
871      }
872    });
873  }
874  function mutateDom(callback) {
875    if (!currentlyObserving)
876      return callback();
877    stopObservingMutations();
878    let result = callback();
879    startObservingMutations();
880    return result;
881  }
882  var isCollecting = false;
883  var deferredMutations = [];
884  function deferMutations() {
885    isCollecting = true;
886  }
887  function flushAndStopDeferringMutations() {
888    isCollecting = false;
889    onMutate(deferredMutations);
890    deferredMutations = [];
891  }
892  function onMutate(mutations) {
893    if (isCollecting) {
894      deferredMutations = deferredMutations.concat(mutations);
895      return;
896    }
897    let addedNodes = [];
898    let removedNodes = /* @__PURE__ */ new Set();
899    let addedAttributes = /* @__PURE__ */ new Map();
900    let removedAttributes = /* @__PURE__ */ new Map();
901    for (let i = 0; i < mutations.length; i++) {
902      if (mutations[i].target._x_ignoreMutationObserver)
903        continue;
904      if (mutations[i].type === "childList") {
905        mutations[i].removedNodes.forEach((node) => {
906          if (node.nodeType !== 1)
907            return;
908          if (!node._x_marker)
909            return;
910          removedNodes.add(node);
911        });
912        mutations[i].addedNodes.forEach((node) => {
913          if (node.nodeType !== 1)
914            return;
915          if (removedNodes.has(node)) {
916            removedNodes.delete(node);
917            return;
918          }
919          if (node._x_marker)
920            return;
921          addedNodes.push(node);
922        });
923      }
924      if (mutations[i].type === "attributes") {
925        let el = mutations[i].target;
926        let name = mutations[i].attributeName;
927        let oldValue = mutations[i].oldValue;
928        let add2 = () => {
929          if (!addedAttributes.has(el))
930            addedAttributes.set(el, []);
931          addedAttributes.get(el).push({ name, value: el.getAttribute(name) });
932        };
933        let remove = () => {
934          if (!removedAttributes.has(el))
935            removedAttributes.set(el, []);
936          removedAttributes.get(el).push(name);
937        };
938        if (el.hasAttribute(name) && oldValue === null) {
939          add2();
940        } else if (el.hasAttribute(name)) {
941          remove();
942          add2();
943        } else {
944          remove();
945        }
946      }
947    }
948    removedAttributes.forEach((attrs, el) => {
949      cleanupAttributes(el, attrs);
950    });
951    addedAttributes.forEach((attrs, el) => {
952      onAttributeAddeds.forEach((i) => i(el, attrs));
953    });
954    for (let node of removedNodes) {
955      if (addedNodes.some((i) => i.contains(node)))
956        continue;
957      onElRemoveds.forEach((i) => i(node));
958    }
959    for (let node of addedNodes) {
960      if (!node.isConnected)
961        continue;
962      onElAddeds.forEach((i) => i(node));
963    }
964    addedNodes = null;
965    removedNodes = null;
966    addedAttributes = null;
967    removedAttributes = null;
968  }
969  function scope(node) {
970    return mergeProxies(closestDataStack(node));
971  }
972  function addScopeToNode(node, data2, referenceNode) {
973    node._x_dataStack = [data2, ...closestDataStack(referenceNode || node)];
974    return () => {
975      node._x_dataStack = node._x_dataStack.filter((i) => i !== data2);
976    };
977  }
978  function closestDataStack(node) {
979    if (node._x_dataStack)
980      return node._x_dataStack;
981    if (typeof ShadowRoot === "function" && node instanceof ShadowRoot) {
982      return closestDataStack(node.host);
983    }
984    if (!node.parentNode) {
985      return [];
986    }
987    return closestDataStack(node.parentNode);
988  }
989  function mergeProxies(objects) {
990    return new Proxy({ objects }, mergeProxyTrap);
991  }
992  function keyInPrototypeChain(obj, key) {
993    if (obj === null || obj === Object.prototype)
994      return null;
995    if (Object.prototype.hasOwnProperty.call(obj, key))
996      return obj;
997    return keyInPrototypeChain(Object.getPrototypeOf(obj), key);
998  }
999  var mergeProxyTrap = {
1000    ownKeys({ objects }) {
1001      return Array.from(
1002        new Set(objects.flatMap((i) => Object.keys(i)))
1003      );
1004    },
1005    has({ objects }, name) {
1006      if (name == Symbol.unscopables)
1007        return false;
1008      return objects.some(
1009        (obj) => Object.prototype.hasOwnProperty.call(obj, name) || Reflect.has(obj, name)
1010      );
1011    },
1012    get({ objects }, name, thisProxy) {
1013      if (name == "toJSON")
1014        return collapseProxies;
1015      return Reflect.get(
1016        objects.find(
1017          (obj) => Reflect.has(obj, name)
1018        ) || {},
1019        name,
1020        thisProxy
1021      );
1022    },
1023    set({ objects }, name, value, thisProxy) {
1024      let target;
1025      for (const obj of objects) {
1026        target = keyInPrototypeChain(obj, name);
1027        if (target)
1028          break;
1029      }
1030      if (!target)
1031        target = objects[objects.length - 1];
1032      const descriptor = Object.getOwnPropertyDescriptor(target, name);
1033      if (descriptor?.set && descriptor?.get)
1034        return descriptor.set.call(thisProxy, value) || true;
1035      return Reflect.set(target, name, value);
1036    }
1037  };
1038  function collapseProxies() {
1039    let keys = Reflect.ownKeys(this);
1040    return keys.reduce((acc, key) => {
1041      acc[key] = Reflect.get(this, key);
1042      return acc;
1043    }, {});
1044  }
1045  function initInterceptors(data2) {
1046    let isObject3 = (val) => typeof val === "object" && !Array.isArray(val) && val !== null;
1047    let recurse = (obj, basePath = "") => {
1048      Object.entries(Object.getOwnPropertyDescriptors(obj)).forEach(([key, { value, enumerable }]) => {
1049        if (enumerable === false || value === void 0)
1050          return;
1051        if (typeof value === "object" && value !== null && value.__v_skip)
1052          return;
1053        let path = basePath === "" ? key : `${basePath}.${key}`;
1054        if (typeof value === "object" && value !== null && value._x_interceptor) {
1055          obj[key] = value.initialize(data2, path, key);
1056        } else {
1057          if (isObject3(value) && value !== obj && !(value instanceof Element)) {
1058            recurse(value, path);
1059          }
1060        }
1061      });
1062    };
1063    return recurse(data2);
1064  }
1065  function interceptor(callback, mutateObj = () => {
1066  }) {
1067    let obj = {
1068      initialValue: void 0,
1069      _x_interceptor: true,
1070      initialize(data2, path, key) {
1071        return callback(this.initialValue, () => get(data2, path), (value) => set(data2, path, value), path, key);
1072      }
1073    };
1074    mutateObj(obj);
1075    return (initialValue) => {
1076      if (typeof initialValue === "object" && initialValue !== null && initialValue._x_interceptor) {
1077        let initialize = obj.initialize.bind(obj);
1078        obj.initialize = (data2, path, key) => {
1079          let innerValue = initialValue.initialize(data2, path, key);
1080          obj.initialValue = innerValue;
1081          return initialize(data2, path, key);
1082        };
1083      } else {
1084        obj.initialValue = initialValue;
1085      }
1086      return obj;
1087    };
1088  }
1089  function get(obj, path) {
1090    return path.split(".").reduce((carry, segment) => carry[segment], obj);
1091  }
1092  function set(obj, path, value) {
1093    if (typeof path === "string")
1094      path = path.split(".");
1095    if (path.length === 1)
1096      obj[path[0]] = value;
1097    else if (path.length === 0)
1098      throw error;
1099    else {
1100      if (obj[path[0]])
1101        return set(obj[path[0]], path.slice(1), value);
1102      else {
1103        obj[path[0]] = {};
1104        return set(obj[path[0]], path.slice(1), value);
1105      }
1106    }
1107  }
1108  var magics = {};
1109  function magic(name, callback) {
1110    magics[name] = callback;
1111  }
1112  function injectMagics(obj, el) {
1113    let memoizedUtilities = getUtilities(el);
1114    Object.entries(magics).forEach(([name, callback]) => {
1115      Object.defineProperty(obj, `$${name}`, {
1116        get() {
1117          return callback(el, memoizedUtilities);
1118        },
1119        enumerable: false
1120      });
1121    });
1122    return obj;
1123  }
1124  function getUtilities(el) {
1125    let [utilities, cleanup2] = getElementBoundUtilities(el);
1126    let utils = { interceptor, ...utilities };
1127    onElRemoved(el, cleanup2);
1128    return utils;
1129  }
1130  function tryCatch(el, expression, callback, ...args) {
1131    try {
1132      return callback(...args);
1133    } catch (e) {
1134      handleError(e, el, expression);
1135    }
1136  }
1137  function handleError(...args) {
1138    return errorHandler(...args);
1139  }
1140  var errorHandler = normalErrorHandler;
1141  function setErrorHandler(handler4) {
1142    errorHandler = handler4;
1143  }
1144  function normalErrorHandler(error2, el, expression = void 0) {
1145    error2 = Object.assign(
1146      error2 ?? { message: "No error message given." },
1147      { el, expression }
1148    );
1149    console.warn(`Alpine Expression Error: ${error2.message}
1150
1151${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
1152    setTimeout(() => {
1153      throw error2;
1154    }, 0);
1155  }
1156  var shouldAutoEvaluateFunctions = true;
1157  function dontAutoEvaluateFunctions(callback) {
1158    let cache = shouldAutoEvaluateFunctions;
1159    shouldAutoEvaluateFunctions = false;
1160    let result = callback();
1161    shouldAutoEvaluateFunctions = cache;
1162    return result;
1163  }
1164  function evaluate(el, expression, extras = {}) {
1165    let result;
1166    evaluateLater(el, expression)((value) => result = value, extras);
1167    return result;
1168  }
1169  function evaluateLater(...args) {
1170    return theEvaluatorFunction(...args);
1171  }
1172  var theEvaluatorFunction = () => {
1173  };
1174  function setEvaluator(newEvaluator) {
1175    theEvaluatorFunction = newEvaluator;
1176  }
1177  var theRawEvaluatorFunction;
1178  function setRawEvaluator(newEvaluator) {
1179    theRawEvaluatorFunction = newEvaluator;
1180  }
1181  function normalEvaluator(el, expression) {
1182    let overriddenMagics = {};
1183    injectMagics(overriddenMagics, el);
1184    let dataStack = [overriddenMagics, ...closestDataStack(el)];
1185    let evaluator = typeof expression === "function" ? generateEvaluatorFromFunction(dataStack, expression) : generateEvaluatorFromString(dataStack, expression, el);
1186    return tryCatch.bind(null, el, expression, evaluator);
1187  }
1188  function generateEvaluatorFromFunction(dataStack, func) {
1189    return (receiver = () => {
1190    }, { scope: scope2 = {}, params = [], context } = {}) => {
1191      if (!shouldAutoEvaluateFunctions) {
1192        runIfTypeOfFunction(receiver, func, mergeProxies([scope2, ...dataStack]), params);
1193        return;
1194      }
1195      let result = func.apply(mergeProxies([scope2, ...dataStack]), params);
1196      runIfTypeOfFunction(receiver, result);
1197    };
1198  }
1199  var evaluatorMemo = {};
1200  function generateFunctionFromString(expression, el) {
1201    if (evaluatorMemo[expression]) {
1202      return evaluatorMemo[expression];
1203    }
1204    let AsyncFunction = Object.getPrototypeOf(async function() {
1205    }).constructor;
1206    let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression.trim()) || /^(let|const)\s/.test(expression.trim()) ? `(async()=>{ ${expression} })()` : expression;
1207    const safeAsyncFunction = () => {
1208      try {
1209        let func2 = new AsyncFunction(
1210          ["__self", "scope"],
1211          `with (scope) { __self.result = ${rightSideSafeExpression} }; __self.finished = true; return __self.result;`
1212        );
1213        Object.defineProperty(func2, "name", {
1214          value: `[Alpine] ${expression}`
1215        });
1216        return func2;
1217      } catch (error2) {
1218        handleError(error2, el, expression);
1219        return Promise.resolve();
1220      }
1221    };
1222    let func = safeAsyncFunction();
1223    evaluatorMemo[expression] = func;
1224    return func;
1225  }
1226  function generateEvaluatorFromString(dataStack, expression, el) {
1227    let func = generateFunctionFromString(expression, el);
1228    return (receiver = () => {
1229    }, { scope: scope2 = {}, params = [], context } = {}) => {
1230      func.result = void 0;
1231      func.finished = false;
1232      let completeScope = mergeProxies([scope2, ...dataStack]);
1233      if (typeof func === "function") {
1234        let promise = func.call(context, func, completeScope).catch((error2) => handleError(error2, el, expression));
1235        if (func.finished) {
1236          runIfTypeOfFunction(receiver, func.result, completeScope, params, el);
1237          func.result = void 0;
1238        } else {
1239          promise.then((result) => {
1240            runIfTypeOfFunction(receiver, result, completeScope, params, el);
1241          }).catch((error2) => handleError(error2, el, expression)).finally(() => func.result = void 0);
1242        }
1243      }
1244    };
1245  }
1246  function runIfTypeOfFunction(receiver, value, scope2, params, el) {
1247    if (shouldAutoEvaluateFunctions && typeof value === "function") {
1248      let result = value.apply(scope2, params);
1249      if (result instanceof Promise) {
1250        result.then((i) => runIfTypeOfFunction(receiver, i, scope2, params)).catch((error2) => handleError(error2, el, value));
1251      } else {
1252        receiver(result);
1253      }
1254    } else if (typeof value === "object" && value instanceof Promise) {
1255      value.then((i) => receiver(i));
1256    } else {
1257      receiver(value);
1258    }
1259  }
1260  function evaluateRaw(...args) {
1261    return theRawEvaluatorFunction(...args);
1262  }
1263  function normalRawEvaluator(el, expression, extras = {}) {
1264    let overriddenMagics = {};
1265    injectMagics(overriddenMagics, el);
1266    let dataStack = [overriddenMagics, ...closestDataStack(el)];
1267    let scope2 = mergeProxies([extras.scope ?? {}, ...dataStack]);
1268    let params = extras.params ?? [];
1269    if (expression.includes("await")) {
1270      let AsyncFunction = Object.getPrototypeOf(async function() {
1271      }).constructor;
1272      let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression.trim()) || /^(let|const)\s/.test(expression.trim()) ? `(async()=>{ ${expression} })()` : expression;
1273      let func = new AsyncFunction(
1274        ["scope"],
1275        `with (scope) { let __result = ${rightSideSafeExpression}; return __result }`
1276      );
1277      let result = func.call(extras.context, scope2);
1278      return result;
1279    } else {
1280      let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression.trim()) || /^(let|const)\s/.test(expression.trim()) ? `(()=>{ ${expression} })()` : expression;
1281      let func = new Function(
1282        ["scope"],
1283        `with (scope) { let __result = ${rightSideSafeExpression}; return __result }`
1284      );
1285      let result = func.call(extras.context, scope2);
1286      if (typeof result === "function" && shouldAutoEvaluateFunctions) {
1287        return result.apply(scope2, params);
1288      }
1289      return result;
1290    }
1291  }
1292  var prefixAsString = "x-";
1293  function prefix(subject = "") {
1294    return prefixAsString + subject;
1295  }
1296  function setPrefix(newPrefix) {
1297    prefixAsString = newPrefix;
1298  }
1299  var directiveHandlers = {};
1300  function directive(name, callback) {
1301    directiveHandlers[name] = callback;
1302    return {
1303      before(directive2) {
1304        if (!directiveHandlers[directive2]) {
1305          console.warn(String.raw`Cannot find directive \`${directive2}\`. \`${name}\` will use the default order of execution`);
1306          return;
1307        }
1308        const pos = directiveOrder.indexOf(directive2);
1309        directiveOrder.splice(pos >= 0 ? pos : directiveOrder.indexOf("DEFAULT"), 0, name);
1310      }
1311    };
1312  }
1313  function directiveExists(name) {
1314    return Object.keys(directiveHandlers).includes(name);
1315  }
1316  function directives(el, attributes, originalAttributeOverride) {
1317    attributes = Array.from(attributes);
1318    if (el._x_virtualDirectives) {
1319      let vAttributes = Object.entries(el._x_virtualDirectives).map(([name, value]) => ({ name, value }));
1320      let staticAttributes = attributesOnly(vAttributes);
1321      vAttributes = vAttributes.map((attribute) => {
1322        if (staticAttributes.find((attr) => attr.name === attribute.name)) {
1323          return {
1324            name: `x-bind:${attribute.name}`,
1325            value: `"${attribute.value}"`
1326          };
1327        }
1328        return attribute;
1329      });
1330      attributes = attributes.concat(vAttributes);
1331    }
1332    let transformedAttributeMap = {};
1333    let directives2 = attributes.map(toTransformedAttributes((newName, oldName) => transformedAttributeMap[newName] = oldName)).filter(outNonAlpineAttributes).map(toParsedDirectives(transformedAttributeMap, originalAttributeOverride)).sort(byPriority);
1334    return directives2.map((directive2) => {
1335      return getDirectiveHandler(el, directive2);
1336    });
1337  }
1338  function attributesOnly(attributes) {
1339    return Array.from(attributes).map(toTransformedAttributes()).filter((attr) => !outNonAlpineAttributes(attr));
1340  }
1341  var isDeferringHandlers = false;
1342  var directiveHandlerStacks = /* @__PURE__ */ new Map();
1343  var currentHandlerStackKey = /* @__PURE__ */ Symbol();
1344  function deferHandlingDirectives(callback) {
1345    isDeferringHandlers = true;
1346    let key = /* @__PURE__ */ Symbol();
1347    currentHandlerStackKey = key;
1348    directiveHandlerStacks.set(key, []);
1349    let flushHandlers = () => {
1350      while (directiveHandlerStacks.get(key).length)
1351        directiveHandlerStacks.get(key).shift()();
1352      directiveHandlerStacks.delete(key);
1353    };
1354    let stopDeferring = () => {
1355      isDeferringHandlers = false;
1356      flushHandlers();
1357    };
1358    callback(flushHandlers);
1359    stopDeferring();
1360  }
1361  function getElementBoundUtilities(el) {
1362    let cleanups = [];
1363    let cleanup2 = (callback) => cleanups.push(callback);
1364    let [effect3, cleanupEffect] = elementBoundEffect(el);
1365    cleanups.push(cleanupEffect);
1366    let utilities = {
1367      Alpine: alpine_default,
1368      effect: effect3,
1369      cleanup: cleanup2,
1370      evaluateLater: evaluateLater.bind(evaluateLater, el),
1371      evaluate: evaluate.bind(evaluate, el)
1372    };
1373    let doCleanup = () => cleanups.forEach((i) => i());
1374    return [utilities, doCleanup];
1375  }
1376  function getDirectiveHandler(el, directive2) {
1377    let noop = () => {
1378    };
1379    let handler4 = directiveHandlers[directive2.type] || noop;
1380    let [utilities, cleanup2] = getElementBoundUtilities(el);
1381    onAttributeRemoved(el, directive2.original, cleanup2);
1382    let fullHandler = () => {
1383      if (el._x_ignore || el._x_ignoreSelf)
1384        return;
1385      handler4.inline && handler4.inline(el, directive2, utilities);
1386      handler4 = handler4.bind(handler4, el, directive2, utilities);
1387      isDeferringHandlers ? directiveHandlerStacks.get(currentHandlerStackKey).push(handler4) : handler4();
1388    };
1389    fullHandler.runCleanups = cleanup2;
1390    return fullHandler;
1391  }
1392  var startingWith = (subject, replacement) => ({ name, value }) => {
1393    if (name.startsWith(subject))
1394      name = name.replace(subject, replacement);
1395    return { name, value };
1396  };
1397  var into = (i) => i;
1398  function toTransformedAttributes(callback = () => {
1399  }) {
1400    return ({ name, value }) => {
1401      let { name: newName, value: newValue } = attributeTransformers.reduce((carry, transform) => {
1402        return transform(carry);
1403      }, { name, value });
1404      if (newName !== name)
1405        callback(newName, name);
1406      return { name: newName, value: newValue };
1407    };
1408  }
1409  var attributeTransformers = [];
1410  function mapAttributes(callback) {
1411    attributeTransformers.push(callback);
1412  }
1413  function outNonAlpineAttributes({ name }) {
1414    return alpineAttributeRegex().test(name);
1415  }
1416  var alpineAttributeRegex = () => new RegExp(`^${prefixAsString}([^:^.]+)\\b`);
1417  function toParsedDirectives(transformedAttributeMap, originalAttributeOverride) {
1418    return ({ name, value }) => {
1419      if (name === value)
1420        value = "";
1421      let typeMatch = name.match(alpineAttributeRegex());
1422      let valueMatch = name.match(/:([a-zA-Z0-9\-_:]+)/);
1423      let modifiers = name.match(/\.[^.\]]+(?=[^\]]*$)/g) || [];
1424      let original = originalAttributeOverride || transformedAttributeMap[name] || name;
1425      return {
1426        type: typeMatch ? typeMatch[1] : null,
1427        value: valueMatch ? valueMatch[1] : null,
1428        modifiers: modifiers.map((i) => i.replace(".", "")),
1429        expression: value,
1430        original
1431      };
1432    };
1433  }
1434  var DEFAULT = "DEFAULT";
1435  var directiveOrder = [
1436    "ignore",
1437    "ref",
1438    "id",
1439    "data",
1440    "anchor",
1441    "bind",
1442    "init",
1443    "for",
1444    "model",
1445    "modelable",
1446    "transition",
1447    "show",
1448    "if",
1449    DEFAULT,
1450    "teleport"
1451  ];
1452  function byPriority(a, b) {
1453    let typeA = directiveOrder.indexOf(a.type) === -1 ? DEFAULT : a.type;
1454    let typeB = directiveOrder.indexOf(b.type) === -1 ? DEFAULT : b.type;
1455    return directiveOrder.indexOf(typeA) - directiveOrder.indexOf(typeB);
1456  }
1457  function dispatch(el, name, detail = {}, options = {}) {
1458    return el.dispatchEvent(
1459      new CustomEvent(name, {
1460        detail,
1461        bubbles: true,
1462        // Allows events to pass the shadow DOM barrier.
1463        composed: true,
1464        cancelable: true,
1465        // Allows overriding the default event options.
1466        ...options
1467      })
1468    );
1469  }
1470  function walk(el, callback) {
1471    if (typeof ShadowRoot === "function" && el instanceof ShadowRoot) {
1472      Array.from(el.children).forEach((el2) => walk(el2, callback));
1473      return;
1474    }
1475    let skip = false;
1476    callback(el, () => skip = true);
1477    if (skip)
1478      return;
1479    let node = el.firstElementChild;
1480    while (node) {
1481      walk(node, callback, false);
1482      node = node.nextElementSibling;
1483    }
1484  }
1485  function warn(message, ...args) {
1486    console.warn(`Alpine Warning: ${message}`, ...args);
1487  }
1488  var started = false;
1489  function start() {
1490    if (started)
1491      warn("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems.");
1492    started = true;
1493    if (!document.body)
1494      warn("Unable to initialize. Trying to load Alpine before `<body>` is available. Did you forget to add `defer` in Alpine's `<script>` tag?");
1495    dispatch(document, "alpine:init");
1496    dispatch(document, "alpine:initializing");
1497    startObservingMutations();
1498    onElAdded((el) => initTree(el, walk));
1499    onElRemoved((el) => destroyTree(el));
1500    onAttributesAdded((el, attrs) => {
1501      directives(el, attrs).forEach((handle) => handle());
1502    });
1503    let outNestedComponents = (el) => !closestRoot(el.parentElement, true);
1504    Array.from(document.querySelectorAll(allSelectors().join(","))).filter(outNestedComponents).forEach((el) => {
1505      initTree(el);
1506    });
1507    dispatch(document, "alpine:initialized");
1508    setTimeout(() => {
1509      warnAboutMissingPlugins();
1510    });
1511  }
1512  var rootSelectorCallbacks = [];
1513  var initSelectorCallbacks = [];
1514  function rootSelectors() {
1515    return rootSelectorCallbacks.map((fn) => fn());
1516  }
1517  function allSelectors() {
1518    return rootSelectorCallbacks.concat(initSelectorCallbacks).map((fn) => fn());
1519  }
1520  function addRootSelector(selectorCallback) {
1521    rootSelectorCallbacks.push(selectorCallback);
1522  }
1523  function addInitSelector(selectorCallback) {
1524    initSelectorCallbacks.push(selectorCallback);
1525  }
1526  function closestRoot(el, includeInitSelectors = false) {
1527    return findClosest(el, (element) => {
1528      const selectors = includeInitSelectors ? allSelectors() : rootSelectors();
1529      if (selectors.some((selector) => element.matches(selector)))
1530        return true;
1531    });
1532  }
1533  function findClosest(el, callback) {
1534    if (!el)
1535      return;
1536    if (callback(el))
1537      return el;
1538    if (el._x_teleportBack)
1539      return findClosest(el._x_teleportBack, callback);
1540    if (el.parentNode instanceof ShadowRoot) {
1541      return findClosest(el.parentNode.host, callback);
1542    }
1543    if (!el.parentElement)
1544      return;
1545    return findClosest(el.parentElement, callback);
1546  }
1547  function isRoot(el) {
1548    return rootSelectors().some((selector) => el.matches(selector));
1549  }
1550  var initInterceptors2 = [];
1551  function interceptInit(callback) {
1552    initInterceptors2.push(callback);
1553  }
1554  var markerDispenser = 1;
1555  function initTree(el, walker = walk, intercept = () => {
1556  }) {
1557    if (findClosest(el, (i) => i._x_ignore))
1558      return;
1559    deferHandlingDirectives(() => {
1560      walker(el, (el2, skip) => {
1561        if (el2._x_marker)
1562          return;
1563        intercept(el2, skip);
1564        initInterceptors2.forEach((i) => i(el2, skip));
1565        directives(el2, el2.attributes).forEach((handle) => handle());
1566        if (!el2._x_ignore)
1567          el2._x_marker = markerDispenser++;
1568        el2._x_ignore && skip();
1569      });
1570    });
1571  }
1572  function destroyTree(root, walker = walk) {
1573    walker(root, (el) => {
1574      cleanupElement(el);
1575      cleanupAttributes(el);
1576      delete el._x_marker;
1577    });
1578  }
1579  function warnAboutMissingPlugins() {
1580    let pluginDirectives = [
1581      ["ui", "dialog", ["[x-dialog], [x-popover]"]],
1582      ["anchor", "anchor", ["[x-anchor]"]],
1583      ["sort", "sort", ["[x-sort]"]]
1584    ];
1585    pluginDirectives.forEach(([plugin2, directive2, selectors]) => {
1586      if (directiveExists(directive2))
1587        return;
1588      selectors.some((selector) => {
1589        if (document.querySelector(selector)) {
1590          warn(`found "${selector}", but missing ${plugin2} plugin`);
1591          return true;
1592        }
1593      });
1594    });
1595  }
1596  var tickStack = [];
1597  var isHolding = false;
1598  function nextTick(callback = () => {
1599  }) {
1600    queueMicrotask(() => {
1601      isHolding || setTimeout(() => {
1602        releaseNextTicks();
1603      });
1604    });
1605    return new Promise((res) => {
1606      tickStack.push(() => {
1607        callback();
1608        res();
1609      });
1610    });
1611  }
1612  function releaseNextTicks() {
1613    isHolding = false;
1614    while (tickStack.length)
1615      tickStack.shift()();
1616  }
1617  function holdNextTicks() {
1618    isHolding = true;
1619  }
1620  function setClasses(el, value) {
1621    if (Array.isArray(value)) {
1622      return setClassesFromString(el, value.join(" "));
1623    } else if (typeof value === "object" && value !== null) {
1624      return setClassesFromObject(el, value);
1625    } else if (typeof value === "function") {
1626      return setClasses(el, value());
1627    }
1628    return setClassesFromString(el, value);
1629  }
1630  function splitClasses(classString) {
1631    return classString.split(/\s/).filter(Boolean);
1632  }
1633  function setClassesFromString(el, classString) {
1634    let missingClasses = (classString2) => splitClasses(classString2).filter((i) => !el.classList.contains(i)).filter(Boolean);
1635    let addClassesAndReturnUndo = (classes) => {
1636      el.classList.add(...classes);
1637      return () => {
1638        el.classList.remove(...classes);
1639      };
1640    };
1641    classString = classString === true ? classString = "" : classString || "";
1642    return addClassesAndReturnUndo(missingClasses(classString));
1643  }
1644  function setClassesFromObject(el, classObject) {
1645    let forAdd = Object.entries(classObject).flatMap(([classString, bool]) => bool ? splitClasses(classString) : false).filter(Boolean);
1646    let forRemove = Object.entries(classObject).flatMap(([classString, bool]) => !bool ? splitClasses(classString) : false).filter(Boolean);
1647    let added = [];
1648    let removed = [];
1649    forRemove.forEach((i) => {
1650      if (el.classList.contains(i)) {
1651        el.classList.remove(i);
1652        removed.push(i);
1653      }
1654    });
1655    forAdd.forEach((i) => {
1656      if (!el.classList.contains(i)) {
1657        el.classList.add(i);
1658        added.push(i);
1659      }
1660    });
1661    return () => {
1662      removed.forEach((i) => el.classList.add(i));
1663      added.forEach((i) => el.classList.remove(i));
1664    };
1665  }
1666  function setStyles(el, value) {
1667    if (typeof value === "object" && value !== null) {
1668      return setStylesFromObject(el, value);
1669    }
1670    return setStylesFromString(el, value);
1671  }
1672  function setStylesFromObject(el, value) {
1673    let previousStyles = {};
1674    Object.entries(value).forEach(([key, value2]) => {
1675      previousStyles[key] = el.style[key];
1676      if (!key.startsWith("--")) {
1677        key = kebabCase(key);
1678      }
1679      el.style.setProperty(key, value2);
1680    });
1681    setTimeout(() => {
1682      if (el.style.length === 0) {
1683        el.removeAttribute("style");
1684      }
1685    });
1686    return () => {
1687      setStyles(el, previousStyles);
1688    };
1689  }
1690  function setStylesFromString(el, value) {
1691    let cache = el.getAttribute("style", value);
1692    el.setAttribute("style", value);
1693    return () => {
1694      el.setAttribute("style", cache || "");
1695    };
1696  }
1697  function kebabCase(subject) {
1698    return subject.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
1699  }
1700  function once(callback, fallback = () => {
1701  }) {
1702    let called = false;
1703    return function() {
1704      if (!called) {
1705        called = true;
1706        callback.apply(this, arguments);
1707      } else {
1708        fallback.apply(this, arguments);
1709      }
1710    };
1711  }
1712  directive("transition", (el, { value, modifiers, expression }, { evaluate: evaluate2 }) => {
1713    if (typeof expression === "function")
1714      expression = evaluate2(expression);
1715    if (expression === false)
1716      return;
1717    if (!expression || typeof expression === "boolean") {
1718      registerTransitionsFromHelper(el, modifiers, value);
1719    } else {
1720      registerTransitionsFromClassString(el, expression, value);
1721    }
1722  });
1723  function registerTransitionsFromClassString(el, classString, stage) {
1724    registerTransitionObject(el, setClasses, "");
1725    let directiveStorageMap = {
1726      "enter": (classes) => {
1727        el._x_transition.enter.during = classes;
1728      },
1729      "enter-start": (classes) => {
1730        el._x_transition.enter.start = classes;
1731      },
1732      "enter-end": (classes) => {
1733        el._x_transition.enter.end = classes;
1734      },
1735      "leave": (classes) => {
1736        el._x_transition.leave.during = classes;
1737      },
1738      "leave-start": (classes) => {
1739        el._x_transition.leave.start = classes;
1740      },
1741      "leave-end": (classes) => {
1742        el._x_transition.leave.end = classes;
1743      }
1744    };
1745    directiveStorageMap[stage](classString);
1746  }
1747  function registerTransitionsFromHelper(el, modifiers, stage) {
1748    registerTransitionObject(el, setStyles);
1749    let doesntSpecify = !modifiers.includes("in") && !modifiers.includes("out") && !stage;
1750    let transitioningIn = doesntSpecify || modifiers.includes("in") || ["enter"].includes(stage);
1751    let transitioningOut = doesntSpecify || modifiers.includes("out") || ["leave"].includes(stage);
1752    if (modifiers.includes("in") && !doesntSpecify) {
1753      modifiers = modifiers.filter((i, index2) => index2 < modifiers.indexOf("out"));
1754    }
1755    if (modifiers.includes("out") && !doesntSpecify) {
1756      modifiers = modifiers.filter((i, index2) => index2 > modifiers.indexOf("out"));
1757    }
1758    let wantsAll = !modifiers.includes("opacity") && !modifiers.includes("scale");
1759    let wantsOpacity = wantsAll || modifiers.includes("opacity");
1760    let wantsScale = wantsAll || modifiers.includes("scale");
1761    let opacityValue = wantsOpacity ? 0 : 1;
1762    let scaleValue = wantsScale ? modifierValue(modifiers, "scale", 95) / 100 : 1;
1763    let delay = modifierValue(modifiers, "delay", 0) / 1e3;
1764    let origin = modifierValue(modifiers, "origin", "center");
1765    let property = "opacity, transform";
1766    let durationIn = modifierValue(modifiers, "duration", 150) / 1e3;
1767    let durationOut = modifierValue(modifiers, "duration", 75) / 1e3;
1768    let easing = `cubic-bezier(0.4, 0.0, 0.2, 1)`;
1769    if (transitioningIn) {
1770      el._x_transition.enter.during = {
1771        transformOrigin: origin,
1772        transitionDelay: `${delay}s`,
1773        transitionProperty: property,
1774        transitionDuration: `${durationIn}s`,
1775        transitionTimingFunction: easing
1776      };
1777      el._x_transition.enter.start = {
1778        opacity: opacityValue,
1779        transform: `scale(${scaleValue})`
1780      };
1781      el._x_transition.enter.end = {
1782        opacity: 1,
1783        transform: `scale(1)`
1784      };
1785    }
1786    if (transitioningOut) {
1787      el._x_transition.leave.during = {
1788        transformOrigin: origin,
1789        transitionDelay: `${delay}s`,
1790        transitionProperty: property,
1791        transitionDuration: `${durationOut}s`,
1792        transitionTimingFunction: easing
1793      };
1794      el._x_transition.leave.start = {
1795        opacity: 1,
1796        transform: `scale(1)`
1797      };
1798      el._x_transition.leave.end = {
1799        opacity: opacityValue,
1800        transform: `scale(${scaleValue})`
1801      };
1802    }
1803  }
1804  function registerTransitionObject(el, setFunction, defaultValue = {}) {
1805    if (!el._x_transition)
1806      el._x_transition = {
1807        enter: { during: defaultValue, start: defaultValue, end: defaultValue },
1808        leave: { during: defaultValue, start: defaultValue, end: defaultValue },
1809        in(before = () => {
1810        }, after = () => {
1811        }) {
1812          transition(el, setFunction, {
1813            during: this.enter.during,
1814            start: this.enter.start,
1815            end: this.enter.end
1816          }, before, after);
1817        },
1818        out(before = () => {
1819        }, after = () => {
1820        }) {
1821          transition(el, setFunction, {
1822            during: this.leave.during,
1823            start: this.leave.start,
1824            end: this.leave.end
1825          }, before, after);
1826        }
1827      };
1828  }
1829  window.Element.prototype._x_toggleAndCascadeWithTransitions = function(el, value, show, hide) {
1830    const nextTick2 = document.visibilityState === "visible" ? requestAnimationFrame : setTimeout;
1831    let clickAwayCompatibleShow = () => nextTick2(show);
1832    if (value) {
1833      if (el._x_transition && (el._x_transition.enter || el._x_transition.leave)) {
1834        el._x_transition.enter && (Object.entries(el._x_transition.enter.during).length || Object.entries(el._x_transition.enter.start).length || Object.entries(el._x_transition.enter.end).length) ? el._x_transition.in(show) : clickAwayCompatibleShow();
1835      } else {
1836        el._x_transition ? el._x_transition.in(show) : clickAwayCompatibleShow();
1837      }
1838      return;
1839    }
1840    el._x_hidePromise = el._x_transition ? new Promise((resolve, reject) => {
1841      el._x_transition.out(() => {
1842      }, () => resolve(hide));
1843      el._x_transitioning && el._x_transitioning.beforeCancel(() => reject({ isFromCancelledTransition: true }));
1844    }) : Promise.resolve(hide);
1845    queueMicrotask(() => {
1846      let closest2 = closestHide(el);
1847      if (closest2) {
1848        if (!closest2._x_hideChildren)
1849          closest2._x_hideChildren = [];
1850        closest2._x_hideChildren.push(el);
1851      } else {
1852        nextTick2(() => {
1853          let hideAfterChildren = (el2) => {
1854            let carry = Promise.all([
1855              el2._x_hidePromise,
1856              ...(el2._x_hideChildren || []).map(hideAfterChildren)
1857            ]).then(([i]) => i?.());
1858            delete el2._x_hidePromise;
1859            delete el2._x_hideChildren;
1860            return carry;
1861          };
1862          hideAfterChildren(el).catch((e) => {
1863            if (!e.isFromCancelledTransition)
1864              throw e;
1865          });
1866        });
1867      }
1868    });
1869  };
1870  function closestHide(el) {
1871    let parent = el.parentNode;
1872    if (!parent)
1873      return;
1874    return parent._x_hidePromise ? parent : closestHide(parent);
1875  }
1876  function transition(el, setFunction, { during, start: start2, end } = {}, before = () => {
1877  }, after = () => {
1878  }) {
1879    if (el._x_transitioning)
1880      el._x_transitioning.cancel();
1881    if (Object.keys(during).length === 0 && Object.keys(start2).length === 0 && Object.keys(end).length === 0) {
1882      before();
1883      after();
1884      return;
1885    }
1886    let undoStart, undoDuring, undoEnd;
1887    performTransition(el, {
1888      start() {
1889        undoStart = setFunction(el, start2);
1890      },
1891      during() {
1892        undoDuring = setFunction(el, during);
1893      },
1894      before,
1895      end() {
1896        undoStart();
1897        undoEnd = setFunction(el, end);
1898      },
1899      after,
1900      cleanup() {
1901        undoDuring();
1902        undoEnd();
1903      }
1904    });
1905  }
1906  function performTransition(el, stages) {
1907    let interrupted, reachedBefore, reachedEnd;
1908    let finish = once(() => {
1909      mutateDom(() => {
1910        interrupted = true;
1911        if (!reachedBefore)
1912          stages.before();
1913        if (!reachedEnd) {
1914          stages.end();
1915          releaseNextTicks();
1916        }
1917        stages.after();
1918        if (el.isConnected)
1919          stages.cleanup();
1920        delete el._x_transitioning;
1921      });
1922    });
1923    el._x_transitioning = {
1924      beforeCancels: [],
1925      beforeCancel(callback) {
1926        this.beforeCancels.push(callback);
1927      },
1928      cancel: once(function() {
1929        while (this.beforeCancels.length) {
1930          this.beforeCancels.shift()();
1931        }
1932        ;
1933        finish();
1934      }),
1935      finish
1936    };
1937    mutateDom(() => {
1938      stages.start();
1939      stages.during();
1940    });
1941    holdNextTicks();
1942    requestAnimationFrame(() => {
1943      if (interrupted)
1944        return;
1945      let duration = Number(getComputedStyle(el).transitionDuration.replace(/,.*/, "").replace("s", "")) * 1e3;
1946      let delay = Number(getComputedStyle(el).transitionDelay.replace(/,.*/, "").replace("s", "")) * 1e3;
1947      if (duration === 0)
1948        duration = Number(getComputedStyle(el).animationDuration.replace("s", "")) * 1e3;
1949      mutateDom(() => {
1950        stages.before();
1951      });
1952      reachedBefore = true;
1953      requestAnimationFrame(() => {
1954        if (interrupted)
1955          return;
1956        mutateDom(() => {
1957          stages.end();
1958        });
1959        releaseNextTicks();
1960        setTimeout(el._x_transitioning.finish, duration + delay);
1961        reachedEnd = true;
1962      });
1963    });
1964  }
1965  function modifierValue(modifiers, key, fallback) {
1966    if (modifiers.indexOf(key) === -1)
1967      return fallback;
1968    const rawValue = modifiers[modifiers.indexOf(key) + 1];
1969    if (!rawValue)
1970      return fallback;
1971    if (key === "scale") {
1972      if (isNaN(rawValue))
1973        return fallback;
1974    }
1975    if (key === "duration" || key === "delay") {
1976      let match = rawValue.match(/([0-9]+)ms/);
1977      if (match)
1978        return match[1];
1979    }
1980    if (key === "origin") {
1981      if (["top", "right", "left", "center", "bottom"].includes(modifiers[modifiers.indexOf(key) + 2])) {
1982        return [rawValue, modifiers[modifiers.indexOf(key) + 2]].join(" ");
1983      }
1984    }
1985    return rawValue;
1986  }
1987  var isCloning = false;
1988  function skipDuringClone(callback, fallback = () => {
1989  }) {
1990    return (...args) => isCloning ? fallback(...args) : callback(...args);
1991  }
1992  function onlyDuringClone(callback) {
1993    return (...args) => isCloning && callback(...args);
1994  }
1995  var interceptors = [];
1996  function interceptClone(callback) {
1997    interceptors.push(callback);
1998  }
1999  function cloneNode(from, to) {
2000    interceptors.forEach((i) => i(from, to));
2001    isCloning = true;
2002    dontRegisterReactiveSideEffects(() => {
2003      initTree(to, (el, callback) => {
2004        callback(el, () => {
2005        });
2006      });
2007    });
2008    isCloning = false;
2009  }
2010  var isCloningLegacy = false;
2011  function clone(oldEl, newEl) {
2012    if (!newEl._x_dataStack)
2013      newEl._x_dataStack = oldEl._x_dataStack;
2014    isCloning = true;
2015    isCloningLegacy = true;
2016    dontRegisterReactiveSideEffects(() => {
2017      cloneTree(newEl);
2018    });
2019    isCloning = false;
2020    isCloningLegacy = false;
2021  }
2022  function cloneTree(el) {
2023    let hasRunThroughFirstEl = false;
2024    let shallowWalker = (el2, callback) => {
2025      walk(el2, (el3, skip) => {
2026        if (hasRunThroughFirstEl && isRoot(el3))
2027          return skip();
2028        hasRunThroughFirstEl = true;
2029        callback(el3, skip);
2030      });
2031    };
2032    initTree(el, shallowWalker);
2033  }
2034  function dontRegisterReactiveSideEffects(callback) {
2035    let cache = effect;
2036    overrideEffect((callback2, el) => {
2037      let storedEffect = cache(callback2);
2038      release(storedEffect);
2039      return () => {
2040      };
2041    });
2042    callback();
2043    overrideEffect(cache);
2044  }
2045  function bind(el, name, value, modifiers = []) {
2046    if (!el._x_bindings)
2047      el._x_bindings = reactive({});
2048    el._x_bindings[name] = value;
2049    name = modifiers.includes("camel") ? camelCase(name) : name;
2050    switch (name) {
2051      case "value":
2052        bindInputValue(el, value);
2053        break;
2054      case "style":
2055        bindStyles(el, value);
2056        break;
2057      case "class":
2058        bindClasses(el, value);
2059        break;
2060      case "selected":
2061      case "checked":
2062        bindAttributeAndProperty(el, name, value);
2063        break;
2064      default:
2065        bindAttribute(el, name, value);
2066        break;
2067    }
2068  }
2069  function bindInputValue(el, value) {
2070    if (isRadio(el)) {
2071      if (el.attributes.value === void 0) {
2072        el.value = value;
2073      }
2074    } else if (isCheckbox(el)) {
2075      if (Number.isInteger(value)) {
2076        el.value = value;
2077      } else if (!Array.isArray(value) && typeof value !== "boolean" && ![null, void 0].includes(value)) {
2078        el.value = String(value);
2079      } else {
2080        if (Array.isArray(value)) {
2081          el.checked = value.some((val) => checkedAttrLooseCompare(val, el.value));
2082        } else {
2083          el.checked = !!value;
2084        }
2085      }
2086    } else if (el.tagName === "SELECT") {
2087      updateSelect(el, value);
2088    } else {
2089      if (el.value === value)
2090        return;
2091      el.value = value === void 0 ? "" : value;
2092    }
2093  }
2094  function bindClasses(el, value) {
2095    if (el._x_undoAddedClasses)
2096      el._x_undoAddedClasses();
2097    el._x_undoAddedClasses = setClasses(el, value);
2098  }
2099  function bindStyles(el, value) {
2100    if (el._x_undoAddedStyles)
2101      el._x_undoAddedStyles();
2102    el._x_undoAddedStyles = setStyles(el, value);
2103  }
2104  function bindAttributeAndProperty(el, name, value) {
2105    bindAttribute(el, name, value);
2106    setPropertyIfChanged(el, name, value);
2107  }
2108  function bindAttribute(el, name, value) {
2109    if ([null, void 0, false].includes(value) && attributeShouldntBePreservedIfFalsy(name)) {
2110      el.removeAttribute(name);
2111    } else {
2112      if (isBooleanAttr(name))
2113        value = name;
2114      setIfChanged(el, name, value);
2115    }
2116  }
2117  function setIfChanged(el, attrName, value) {
2118    if (el.getAttribute(attrName) != value) {
2119      el.setAttribute(attrName, value);
2120    }
2121  }
2122  function setPropertyIfChanged(el, propName, value) {
2123    if (el[propName] !== value) {
2124      el[propName] = value;
2125    }
2126  }
2127  function updateSelect(el, value) {
2128    const arrayWrappedValue = [].concat(value).map((value2) => {
2129      return value2 + "";
2130    });
2131    Array.from(el.options).forEach((option2) => {
2132      option2.selected = arrayWrappedValue.includes(option2.value);
2133    });
2134  }
2135  function camelCase(subject) {
2136    return subject.toLowerCase().replace(/-(\w)/g, (match, char) => char.toUpperCase());
2137  }
2138  function checkedAttrLooseCompare(valueA, valueB) {
2139    return valueA == valueB;
2140  }
2141  function safeParseBoolean(rawValue) {
2142    if ([1, "1", "true", "on", "yes", true].includes(rawValue)) {
2143      return true;
2144    }
2145    if ([0, "0", "false", "off", "no", false].includes(rawValue)) {
2146      return false;
2147    }
2148    return rawValue ? Boolean(rawValue) : null;
2149  }
2150  var booleanAttributes = /* @__PURE__ */ new Set([
2151    "allowfullscreen",
2152    "async",
2153    "autofocus",
2154    "autoplay",
2155    "checked",
2156    "controls",
2157    "default",
2158    "defer",
2159    "disabled",
2160    "formnovalidate",
2161    "inert",
2162    "ismap",
2163    "itemscope",
2164    "loop",
2165    "multiple",
2166    "muted",
2167    "nomodule",
2168    "novalidate",
2169    "open",
2170    "playsinline",
2171    "readonly",
2172    "required",
2173    "reversed",
2174    "selected",
2175    "shadowrootclonable",
2176    "shadowrootdelegatesfocus",
2177    "shadowrootserializable"
2178  ]);
2179  function isBooleanAttr(attrName) {
2180    return booleanAttributes.has(attrName);
2181  }
2182  function attributeShouldntBePreservedIfFalsy(name) {
2183    return !["aria-pressed", "aria-checked", "aria-expanded", "aria-selected"].includes(name);
2184  }
2185  function getBinding(el, name, fallback) {
2186    if (el._x_bindings && el._x_bindings[name] !== void 0)
2187      return el._x_bindings[name];
2188    return getAttributeBinding(el, name, fallback);
2189  }
2190  function extractProp(el, name, fallback, extract = true) {
2191    if (el._x_bindings && el._x_bindings[name] !== void 0)
2192      return el._x_bindings[name];
2193    if (el._x_inlineBindings && el._x_inlineBindings[name] !== void 0) {
2194      let binding = el._x_inlineBindings[name];
2195      binding.extract = extract;
2196      return dontAutoEvaluateFunctions(() => {
2197        return evaluate(el, binding.expression);
2198      });
2199    }
2200    return getAttributeBinding(el, name, fallback);
2201  }
2202  function getAttributeBinding(el, name, fallback) {
2203    let attr = el.getAttribute(name);
2204    if (attr === null)
2205      return typeof fallback === "function" ? fallback() : fallback;
2206    if (attr === "")
2207      return true;
2208    if (isBooleanAttr(name)) {
2209      return !![name, "true"].includes(attr);
2210    }
2211    return attr;
2212  }
2213  function isCheckbox(el) {
2214    return el.type === "checkbox" || el.localName === "ui-checkbox" || el.localName === "ui-switch";
2215  }
2216  function isRadio(el) {
2217    return el.type === "radio" || el.localName === "ui-radio";
2218  }
2219  function debounce(func, wait) {
2220    let timeout;
2221    return function() {
2222      const context = this, args = arguments;
2223      const later = function() {
2224        timeout = null;
2225        func.apply(context, args);
2226      };
2227      clearTimeout(timeout);
2228      timeout = setTimeout(later, wait);
2229    };
2230  }
2231  function throttle(func, limit) {
2232    let inThrottle;
2233    return function() {
2234      let context = this, args = arguments;
2235      if (!inThrottle) {
2236        func.apply(context, args);
2237        inThrottle = true;
2238        setTimeout(() => inThrottle = false, limit);
2239      }
2240    };
2241  }
2242  function entangle({ get: outerGet, set: outerSet }, { get: innerGet, set: innerSet }) {
2243    let firstRun = true;
2244    let outerHash;
2245    let innerHash;
2246    let reference = effect(() => {
2247      let outer = outerGet();
2248      let inner = innerGet();
2249      if (firstRun) {
2250        innerSet(cloneIfObject(outer));
2251        firstRun = false;
2252      } else {
2253        let outerHashLatest = JSON.stringify(outer);
2254        let innerHashLatest = JSON.stringify(inner);
2255        if (outerHashLatest !== outerHash) {
2256          innerSet(cloneIfObject(outer));
2257        } else if (outerHashLatest !== innerHashLatest) {
2258          outerSet(cloneIfObject(inner));
2259        } else {
2260        }
2261      }
2262      outerHash = JSON.stringify(outerGet());
2263      innerHash = JSON.stringify(innerGet());
2264    });
2265    return () => {
2266      release(reference);
2267    };
2268  }
2269  function cloneIfObject(value) {
2270    return typeof value === "object" ? JSON.parse(JSON.stringify(value)) : value;
2271  }
2272  function plugin(callback) {
2273    let callbacks = Array.isArray(callback) ? callback : [callback];
2274    callbacks.forEach((i) => i(alpine_default));
2275  }
2276  var stores = {};
2277  var isReactive = false;
2278  function store(name, value) {
2279    if (!isReactive) {
2280      stores = reactive(stores);
2281      isReactive = true;
2282    }
2283    if (value === void 0) {
2284      return stores[name];
2285    }
2286    stores[name] = value;
2287    initInterceptors(stores[name]);
2288    if (typeof value === "object" && value !== null && value.hasOwnProperty("init") && typeof value.init === "function") {
2289      stores[name].init();
2290    }
2291  }
2292  function getStores() {
2293    return stores;
2294  }
2295  var binds = {};
2296  function bind2(name, bindings) {
2297    let getBindings = typeof bindings !== "function" ? () => bindings : bindings;
2298    if (name instanceof Element) {
2299      return applyBindingsObject(name, getBindings());
2300    } else {
2301      binds[name] = getBindings;
2302    }
2303    return () => {
2304    };
2305  }
2306  function injectBindingProviders(obj) {
2307    Object.entries(binds).forEach(([name, callback]) => {
2308      Object.defineProperty(obj, name, {
2309        get() {
2310          return (...args) => {
2311            return callback(...args);
2312          };
2313        }
2314      });
2315    });
2316    return obj;
2317  }
2318  function applyBindingsObject(el, obj, original) {
2319    let cleanupRunners = [];
2320    while (cleanupRunners.length)
2321      cleanupRunners.pop()();
2322    let attributes = Object.entries(obj).map(([name, value]) => ({ name, value }));
2323    let staticAttributes = attributesOnly(attributes);
2324    attributes = attributes.map((attribute) => {
2325      if (staticAttributes.find((attr) => attr.name === attribute.name)) {
2326        return {
2327          name: `x-bind:${attribute.name}`,
2328          value: `"${attribute.value}"`
2329        };
2330      }
2331      return attribute;
2332    });
2333    directives(el, attributes, original).map((handle) => {
2334      cleanupRunners.push(handle.runCleanups);
2335      handle();
2336    });
2337    return () => {
2338      while (cleanupRunners.length)
2339        cleanupRunners.pop()();
2340    };
2341  }
2342  var datas = {};
2343  function data(name, callback) {
2344    datas[name] = callback;
2345  }
2346  function injectDataProviders(obj, context) {
2347    Object.entries(datas).forEach(([name, callback]) => {
2348      Object.defineProperty(obj, name, {
2349        get() {
2350          return (...args) => {
2351            return callback.bind(context)(...args);
2352          };
2353        },
2354        enumerable: false
2355      });
2356    });
2357    return obj;
2358  }
2359  var Alpine = {
2360    get reactive() {
2361      return reactive;
2362    },
2363    get release() {
2364      return release;
2365    },
2366    get effect() {
2367      return effect;
2368    },
2369    get raw() {
2370      return raw;
2371    },
2372    get transaction() {
2373      return transaction;
2374    },
2375    version: "3.15.12",
2376    flushAndStopDeferringMutations,
2377    dontAutoEvaluateFunctions,
2378    disableEffectScheduling,
2379    startObservingMutations,
2380    stopObservingMutations,
2381    setReactivityEngine,
2382    onAttributeRemoved,
2383    onAttributesAdded,
2384    closestDataStack,
2385    skipDuringClone,
2386    onlyDuringClone,
2387    addRootSelector,
2388    addInitSelector,
2389    setErrorHandler,
2390    interceptClone,
2391    addScopeToNode,
2392    deferMutations,
2393    mapAttributes,
2394    evaluateLater,
2395    interceptInit,
2396    initInterceptors,
2397    injectMagics,
2398    setEvaluator,
2399    setRawEvaluator,
2400    mergeProxies,
2401    extractProp,
2402    findClosest,
2403    onElRemoved,
2404    closestRoot,
2405    destroyTree,
2406    interceptor,
2407    // INTERNAL: not public API and is subject to change without major release.
2408    transition,
2409    // INTERNAL
2410    setStyles,
2411    // INTERNAL
2412    mutateDom,
2413    directive,
2414    entangle,
2415    throttle,
2416    debounce,
2417    evaluate,
2418    evaluateRaw,
2419    initTree,
2420    nextTick,
2421    prefixed: prefix,
2422    prefix: setPrefix,
2423    plugin,
2424    magic,
2425    store,
2426    start,
2427    clone,
2428    // INTERNAL
2429    cloneNode,
2430    // INTERNAL
2431    bound: getBinding,
2432    $data: scope,
2433    watch,
2434    walk,
2435    data,
2436    bind: bind2
2437  };
2438  var alpine_default = Alpine;
2439  function makeMap(str, expectsLowerCase) {
2440    const map = /* @__PURE__ */ Object.create(null);
2441    const list = str.split(",");
2442    for (let i = 0; i < list.length; i++) {
2443      map[list[i]] = true;
2444    }
2445    return expectsLowerCase ? (val) => !!map[val.toLowerCase()] : (val) => !!map[val];
2446  }
2447  var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
2448  var isBooleanAttr2 = /* @__PURE__ */ makeMap(specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`);
2449  var EMPTY_OBJ = true ? Object.freeze({}) : {};
2450  var EMPTY_ARR = true ? Object.freeze([]) : [];
2451  var hasOwnProperty = Object.prototype.hasOwnProperty;
2452  var hasOwn = (val, key) => hasOwnProperty.call(val, key);
2453  var isArray = Array.isArray;
2454  var isMap = (val) => toTypeString(val) === "[object Map]";
2455  var isString = (val) => typeof val === "string";
2456  var isSymbol = (val) => typeof val === "symbol";
2457  var isObject = (val) => val !== null && typeof val === "object";
2458  var objectToString = Object.prototype.toString;
2459  var toTypeString = (value) => objectToString.call(value);
2460  var toRawType = (value) => {
2461    return toTypeString(value).slice(8, -1);
2462  };
2463  var isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key;
2464  var cacheStringFunction = (fn) => {
2465    const cache = /* @__PURE__ */ Object.create(null);
2466    return (str) => {
2467      const hit = cache[str];
2468      return hit || (cache[str] = fn(str));
2469    };
2470  };
2471  var camelizeRE = /-(\w)/g;
2472  var camelize = cacheStringFunction((str) => {
2473    return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : "");
2474  });
2475  var hyphenateRE = /\B([A-Z])/g;
2476  var hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, "-$1").toLowerCase());
2477  var capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1));
2478  var toHandlerKey = cacheStringFunction((str) => str ? `on${capitalize(str)}` : ``);
2479  var hasChanged = (value, oldValue) => value !== oldValue && (value === value || oldValue === oldValue);
2480  var targetMap = /* @__PURE__ */ new WeakMap();
2481  var effectStack = [];
2482  var activeEffect;
2483  var ITERATE_KEY = /* @__PURE__ */ Symbol(true ? "iterate" : "");
2484  var MAP_KEY_ITERATE_KEY = /* @__PURE__ */ Symbol(true ? "Map key iterate" : "");
2485  function isEffect(fn) {
2486    return fn && fn._isEffect === true;
2487  }
2488  function effect2(fn, options = EMPTY_OBJ) {
2489    if (isEffect(fn)) {
2490      fn = fn.raw;
2491    }
2492    const effect3 = createReactiveEffect(fn, options);
2493    if (!options.lazy) {
2494      effect3();
2495    }
2496    return effect3;
2497  }
2498  function stop(effect3) {
2499    if (effect3.active) {
2500      cleanup(effect3);
2501      if (effect3.options.onStop) {
2502        effect3.options.onStop();
2503      }
2504      effect3.active = false;
2505    }
2506  }
2507  var uid = 0;
2508  function createReactiveEffect(fn, options) {
2509    const effect3 = function reactiveEffect() {
2510      if (!effect3.active) {
2511        return fn();
2512      }
2513      if (!effectStack.includes(effect3)) {
2514        cleanup(effect3);
2515        try {
2516          enableTracking();
2517          effectStack.push(effect3);
2518          activeEffect = effect3;
2519          return fn();
2520        } finally {
2521          effectStack.pop();
2522          resetTracking();
2523          activeEffect = effectStack[effectStack.length - 1];
2524        }
2525      }
2526    };
2527    effect3.id = uid++;
2528    effect3.allowRecurse = !!options.allowRecurse;
2529    effect3._isEffect = true;
2530    effect3.active = true;
2531    effect3.raw = fn;
2532    effect3.deps = [];
2533    effect3.options = options;
2534    return effect3;
2535  }
2536  function cleanup(effect3) {
2537    const { deps } = effect3;
2538    if (deps.length) {
2539      for (let i = 0; i < deps.length; i++) {
2540        deps[i].delete(effect3);
2541      }
2542      deps.length = 0;
2543    }
2544  }
2545  var shouldTrack = true;
2546  var trackStack = [];
2547  function pauseTracking() {
2548    trackStack.push(shouldTrack);
2549    shouldTrack = false;
2550  }
2551  function enableTracking() {
2552    trackStack.push(shouldTrack);
2553    shouldTrack = true;
2554  }
2555  function resetTracking() {
2556    const last = trackStack.pop();
2557    shouldTrack = last === void 0 ? true : last;
2558  }
2559  function track(target, type, key) {
2560    if (!shouldTrack || activeEffect === void 0) {
2561      return;
2562    }
2563    let depsMap = targetMap.get(target);
2564    if (!depsMap) {
2565      targetMap.set(target, depsMap = /* @__PURE__ */ new Map());
2566    }
2567    let dep = depsMap.get(key);
2568    if (!dep) {
2569      depsMap.set(key, dep = /* @__PURE__ */ new Set());
2570    }
2571    if (!dep.has(activeEffect)) {
2572      dep.add(activeEffect);
2573      activeEffect.deps.push(dep);
2574      if (activeEffect.options.onTrack) {
2575        activeEffect.options.onTrack({
2576          effect: activeEffect,
2577          target,
2578          type,
2579          key
2580        });
2581      }
2582    }
2583  }
2584  function trigger(target, type, key, newValue, oldValue, oldTarget) {
2585    const depsMap = targetMap.get(target);
2586    if (!depsMap) {
2587      return;
2588    }
2589    const effects = /* @__PURE__ */ new Set();
2590    const add2 = (effectsToAdd) => {
2591      if (effectsToAdd) {
2592        effectsToAdd.forEach((effect3) => {
2593          if (effect3 !== activeEffect || effect3.allowRecurse) {
2594            effects.add(effect3);
2595          }
2596        });
2597      }
2598    };
2599    if (type === "clear") {
2600      depsMap.forEach(add2);
2601    } else if (key === "length" && isArray(target)) {
2602      depsMap.forEach((dep, key2) => {
2603        if (key2 === "length" || key2 >= newValue) {
2604          add2(dep);
2605        }
2606      });
2607    } else {
2608      if (key !== void 0) {
2609        add2(depsMap.get(key));
2610      }
2611      switch (type) {
2612        case "add":
2613          if (!isArray(target)) {
2614            add2(depsMap.get(ITERATE_KEY));
2615            if (isMap(target)) {
2616              add2(depsMap.get(MAP_KEY_ITERATE_KEY));
2617            }
2618          } else if (isIntegerKey(key)) {
2619            add2(depsMap.get("length"));
2620          }
2621          break;
2622        case "delete":
2623          if (!isArray(target)) {
2624            add2(depsMap.get(ITERATE_KEY));
2625            if (isMap(target)) {
2626              add2(depsMap.get(MAP_KEY_ITERATE_KEY));
2627            }
2628          }
2629          break;
2630        case "set":
2631          if (isMap(target)) {
2632            add2(depsMap.get(ITERATE_KEY));
2633          }
2634          break;
2635      }
2636    }
2637    const run = (effect3) => {
2638      if (effect3.options.onTrigger) {
2639        effect3.options.onTrigger({
2640          effect: effect3,
2641          target,
2642          key,
2643          type,
2644          newValue,
2645          oldValue,
2646          oldTarget
2647        });
2648      }
2649      if (effect3.options.scheduler) {
2650        effect3.options.scheduler(effect3);
2651      } else {
2652        effect3();
2653      }
2654    };
2655    effects.forEach(run);
2656  }
2657  var isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);
2658  var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map((key) => Symbol[key]).filter(isSymbol));
2659  var get2 = /* @__PURE__ */ createGetter();
2660  var readonlyGet = /* @__PURE__ */ createGetter(true);
2661  var arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();
2662  function createArrayInstrumentations() {
2663    const instrumentations = {};
2664    ["includes", "indexOf", "lastIndexOf"].forEach((key) => {
2665      instrumentations[key] = function(...args) {
2666        const arr = toRaw(this);
2667        for (let i = 0, l = this.length; i < l; i++) {
2668          track(arr, "get", i + "");
2669        }
2670        const res = arr[key](...args);
2671        if (res === -1 || res === false) {
2672          return arr[key](...args.map(toRaw));
2673        } else {
2674          return res;
2675        }
2676      };
2677    });
2678    ["push", "pop", "shift", "unshift", "splice"].forEach((key) => {
2679      instrumentations[key] = function(...args) {
2680        pauseTracking();
2681        const res = toRaw(this)[key].apply(this, args);
2682        resetTracking();
2683        return res;
2684      };
2685    });
2686    return instrumentations;
2687  }
2688  function createGetter(isReadonly = false, shallow = false) {
2689    return function get3(target, key, receiver) {
2690      if (key === "__v_isReactive") {
2691        return !isReadonly;
2692      } else if (key === "__v_isReadonly") {
2693        return isReadonly;
2694      } else if (key === "__v_raw" && receiver === (isReadonly ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {
2695        return target;
2696      }
2697      const targetIsArray = isArray(target);
2698      if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) {
2699        return Reflect.get(arrayInstrumentations, key, receiver);
2700      }
2701      const res = Reflect.get(target, key, receiver);
2702      if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
2703        return res;
2704      }
2705      if (!isReadonly) {
2706        track(target, "get", key);
2707      }
2708      if (shallow) {
2709        return res;
2710      }
2711      if (isRef(res)) {
2712        const shouldUnwrap = !targetIsArray || !isIntegerKey(key);
2713        return shouldUnwrap ? res.value : res;
2714      }
2715      if (isObject(res)) {
2716        return isReadonly ? readonly(res) : reactive2(res);
2717      }
2718      return res;
2719    };
2720  }
2721  var set2 = /* @__PURE__ */ createSetter();
2722  function createSetter(shallow = false) {
2723    return function set3(target, key, value, receiver) {
2724      let oldValue = target[key];
2725      if (!shallow) {
2726        value = toRaw(value);
2727        oldValue = toRaw(oldValue);
2728        if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
2729          oldValue.value = value;
2730          return true;
2731        }
2732      }
2733      const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);
2734      const result = Reflect.set(target, key, value, receiver);
2735      if (target === toRaw(receiver)) {
2736        if (!hadKey) {
2737          trigger(target, "add", key, value);
2738        } else if (hasChanged(value, oldValue)) {
2739          trigger(target, "set", key, value, oldValue);
2740        }
2741      }
2742      return result;
2743    };
2744  }
2745  function deleteProperty(target, key) {
2746    const hadKey = hasOwn(target, key);
2747    const oldValue = target[key];
2748    const result = Reflect.deleteProperty(target, key);
2749    if (result && hadKey) {
2750      trigger(target, "delete", key, void 0, oldValue);
2751    }
2752    return result;
2753  }
2754  function has(target, key) {
2755    const result = Reflect.has(target, key);
2756    if (!isSymbol(key) || !builtInSymbols.has(key)) {
2757      track(target, "has", key);
2758    }
2759    return result;
2760  }
2761  function ownKeys(target) {
2762    track(target, "iterate", isArray(target) ? "length" : ITERATE_KEY);
2763    return Reflect.ownKeys(target);
2764  }
2765  var mutableHandlers = {
2766    get: get2,
2767    set: set2,
2768    deleteProperty,
2769    has,
2770    ownKeys
2771  };
2772  var readonlyHandlers = {
2773    get: readonlyGet,
2774    set(target, key) {
2775      if (true) {
2776        console.warn(`Set operation on key "${String(key)}" failed: target is readonly.`, target);
2777      }
2778      return true;
2779    },
2780    deleteProperty(target, key) {
2781      if (true) {
2782        console.warn(`Delete operation on key "${String(key)}" failed: target is readonly.`, target);
2783      }
2784      return true;
2785    }
2786  };
2787  var toReactive = (value) => isObject(value) ? reactive2(value) : value;
2788  var toReadonly = (value) => isObject(value) ? readonly(value) : value;
2789  var toShallow = (value) => value;
2790  var getProto = (v) => Reflect.getPrototypeOf(v);
2791  function get$1(target, key, isReadonly = false, isShallow = false) {
2792    target = target[
2793      "__v_raw"
2794      /* RAW */
2795    ];
2796    const rawTarget = toRaw(target);
2797    const rawKey = toRaw(key);
2798    if (key !== rawKey) {
2799      !isReadonly && track(rawTarget, "get", key);
2800    }
2801    !isReadonly && track(rawTarget, "get", rawKey);
2802    const { has: has2 } = getProto(rawTarget);
2803    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
2804    if (has2.call(rawTarget, key)) {
2805      return wrap(target.get(key));
2806    } else if (has2.call(rawTarget, rawKey)) {
2807      return wrap(target.get(rawKey));
2808    } else if (target !== rawTarget) {
2809      target.get(key);
2810    }
2811  }
2812  function has$1(key, isReadonly = false) {
2813    const target = this[
2814      "__v_raw"
2815      /* RAW */
2816    ];
2817    const rawTarget = toRaw(target);
2818    const rawKey = toRaw(key);
2819    if (key !== rawKey) {
2820      !isReadonly && track(rawTarget, "has", key);
2821    }
2822    !isReadonly && track(rawTarget, "has", rawKey);
2823    return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
2824  }
2825  function size(target, isReadonly = false) {
2826    target = target[
2827      "__v_raw"
2828      /* RAW */
2829    ];
2830    !isReadonly && track(toRaw(target), "iterate", ITERATE_KEY);
2831    return Reflect.get(target, "size", target);
2832  }
2833  function add(value) {
2834    value = toRaw(value);
2835    const target = toRaw(this);
2836    const proto = getProto(target);
2837    const hadKey = proto.has.call(target, value);
2838    if (!hadKey) {
2839      target.add(value);
2840      trigger(target, "add", value, value);
2841    }
2842    return this;
2843  }
2844  function set$1(key, value) {
2845    value = toRaw(value);
2846    const target = toRaw(this);
2847    const { has: has2, get: get3 } = getProto(target);
2848    let hadKey = has2.call(target, key);
2849    if (!hadKey) {
2850      key = toRaw(key);
2851      hadKey = has2.call(target, key);
2852    } else if (true) {
2853      checkIdentityKeys(target, has2, key);
2854    }
2855    const oldValue = get3.call(target, key);
2856    target.set(key, value);
2857    if (!hadKey) {
2858      trigger(target, "add", key, value);
2859    } else if (hasChanged(value, oldValue)) {
2860      trigger(target, "set", key, value, oldValue);
2861    }
2862    return this;
2863  }
2864  function deleteEntry(key) {
2865    const target = toRaw(this);
2866    const { has: has2, get: get3 } = getProto(target);
2867    let hadKey = has2.call(target, key);
2868    if (!hadKey) {
2869      key = toRaw(key);
2870      hadKey = has2.call(target, key);
2871    } else if (true) {
2872      checkIdentityKeys(target, has2, key);
2873    }
2874    const oldValue = get3 ? get3.call(target, key) : void 0;
2875    const result = target.delete(key);
2876    if (hadKey) {
2877      trigger(target, "delete", key, void 0, oldValue);
2878    }
2879    return result;
2880  }
2881  function clear() {
2882    const target = toRaw(this);
2883    const hadItems = target.size !== 0;
2884    const oldTarget = true ? isMap(target) ? new Map(target) : new Set(target) : void 0;
2885    const result = target.clear();
2886    if (hadItems) {
2887      trigger(target, "clear", void 0, void 0, oldTarget);
2888    }
2889    return result;
2890  }
2891  function createForEach(isReadonly, isShallow) {
2892    return function forEach(callback, thisArg) {
2893      const observed = this;
2894      const target = observed[
2895        "__v_raw"
2896        /* RAW */
2897      ];
2898      const rawTarget = toRaw(target);
2899      const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
2900      !isReadonly && track(rawTarget, "iterate", ITERATE_KEY);
2901      return target.forEach((value, key) => {
2902        return callback.call(thisArg, wrap(value), wrap(key), observed);
2903      });
2904    };
2905  }
2906  function createIterableMethod(method, isReadonly, isShallow) {
2907    return function(...args) {
2908      const target = this[
2909        "__v_raw"
2910        /* RAW */
2911      ];
2912      const rawTarget = toRaw(target);
2913      const targetIsMap = isMap(rawTarget);
2914      const isPair = method === "entries" || method === Symbol.iterator && targetIsMap;
2915      const isKeyOnly = method === "keys" && targetIsMap;
2916      const innerIterator = target[method](...args);
2917      const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
2918      !isReadonly && track(rawTarget, "iterate", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);
2919      return {
2920        // iterator protocol
2921        next() {
2922          const { value, done } = innerIterator.next();
2923          return done ? { value, done } : {
2924            value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
2925            done
2926          };
2927        },
2928        // iterable protocol
2929        [Symbol.iterator]() {
2930          return this;
2931        }
2932      };
2933    };
2934  }
2935  function createReadonlyMethod(type) {
2936    return function(...args) {
2937      if (true) {
2938        const key = args[0] ? `on key "${args[0]}" ` : ``;
2939        console.warn(`${capitalize(type)} operation ${key}failed: target is readonly.`, toRaw(this));
2940      }
2941      return type === "delete" ? false : this;
2942    };
2943  }
2944  function createInstrumentations() {
2945    const mutableInstrumentations2 = {
2946      get(key) {
2947        return get$1(this, key);
2948      },
2949      get size() {
2950        return size(this);
2951      },
2952      has: has$1,
2953      add,
2954      set: set$1,
2955      delete: deleteEntry,
2956      clear,
2957      forEach: createForEach(false, false)
2958    };
2959    const shallowInstrumentations2 = {
2960      get(key) {
2961        return get$1(this, key, false, true);
2962      },
2963      get size() {
2964        return size(this);
2965      },
2966      has: has$1,
2967      add,
2968      set: set$1,
2969      delete: deleteEntry,
2970      clear,
2971      forEach: createForEach(false, true)
2972    };
2973    const readonlyInstrumentations2 = {
2974      get(key) {
2975        return get$1(this, key, true);
2976      },
2977      get size() {
2978        return size(this, true);
2979      },
2980      has(key) {
2981        return has$1.call(this, key, true);
2982      },
2983      add: createReadonlyMethod(
2984        "add"
2985        /* ADD */
2986      ),
2987      set: createReadonlyMethod(
2988        "set"
2989        /* SET */
2990      ),
2991      delete: createReadonlyMethod(
2992        "delete"
2993        /* DELETE */
2994      ),
2995      clear: createReadonlyMethod(
2996        "clear"
2997        /* CLEAR */
2998      ),
2999      forEach: createForEach(true, false)
3000    };
3001    const shallowReadonlyInstrumentations2 = {
3002      get(key) {
3003        return get$1(this, key, true, true);
3004      },
3005      get size() {
3006        return size(this, true);
3007      },
3008      has(key) {
3009        return has$1.call(this, key, true);
3010      },
3011      add: createReadonlyMethod(
3012        "add"
3013        /* ADD */
3014      ),
3015      set: createReadonlyMethod(
3016        "set"
3017        /* SET */
3018      ),
3019      delete: createReadonlyMethod(
3020        "delete"
3021        /* DELETE */
3022      ),
3023      clear: createReadonlyMethod(
3024        "clear"
3025        /* CLEAR */
3026      ),
3027      forEach: createForEach(true, true)
3028    };
3029    const iteratorMethods = ["keys", "values", "entries", Symbol.iterator];
3030    iteratorMethods.forEach((method) => {
3031      mutableInstrumentations2[method] = createIterableMethod(method, false, false);
3032      readonlyInstrumentations2[method] = createIterableMethod(method, true, false);
3033      shallowInstrumentations2[method] = createIterableMethod(method, false, true);
3034      shallowReadonlyInstrumentations2[method] = createIterableMethod(method, true, true);
3035    });
3036    return [
3037      mutableInstrumentations2,
3038      readonlyInstrumentations2,
3039      shallowInstrumentations2,
3040      shallowReadonlyInstrumentations2
3041    ];
3042  }
3043  var [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations] = /* @__PURE__ */ createInstrumentations();
3044  function createInstrumentationGetter(isReadonly, shallow) {
3045    const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;
3046    return (target, key, receiver) => {
3047      if (key === "__v_isReactive") {
3048        return !isReadonly;
3049      } else if (key === "__v_isReadonly") {
3050        return isReadonly;
3051      } else if (key === "__v_raw") {
3052        return target;
3053      }
3054      return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver);
3055    };
3056  }
3057  var mutableCollectionHandlers = {
3058    get: /* @__PURE__ */ createInstrumentationGetter(false, false)
3059  };
3060  var readonlyCollectionHandlers = {
3061    get: /* @__PURE__ */ createInstrumentationGetter(true, false)
3062  };
3063  function checkIdentityKeys(target, has2, key) {
3064    const rawKey = toRaw(key);
3065    if (rawKey !== key && has2.call(target, rawKey)) {
3066      const type = toRawType(target);
3067      console.warn(`Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`);
3068    }
3069  }
3070  var reactiveMap = /* @__PURE__ */ new WeakMap();
3071  var shallowReactiveMap = /* @__PURE__ */ new WeakMap();
3072  var readonlyMap = /* @__PURE__ */ new WeakMap();
3073  var shallowReadonlyMap = /* @__PURE__ */ new WeakMap();
3074  function targetTypeMap(rawType) {
3075    switch (rawType) {
3076      case "Object":
3077      case "Array":
3078        return 1;
3079      case "Map":
3080      case "Set":
3081      case "WeakMap":
3082      case "WeakSet":
3083        return 2;
3084      default:
3085        return 0;
3086    }
3087  }
3088  function getTargetType(value) {
3089    return value[
3090      "__v_skip"
3091      /* SKIP */
3092    ] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value));
3093  }
3094  function reactive2(target) {
3095    if (target && target[
3096      "__v_isReadonly"
3097      /* IS_READONLY */
3098    ]) {
3099      return target;
3100    }
3101    return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);
3102  }
3103  function readonly(target) {
3104    return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);
3105  }
3106  function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers, proxyMap) {
3107    if (!isObject(target)) {
3108      if (true) {
3109        console.warn(`value cannot be made reactive: ${String(target)}`);
3110      }
3111      return target;
3112    }
3113    if (target[
3114      "__v_raw"
3115      /* RAW */
3116    ] && !(isReadonly && target[
3117      "__v_isReactive"
3118      /* IS_REACTIVE */
3119    ])) {
3120      return target;
3121    }
3122    const existingProxy = proxyMap.get(target);
3123    if (existingProxy) {
3124      return existingProxy;
3125    }
3126    const targetType = getTargetType(target);
3127    if (targetType === 0) {
3128      return target;
3129    }
3130    const proxy = new Proxy(target, targetType === 2 ? collectionHandlers : baseHandlers);
3131    proxyMap.set(target, proxy);
3132    return proxy;
3133  }
3134  function toRaw(observed) {
3135    return observed && toRaw(observed[
3136      "__v_raw"
3137      /* RAW */
3138    ]) || observed;
3139  }
3140  function isRef(r) {
3141    return Boolean(r && r.__v_isRef === true);
3142  }
3143  magic("nextTick", () => nextTick);
3144  magic("dispatch", (el) => dispatch.bind(dispatch, el));
3145  magic("watch", (el, { evaluateLater: evaluateLater2, cleanup: cleanup2 }) => (key, callback) => {
3146    let evaluate2 = evaluateLater2(key);
3147    let getter = () => {
3148      let value;
3149      evaluate2((i) => value = i);
3150      return value;
3151    };
3152    let unwatch = watch(getter, callback);
3153    cleanup2(unwatch);
3154  });
3155  magic("store", getStores);
3156  magic("data", (el) => scope(el));
3157  magic("root", (el) => closestRoot(el));
3158  magic("refs", (el) => {
3159    if (el._x_refs_proxy)
3160      return el._x_refs_proxy;
3161    el._x_refs_proxy = mergeProxies(getArrayOfRefObject(el));
3162    return el._x_refs_proxy;
3163  });
3164  function getArrayOfRefObject(el) {
3165    let refObjects = [];
3166    findClosest(el, (i) => {
3167      if (i._x_refs)
3168        refObjects.push(i._x_refs);
3169    });
3170    return refObjects;
3171  }
3172  var globalIdMemo = {};
3173  function findAndIncrementId(name) {
3174    if (!globalIdMemo[name])
3175      globalIdMemo[name] = 0;
3176    return ++globalIdMemo[name];
3177  }
3178  function closestIdRoot(el, name) {
3179    return findClosest(el, (element) => {
3180      if (element._x_ids && element._x_ids[name])
3181        return true;
3182    });
3183  }
3184  function setIdRoot(el, name) {
3185    if (!el._x_ids)
3186      el._x_ids = {};
3187    if (!el._x_ids[name])
3188      el._x_ids[name] = findAndIncrementId(name);
3189  }
3190  magic("id", (el, { cleanup: cleanup2 }) => (name, key = null) => {
3191    let cacheKey = `${name}${key ? `-${key}` : ""}`;
3192    return cacheIdByNameOnElement(el, cacheKey, cleanup2, () => {
3193      let root = closestIdRoot(el, name);
3194      let id = root ? root._x_ids[name] : findAndIncrementId(name);
3195      return key ? `${name}-${id}-${key}` : `${name}-${id}`;
3196    });
3197  });
3198  interceptClone((from, to) => {
3199    if (from._x_id) {
3200      to._x_id = from._x_id;
3201    }
3202  });
3203  function cacheIdByNameOnElement(el, cacheKey, cleanup2, callback) {
3204    if (!el._x_id)
3205      el._x_id = {};
3206    if (el._x_id[cacheKey])
3207      return el._x_id[cacheKey];
3208    let output = callback();
3209    el._x_id[cacheKey] = output;
3210    cleanup2(() => {
3211      delete el._x_id[cacheKey];
3212    });
3213    return output;
3214  }
3215  magic("el", (el) => el);
3216  warnMissingPluginMagic("Focus", "focus", "focus");
3217  warnMissingPluginMagic("Persist", "persist", "persist");
3218  function warnMissingPluginMagic(name, magicName, slug) {
3219    magic(magicName, (el) => warn(`You can't use [$${magicName}] without first installing the "${name}" plugin here: https://alpinejs.dev/plugins/${slug}`, el));
3220  }
3221  directive("modelable", (el, { expression }, { effect: effect3, evaluateLater: evaluateLater2, cleanup: cleanup2 }) => {
3222    let func = evaluateLater2(expression);
3223    let innerGet = () => {
3224      let result;
3225      func((i) => result = i);
3226      return result;
3227    };
3228    let evaluateInnerSet = evaluateLater2(`${expression} = __placeholder`);
3229    let innerSet = (val) => evaluateInnerSet(() => {
3230    }, { scope: { "__placeholder": val } });
3231    let initialValue = innerGet();
3232    innerSet(initialValue);
3233    queueMicrotask(() => {
3234      if (!el._x_model)
3235        return;
3236      el._x_removeModelListeners["default"]();
3237      let outerGet = el._x_model.get;
3238      let outerSet = el._x_model.setWithModifiers;
3239      let releaseEntanglement = entangle(
3240        {
3241          get() {
3242            return outerGet();
3243          },
3244          set(value) {
3245            outerSet(value);
3246          }
3247        },
3248        {
3249          get() {
3250            return innerGet();
3251          },
3252          set(value) {
3253            innerSet(value);
3254          }
3255        }
3256      );
3257      cleanup2(releaseEntanglement);
3258    });
3259  });
3260  directive("teleport", (el, { modifiers, expression }, { cleanup: cleanup2 }) => {
3261    if (el.tagName.toLowerCase() !== "template")
3262      warn("x-teleport can only be used on a <template> tag", el);
3263    let target = getTarget(expression);
3264    let clone22 = el.content.cloneNode(true).firstElementChild;
3265    el._x_teleport = clone22;
3266    clone22._x_teleportBack = el;
3267    el.setAttribute("data-teleport-template", true);
3268    clone22.setAttribute("data-teleport-target", true);
3269    if (el._x_forwardEvents) {
3270      el._x_forwardEvents.forEach((eventName) => {
3271        clone22.addEventListener(eventName, (e) => {
3272          e.stopPropagation();
3273          el.dispatchEvent(new e.constructor(e.type, e));
3274        });
3275      });
3276    }
3277    addScopeToNode(clone22, {}, el);
3278    let placeInDom = (clone3, target2, modifiers2) => {
3279      if (modifiers2.includes("prepend")) {
3280        target2.parentNode.insertBefore(clone3, target2);
3281      } else if (modifiers2.includes("append")) {
3282        target2.parentNode.insertBefore(clone3, target2.nextSibling);
3283      } else {
3284        target2.appendChild(clone3);
3285      }
3286    };
3287    mutateDom(() => {
3288      skipDuringClone(() => {
3289        placeInDom(clone22, target, modifiers);
3290        initTree(clone22);
3291      })();
3292    });
3293    el._x_teleportPutBack = () => {
3294      let target2 = getTarget(expression);
3295      mutateDom(() => {
3296        placeInDom(el._x_teleport, target2, modifiers);
3297      });
3298    };
3299    cleanup2(
3300      () => mutateDom(() => {
3301        clone22.remove();
3302        destroyTree(clone22);
3303      })
3304    );
3305  });
3306  var teleportContainerDuringClone = document.createElement("div");
3307  function getTarget(expression) {
3308    let target = skipDuringClone(() => {
3309      return document.querySelector(expression);
3310    }, () => {
3311      return teleportContainerDuringClone;
3312    })();
3313    if (!target)
3314      warn(`Cannot find x-teleport element for selector: "${expression}"`);
3315    return target;
3316  }
3317  var handler = () => {
3318  };
3319  handler.inline = (el, { modifiers }, { cleanup: cleanup2 }) => {
3320    modifiers.includes("self") ? el._x_ignoreSelf = true : el._x_ignore = true;
3321    cleanup2(() => {
3322      modifiers.includes("self") ? delete el._x_ignoreSelf : delete el._x_ignore;
3323    });
3324  };
3325  directive("ignore", handler);
3326  directive("effect", skipDuringClone((el, { expression }, { effect: effect3 }) => {
3327    effect3(evaluateLater(el, expression));
3328  }));
3329  function on(el, event, modifiers, callback) {
3330    let listenerTarget = el;
3331    let handler4 = (e) => callback(e);
3332    let options = {};
3333    let wrapHandler = (callback2, wrapper) => (e) => wrapper(callback2, e);
3334    if (modifiers.includes("dot"))
3335      event = dotSyntax(event);
3336    if (modifiers.includes("camel"))
3337      event = camelCase2(event);
3338    if (modifiers.includes("capture"))
3339      options.capture = true;
3340    if (modifiers.includes("window"))
3341      listenerTarget = window;
3342    if (modifiers.includes("document"))
3343      listenerTarget = document;
3344    if (modifiers.includes("passive")) {
3345      options.passive = modifiers[modifiers.indexOf("passive") + 1] !== "false";
3346    }
3347    handler4 = addDebounceOrThrottle(modifiers, handler4);
3348    if (modifiers.includes("prevent"))
3349      handler4 = wrapHandler(handler4, (next, e) => {
3350        e.preventDefault();
3351        next(e);
3352      });
3353    if (modifiers.includes("stop"))
3354      handler4 = wrapHandler(handler4, (next, e) => {
3355        e.stopPropagation();
3356        next(e);
3357      });
3358    if (modifiers.includes("once")) {
3359      handler4 = wrapHandler(handler4, (next, e) => {
3360        next(e);
3361        listenerTarget.removeEventListener(event, handler4, options);
3362      });
3363    }
3364    if (modifiers.includes("away") || modifiers.includes("outside")) {
3365      listenerTarget = document;
3366      handler4 = wrapHandler(handler4, (next, e) => {
3367        if (el.contains(e.target))
3368          return;
3369        if (e.target.isConnected === false)
3370          return;
3371        if (el.offsetWidth < 1 && el.offsetHeight < 1)
3372          return;
3373        if (el._x_isShown === false)
3374          return;
3375        next(e);
3376      });
3377    }
3378    if (modifiers.includes("self"))
3379      handler4 = wrapHandler(handler4, (next, e) => {
3380        e.target === el && next(e);
3381      });
3382    if (event === "submit") {
3383      handler4 = wrapHandler(handler4, (next, e) => {
3384        if (e.target._x_pendingModelUpdates) {
3385          e.target._x_pendingModelUpdates.forEach((fn) => fn());
3386        }
3387        next(e);
3388      });
3389    }
3390    if (isKeyEvent(event) || isClickEvent(event)) {
3391      handler4 = wrapHandler(handler4, (next, e) => {
3392        if (isListeningForASpecificKeyThatHasntBeenPressed(e, modifiers)) {
3393          return;
3394        }
3395        next(e);
3396      });
3397    }
3398    listenerTarget.addEventListener(event, handler4, options);
3399    return () => {
3400      listenerTarget.removeEventListener(event, handler4, options);
3401    };
3402  }
3403  function addDebounceOrThrottle(modifiers, handler4) {
3404    if (modifiers.includes("debounce")) {
3405      let nextModifier = modifiers[modifiers.indexOf("debounce") + 1] || "invalid-wait";
3406      let wait = isNumeric(nextModifier.split("ms")[0]) ? Number(nextModifier.split("ms")[0]) : 250;
3407      handler4 = debounce(handler4, wait);
3408    }
3409    if (modifiers.includes("throttle")) {
3410      let nextModifier = modifiers[modifiers.indexOf("throttle") + 1] || "invalid-wait";
3411      let wait = isNumeric(nextModifier.split("ms")[0]) ? Number(nextModifier.split("ms")[0]) : 250;
3412      handler4 = throttle(handler4, wait);
3413    }
3414    return handler4;
3415  }
3416  function dotSyntax(subject) {
3417    return subject.replace(/-/g, ".");
3418  }
3419  function camelCase2(subject) {
3420    return subject.toLowerCase().replace(/-(\w)/g, (match, char) => char.toUpperCase());
3421  }
3422  function isNumeric(subject) {
3423    return !Array.isArray(subject) && !isNaN(subject);
3424  }
3425  function kebabCase2(subject) {
3426    if ([" ", "_"].includes(
3427      subject
3428    ))
3429      return subject;
3430    return subject.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[_\s]/, "-").toLowerCase();
3431  }
3432  function isKeyEvent(event) {
3433    return ["keydown", "keyup"].includes(event);
3434  }
3435  function isClickEvent(event) {
3436    return ["contextmenu", "click", "mouse"].some((i) => event.includes(i));
3437  }
3438  function isListeningForASpecificKeyThatHasntBeenPressed(e, modifiers) {
3439    let keyModifiers = modifiers.filter((i) => {
3440      return !["window", "document", "prevent", "stop", "once", "capture", "self", "away", "outside", "passive", "preserve-scroll", "blur", "change", "lazy"].includes(i);
3441    });
3442    if (keyModifiers.includes("debounce")) {
3443      let debounceIndex = keyModifiers.indexOf("debounce");
3444      keyModifiers.splice(debounceIndex, isNumeric((keyModifiers[debounceIndex + 1] || "invalid-wait").split("ms")[0]) ? 2 : 1);
3445    }
3446    if (keyModifiers.includes("throttle")) {
3447      let debounceIndex = keyModifiers.indexOf("throttle");
3448      keyModifiers.splice(debounceIndex, isNumeric((keyModifiers[debounceIndex + 1] || "invalid-wait").split("ms")[0]) ? 2 : 1);
3449    }
3450    if (keyModifiers.length === 0)
3451      return false;
3452    if (keyModifiers.length === 1 && keyToModifiers(e.key).includes(keyModifiers[0]))
3453      return false;
3454    const systemKeyModifiers = ["ctrl", "shift", "alt", "meta", "cmd", "super"];
3455    const selectedSystemKeyModifiers = systemKeyModifiers.filter((modifier) => keyModifiers.includes(modifier));
3456    keyModifiers = keyModifiers.filter((i) => !selectedSystemKeyModifiers.includes(i));
3457    if (selectedSystemKeyModifiers.length > 0) {
3458      const activelyPressedKeyModifiers = selectedSystemKeyModifiers.filter((modifier) => {
3459        if (modifier === "cmd" || modifier === "super")
3460          modifier = "meta";
3461        return e[`${modifier}Key`];
3462      });
3463      if (activelyPressedKeyModifiers.length === selectedSystemKeyModifiers.length) {
3464        if (isClickEvent(e.type))
3465          return false;
3466        if (keyToModifiers(e.key).includes(keyModifiers[0]))
3467          return false;
3468      }
3469    }
3470    return true;
3471  }
3472  function keyToModifiers(key) {
3473    if (!key)
3474      return [];
3475    key = kebabCase2(key);
3476    let modifierToKeyMap = {
3477      "ctrl": "control",
3478      "slash": "/",
3479      "space": " ",
3480      "spacebar": " ",
3481      "cmd": "meta",
3482      "esc": "escape",
3483      "up": "arrow-up",
3484      "down": "arrow-down",
3485      "left": "arrow-left",
3486      "right": "arrow-right",
3487      "period": ".",
3488      "comma": ",",
3489      "equal": "=",
3490      "minus": "-",
3491      "underscore": "_"
3492    };
3493    modifierToKeyMap[key] = key;
3494    return Object.keys(modifierToKeyMap).map((modifier) => {
3495      if (modifierToKeyMap[modifier] === key)
3496        return modifier;
3497    }).filter((modifier) => modifier);
3498  }
3499  directive("model", (el, { modifiers, expression }, { effect: effect3, cleanup: cleanup2 }) => {
3500    let scopeTarget = el;
3501    if (modifiers.includes("parent")) {
3502      scopeTarget = findClosest(el, (element) => element !== el);
3503    }
3504    let evaluateGet = evaluateLater(scopeTarget, expression);
3505    let evaluateSet;
3506    if (typeof expression === "string") {
3507      evaluateSet = evaluateLater(scopeTarget, `${expression} = __placeholder`);
3508    } else if (typeof expression === "function" && typeof expression() === "string") {
3509      evaluateSet = evaluateLater(scopeTarget, `${expression()} = __placeholder`);
3510    } else {
3511      evaluateSet = () => {
3512      };
3513    }
3514    let getValue = () => {
3515      let result;
3516      evaluateGet((value) => result = value);
3517      return isGetterSetter(result) ? result.get() : result;
3518    };
3519    let setValue = (value) => {
3520      let result;
3521      evaluateGet((value2) => result = value2);
3522      if (isGetterSetter(result)) {
3523        result.set(value);
3524      } else {
3525        evaluateSet(() => {
3526        }, {
3527          scope: { "__placeholder": value }
3528        });
3529      }
3530    };
3531    if (typeof expression === "string" && el.type === "radio") {
3532      mutateDom(() => {
3533        if (!el.hasAttribute("name"))
3534          el.setAttribute("name", expression);
3535      });
3536    }
3537    let hasChangeModifier = modifiers.includes("change") || modifiers.includes("lazy");
3538    let hasBlurModifier = modifiers.includes("blur");
3539    let hasEnterModifier = modifiers.includes("enter");
3540    let hasExplicitEventModifiers = hasChangeModifier || hasBlurModifier || hasEnterModifier;
3541    let removeListener;
3542    if (isCloning) {
3543      removeListener = () => {
3544      };
3545    } else if (hasExplicitEventModifiers) {
3546      let listeners = [];
3547      let syncValue = (e) => setValue(getInputValue(el, modifiers, e, getValue()));
3548      if (hasChangeModifier) {
3549        listeners.push(on(el, "change", modifiers, syncValue));
3550      }
3551      if (hasBlurModifier) {
3552        listeners.push(on(el, "blur", modifiers, syncValue));
3553        if (el.form) {
3554          let form = el.form;
3555          let syncCallback = () => syncValue({ target: el });
3556          if (!form._x_pendingModelUpdates)
3557            form._x_pendingModelUpdates = [];
3558          form._x_pendingModelUpdates.push(syncCallback);
3559          cleanup2(() => {
3560            if (form._x_pendingModelUpdates) {
3561              form._x_pendingModelUpdates.splice(form._x_pendingModelUpdates.indexOf(syncCallback), 1);
3562            }
3563          });
3564        }
3565      }
3566      if (hasEnterModifier) {
3567        listeners.push(on(el, "keydown", modifiers, (e) => {
3568          if (e.key === "Enter")
3569            syncValue(e);
3570        }));
3571      }
3572      removeListener = () => listeners.forEach((remove) => remove());
3573    } else {
3574      let event = el.tagName.toLowerCase() === "select" || ["checkbox", "radio"].includes(el.type) ? "change" : "input";
3575      removeListener = on(el, event, modifiers, (e) => {
3576        setValue(getInputValue(el, modifiers, e, getValue()));
3577      });
3578    }
3579    if (modifiers.includes("fill")) {
3580      if ([void 0, null, ""].includes(getValue()) || isCheckbox(el) && Array.isArray(getValue()) || el.tagName.toLowerCase() === "select" && el.multiple) {
3581        setValue(
3582          getInputValue(el, modifiers, { target: el }, getValue())
3583        );
3584      }
3585    }
3586    if (!el._x_removeModelListeners)
3587      el._x_removeModelListeners = {};
3588    el._x_removeModelListeners["default"] = removeListener;
3589    cleanup2(() => el._x_removeModelListeners["default"]());
3590    if (el.form) {
3591      let removeResetListener = on(el.form, "reset", [], (e) => {
3592        nextTick(() => el._x_model && el._x_model.set(getInputValue(el, modifiers, { target: el }, getValue())));
3593      });
3594      cleanup2(() => removeResetListener());
3595    }
3596    el._x_model = {
3597      get() {
3598        return getValue();
3599      },
3600      set(value) {
3601        setValue(value);
3602      },
3603      setWithModifiers: addDebounceOrThrottle(modifiers, setValue)
3604    };
3605    el._x_forceModelUpdate = (value) => {
3606      if (value === void 0 && typeof expression === "string" && expression.match(/\./))
3607        value = "";
3608      mutateDom(() => {
3609        if (isCheckbox(el)) {
3610          if (Array.isArray(value)) {
3611            el.checked = value.some((val) => val == el.value);
3612          } else {
3613            el.checked = !!value;
3614          }
3615        } else if (isRadio(el)) {
3616          if (typeof value === "boolean") {
3617            el.checked = safeParseBoolean(el.value) === value;
3618          } else {
3619            el.checked = el.value == value;
3620          }
3621        } else {
3622          bind(el, "value", value);
3623        }
3624      });
3625    };
3626    effect3(() => {
3627      let value = getValue();
3628      if (modifiers.includes("unintrusive") && document.activeElement.isSameNode(el))
3629        return;
3630      el._x_forceModelUpdate(value);
3631    });
3632  });
3633  function getInputValue(el, modifiers, event, currentValue) {
3634    return mutateDom(() => {
3635      if (event instanceof CustomEvent && event.detail !== void 0)
3636        return event.detail !== null && event.detail !== void 0 ? event.detail : event.target.value;
3637      else if (isCheckbox(el)) {
3638        if (Array.isArray(currentValue)) {
3639          let newValue = null;
3640          if (modifiers.includes("number")) {
3641            newValue = safeParseNumber(event.target.value);
3642          } else if (modifiers.includes("boolean")) {
3643            newValue = safeParseBoolean(event.target.value);
3644          } else {
3645            newValue = event.target.value;
3646          }
3647          return event.target.checked ? currentValue.includes(newValue) ? currentValue : currentValue.concat([newValue]) : currentValue.filter((el2) => !checkedAttrLooseCompare2(el2, newValue));
3648        } else {
3649          return event.target.checked;
3650        }
3651      } else if (el.tagName.toLowerCase() === "select" && el.multiple) {
3652        if (modifiers.includes("number")) {
3653          return Array.from(event.target.selectedOptions).map((option2) => {
3654            let rawValue = option2.value || option2.text;
3655            return safeParseNumber(rawValue);
3656          });
3657        } else if (modifiers.includes("boolean")) {
3658          return Array.from(event.target.selectedOptions).map((option2) => {
3659            let rawValue = option2.value || option2.text;
3660            return safeParseBoolean(rawValue);
3661          });
3662        }
3663        return Array.from(event.target.selectedOptions).map((option2) => {
3664          return option2.value || option2.text;
3665        });
3666      } else {
3667        let newValue;
3668        if (isRadio(el)) {
3669          if (event.target.checked) {
3670            newValue = event.target.value;
3671          } else {
3672            newValue = currentValue;
3673          }
3674        } else {
3675          newValue = event.target.value;
3676        }
3677        if (modifiers.includes("number")) {
3678          return safeParseNumber(newValue);
3679        } else if (modifiers.includes("boolean")) {
3680          return safeParseBoolean(newValue);
3681        } else if (modifiers.includes("trim")) {
3682          return newValue.trim();
3683        } else {
3684          return newValue;
3685        }
3686      }
3687    });
3688  }
3689  function safeParseNumber(rawValue) {
3690    let number = rawValue ? parseFloat(rawValue) : null;
3691    return isNumeric2(number) ? number : rawValue;
3692  }
3693  function checkedAttrLooseCompare2(valueA, valueB) {
3694    return valueA == valueB;
3695  }
3696  function isNumeric2(subject) {
3697    return !Array.isArray(subject) && !isNaN(subject);
3698  }
3699  function isGetterSetter(value) {
3700    return value !== null && typeof value === "object" && typeof value.get === "function" && typeof value.set === "function";
3701  }
3702  directive("cloak", (el) => queueMicrotask(() => mutateDom(() => el.removeAttribute(prefix("cloak")))));
3703  addInitSelector(() => `[${prefix("init")}]`);
3704  directive("init", skipDuringClone((el, { expression }, { evaluate: evaluate2 }) => {
3705    if (typeof expression === "string") {
3706      return !!expression.trim() && evaluate2(expression, {}, false);
3707    }
3708    return evaluate2(expression, {}, false);
3709  }));
3710  directive("text", (el, { expression }, { effect: effect3, evaluateLater: evaluateLater2 }) => {
3711    let evaluate2 = evaluateLater2(expression);
3712    effect3(() => {
3713      evaluate2((value) => {
3714        mutateDom(() => {
3715          el.textContent = value;
3716        });
3717      });
3718    });
3719  });
3720  directive("html", (el, { expression }, { effect: effect3, evaluateLater: evaluateLater2 }) => {
3721    let evaluate2 = evaluateLater2(expression);
3722    effect3(() => {
3723      evaluate2((value) => {
3724        mutateDom(() => {
3725          el.innerHTML = value ?? "";
3726          el._x_ignoreSelf = true;
3727          initTree(el);
3728          delete el._x_ignoreSelf;
3729        });
3730      });
3731    });
3732  });
3733  mapAttributes(startingWith(":", into(prefix("bind:"))));
3734  var handler2 = (el, { value, modifiers, expression, original }, { effect: effect3, cleanup: cleanup2 }) => {
3735    if (!value) {
3736      let bindingProviders = {};
3737      injectBindingProviders(bindingProviders);
3738      let getBindings = evaluateLater(el, expression);
3739      getBindings((bindings) => {
3740        applyBindingsObject(el, bindings, original);
3741      }, { scope: bindingProviders });
3742      return;
3743    }
3744    if (value === "key")
3745      return storeKeyForXFor(el, expression);
3746    if (el._x_inlineBindings && el._x_inlineBindings[value] && el._x_inlineBindings[value].extract) {
3747      return;
3748    }
3749    let evaluate2 = evaluateLater(el, expression);
3750    effect3(() => evaluate2((result) => {
3751      if (result === void 0 && typeof expression === "string" && expression.match(/\./)) {
3752        result = "";
3753      }
3754      mutateDom(() => bind(el, value, result, modifiers));
3755    }));
3756    cleanup2(() => {
3757      el._x_undoAddedClasses && el._x_undoAddedClasses();
3758      el._x_undoAddedStyles && el._x_undoAddedStyles();
3759    });
3760  };
3761  handler2.inline = (el, { value, modifiers, expression }) => {
3762    if (!value)
3763      return;
3764    if (!el._x_inlineBindings)
3765      el._x_inlineBindings = {};
3766    el._x_inlineBindings[value] = { expression, extract: false };
3767  };
3768  directive("bind", handler2);
3769  function storeKeyForXFor(el, expression) {
3770    el._x_keyExpression = expression;
3771  }
3772  addRootSelector(() => `[${prefix("data")}]`);
3773  directive("data", (el, { expression }, { cleanup: cleanup2 }) => {
3774    if (shouldSkipRegisteringDataDuringClone(el))
3775      return;
3776    expression = expression === "" ? "{}" : expression;
3777    let magicContext = {};
3778    injectMagics(magicContext, el);
3779    let dataProviderContext = {};
3780    injectDataProviders(dataProviderContext, magicContext);
3781    let data2 = evaluate(el, expression, { scope: dataProviderContext });
3782    if (data2 === void 0 || data2 === true)
3783      data2 = {};
3784    injectMagics(data2, el);
3785    let reactiveData = reactive(data2);
3786    initInterceptors(reactiveData);
3787    let undo = addScopeToNode(el, reactiveData);
3788    reactiveData["init"] && evaluate(el, reactiveData["init"]);
3789    cleanup2(() => {
3790      reactiveData["destroy"] && evaluate(el, reactiveData["destroy"]);
3791      undo();
3792    });
3793  });
3794  interceptClone((from, to) => {
3795    if (from._x_dataStack) {
3796      to._x_dataStack = from._x_dataStack;
3797      to.setAttribute("data-has-alpine-state", true);
3798    }
3799  });
3800  function shouldSkipRegisteringDataDuringClone(el) {
3801    if (!isCloning)
3802      return false;
3803    if (isCloningLegacy)
3804      return true;
3805    return el.hasAttribute("data-has-alpine-state");
3806  }
3807  directive("show", (el, { modifiers, expression }, { effect: effect3 }) => {
3808    let evaluate2 = evaluateLater(el, expression);
3809    if (!el._x_doHide)
3810      el._x_doHide = () => {
3811        mutateDom(() => {
3812          el.style.setProperty("display", "none", modifiers.includes("important") ? "important" : void 0);
3813        });
3814      };
3815    if (!el._x_doShow)
3816      el._x_doShow = () => {
3817        mutateDom(() => {
3818          if (el.style.length === 1 && el.style.display === "none") {
3819            el.removeAttribute("style");
3820          } else {
3821            el.style.removeProperty("display");
3822          }
3823        });
3824      };
3825    let hide = () => {
3826      el._x_doHide();
3827      el._x_isShown = false;
3828    };
3829    let show = () => {
3830      el._x_doShow();
3831      el._x_isShown = true;
3832    };
3833    let clickAwayCompatibleShow = () => setTimeout(show);
3834    let toggle = once(
3835      (value) => value ? show() : hide(),
3836      (value) => {
3837        if (typeof el._x_toggleAndCascadeWithTransitions === "function") {
3838          el._x_toggleAndCascadeWithTransitions(el, value, show, hide);
3839        } else {
3840          value ? clickAwayCompatibleShow() : hide();
3841        }
3842      }
3843    );
3844    let oldValue;
3845    let firstTime = true;
3846    effect3(() => evaluate2((value) => {
3847      if (!firstTime && value === oldValue)
3848        return;
3849      if (modifiers.includes("immediate"))
3850        value ? clickAwayCompatibleShow() : hide();
3851      toggle(value);
3852      oldValue = value;
3853      firstTime = false;
3854    }));
3855  });
3856  directive("for", (el, { expression }, { effect: effect3, cleanup: cleanup2 }) => {
3857    let iteratorNames = parseForExpression(expression);
3858    let evaluateItems = evaluateLater(el, iteratorNames.items);
3859    let evaluateKey = evaluateLater(
3860      el,
3861      // the x-bind:key expression is stored for our use instead of evaluated.
3862      el._x_keyExpression || "index"
3863    );
3864    el._x_lookup = /* @__PURE__ */ new Map();
3865    effect3(() => loop(el, iteratorNames, evaluateItems, evaluateKey));
3866    cleanup2(() => {
3867      el._x_lookup.forEach(
3868        (el2) => mutateDom(() => {
3869          destroyTree(el2);
3870          el2.remove();
3871        })
3872      );
3873      delete el._x_lookup;
3874    });
3875  });
3876  function refreshScope(scope2) {
3877    return (newScope) => {
3878      Object.entries(newScope).forEach(([key, value]) => {
3879        scope2[key] = value;
3880      });
3881    };
3882  }
3883  function loop(templateEl, iteratorNames, evaluateItems, evaluateKey) {
3884    evaluateItems((items) => {
3885      if (isNumeric3(items))
3886        items = Array.from({ length: items }, (_, i) => i + 1);
3887      if (items === void 0 || items === null)
3888        items = [];
3889      if (items instanceof Set)
3890        items = Array.from(items);
3891      if (items instanceof Map)
3892        items = Array.from(items);
3893      let oldLookup = templateEl._x_lookup;
3894      let lookup = /* @__PURE__ */ new Map();
3895      templateEl._x_lookup = lookup;
3896      let hasStringKeys = isObject2(items);
3897      let scopeEntries = Object.entries(items).map(([index2, item]) => {
3898        if (!hasStringKeys)
3899          index2 = parseInt(index2);
3900        let scope2 = getIterationScopeVariables(iteratorNames, item, index2, items);
3901        let key;
3902        evaluateKey((innerKey) => {
3903          if (typeof innerKey === "object")
3904            warn("x-for key cannot be an object, it must be a string or an integer", templateEl);
3905          if (oldLookup.has(innerKey)) {
3906            lookup.set(innerKey, oldLookup.get(innerKey));
3907            oldLookup.delete(innerKey);
3908          }
3909          key = innerKey;
3910        }, { scope: { index: index2, ...scope2 } });
3911        return [key, scope2];
3912      });
3913      mutateDom(() => {
3914        oldLookup.forEach((el) => {
3915          destroyTree(el);
3916          el.remove();
3917        });
3918        let added = /* @__PURE__ */ new Set();
3919        let prev = templateEl;
3920        scopeEntries.forEach(([key, scope2]) => {
3921          if (lookup.has(key)) {
3922            let el = lookup.get(key);
3923            el._x_refreshXForScope(scope2);
3924            if (prev.nextElementSibling !== el) {
3925              if (prev.nextElementSibling)
3926                el.replaceWith(prev.nextElementSibling);
3927              prev.after(el);
3928            }
3929            prev = el;
3930            if (el._x_currentIfEl) {
3931              if (el.nextElementSibling !== el._x_currentIfEl)
3932                prev.after(el._x_currentIfEl);
3933              prev = el._x_currentIfEl;
3934            }
3935            return;
3936          }
3937          if (templateEl.content.children.length > 1)
3938            warn("x-for templates require a single root element, additional elements will be ignored.", templateEl);
3939          let clone22 = document.importNode(templateEl.content, true).firstElementChild;
3940          let reactiveScope = reactive(scope2);
3941          addScopeToNode(clone22, reactiveScope, templateEl);
3942          clone22._x_refreshXForScope = refreshScope(reactiveScope);
3943          lookup.set(key, clone22);
3944          added.add(clone22);
3945          prev.after(clone22);
3946          prev = clone22;
3947        });
3948        skipDuringClone(() => added.forEach((clone22) => initTree(clone22)))();
3949      });
3950    });
3951  }
3952  function parseForExpression(expression) {
3953    let forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
3954    let stripParensRE = /^\s*\(|\)\s*$/g;
3955    let forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
3956    let inMatch = expression.match(forAliasRE);
3957    if (!inMatch)
3958      return;
3959    let res = {};
3960    res.items = inMatch[2].trim();
3961    let item = inMatch[1].replace(stripParensRE, "").trim();
3962    let iteratorMatch = item.match(forIteratorRE);
3963    if (iteratorMatch) {
3964      res.item = item.replace(forIteratorRE, "").trim();
3965      res.index = iteratorMatch[1].trim();
3966      if (iteratorMatch[2]) {
3967        res.collection = iteratorMatch[2].trim();
3968      }
3969    } else {
3970      res.item = item;
3971    }
3972    return res;
3973  }
3974  function getIterationScopeVariables(iteratorNames, item, index2, items) {
3975    let scopeVariables = {};
3976    if (/^\[.*\]$/.test(iteratorNames.item) && Array.isArray(item)) {
3977      let names = iteratorNames.item.replace("[", "").replace("]", "").split(",").map((i) => i.trim());
3978      names.forEach((name, i) => {
3979        scopeVariables[name] = item[i];
3980      });
3981    } else if (/^\{.*\}$/.test(iteratorNames.item) && !Array.isArray(item) && typeof item === "object") {
3982      let names = iteratorNames.item.replace("{", "").replace("}", "").split(",").map((i) => i.trim());
3983      names.forEach((name) => {
3984        scopeVariables[name] = item[name];
3985      });
3986    } else {
3987      scopeVariables[iteratorNames.item] = item;
3988    }
3989    if (iteratorNames.index)
3990      scopeVariables[iteratorNames.index] = index2;
3991    if (iteratorNames.collection)
3992      scopeVariables[iteratorNames.collection] = items;
3993    return scopeVariables;
3994  }
3995  function isNumeric3(subject) {
3996    return typeof subject !== "object" && !isNaN(subject);
3997  }
3998  function isObject2(subject) {
3999    return typeof subject === "object" && !Array.isArray(subject);
4000  }
4001  function handler3() {
4002  }
4003  handler3.inline = (el, { expression }, { cleanup: cleanup2 }) => {
4004    let root = closestRoot(el);
4005    if (!root)
4006      return;
4007    if (!root._x_refs)
4008      root._x_refs = {};
4009    root._x_refs[expression] = el;
4010    cleanup2(() => delete root._x_refs[expression]);
4011  };
4012  directive("ref", handler3);
4013  directive("if", (el, { expression }, { effect: effect3, cleanup: cleanup2 }) => {
4014    if (el.tagName.toLowerCase() !== "template")
4015      warn("x-if can only be used on a <template> tag", el);
4016    let evaluate2 = evaluateLater(el, expression);
4017    let show = () => {
4018      if (el._x_currentIfEl)
4019        return el._x_currentIfEl;
4020      let clone22 = el.content.cloneNode(true).firstElementChild;
4021      addScopeToNode(clone22, {}, el);
4022      mutateDom(() => {
4023        el.after(clone22);
4024        skipDuringClone(() => initTree(clone22))();
4025      });
4026      el._x_currentIfEl = clone22;
4027      el._x_undoIf = () => {
4028        mutateDom(() => {
4029          destroyTree(clone22);
4030          clone22.remove();
4031        });
4032        delete el._x_currentIfEl;
4033      };
4034      return clone22;
4035    };
4036    let hide = () => {
4037      if (!el._x_undoIf)
4038        return;
4039      el._x_undoIf();
4040      delete el._x_undoIf;
4041    };
4042    effect3(() => evaluate2((value) => {
4043      value ? show() : hide();
4044    }));
4045    cleanup2(() => el._x_undoIf && el._x_undoIf());
4046  });
4047  directive("id", (el, { expression }, { evaluate: evaluate2 }) => {
4048    let names = evaluate2(expression);
4049    names.forEach((name) => setIdRoot(el, name));
4050  });
4051  interceptClone((from, to) => {
4052    if (from._x_ids) {
4053      to._x_ids = from._x_ids;
4054    }
4055  });
4056  mapAttributes(startingWith("@", into(prefix("on:"))));
4057  directive("on", skipDuringClone((el, { value, modifiers, expression }, { cleanup: cleanup2 }) => {
4058    let evaluate2 = expression ? evaluateLater(el, expression) : () => {
4059    };
4060    if (el.tagName.toLowerCase() === "template") {
4061      if (!el._x_forwardEvents)
4062        el._x_forwardEvents = [];
4063      if (!el._x_forwardEvents.includes(value))
4064        el._x_forwardEvents.push(value);
4065    }
4066    let removeListener = on(el, value, modifiers, (e) => {
4067      evaluate2(() => {
4068      }, { scope: { "$event": e }, params: [e] });
4069    });
4070    cleanup2(() => removeListener());
4071  }));
4072  warnMissingPluginDirective("Collapse", "collapse", "collapse");
4073  warnMissingPluginDirective("Intersect", "intersect", "intersect");
4074  warnMissingPluginDirective("Focus", "trap", "focus");
4075  warnMissingPluginDirective("Mask", "mask", "mask");
4076  function warnMissingPluginDirective(name, directiveName, slug) {
4077    directive(directiveName, (el) => warn(`You can't use [x-${directiveName}] without first installing the "${name}" plugin here: https://alpinejs.dev/plugins/${slug}`, el));
4078  }
4079  alpine_default.setEvaluator(normalEvaluator);
4080  alpine_default.setRawEvaluator(normalRawEvaluator);
4081  alpine_default.setReactivityEngine({ reactive: reactive2, effect: effect2, release: stop, raw: toRaw });
4082  var src_default = alpine_default;
4083  var module_default = src_default;
4084
4085  
vendor: 85,551 bytes, lines 4085-6274
4085// node_modules/sortablejs/modular/sortable.esm.js
4086  function _defineProperty(e, r, t) {
4087    return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
4088      value: t,
4089      enumerable: true,
4090      configurable: true,
4091      writable: true
4092    }) : e[r] = t, e;
4093  }
4094  function _extends() {
4095    return _extends = Object.assign ? Object.assign.bind() : function(n) {
4096      for (var e = 1; e < arguments.length; e++) {
4097        var t = arguments[e];
4098        for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
4099      }
4100      return n;
4101    }, _extends.apply(null, arguments);
4102  }
4103  function ownKeys2(e, r) {
4104    var t = Object.keys(e);
4105    if (Object.getOwnPropertySymbols) {
4106      var o = Object.getOwnPropertySymbols(e);
4107      r && (o = o.filter(function(r2) {
4108        return Object.getOwnPropertyDescriptor(e, r2).enumerable;
4109      })), t.push.apply(t, o);
4110    }
4111    return t;
4112  }
4113  function _objectSpread2(e) {
4114    for (var r = 1; r < arguments.length; r++) {
4115      var t = null != arguments[r] ? arguments[r] : {};
4116      r % 2 ? ownKeys2(Object(t), true).forEach(function(r2) {
4117        _defineProperty(e, r2, t[r2]);
4118      }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys2(Object(t)).forEach(function(r2) {
4119        Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2));
4120      });
4121    }
4122    return e;
4123  }
4124  function _objectWithoutProperties(e, t) {
4125    if (null == e) return {};
4126    var o, r, i = _objectWithoutPropertiesLoose(e, t);
4127    if (Object.getOwnPropertySymbols) {
4128      var n = Object.getOwnPropertySymbols(e);
4129      for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);
4130    }
4131    return i;
4132  }
4133  function _objectWithoutPropertiesLoose(r, e) {
4134    if (null == r) return {};
4135    var t = {};
4136    for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
4137      if (-1 !== e.indexOf(n)) continue;
4138      t[n] = r[n];
4139    }
4140    return t;
4141  }
4142  function _toPrimitive(t, r) {
4143    if ("object" != typeof t || !t) return t;
4144    var e = t[Symbol.toPrimitive];
4145    if (void 0 !== e) {
4146      var i = e.call(t, r || "default");
4147      if ("object" != typeof i) return i;
4148      throw new TypeError("@@toPrimitive must return a primitive value.");
4149    }
4150    return ("string" === r ? String : Number)(t);
4151  }
4152  function _toPropertyKey(t) {
4153    var i = _toPrimitive(t, "string");
4154    return "symbol" == typeof i ? i : i + "";
4155  }
4156  function _typeof(o) {
4157    "@babel/helpers - typeof";
4158    return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) {
4159      return typeof o2;
4160    } : function(o2) {
4161      return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2;
4162    }, _typeof(o);
4163  }
4164  var version = "1.15.7";
4165  function userAgent(pattern) {
4166    if (typeof window !== "undefined" && window.navigator) {
4167      return !!/* @__PURE__ */ navigator.userAgent.match(pattern);
4168    }
4169  }
4170  var IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i);
4171  var Edge = userAgent(/Edge/i);
4172  var FireFox = userAgent(/firefox/i);
4173  var Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
4174  var IOS = userAgent(/iP(ad|od|hone)/i);
4175  var ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);
4176  var captureMode = {
4177    capture: false,
4178    passive: false
4179  };
4180  function on2(el, event, fn) {
4181    el.addEventListener(event, fn, !IE11OrLess && captureMode);
4182  }
4183  function off(el, event, fn) {
4184    el.removeEventListener(event, fn, !IE11OrLess && captureMode);
4185  }
4186  function matches(el, selector) {
4187    if (!selector) return;
4188    selector[0] === ">" && (selector = selector.substring(1));
4189    if (el) {
4190      try {
4191        if (el.matches) {
4192          return el.matches(selector);
4193        } else if (el.msMatchesSelector) {
4194          return el.msMatchesSelector(selector);
4195        } else if (el.webkitMatchesSelector) {
4196          return el.webkitMatchesSelector(selector);
4197        }
4198      } catch (_) {
4199        return false;
4200      }
4201    }
4202    return false;
4203  }
4204  function getParentOrHost(el) {
4205    return el.host && el !== document && el.host.nodeType && el.host !== el ? el.host : el.parentNode;
4206  }
4207  function closest(el, selector, ctx, includeCTX) {
4208    if (el) {
4209      ctx = ctx || document;
4210      do {
4211        if (selector != null && (selector[0] === ">" ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {
4212          return el;
4213        }
4214        if (el === ctx) break;
4215      } while (el = getParentOrHost(el));
4216    }
4217    return null;
4218  }
4219  var R_SPACE = /\s+/g;
4220  function toggleClass(el, name, state) {
4221    if (el && name) {
4222      if (el.classList) {
4223        el.classList[state ? "add" : "remove"](name);
4224      } else {
4225        var className = (" " + el.className + " ").replace(R_SPACE, " ").replace(" " + name + " ", " ");
4226        el.className = (className + (state ? " " + name : "")).replace(R_SPACE, " ");
4227      }
4228    }
4229  }
4230  function css(el, prop, val) {
4231    var style = el && el.style;
4232    if (style) {
4233      if (val === void 0) {
4234        if (document.defaultView && document.defaultView.getComputedStyle) {
4235          val = document.defaultView.getComputedStyle(el, "");
4236        } else if (el.currentStyle) {
4237          val = el.currentStyle;
4238        }
4239        return prop === void 0 ? val : val[prop];
4240      } else {
4241        if (!(prop in style) && prop.indexOf("webkit") === -1) {
4242          prop = "-webkit-" + prop;
4243        }
4244        style[prop] = val + (typeof val === "string" ? "" : "px");
4245      }
4246    }
4247  }
4248  function matrix(el, selfOnly) {
4249    var appliedTransforms = "";
4250    if (typeof el === "string") {
4251      appliedTransforms = el;
4252    } else {
4253      do {
4254        var transform = css(el, "transform");
4255        if (transform && transform !== "none") {
4256          appliedTransforms = transform + " " + appliedTransforms;
4257        }
4258      } while (!selfOnly && (el = el.parentNode));
4259    }
4260    var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;
4261    return matrixFn && new matrixFn(appliedTransforms);
4262  }
4263  function find(ctx, tagName, iterator) {
4264    if (ctx) {
4265      var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;
4266      if (iterator) {
4267        for (; i < n; i++) {
4268          iterator(list[i], i);
4269        }
4270      }
4271      return list;
4272    }
4273    return [];
4274  }
4275  function getWindowScrollingElement() {
4276    var scrollingElement = document.scrollingElement;
4277    if (scrollingElement) {
4278      return scrollingElement;
4279    } else {
4280      return document.documentElement;
4281    }
4282  }
4283  function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {
4284    if (!el.getBoundingClientRect && el !== window) return;
4285    var elRect, top, left, bottom, right, height, width;
4286    if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {
4287      elRect = el.getBoundingClientRect();
4288      top = elRect.top;
4289      left = elRect.left;
4290      bottom = elRect.bottom;
4291      right = elRect.right;
4292      height = elRect.height;
4293      width = elRect.width;
4294    } else {
4295      top = 0;
4296      left = 0;
4297      bottom = window.innerHeight;
4298      right = window.innerWidth;
4299      height = window.innerHeight;
4300      width = window.innerWidth;
4301    }
4302    if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {
4303      container = container || el.parentNode;
4304      if (!IE11OrLess) {
4305        do {
4306          if (container && container.getBoundingClientRect && (css(container, "transform") !== "none" || relativeToNonStaticParent && css(container, "position") !== "static")) {
4307            var containerRect = container.getBoundingClientRect();
4308            top -= containerRect.top + parseInt(css(container, "border-top-width"));
4309            left -= containerRect.left + parseInt(css(container, "border-left-width"));
4310            bottom = top + elRect.height;
4311            right = left + elRect.width;
4312            break;
4313          }
4314        } while (container = container.parentNode);
4315      }
4316    }
4317    if (undoScale && el !== window) {
4318      var elMatrix = matrix(container || el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d;
4319      if (elMatrix) {
4320        top /= scaleY;
4321        left /= scaleX;
4322        width /= scaleX;
4323        height /= scaleY;
4324        bottom = top + height;
4325        right = left + width;
4326      }
4327    }
4328    return {
4329      top,
4330      left,
4331      bottom,
4332      right,
4333      width,
4334      height
4335    };
4336  }
4337  function isScrolledPast(el, elSide, parentSide) {
4338    var parent = getParentAutoScrollElement(el, true), elSideVal = getRect(el)[elSide];
4339    while (parent) {
4340      var parentSideVal = getRect(parent)[parentSide], visible = void 0;
4341      if (parentSide === "top" || parentSide === "left") {
4342        visible = elSideVal >= parentSideVal;
4343      } else {
4344        visible = elSideVal <= parentSideVal;
4345      }
4346      if (!visible) return parent;
4347      if (parent === getWindowScrollingElement()) break;
4348      parent = getParentAutoScrollElement(parent, false);
4349    }
4350    return false;
4351  }
4352  function getChild(el, childNum, options, includeDragEl) {
4353    var currentChild = 0, i = 0, children = el.children;
4354    while (i < children.length) {
4355      if (children[i].style.display !== "none" && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {
4356        if (currentChild === childNum) {
4357          return children[i];
4358        }
4359        currentChild++;
4360      }
4361      i++;
4362    }
4363    return null;
4364  }
4365  function lastChild(el, selector) {
4366    var last = el.lastElementChild;
4367    while (last && (last === Sortable.ghost || css(last, "display") === "none" || selector && !matches(last, selector))) {
4368      last = last.previousElementSibling;
4369    }
4370    return last || null;
4371  }
4372  function index(el, selector) {
4373    var index2 = 0;
4374    if (!el || !el.parentNode) {
4375      return -1;
4376    }
4377    while (el = el.previousElementSibling) {
4378      if (el.nodeName.toUpperCase() !== "TEMPLATE" && el !== Sortable.clone && (!selector || matches(el, selector))) {
4379        index2++;
4380      }
4381    }
4382    return index2;
4383  }
4384  function getRelativeScrollOffset(el) {
4385    var offsetLeft = 0, offsetTop = 0, winScroller = getWindowScrollingElement();
4386    if (el) {
4387      do {
4388        var elMatrix = matrix(el), scaleX = elMatrix.a, scaleY = elMatrix.d;
4389        offsetLeft += el.scrollLeft * scaleX;
4390        offsetTop += el.scrollTop * scaleY;
4391      } while (el !== winScroller && (el = el.parentNode));
4392    }
4393    return [offsetLeft, offsetTop];
4394  }
4395  function indexOfObject(arr, obj) {
4396    for (var i in arr) {
4397      if (!arr.hasOwnProperty(i)) continue;
4398      for (var key in obj) {
4399        if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
4400      }
4401    }
4402    return -1;
4403  }
4404  function getParentAutoScrollElement(el, includeSelf) {
4405    if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
4406    var elem = el;
4407    var gotSelf = false;
4408    do {
4409      if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {
4410        var elemCSS = css(elem);
4411        if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == "auto" || elemCSS.overflowX == "scroll") || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == "auto" || elemCSS.overflowY == "scroll")) {
4412          if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();
4413          if (gotSelf || includeSelf) return elem;
4414          gotSelf = true;
4415        }
4416      }
4417    } while (elem = elem.parentNode);
4418    return getWindowScrollingElement();
4419  }
4420  function extend(dst, src) {
4421    if (dst && src) {
4422      for (var key in src) {
4423        if (src.hasOwnProperty(key)) {
4424          dst[key] = src[key];
4425        }
4426      }
4427    }
4428    return dst;
4429  }
4430  function isRectEqual(rect1, rect2) {
4431    return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);
4432  }
4433  var _throttleTimeout;
4434  function throttle2(callback, ms) {
4435    return function() {
4436      if (!_throttleTimeout) {
4437        var args = arguments, _this = this;
4438        if (args.length === 1) {
4439          callback.call(_this, args[0]);
4440        } else {
4441          callback.apply(_this, args);
4442        }
4443        _throttleTimeout = setTimeout(function() {
4444          _throttleTimeout = void 0;
4445        }, ms);
4446      }
4447    };
4448  }
4449  function cancelThrottle() {
4450    clearTimeout(_throttleTimeout);
4451    _throttleTimeout = void 0;
4452  }
4453  function scrollBy(el, x, y) {
4454    el.scrollLeft += x;
4455    el.scrollTop += y;
4456  }
4457  function clone2(el) {
4458    var Polymer = window.Polymer;
4459    var $ = window.jQuery || window.Zepto;
4460    if (Polymer && Polymer.dom) {
4461      return Polymer.dom(el).cloneNode(true);
4462    } else if ($) {
4463      return $(el).clone(true)[0];
4464    } else {
4465      return el.cloneNode(true);
4466    }
4467  }
4468  function getChildContainingRectFromElement(container, options, ghostEl2) {
4469    var rect = {};
4470    Array.from(container.children).forEach(function(child) {
4471      var _rect$left, _rect$top, _rect$right, _rect$bottom;
4472      if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl2) return;
4473      var childRect = getRect(child);
4474      rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);
4475      rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);
4476      rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);
4477      rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);
4478    });
4479    rect.width = rect.right - rect.left;
4480    rect.height = rect.bottom - rect.top;
4481    rect.x = rect.left;
4482    rect.y = rect.top;
4483    return rect;
4484  }
4485  var expando = "Sortable" + (/* @__PURE__ */ new Date()).getTime();
4486  function AnimationStateManager() {
4487    var animationStates = [], animationCallbackId;
4488    return {
4489      captureAnimationState: function captureAnimationState() {
4490        animationStates = [];
4491        if (!this.options.animation) return;
4492        var children = [].slice.call(this.el.children);
4493        children.forEach(function(child) {
4494          if (css(child, "display") === "none" || child === Sortable.ghost) return;
4495          animationStates.push({
4496            target: child,
4497            rect: getRect(child)
4498          });
4499          var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);
4500          if (child.thisAnimationDuration) {
4501            var childMatrix = matrix(child, true);
4502            if (childMatrix) {
4503              fromRect.top -= childMatrix.f;
4504              fromRect.left -= childMatrix.e;
4505            }
4506          }
4507          child.fromRect = fromRect;
4508        });
4509      },
4510      addAnimationState: function addAnimationState(state) {
4511        animationStates.push(state);
4512      },
4513      removeAnimationState: function removeAnimationState(target) {
4514        animationStates.splice(indexOfObject(animationStates, {
4515          target
4516        }), 1);
4517      },
4518      animateAll: function animateAll(callback) {
4519        var _this = this;
4520        if (!this.options.animation) {
4521          clearTimeout(animationCallbackId);
4522          if (typeof callback === "function") callback();
4523          return;
4524        }
4525        var animating = false, animationTime = 0;
4526        animationStates.forEach(function(state) {
4527          var time = 0, target = state.target, fromRect = target.fromRect, toRect = getRect(target), prevFromRect = target.prevFromRect, prevToRect = target.prevToRect, animatingRect = state.rect, targetMatrix = matrix(target, true);
4528          if (targetMatrix) {
4529            toRect.top -= targetMatrix.f;
4530            toRect.left -= targetMatrix.e;
4531          }
4532          target.toRect = toRect;
4533          if (target.thisAnimationDuration) {
4534            if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect
4535            (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {
4536              time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);
4537            }
4538          }
4539          if (!isRectEqual(toRect, fromRect)) {
4540            target.prevFromRect = fromRect;
4541            target.prevToRect = toRect;
4542            if (!time) {
4543              time = _this.options.animation;
4544            }
4545            _this.animate(target, animatingRect, toRect, time);
4546          }
4547          if (time) {
4548            animating = true;
4549            animationTime = Math.max(animationTime, time);
4550            clearTimeout(target.animationResetTimer);
4551            target.animationResetTimer = setTimeout(function() {
4552              target.animationTime = 0;
4553              target.prevFromRect = null;
4554              target.fromRect = null;
4555              target.prevToRect = null;
4556              target.thisAnimationDuration = null;
4557            }, time);
4558            target.thisAnimationDuration = time;
4559          }
4560        });
4561        clearTimeout(animationCallbackId);
4562        if (!animating) {
4563          if (typeof callback === "function") callback();
4564        } else {
4565          animationCallbackId = setTimeout(function() {
4566            if (typeof callback === "function") callback();
4567          }, animationTime);
4568        }
4569        animationStates = [];
4570      },
4571      animate: function animate(target, currentRect, toRect, duration) {
4572        if (duration) {
4573          css(target, "transition", "");
4574          css(target, "transform", "");
4575          var elMatrix = matrix(this.el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d, translateX = (currentRect.left - toRect.left) / (scaleX || 1), translateY = (currentRect.top - toRect.top) / (scaleY || 1);
4576          target.animatingX = !!translateX;
4577          target.animatingY = !!translateY;
4578          css(target, "transform", "translate3d(" + translateX + "px," + translateY + "px,0)");
4579          this.forRepaintDummy = repaint(target);
4580          css(target, "transition", "transform " + duration + "ms" + (this.options.easing ? " " + this.options.easing : ""));
4581          css(target, "transform", "translate3d(0,0,0)");
4582          typeof target.animated === "number" && clearTimeout(target.animated);
4583          target.animated = setTimeout(function() {
4584            css(target, "transition", "");
4585            css(target, "transform", "");
4586            target.animated = false;
4587            target.animatingX = false;
4588            target.animatingY = false;
4589          }, duration);
4590        }
4591      }
4592    };
4593  }
4594  function repaint(target) {
4595    return target.offsetWidth;
4596  }
4597  function calculateRealTime(animatingRect, fromRect, toRect, options) {
4598    return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;
4599  }
4600  var plugins = [];
4601  var defaults = {
4602    initializeByDefault: true
4603  };
4604  var PluginManager = {
4605    mount: function mount(plugin2) {
4606      for (var option2 in defaults) {
4607        if (defaults.hasOwnProperty(option2) && !(option2 in plugin2)) {
4608          plugin2[option2] = defaults[option2];
4609        }
4610      }
4611      plugins.forEach(function(p) {
4612        if (p.pluginName === plugin2.pluginName) {
4613          throw "Sortable: Cannot mount plugin ".concat(plugin2.pluginName, " more than once");
4614        }
4615      });
4616      plugins.push(plugin2);
4617    },
4618    pluginEvent: function pluginEvent(eventName, sortable, evt) {
4619      var _this = this;
4620      this.eventCanceled = false;
4621      evt.cancel = function() {
4622        _this.eventCanceled = true;
4623      };
4624      var eventNameGlobal = eventName + "Global";
4625      plugins.forEach(function(plugin2) {
4626        if (!sortable[plugin2.pluginName]) return;
4627        if (sortable[plugin2.pluginName][eventNameGlobal]) {
4628          sortable[plugin2.pluginName][eventNameGlobal](_objectSpread2({
4629            sortable
4630          }, evt));
4631        }
4632        if (sortable.options[plugin2.pluginName] && sortable[plugin2.pluginName][eventName]) {
4633          sortable[plugin2.pluginName][eventName](_objectSpread2({
4634            sortable
4635          }, evt));
4636        }
4637      });
4638    },
4639    initializePlugins: function initializePlugins(sortable, el, defaults2, options) {
4640      plugins.forEach(function(plugin2) {
4641        var pluginName = plugin2.pluginName;
4642        if (!sortable.options[pluginName] && !plugin2.initializeByDefault) return;
4643        var initialized = new plugin2(sortable, el, sortable.options);
4644        initialized.sortable = sortable;
4645        initialized.options = sortable.options;
4646        sortable[pluginName] = initialized;
4647        _extends(defaults2, initialized.defaults);
4648      });
4649      for (var option2 in sortable.options) {
4650        if (!sortable.options.hasOwnProperty(option2)) continue;
4651        var modified = this.modifyOption(sortable, option2, sortable.options[option2]);
4652        if (typeof modified !== "undefined") {
4653          sortable.options[option2] = modified;
4654        }
4655      }
4656    },
4657    getEventProperties: function getEventProperties(name, sortable) {
4658      var eventProperties = {};
4659      plugins.forEach(function(plugin2) {
4660        if (typeof plugin2.eventProperties !== "function") return;
4661        _extends(eventProperties, plugin2.eventProperties.call(sortable[plugin2.pluginName], name));
4662      });
4663      return eventProperties;
4664    },
4665    modifyOption: function modifyOption(sortable, name, value) {
4666      var modifiedValue;
4667      plugins.forEach(function(plugin2) {
4668        if (!sortable[plugin2.pluginName]) return;
4669        if (plugin2.optionListeners && typeof plugin2.optionListeners[name] === "function") {
4670          modifiedValue = plugin2.optionListeners[name].call(sortable[plugin2.pluginName], value);
4671        }
4672      });
4673      return modifiedValue;
4674    }
4675  };
4676  function dispatchEvent(_ref) {
4677    var sortable = _ref.sortable, rootEl2 = _ref.rootEl, name = _ref.name, targetEl = _ref.targetEl, cloneEl2 = _ref.cloneEl, toEl = _ref.toEl, fromEl = _ref.fromEl, oldIndex2 = _ref.oldIndex, newIndex2 = _ref.newIndex, oldDraggableIndex2 = _ref.oldDraggableIndex, newDraggableIndex2 = _ref.newDraggableIndex, originalEvent = _ref.originalEvent, putSortable2 = _ref.putSortable, extraEventProperties = _ref.extraEventProperties;
4678    sortable = sortable || rootEl2 && rootEl2[expando];
4679    if (!sortable) return;
4680    var evt, options = sortable.options, onName = "on" + name.charAt(0).toUpperCase() + name.substr(1);
4681    if (window.CustomEvent && !IE11OrLess && !Edge) {
4682      evt = new CustomEvent(name, {
4683        bubbles: true,
4684        cancelable: true
4685      });
4686    } else {
4687      evt = document.createEvent("Event");
4688      evt.initEvent(name, true, true);
4689    }
4690    evt.to = toEl || rootEl2;
4691    evt.from = fromEl || rootEl2;
4692    evt.item = targetEl || rootEl2;
4693    evt.clone = cloneEl2;
4694    evt.oldIndex = oldIndex2;
4695    evt.newIndex = newIndex2;
4696    evt.oldDraggableIndex = oldDraggableIndex2;
4697    evt.newDraggableIndex = newDraggableIndex2;
4698    evt.originalEvent = originalEvent;
4699    evt.pullMode = putSortable2 ? putSortable2.lastPutMode : void 0;
4700    var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));
4701    for (var option2 in allEventProperties) {
4702      evt[option2] = allEventProperties[option2];
4703    }
4704    if (rootEl2) {
4705      rootEl2.dispatchEvent(evt);
4706    }
4707    if (options[onName]) {
4708      options[onName].call(sortable, evt);
4709    }
4710  }
4711  var _excluded = ["evt"];
4712  var pluginEvent2 = function pluginEvent3(eventName, sortable) {
4713    var _ref = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, originalEvent = _ref.evt, data2 = _objectWithoutProperties(_ref, _excluded);
4714    PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({
4715      dragEl,
4716      parentEl,
4717      ghostEl,
4718      rootEl,
4719      nextEl,
4720      lastDownEl,
4721      cloneEl,
4722      cloneHidden,
4723      dragStarted: moved,
4724      putSortable,
4725      activeSortable: Sortable.active,
4726      originalEvent,
4727      oldIndex,
4728      oldDraggableIndex,
4729      newIndex,
4730      newDraggableIndex,
4731      hideGhostForTarget: _hideGhostForTarget,
4732      unhideGhostForTarget: _unhideGhostForTarget,
4733      cloneNowHidden: function cloneNowHidden() {
4734        cloneHidden = true;
4735      },
4736      cloneNowShown: function cloneNowShown() {
4737        cloneHidden = false;
4738      },
4739      dispatchSortableEvent: function dispatchSortableEvent(name) {
4740        _dispatchEvent({
4741          sortable,
4742          name,
4743          originalEvent
4744        });
4745      }
4746    }, data2));
4747  };
4748  function _dispatchEvent(info) {
4749    dispatchEvent(_objectSpread2({
4750      putSortable,
4751      cloneEl,
4752      targetEl: dragEl,
4753      rootEl,
4754      oldIndex,
4755      oldDraggableIndex,
4756      newIndex,
4757      newDraggableIndex
4758    }, info));
4759  }
4760  var dragEl;
4761  var parentEl;
4762  var ghostEl;
4763  var rootEl;
4764  var nextEl;
4765  var lastDownEl;
4766  var cloneEl;
4767  var cloneHidden;
4768  var oldIndex;
4769  var newIndex;
4770  var oldDraggableIndex;
4771  var newDraggableIndex;
4772  var activeGroup;
4773  var putSortable;
4774  var awaitingDragStarted = false;
4775  var ignoreNextClick = false;
4776  var sortables = [];
4777  var tapEvt;
4778  var touchEvt;
4779  var lastDx;
4780  var lastDy;
4781  var tapDistanceLeft;
4782  var tapDistanceTop;
4783  var moved;
4784  var lastTarget;
4785  var lastDirection;
4786  var pastFirstInvertThresh = false;
4787  var isCircumstantialInvert = false;
4788  var targetMoveDistance;
4789  var ghostRelativeParent;
4790  var ghostRelativeParentInitialScroll = [];
4791  var _silent = false;
4792  var savedInputChecked = [];
4793  var documentExists = typeof document !== "undefined";
4794  var PositionGhostAbsolutely = IOS;
4795  var CSSFloatProperty = Edge || IE11OrLess ? "cssFloat" : "float";
4796  var supportDraggable = documentExists && !ChromeForAndroid && !IOS && "draggable" in document.createElement("div");
4797  var supportCssPointerEvents = (function() {
4798    if (!documentExists) return;
4799    if (IE11OrLess) {
4800      return false;
4801    }
4802    var el = document.createElement("x");
4803    el.style.cssText = "pointer-events:auto";
4804    return el.style.pointerEvents === "auto";
4805  })();
4806  var _detectDirection = function _detectDirection2(el, options) {
4807    var elCSS = css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = getChild(el, 0, options), child2 = getChild(el, 1, options), firstChildCSS = child1 && css(child1), secondChildCSS = child2 && css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;
4808    if (elCSS.display === "flex") {
4809      return elCSS.flexDirection === "column" || elCSS.flexDirection === "column-reverse" ? "vertical" : "horizontal";
4810    }
4811    if (elCSS.display === "grid") {
4812      return elCSS.gridTemplateColumns.split(" ").length <= 1 ? "vertical" : "horizontal";
4813    }
4814    if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== "none") {
4815      var touchingSideChild2 = firstChildCSS["float"] === "left" ? "left" : "right";
4816      return child2 && (secondChildCSS.clear === "both" || secondChildCSS.clear === touchingSideChild2) ? "vertical" : "horizontal";
4817    }
4818    return child1 && (firstChildCSS.display === "block" || firstChildCSS.display === "flex" || firstChildCSS.display === "table" || firstChildCSS.display === "grid" || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === "none" || child2 && elCSS[CSSFloatProperty] === "none" && firstChildWidth + secondChildWidth > elWidth) ? "vertical" : "horizontal";
4819  };
4820  var _dragElInRowColumn = function _dragElInRowColumn2(dragRect, targetRect, vertical) {
4821    var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height;
4822    return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;
4823  };
4824  var _detectNearestEmptySortable = function _detectNearestEmptySortable2(x, y) {
4825    var ret;
4826    sortables.some(function(sortable) {
4827      var threshold = sortable[expando].options.emptyInsertThreshold;
4828      if (!threshold || lastChild(sortable)) return;
4829      var rect = getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;
4830      if (insideHorizontally && insideVertically) {
4831        return ret = sortable;
4832      }
4833    });
4834    return ret;
4835  };
4836  var _prepareGroup = function _prepareGroup2(options) {
4837    function toFn(value, pull) {
4838      return function(to, from, dragEl2, evt) {
4839        var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;
4840        if (value == null && (pull || sameGroup)) {
4841          return true;
4842        } else if (value == null || value === false) {
4843          return false;
4844        } else if (pull && value === "clone") {
4845          return value;
4846        } else if (typeof value === "function") {
4847          return toFn(value(to, from, dragEl2, evt), pull)(to, from, dragEl2, evt);
4848        } else {
4849          var otherGroup = (pull ? to : from).options.group.name;
4850          return value === true || typeof value === "string" && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;
4851        }
4852      };
4853    }
4854    var group = {};
4855    var originalGroup = options.group;
4856    if (!originalGroup || _typeof(originalGroup) != "object") {
4857      originalGroup = {
4858        name: originalGroup
4859      };
4860    }
4861    group.name = originalGroup.name;
4862    group.checkPull = toFn(originalGroup.pull, true);
4863    group.checkPut = toFn(originalGroup.put);
4864    group.revertClone = originalGroup.revertClone;
4865    options.group = group;
4866  };
4867  var _hideGhostForTarget = function _hideGhostForTarget2() {
4868    if (!supportCssPointerEvents && ghostEl) {
4869      css(ghostEl, "display", "none");
4870    }
4871  };
4872  var _unhideGhostForTarget = function _unhideGhostForTarget2() {
4873    if (!supportCssPointerEvents && ghostEl) {
4874      css(ghostEl, "display", "");
4875    }
4876  };
4877  if (documentExists && !ChromeForAndroid) {
4878    document.addEventListener("click", function(evt) {
4879      if (ignoreNextClick) {
4880        evt.preventDefault();
4881        evt.stopPropagation && evt.stopPropagation();
4882        evt.stopImmediatePropagation && evt.stopImmediatePropagation();
4883        ignoreNextClick = false;
4884        return false;
4885      }
4886    }, true);
4887  }
4888  var nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent2(evt) {
4889    if (dragEl) {
4890      evt = evt.touches ? evt.touches[0] : evt;
4891      var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);
4892      if (nearest) {
4893        var event = {};
4894        for (var i in evt) {
4895          if (evt.hasOwnProperty(i)) {
4896            event[i] = evt[i];
4897          }
4898        }
4899        event.target = event.rootEl = nearest;
4900        event.preventDefault = void 0;
4901        event.stopPropagation = void 0;
4902        nearest[expando]._onDragOver(event);
4903      }
4904    }
4905  };
4906  var _checkOutsideTargetEl = function _checkOutsideTargetEl2(evt) {
4907    if (dragEl) {
4908      dragEl.parentNode[expando]._isOutsideThisEl(evt.target);
4909    }
4910  };
4911  function Sortable(el, options) {
4912    if (!(el && el.nodeType && el.nodeType === 1)) {
4913      throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(el));
4914    }
4915    this.el = el;
4916    this.options = options = _extends({}, options);
4917    el[expando] = this;
4918    var defaults2 = {
4919      group: null,
4920      sort: true,
4921      disabled: false,
4922      store: null,
4923      handle: null,
4924      draggable: /^[uo]l$/i.test(el.nodeName) ? ">li" : ">*",
4925      swapThreshold: 1,
4926      // percentage; 0 <= x <= 1
4927      invertSwap: false,
4928      // invert always
4929      invertedSwapThreshold: null,
4930      // will be set to same as swapThreshold if default
4931      removeCloneOnHide: true,
4932      direction: function direction() {
4933        return _detectDirection(el, this.options);
4934      },
4935      ghostClass: "sortable-ghost",
4936      chosenClass: "sortable-chosen",
4937      dragClass: "sortable-drag",
4938      ignore: "a, img",
4939      filter: null,
4940      preventOnFilter: true,
4941      animation: 0,
4942      easing: null,
4943      setData: function setData(dataTransfer, dragEl2) {
4944        dataTransfer.setData("Text", dragEl2.textContent);
4945      },
4946      dropBubble: false,
4947      dragoverBubble: false,
4948      dataIdAttr: "data-id",
4949      delay: 0,
4950      delayOnTouchOnly: false,
4951      touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,
4952      forceFallback: false,
4953      fallbackClass: "sortable-fallback",
4954      fallbackOnBody: false,
4955      fallbackTolerance: 0,
4956      fallbackOffset: {
4957        x: 0,
4958        y: 0
4959      },
4960      // Disabled on Safari: #1571; Enabled on Safari IOS: #2244
4961      supportPointer: Sortable.supportPointer !== false && "PointerEvent" in window && (!Safari || IOS),
4962      emptyInsertThreshold: 5
4963    };
4964    PluginManager.initializePlugins(this, el, defaults2);
4965    for (var name in defaults2) {
4966      !(name in options) && (options[name] = defaults2[name]);
4967    }
4968    _prepareGroup(options);
4969    for (var fn in this) {
4970      if (fn.charAt(0) === "_" && typeof this[fn] === "function") {
4971        this[fn] = this[fn].bind(this);
4972      }
4973    }
4974    this.nativeDraggable = options.forceFallback ? false : supportDraggable;
4975    if (this.nativeDraggable) {
4976      this.options.touchStartThreshold = 1;
4977    }
4978    if (options.supportPointer) {
4979      on2(el, "pointerdown", this._onTapStart);
4980    } else {
4981      on2(el, "mousedown", this._onTapStart);
4982      on2(el, "touchstart", this._onTapStart);
4983    }
4984    if (this.nativeDraggable) {
4985      on2(el, "dragover", this);
4986      on2(el, "dragenter", this);
4987    }
4988    sortables.push(this.el);
4989    options.store && options.store.get && this.sort(options.store.get(this) || []);
4990    _extends(this, AnimationStateManager());
4991  }
4992  Sortable.prototype = /** @lends Sortable.prototype */
4993  {
4994    constructor: Sortable,
4995    _isOutsideThisEl: function _isOutsideThisEl(target) {
4996      if (!this.el.contains(target) && target !== this.el) {
4997        lastTarget = null;
4998      }
4999    },
5000    _getDirection: function _getDirection(evt, target) {
5001      return typeof this.options.direction === "function" ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;
5002    },
5003    _onTapStart: function _onTapStart(evt) {
5004      if (!evt.cancelable) return;
5005      var _this = this, el = this.el, options = this.options, preventOnFilter = options.preventOnFilter, type = evt.type, touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === "touch" && evt, target = (touch || evt).target, originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, filter = options.filter;
5006      _saveInputCheckedState(el);
5007      if (dragEl) {
5008        return;
5009      }
5010      if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {
5011        return;
5012      }
5013      if (originalTarget.isContentEditable) {
5014        return;
5015      }
5016      if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === "SELECT") {
5017        return;
5018      }
5019      target = closest(target, options.draggable, el, false);
5020      if (target && target.animated) {
5021        return;
5022      }
5023      if (lastDownEl === target) {
5024        return;
5025      }
5026      oldIndex = index(target);
5027      oldDraggableIndex = index(target, options.draggable);
5028      if (typeof filter === "function") {
5029        if (filter.call(this, evt, target, this)) {
5030          _dispatchEvent({
5031            sortable: _this,
5032            rootEl: originalTarget,
5033            name: "filter",
5034            targetEl: target,
5035            toEl: el,
5036            fromEl: el
5037          });
5038          pluginEvent2("filter", _this, {
5039            evt
5040          });
5041          preventOnFilter && evt.preventDefault();
5042          return;
5043        }
5044      } else if (filter) {
5045        filter = filter.split(",").some(function(criteria) {
5046          criteria = closest(originalTarget, criteria.trim(), el, false);
5047          if (criteria) {
5048            _dispatchEvent({
5049              sortable: _this,
5050              rootEl: criteria,
5051              name: "filter",
5052              targetEl: target,
5053              fromEl: el,
5054              toEl: el
5055            });
5056            pluginEvent2("filter", _this, {
5057              evt
5058            });
5059            return true;
5060          }
5061        });
5062        if (filter) {
5063          preventOnFilter && evt.preventDefault();
5064          return;
5065        }
5066      }
5067      if (options.handle && !closest(originalTarget, options.handle, el, false)) {
5068        return;
5069      }
5070      this._prepareDragStart(evt, touch, target);
5071    },
5072    _prepareDragStart: function _prepareDragStart(evt, touch, target) {
5073      var _this = this, el = _this.el, options = _this.options, ownerDocument = el.ownerDocument, dragStartFn;
5074      if (target && !dragEl && target.parentNode === el) {
5075        var dragRect = getRect(target);
5076        rootEl = el;
5077        dragEl = target;
5078        parentEl = dragEl.parentNode;
5079        nextEl = dragEl.nextSibling;
5080        lastDownEl = target;
5081        activeGroup = options.group;
5082        Sortable.dragged = dragEl;
5083        tapEvt = {
5084          target: dragEl,
5085          clientX: (touch || evt).clientX,
5086          clientY: (touch || evt).clientY
5087        };
5088        tapDistanceLeft = tapEvt.clientX - dragRect.left;
5089        tapDistanceTop = tapEvt.clientY - dragRect.top;
5090        this._lastX = (touch || evt).clientX;
5091        this._lastY = (touch || evt).clientY;
5092        dragEl.style["will-change"] = "all";
5093        dragStartFn = function dragStartFn2() {
5094          pluginEvent2("delayEnded", _this, {
5095            evt
5096          });
5097          if (Sortable.eventCanceled) {
5098            _this._onDrop();
5099            return;
5100          }
5101          _this._disableDelayedDragEvents();
5102          if (!FireFox && _this.nativeDraggable) {
5103            dragEl.draggable = true;
5104          }
5105          _this._triggerDragStart(evt, touch);
5106          _dispatchEvent({
5107            sortable: _this,
5108            name: "choose",
5109            originalEvent: evt
5110          });
5111          toggleClass(dragEl, options.chosenClass, true);
5112        };
5113        options.ignore.split(",").forEach(function(criteria) {
5114          find(dragEl, criteria.trim(), _disableDraggable);
5115        });
5116        on2(ownerDocument, "dragover", nearestEmptyInsertDetectEvent);
5117        on2(ownerDocument, "mousemove", nearestEmptyInsertDetectEvent);
5118        on2(ownerDocument, "touchmove", nearestEmptyInsertDetectEvent);
5119        if (options.supportPointer) {
5120          on2(ownerDocument, "pointerup", _this._onDrop);
5121          !this.nativeDraggable && on2(ownerDocument, "pointercancel", _this._onDrop);
5122        } else {
5123          on2(ownerDocument, "mouseup", _this._onDrop);
5124          on2(ownerDocument, "touchend", _this._onDrop);
5125          on2(ownerDocument, "touchcancel", _this._onDrop);
5126        }
5127        if (FireFox && this.nativeDraggable) {
5128          this.options.touchStartThreshold = 4;
5129          dragEl.draggable = true;
5130        }
5131        pluginEvent2("delayStart", this, {
5132          evt
5133        });
5134        if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {
5135          if (Sortable.eventCanceled) {
5136            this._onDrop();
5137            return;
5138          }
5139          if (options.supportPointer) {
5140            on2(ownerDocument, "pointerup", _this._disableDelayedDrag);
5141            on2(ownerDocument, "pointercancel", _this._disableDelayedDrag);
5142          } else {
5143            on2(ownerDocument, "mouseup", _this._disableDelayedDrag);
5144            on2(ownerDocument, "touchend", _this._disableDelayedDrag);
5145            on2(ownerDocument, "touchcancel", _this._disableDelayedDrag);
5146          }
5147          on2(ownerDocument, "mousemove", _this._delayedDragTouchMoveHandler);
5148          on2(ownerDocument, "touchmove", _this._delayedDragTouchMoveHandler);
5149          options.supportPointer && on2(ownerDocument, "pointermove", _this._delayedDragTouchMoveHandler);
5150          _this._dragStartTimer = setTimeout(dragStartFn, options.delay);
5151        } else {
5152          dragStartFn();
5153        }
5154      }
5155    },
5156    _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(e) {
5157      var touch = e.touches ? e.touches[0] : e;
5158      if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {
5159        this._disableDelayedDrag();
5160      }
5161    },
5162    _disableDelayedDrag: function _disableDelayedDrag() {
5163      dragEl && _disableDraggable(dragEl);
5164      clearTimeout(this._dragStartTimer);
5165      this._disableDelayedDragEvents();
5166    },
5167    _disableDelayedDragEvents: function _disableDelayedDragEvents() {
5168      var ownerDocument = this.el.ownerDocument;
5169      off(ownerDocument, "mouseup", this._disableDelayedDrag);
5170      off(ownerDocument, "touchend", this._disableDelayedDrag);
5171      off(ownerDocument, "touchcancel", this._disableDelayedDrag);
5172      off(ownerDocument, "pointerup", this._disableDelayedDrag);
5173      off(ownerDocument, "pointercancel", this._disableDelayedDrag);
5174      off(ownerDocument, "mousemove", this._delayedDragTouchMoveHandler);
5175      off(ownerDocument, "touchmove", this._delayedDragTouchMoveHandler);
5176      off(ownerDocument, "pointermove", this._delayedDragTouchMoveHandler);
5177    },
5178    _triggerDragStart: function _triggerDragStart(evt, touch) {
5179      touch = touch || evt.pointerType == "touch" && evt;
5180      if (!this.nativeDraggable || touch) {
5181        if (this.options.supportPointer) {
5182          on2(document, "pointermove", this._onTouchMove);
5183        } else if (touch) {
5184          on2(document, "touchmove", this._onTouchMove);
5185        } else {
5186          on2(document, "mousemove", this._onTouchMove);
5187        }
5188      } else {
5189        on2(dragEl, "dragend", this);
5190        on2(rootEl, "dragstart", this._onDragStart);
5191      }
5192      try {
5193        if (document.selection) {
5194          _nextTick(function() {
5195            document.selection.empty();
5196          });
5197        } else {
5198          window.getSelection().removeAllRanges();
5199        }
5200      } catch (err) {
5201      }
5202    },
5203    _dragStarted: function _dragStarted(fallback, evt) {
5204      awaitingDragStarted = false;
5205      if (rootEl && dragEl) {
5206        pluginEvent2("dragStarted", this, {
5207          evt
5208        });
5209        if (this.nativeDraggable) {
5210          on2(document, "dragover", _checkOutsideTargetEl);
5211        }
5212        var options = this.options;
5213        !fallback && toggleClass(dragEl, options.dragClass, false);
5214        toggleClass(dragEl, options.ghostClass, true);
5215        Sortable.active = this;
5216        fallback && this._appendGhost();
5217        _dispatchEvent({
5218          sortable: this,
5219          name: "start",
5220          originalEvent: evt
5221        });
5222      } else {
5223        this._nulling();
5224      }
5225    },
5226    _emulateDragOver: function _emulateDragOver() {
5227      if (touchEvt) {
5228        this._lastX = touchEvt.clientX;
5229        this._lastY = touchEvt.clientY;
5230        _hideGhostForTarget();
5231        var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);
5232        var parent = target;
5233        while (target && target.shadowRoot) {
5234          target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);
5235          if (target === parent) break;
5236          parent = target;
5237        }
5238        dragEl.parentNode[expando]._isOutsideThisEl(target);
5239        if (parent) {
5240          do {
5241            if (parent[expando]) {
5242              var inserted = void 0;
5243              inserted = parent[expando]._onDragOver({
5244                clientX: touchEvt.clientX,
5245                clientY: touchEvt.clientY,
5246                target,
5247                rootEl: parent
5248              });
5249              if (inserted && !this.options.dragoverBubble) {
5250                break;
5251              }
5252            }
5253            target = parent;
5254          } while (parent = getParentOrHost(parent));
5255        }
5256        _unhideGhostForTarget();
5257      }
5258    },
5259    _onTouchMove: function _onTouchMove(evt) {
5260      if (tapEvt) {
5261        var options = this.options, fallbackTolerance = options.fallbackTolerance, fallbackOffset = options.fallbackOffset, touch = evt.touches ? evt.touches[0] : evt, ghostMatrix = ghostEl && matrix(ghostEl, true), scaleX = ghostEl && ghostMatrix && ghostMatrix.a, scaleY = ghostEl && ghostMatrix && ghostMatrix.d, relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);
5262        if (!Sortable.active && !awaitingDragStarted) {
5263          if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {
5264            return;
5265          }
5266          this._onDragStart(evt, true);
5267        }
5268        if (ghostEl) {
5269          if (ghostMatrix) {
5270            ghostMatrix.e += dx - (lastDx || 0);
5271            ghostMatrix.f += dy - (lastDy || 0);
5272          } else {
5273            ghostMatrix = {
5274              a: 1,
5275              b: 0,
5276              c: 0,
5277              d: 1,
5278              e: dx,
5279              f: dy
5280            };
5281          }
5282          var cssMatrix = "matrix(".concat(ghostMatrix.a, ",").concat(ghostMatrix.b, ",").concat(ghostMatrix.c, ",").concat(ghostMatrix.d, ",").concat(ghostMatrix.e, ",").concat(ghostMatrix.f, ")");
5283          css(ghostEl, "webkitTransform", cssMatrix);
5284          css(ghostEl, "mozTransform", cssMatrix);
5285          css(ghostEl, "msTransform", cssMatrix);
5286          css(ghostEl, "transform", cssMatrix);
5287          lastDx = dx;
5288          lastDy = dy;
5289          touchEvt = touch;
5290        }
5291        evt.cancelable && evt.preventDefault();
5292      }
5293    },
5294    _appendGhost: function _appendGhost() {
5295      if (!ghostEl) {
5296        var container = this.options.fallbackOnBody ? document.body : rootEl, rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), options = this.options;
5297        if (PositionGhostAbsolutely) {
5298          ghostRelativeParent = container;
5299          while (css(ghostRelativeParent, "position") === "static" && css(ghostRelativeParent, "transform") === "none" && ghostRelativeParent !== document) {
5300            ghostRelativeParent = ghostRelativeParent.parentNode;
5301          }
5302          if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {
5303            if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();
5304            rect.top += ghostRelativeParent.scrollTop;
5305            rect.left += ghostRelativeParent.scrollLeft;
5306          } else {
5307            ghostRelativeParent = getWindowScrollingElement();
5308          }
5309          ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);
5310        }
5311        ghostEl = dragEl.cloneNode(true);
5312        toggleClass(ghostEl, options.ghostClass, false);
5313        toggleClass(ghostEl, options.fallbackClass, true);
5314        toggleClass(ghostEl, options.dragClass, true);
5315        css(ghostEl, "transition", "");
5316        css(ghostEl, "transform", "");
5317        css(ghostEl, "box-sizing", "border-box");
5318        css(ghostEl, "margin", 0);
5319        css(ghostEl, "top", rect.top);
5320        css(ghostEl, "left", rect.left);
5321        css(ghostEl, "width", rect.width);
5322        css(ghostEl, "height", rect.height);
5323        css(ghostEl, "opacity", "0.8");
5324        css(ghostEl, "position", PositionGhostAbsolutely ? "absolute" : "fixed");
5325        css(ghostEl, "zIndex", "100000");
5326        css(ghostEl, "pointerEvents", "none");
5327        Sortable.ghost = ghostEl;
5328        container.appendChild(ghostEl);
5329        css(ghostEl, "transform-origin", tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + "% " + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + "%");
5330      }
5331    },
5332    _onDragStart: function _onDragStart(evt, fallback) {
5333      var _this = this;
5334      var dataTransfer = evt.dataTransfer;
5335      var options = _this.options;
5336      pluginEvent2("dragStart", this, {
5337        evt
5338      });
5339      if (Sortable.eventCanceled) {
5340        this._onDrop();
5341        return;
5342      }
5343      pluginEvent2("setupClone", this);
5344      if (!Sortable.eventCanceled) {
5345        cloneEl = clone2(dragEl);
5346        cloneEl.removeAttribute("id");
5347        cloneEl.draggable = false;
5348        cloneEl.style["will-change"] = "";
5349        this._hideClone();
5350        toggleClass(cloneEl, this.options.chosenClass, false);
5351        Sortable.clone = cloneEl;
5352      }
5353      _this.cloneId = _nextTick(function() {
5354        pluginEvent2("clone", _this);
5355        if (Sortable.eventCanceled) return;
5356        if (!_this.options.removeCloneOnHide) {
5357          rootEl.insertBefore(cloneEl, dragEl);
5358        }
5359        _this._hideClone();
5360        _dispatchEvent({
5361          sortable: _this,
5362          name: "clone"
5363        });
5364      });
5365      !fallback && toggleClass(dragEl, options.dragClass, true);
5366      if (fallback) {
5367        ignoreNextClick = true;
5368        _this._loopId = setInterval(_this._emulateDragOver, 50);
5369      } else {
5370        off(document, "mouseup", _this._onDrop);
5371        off(document, "touchend", _this._onDrop);
5372        off(document, "touchcancel", _this._onDrop);
5373        if (dataTransfer) {
5374          dataTransfer.effectAllowed = "move";
5375          options.setData && options.setData.call(_this, dataTransfer, dragEl);
5376        }
5377        on2(document, "drop", _this);
5378        css(dragEl, "transform", "translateZ(0)");
5379      }
5380      awaitingDragStarted = true;
5381      _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));
5382      on2(document, "selectstart", _this);
5383      moved = true;
5384      window.getSelection().removeAllRanges();
5385      if (Safari) {
5386        css(document.body, "user-select", "none");
5387      }
5388    },
5389    // Returns true - if no further action is needed (either inserted or another condition)
5390    _onDragOver: function _onDragOver(evt) {
5391      var el = this.el, target = evt.target, dragRect, targetRect, revert, options = this.options, group = options.group, activeSortable = Sortable.active, isOwner = activeGroup === group, canSort = options.sort, fromSortable = putSortable || activeSortable, vertical, _this = this, completedFired = false;
5392      if (_silent) return;
5393      function dragOverEvent(name, extra) {
5394        pluginEvent2(name, _this, _objectSpread2({
5395          evt,
5396          isOwner,
5397          axis: vertical ? "vertical" : "horizontal",
5398          revert,
5399          dragRect,
5400          targetRect,
5401          canSort,
5402          fromSortable,
5403          target,
5404          completed,
5405          onMove: function onMove(target2, after2) {
5406            return _onMove(rootEl, el, dragEl, dragRect, target2, getRect(target2), evt, after2);
5407          },
5408          changed
5409        }, extra));
5410      }
5411      function capture() {
5412        dragOverEvent("dragOverAnimationCapture");
5413        _this.captureAnimationState();
5414        if (_this !== fromSortable) {
5415          fromSortable.captureAnimationState();
5416        }
5417      }
5418      function completed(insertion) {
5419        dragOverEvent("dragOverCompleted", {
5420          insertion
5421        });
5422        if (insertion) {
5423          if (isOwner) {
5424            activeSortable._hideClone();
5425          } else {
5426            activeSortable._showClone(_this);
5427          }
5428          if (_this !== fromSortable) {
5429            toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);
5430            toggleClass(dragEl, options.ghostClass, true);
5431          }
5432          if (putSortable !== _this && _this !== Sortable.active) {
5433            putSortable = _this;
5434          } else if (_this === Sortable.active && putSortable) {
5435            putSortable = null;
5436          }
5437          if (fromSortable === _this) {
5438            _this._ignoreWhileAnimating = target;
5439          }
5440          _this.animateAll(function() {
5441            dragOverEvent("dragOverAnimationComplete");
5442            _this._ignoreWhileAnimating = null;
5443          });
5444          if (_this !== fromSortable) {
5445            fromSortable.animateAll();
5446            fromSortable._ignoreWhileAnimating = null;
5447          }
5448        }
5449        if (target === dragEl && !dragEl.animated || target === el && !target.animated) {
5450          lastTarget = null;
5451        }
5452        if (!options.dragoverBubble && !evt.rootEl && target !== document) {
5453          dragEl.parentNode[expando]._isOutsideThisEl(evt.target);
5454          !insertion && nearestEmptyInsertDetectEvent(evt);
5455        }
5456        !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();
5457        return completedFired = true;
5458      }
5459      function changed() {
5460        newIndex = index(dragEl);
5461        newDraggableIndex = index(dragEl, options.draggable);
5462        _dispatchEvent({
5463          sortable: _this,
5464          name: "change",
5465          toEl: el,
5466          newIndex,
5467          newDraggableIndex,
5468          originalEvent: evt
5469        });
5470      }
5471      if (evt.preventDefault !== void 0) {
5472        evt.cancelable && evt.preventDefault();
5473      }
5474      target = closest(target, options.draggable, el, true);
5475      dragOverEvent("dragOver");
5476      if (Sortable.eventCanceled) return completedFired;
5477      if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {
5478        return completed(false);
5479      }
5480      ignoreNextClick = false;
5481      if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {
5482        vertical = this._getDirection(evt, target) === "vertical";
5483        dragRect = getRect(dragEl);
5484        dragOverEvent("dragOverValid");
5485        if (Sortable.eventCanceled) return completedFired;
5486        if (revert) {
5487          parentEl = rootEl;
5488          capture();
5489          this._hideClone();
5490          dragOverEvent("revert");
5491          if (!Sortable.eventCanceled) {
5492            if (nextEl) {
5493              rootEl.insertBefore(dragEl, nextEl);
5494            } else {
5495              rootEl.appendChild(dragEl);
5496            }
5497          }
5498          return completed(true);
5499        }
5500        var elLastChild = lastChild(el, options.draggable);
5501        if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {
5502          if (elLastChild === dragEl) {
5503            return completed(false);
5504          }
5505          if (elLastChild && el === evt.target) {
5506            target = elLastChild;
5507          }
5508          if (target) {
5509            targetRect = getRect(target);
5510          }
5511          if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {
5512            capture();
5513            if (elLastChild && elLastChild.nextSibling) {
5514              el.insertBefore(dragEl, elLastChild.nextSibling);
5515            } else {
5516              el.appendChild(dragEl);
5517            }
5518            parentEl = el;
5519            changed();
5520            return completed(true);
5521          }
5522        } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {
5523          var firstChild = getChild(el, 0, options, true);
5524          if (firstChild === dragEl) {
5525            return completed(false);
5526          }
5527          target = firstChild;
5528          targetRect = getRect(target);
5529          if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {
5530            capture();
5531            el.insertBefore(dragEl, firstChild);
5532            parentEl = el;
5533            changed();
5534            return completed(true);
5535          }
5536        } else if (target.parentNode === el) {
5537          targetRect = getRect(target);
5538          var direction = 0, targetBeforeFirstSwap, differentLevel = dragEl.parentNode !== el, differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), side1 = vertical ? "top" : "left", scrolledPastTop = isScrolledPast(target, "top", "top") || isScrolledPast(dragEl, "top", "top"), scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;
5539          if (lastTarget !== target) {
5540            targetBeforeFirstSwap = targetRect[side1];
5541            pastFirstInvertThresh = false;
5542            isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;
5543          }
5544          direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);
5545          var sibling;
5546          if (direction !== 0) {
5547            var dragIndex = index(dragEl);
5548            do {
5549              dragIndex -= direction;
5550              sibling = parentEl.children[dragIndex];
5551            } while (sibling && (css(sibling, "display") === "none" || sibling === ghostEl));
5552          }
5553          if (direction === 0 || sibling === target) {
5554            return completed(false);
5555          }
5556          lastTarget = target;
5557          lastDirection = direction;
5558          var nextSibling = target.nextElementSibling, after = false;
5559          after = direction === 1;
5560          var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);
5561          if (moveVector !== false) {
5562            if (moveVector === 1 || moveVector === -1) {
5563              after = moveVector === 1;
5564            }
5565            _silent = true;
5566            setTimeout(_unsilent, 30);
5567            capture();
5568            if (after && !nextSibling) {
5569              el.appendChild(dragEl);
5570            } else {
5571              target.parentNode.insertBefore(dragEl, after ? nextSibling : target);
5572            }
5573            if (scrolledPastTop) {
5574              scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);
5575            }
5576            parentEl = dragEl.parentNode;
5577            if (targetBeforeFirstSwap !== void 0 && !isCircumstantialInvert) {
5578              targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);
5579            }
5580            changed();
5581            return completed(true);
5582          }
5583        }
5584        if (el.contains(dragEl)) {
5585          return completed(false);
5586        }
5587      }
5588      return false;
5589    },
5590    _ignoreWhileAnimating: null,
5591    _offMoveEvents: function _offMoveEvents() {
5592      off(document, "mousemove", this._onTouchMove);
5593      off(document, "touchmove", this._onTouchMove);
5594      off(document, "pointermove", this._onTouchMove);
5595      off(document, "dragover", nearestEmptyInsertDetectEvent);
5596      off(document, "mousemove", nearestEmptyInsertDetectEvent);
5597      off(document, "touchmove", nearestEmptyInsertDetectEvent);
5598    },
5599    _offUpEvents: function _offUpEvents() {
5600      var ownerDocument = this.el.ownerDocument;
5601      off(ownerDocument, "mouseup", this._onDrop);
5602      off(ownerDocument, "touchend", this._onDrop);
5603      off(ownerDocument, "pointerup", this._onDrop);
5604      off(ownerDocument, "pointercancel", this._onDrop);
5605      off(ownerDocument, "touchcancel", this._onDrop);
5606      off(document, "selectstart", this);
5607    },
5608    _onDrop: function _onDrop(evt) {
5609      var el = this.el, options = this.options;
5610      newIndex = index(dragEl);
5611      newDraggableIndex = index(dragEl, options.draggable);
5612      pluginEvent2("drop", this, {
5613        evt
5614      });
5615      parentEl = dragEl && dragEl.parentNode;
5616      newIndex = index(dragEl);
5617      newDraggableIndex = index(dragEl, options.draggable);
5618      if (Sortable.eventCanceled) {
5619        this._nulling();
5620        return;
5621      }
5622      awaitingDragStarted = false;
5623      isCircumstantialInvert = false;
5624      pastFirstInvertThresh = false;
5625      clearInterval(this._loopId);
5626      clearTimeout(this._dragStartTimer);
5627      _cancelNextTick(this.cloneId);
5628      _cancelNextTick(this._dragStartId);
5629      if (this.nativeDraggable) {
5630        off(document, "drop", this);
5631        off(el, "dragstart", this._onDragStart);
5632      }
5633      this._offMoveEvents();
5634      this._offUpEvents();
5635      if (Safari) {
5636        css(document.body, "user-select", "");
5637      }
5638      css(dragEl, "transform", "");
5639      if (evt) {
5640        if (moved) {
5641          evt.cancelable && evt.preventDefault();
5642          !options.dropBubble && evt.stopPropagation();
5643        }
5644        ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);
5645        if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== "clone") {
5646          cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);
5647        }
5648        if (dragEl) {
5649          if (this.nativeDraggable) {
5650            off(dragEl, "dragend", this);
5651          }
5652          _disableDraggable(dragEl);
5653          dragEl.style["will-change"] = "";
5654          if (moved && !awaitingDragStarted) {
5655            toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);
5656          }
5657          toggleClass(dragEl, this.options.chosenClass, false);
5658          _dispatchEvent({
5659            sortable: this,
5660            name: "unchoose",
5661            toEl: parentEl,
5662            newIndex: null,
5663            newDraggableIndex: null,
5664            originalEvent: evt
5665          });
5666          if (rootEl !== parentEl) {
5667            if (newIndex >= 0) {
5668              _dispatchEvent({
5669                rootEl: parentEl,
5670                name: "add",
5671                toEl: parentEl,
5672                fromEl: rootEl,
5673                originalEvent: evt
5674              });
5675              _dispatchEvent({
5676                sortable: this,
5677                name: "remove",
5678                toEl: parentEl,
5679                originalEvent: evt
5680              });
5681              _dispatchEvent({
5682                rootEl: parentEl,
5683                name: "sort",
5684                toEl: parentEl,
5685                fromEl: rootEl,
5686                originalEvent: evt
5687              });
5688              _dispatchEvent({
5689                sortable: this,
5690                name: "sort",
5691                toEl: parentEl,
5692                originalEvent: evt
5693              });
5694            }
5695            putSortable && putSortable.save();
5696          } else {
5697            if (newIndex !== oldIndex) {
5698              if (newIndex >= 0) {
5699                _dispatchEvent({
5700                  sortable: this,
5701                  name: "update",
5702                  toEl: parentEl,
5703                  originalEvent: evt
5704                });
5705                _dispatchEvent({
5706                  sortable: this,
5707                  name: "sort",
5708                  toEl: parentEl,
5709                  originalEvent: evt
5710                });
5711              }
5712            }
5713          }
5714          if (Sortable.active) {
5715            if (newIndex == null || newIndex === -1) {
5716              newIndex = oldIndex;
5717              newDraggableIndex = oldDraggableIndex;
5718            }
5719            _dispatchEvent({
5720              sortable: this,
5721              name: "end",
5722              toEl: parentEl,
5723              originalEvent: evt
5724            });
5725            this.save();
5726          }
5727        }
5728      }
5729      this._nulling();
5730    },
5731    _nulling: function _nulling() {
5732      pluginEvent2("nulling", this);
5733      rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;
5734      var el = this.el;
5735      savedInputChecked.forEach(function(checkEl) {
5736        if (el.contains(checkEl)) {
5737          checkEl.checked = true;
5738        }
5739      });
5740      savedInputChecked.length = lastDx = lastDy = 0;
5741    },
5742    handleEvent: function handleEvent(evt) {
5743      switch (evt.type) {
5744        case "drop":
5745        case "dragend":
5746          this._onDrop(evt);
5747          break;
5748        case "dragenter":
5749        case "dragover":
5750          if (dragEl) {
5751            this._onDragOver(evt);
5752            _globalDragOver(evt);
5753          }
5754          break;
5755        case "selectstart":
5756          evt.preventDefault();
5757          break;
5758      }
5759    },
5760    /**
5761     * Serializes the item into an array of string.
5762     * @returns {String[]}
5763     */
5764    toArray: function toArray() {
5765      var order = [], el, children = this.el.children, i = 0, n = children.length, options = this.options;
5766      for (; i < n; i++) {
5767        el = children[i];
5768        if (closest(el, options.draggable, this.el, false)) {
5769          order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));
5770        }
5771      }
5772      return order;
5773    },
5774    /**
5775     * Sorts the elements according to the array.
5776     * @param  {String[]}  order  order of the items
5777     */
5778    sort: function sort(order, useAnimation) {
5779      var items = {}, rootEl2 = this.el;
5780      this.toArray().forEach(function(id, i) {
5781        var el = rootEl2.children[i];
5782        if (closest(el, this.options.draggable, rootEl2, false)) {
5783          items[id] = el;
5784        }
5785      }, this);
5786      useAnimation && this.captureAnimationState();
5787      order.forEach(function(id) {
5788        if (items[id]) {
5789          rootEl2.removeChild(items[id]);
5790          rootEl2.appendChild(items[id]);
5791        }
5792      });
5793      useAnimation && this.animateAll();
5794    },
5795    /**
5796     * Save the current sorting
5797     */
5798    save: function save() {
5799      var store2 = this.options.store;
5800      store2 && store2.set && store2.set(this);
5801    },
5802    /**
5803     * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
5804     * @param   {HTMLElement}  el
5805     * @param   {String}       [selector]  default: `options.draggable`
5806     * @returns {HTMLElement|null}
5807     */
5808    closest: function closest$1(el, selector) {
5809      return closest(el, selector || this.options.draggable, this.el, false);
5810    },
5811    /**
5812     * Set/get option
5813     * @param   {string} name
5814     * @param   {*}      [value]
5815     * @returns {*}
5816     */
5817    option: function option(name, value) {
5818      var options = this.options;
5819      if (value === void 0) {
5820        return options[name];
5821      } else {
5822        var modifiedValue = PluginManager.modifyOption(this, name, value);
5823        if (typeof modifiedValue !== "undefined") {
5824          options[name] = modifiedValue;
5825        } else {
5826          options[name] = value;
5827        }
5828        if (name === "group") {
5829          _prepareGroup(options);
5830        }
5831      }
5832    },
5833    /**
5834     * Destroy
5835     */
5836    destroy: function destroy() {
5837      pluginEvent2("destroy", this);
5838      var el = this.el;
5839      el[expando] = null;
5840      off(el, "mousedown", this._onTapStart);
5841      off(el, "touchstart", this._onTapStart);
5842      off(el, "pointerdown", this._onTapStart);
5843      if (this.nativeDraggable) {
5844        off(el, "dragover", this);
5845        off(el, "dragenter", this);
5846      }
5847      Array.prototype.forEach.call(el.querySelectorAll("[draggable]"), function(el2) {
5848        el2.removeAttribute("draggable");
5849      });
5850      this._onDrop();
5851      this._disableDelayedDragEvents();
5852      sortables.splice(sortables.indexOf(this.el), 1);
5853      this.el = el = null;
5854    },
5855    _hideClone: function _hideClone() {
5856      if (!cloneHidden) {
5857        pluginEvent2("hideClone", this);
5858        if (Sortable.eventCanceled) return;
5859        css(cloneEl, "display", "none");
5860        if (this.options.removeCloneOnHide && cloneEl.parentNode) {
5861          cloneEl.parentNode.removeChild(cloneEl);
5862        }
5863        cloneHidden = true;
5864      }
5865    },
5866    _showClone: function _showClone(putSortable2) {
5867      if (putSortable2.lastPutMode !== "clone") {
5868        this._hideClone();
5869        return;
5870      }
5871      if (cloneHidden) {
5872        pluginEvent2("showClone", this);
5873        if (Sortable.eventCanceled) return;
5874        if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {
5875          rootEl.insertBefore(cloneEl, dragEl);
5876        } else if (nextEl) {
5877          rootEl.insertBefore(cloneEl, nextEl);
5878        } else {
5879          rootEl.appendChild(cloneEl);
5880        }
5881        if (this.options.group.revertClone) {
5882          this.animate(dragEl, cloneEl);
5883        }
5884        css(cloneEl, "display", "");
5885        cloneHidden = false;
5886      }
5887    }
5888  };
5889  function _globalDragOver(evt) {
5890    if (evt.dataTransfer) {
5891      evt.dataTransfer.dropEffect = "move";
5892    }
5893    evt.cancelable && evt.preventDefault();
5894  }
5895  function _onMove(fromEl, toEl, dragEl2, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {
5896    var evt, sortable = fromEl[expando], onMoveFn = sortable.options.onMove, retVal;
5897    if (window.CustomEvent && !IE11OrLess && !Edge) {
5898      evt = new CustomEvent("move", {
5899        bubbles: true,
5900        cancelable: true
5901      });
5902    } else {
5903      evt = document.createEvent("Event");
5904      evt.initEvent("move", true, true);
5905    }
5906    evt.to = toEl;
5907    evt.from = fromEl;
5908    evt.dragged = dragEl2;
5909    evt.draggedRect = dragRect;
5910    evt.related = targetEl || toEl;
5911    evt.relatedRect = targetRect || getRect(toEl);
5912    evt.willInsertAfter = willInsertAfter;
5913    evt.originalEvent = originalEvent;
5914    fromEl.dispatchEvent(evt);
5915    if (onMoveFn) {
5916      retVal = onMoveFn.call(sortable, evt, originalEvent);
5917    }
5918    return retVal;
5919  }
5920  function _disableDraggable(el) {
5921    el.draggable = false;
5922  }
5923  function _unsilent() {
5924    _silent = false;
5925  }
5926  function _ghostIsFirst(evt, vertical, sortable) {
5927    var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));
5928    var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);
5929    var spacer = 10;
5930    return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;
5931  }
5932  function _ghostIsLast(evt, vertical, sortable) {
5933    var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));
5934    var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);
5935    var spacer = 10;
5936    return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;
5937  }
5938  function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {
5939    var mouseOnAxis = vertical ? evt.clientY : evt.clientX, targetLength = vertical ? targetRect.height : targetRect.width, targetS1 = vertical ? targetRect.top : targetRect.left, targetS2 = vertical ? targetRect.bottom : targetRect.right, invert = false;
5940    if (!invertSwap) {
5941      if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {
5942        if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {
5943          pastFirstInvertThresh = true;
5944        }
5945        if (!pastFirstInvertThresh) {
5946          if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance : mouseOnAxis > targetS2 - targetMoveDistance) {
5947            return -lastDirection;
5948          }
5949        } else {
5950          invert = true;
5951        }
5952      } else {
5953        if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {
5954          return _getInsertDirection(target);
5955        }
5956      }
5957    }
5958    invert = invert || invertSwap;
5959    if (invert) {
5960      if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {
5961        return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;
5962      }
5963    }
5964    return 0;
5965  }
5966  function _getInsertDirection(target) {
5967    if (index(dragEl) < index(target)) {
5968      return 1;
5969    } else {
5970      return -1;
5971    }
5972  }
5973  function _generateId(el) {
5974    var str = el.tagName + el.className + el.src + el.href + el.textContent, i = str.length, sum = 0;
5975    while (i--) {
5976      sum += str.charCodeAt(i);
5977    }
5978    return sum.toString(36);
5979  }
5980  function _saveInputCheckedState(root) {
5981    savedInputChecked.length = 0;
5982    var inputs = root.getElementsByTagName("input");
5983    var idx = inputs.length;
5984    while (idx--) {
5985      var el = inputs[idx];
5986      el.checked && savedInputChecked.push(el);
5987    }
5988  }
5989  function _nextTick(fn) {
5990    return setTimeout(fn, 0);
5991  }
5992  function _cancelNextTick(id) {
5993    return clearTimeout(id);
5994  }
5995  if (documentExists) {
5996    on2(document, "touchmove", function(evt) {
5997      if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {
5998        evt.preventDefault();
5999      }
6000    });
6001  }
6002  Sortable.utils = {
6003    on: on2,
6004    off,
6005    css,
6006    find,
6007    is: function is(el, selector) {
6008      return !!closest(el, selector, el, false);
6009    },
6010    extend,
6011    throttle: throttle2,
6012    closest,
6013    toggleClass,
6014    clone: clone2,
6015    index,
6016    nextTick: _nextTick,
6017    cancelNextTick: _cancelNextTick,
6018    detectDirection: _detectDirection,
6019    getChild,
6020    expando
6021  };
6022  Sortable.get = function(element) {
6023    return element[expando];
6024  };
6025  Sortable.mount = function() {
6026    for (var _len = arguments.length, plugins2 = new Array(_len), _key = 0; _key < _len; _key++) {
6027      plugins2[_key] = arguments[_key];
6028    }
6029    if (plugins2[0].constructor === Array) plugins2 = plugins2[0];
6030    plugins2.forEach(function(plugin2) {
6031      if (!plugin2.prototype || !plugin2.prototype.constructor) {
6032        throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin2));
6033      }
6034      if (plugin2.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin2.utils);
6035      PluginManager.mount(plugin2);
6036    });
6037  };
6038  Sortable.create = function(el, options) {
6039    return new Sortable(el, options);
6040  };
6041  Sortable.version = version;
6042  var autoScrolls = [];
6043  var scrollEl;
6044  var scrollRootEl;
6045  var scrolling = false;
6046  var lastAutoScrollX;
6047  var lastAutoScrollY;
6048  var touchEvt$1;
6049  var pointerElemChangedInterval;
6050  function AutoScrollPlugin() {
6051    function AutoScroll() {
6052      this.defaults = {
6053        scroll: true,
6054        forceAutoScrollFallback: false,
6055        scrollSensitivity: 30,
6056        scrollSpeed: 10,
6057        bubbleScroll: true
6058      };
6059      for (var fn in this) {
6060        if (fn.charAt(0) === "_" && typeof this[fn] === "function") {
6061          this[fn] = this[fn].bind(this);
6062        }
6063      }
6064    }
6065    AutoScroll.prototype = {
6066      dragStarted: function dragStarted(_ref) {
6067        var originalEvent = _ref.originalEvent;
6068        if (this.sortable.nativeDraggable) {
6069          on2(document, "dragover", this._handleAutoScroll);
6070        } else {
6071          if (this.options.supportPointer) {
6072            on2(document, "pointermove", this._handleFallbackAutoScroll);
6073          } else if (originalEvent.touches) {
6074            on2(document, "touchmove", this._handleFallbackAutoScroll);
6075          } else {
6076            on2(document, "mousemove", this._handleFallbackAutoScroll);
6077          }
6078        }
6079      },
6080      dragOverCompleted: function dragOverCompleted(_ref2) {
6081        var originalEvent = _ref2.originalEvent;
6082        if (!this.options.dragOverBubble && !originalEvent.rootEl) {
6083          this._handleAutoScroll(originalEvent);
6084        }
6085      },
6086      drop: function drop3() {
6087        if (this.sortable.nativeDraggable) {
6088          off(document, "dragover", this._handleAutoScroll);
6089        } else {
6090          off(document, "pointermove", this._handleFallbackAutoScroll);
6091          off(document, "touchmove", this._handleFallbackAutoScroll);
6092          off(document, "mousemove", this._handleFallbackAutoScroll);
6093        }
6094        clearPointerElemChangedInterval();
6095        clearAutoScrolls();
6096        cancelThrottle();
6097      },
6098      nulling: function nulling() {
6099        touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;
6100        autoScrolls.length = 0;
6101      },
6102      _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {
6103        this._handleAutoScroll(evt, true);
6104      },
6105      _handleAutoScroll: function _handleAutoScroll(evt, fallback) {
6106        var _this = this;
6107        var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, elem = document.elementFromPoint(x, y);
6108        touchEvt$1 = evt;
6109        if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {
6110          autoScroll(evt, this.options, elem, fallback);
6111          var ogElemScroller = getParentAutoScrollElement(elem, true);
6112          if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {
6113            pointerElemChangedInterval && clearPointerElemChangedInterval();
6114            pointerElemChangedInterval = setInterval(function() {
6115              var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);
6116              if (newElem !== ogElemScroller) {
6117                ogElemScroller = newElem;
6118                clearAutoScrolls();
6119              }
6120              autoScroll(evt, _this.options, newElem, fallback);
6121            }, 10);
6122            lastAutoScrollX = x;
6123            lastAutoScrollY = y;
6124          }
6125        } else {
6126          if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {
6127            clearAutoScrolls();
6128            return;
6129          }
6130          autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);
6131        }
6132      }
6133    };
6134    return _extends(AutoScroll, {
6135      pluginName: "scroll",
6136      initializeByDefault: true
6137    });
6138  }
6139  function clearAutoScrolls() {
6140    autoScrolls.forEach(function(autoScroll2) {
6141      clearInterval(autoScroll2.pid);
6142    });
6143    autoScrolls = [];
6144  }
6145  function clearPointerElemChangedInterval() {
6146    clearInterval(pointerElemChangedInterval);
6147  }
6148  var autoScroll = throttle2(function(evt, options, rootEl2, isFallback) {
6149    if (!options.scroll) return;
6150    var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, sens = options.scrollSensitivity, speed = options.scrollSpeed, winScroller = getWindowScrollingElement();
6151    var scrollThisInstance = false, scrollCustomFn;
6152    if (scrollRootEl !== rootEl2) {
6153      scrollRootEl = rootEl2;
6154      clearAutoScrolls();
6155      scrollEl = options.scroll;
6156      scrollCustomFn = options.scrollFn;
6157      if (scrollEl === true) {
6158        scrollEl = getParentAutoScrollElement(rootEl2, true);
6159      }
6160    }
6161    var layersOut = 0;
6162    var currentParent = scrollEl;
6163    do {
6164      var el = currentParent, rect = getRect(el), top = rect.top, bottom = rect.bottom, left = rect.left, right = rect.right, width = rect.width, height = rect.height, canScrollX = void 0, canScrollY = void 0, scrollWidth = el.scrollWidth, scrollHeight = el.scrollHeight, elCSS = css(el), scrollPosX = el.scrollLeft, scrollPosY = el.scrollTop;
6165      if (el === winScroller) {
6166        canScrollX = width < scrollWidth && (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll" || elCSS.overflowX === "visible");
6167        canScrollY = height < scrollHeight && (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll" || elCSS.overflowY === "visible");
6168      } else {
6169        canScrollX = width < scrollWidth && (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll");
6170        canScrollY = height < scrollHeight && (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll");
6171      }
6172      var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);
6173      var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);
6174      if (!autoScrolls[layersOut]) {
6175        for (var i = 0; i <= layersOut; i++) {
6176          if (!autoScrolls[i]) {
6177            autoScrolls[i] = {};
6178          }
6179        }
6180      }
6181      if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {
6182        autoScrolls[layersOut].el = el;
6183        autoScrolls[layersOut].vx = vx;
6184        autoScrolls[layersOut].vy = vy;
6185        clearInterval(autoScrolls[layersOut].pid);
6186        if (vx != 0 || vy != 0) {
6187          scrollThisInstance = true;
6188          autoScrolls[layersOut].pid = setInterval(function() {
6189            if (isFallback && this.layer === 0) {
6190              Sortable.active._onTouchMove(touchEvt$1);
6191            }
6192            var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;
6193            var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;
6194            if (typeof scrollCustomFn === "function") {
6195              if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== "continue") {
6196                return;
6197              }
6198            }
6199            scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
6200          }.bind({
6201            layer: layersOut
6202          }), 24);
6203        }
6204      }
6205      layersOut++;
6206    } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
6207    scrolling = scrollThisInstance;
6208  }, 30);
6209  var drop = function drop2(_ref) {
6210    var originalEvent = _ref.originalEvent, putSortable2 = _ref.putSortable, dragEl2 = _ref.dragEl, activeSortable = _ref.activeSortable, dispatchSortableEvent = _ref.dispatchSortableEvent, hideGhostForTarget = _ref.hideGhostForTarget, unhideGhostForTarget = _ref.unhideGhostForTarget;
6211    if (!originalEvent) return;
6212    var toSortable = putSortable2 || activeSortable;
6213    hideGhostForTarget();
6214    var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;
6215    var target = document.elementFromPoint(touch.clientX, touch.clientY);
6216    unhideGhostForTarget();
6217    if (toSortable && !toSortable.el.contains(target)) {
6218      dispatchSortableEvent("spill");
6219      this.onSpill({
6220        dragEl: dragEl2,
6221        putSortable: putSortable2
6222      });
6223    }
6224  };
6225  function Revert() {
6226  }
6227  Revert.prototype = {
6228    startIndex: null,
6229    dragStart: function dragStart(_ref2) {
6230      var oldDraggableIndex2 = _ref2.oldDraggableIndex;
6231      this.startIndex = oldDraggableIndex2;
6232    },
6233    onSpill: function onSpill(_ref3) {
6234      var dragEl2 = _ref3.dragEl, putSortable2 = _ref3.putSortable;
6235      this.sortable.captureAnimationState();
6236      if (putSortable2) {
6237        putSortable2.captureAnimationState();
6238      }
6239      var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
6240      if (nextSibling) {
6241        this.sortable.el.insertBefore(dragEl2, nextSibling);
6242      } else {
6243        this.sortable.el.appendChild(dragEl2);
6244      }
6245      this.sortable.animateAll();
6246      if (putSortable2) {
6247        putSortable2.animateAll();
6248      }
6249    },
6250    drop
6251  };
6252  _extends(Revert, {
6253    pluginName: "revertOnSpill"
6254  });
6255  function Remove() {
6256  }
6257  Remove.prototype = {
6258    onSpill: function onSpill2(_ref4) {
6259      var dragEl2 = _ref4.dragEl, putSortable2 = _ref4.putSortable;
6260      var parentSortable = putSortable2 || this.sortable;
6261      parentSortable.captureAnimationState();
6262      dragEl2.parentNode && dragEl2.parentNode.removeChild(dragEl2);
6263      parentSortable.animateAll();
6264    },
6265    drop
6266  };
6267  _extends(Remove, {
6268    pluginName: "removeOnSpill"
6269  });
6270  Sortable.mount(new AutoScrollPlugin());
6271  Sortable.mount(Remove, Revert);
6272  var sortable_esm_default = Sortable;
6273
6274  
6274// Web/src/scripts/pronouncement-builder/index.ts
6275  var isEmpty = (value) => !value || value.trim() === "";
6276  var matchesSearch = (text, searchTerm) => isEmpty(searchTerm) || text.toLowerCase().includes(searchTerm.trim().toLowerCase());
6277  var matchesCategory = (categories, selectedCategory) => isEmpty(selectedCategory) || categories?.some((cat) => cat.id.toString() === selectedCategory) === true;
6278  var matchesFilter = (itemValue, selectedValue) => isEmpty(selectedValue) || itemValue === selectedValue;
6279  var createLanguagePreference = (isCymraeg) => isCymraeg ? "Cymraeg" : "English";
6280  var isValidAgeGroup = (ageGroup) => ageGroup === "Adult" || ageGroup === "Youth";
6281  var createFilterOptions = (options) => ({
6282    searchTerm: options.searchTerm || "",
6283    categoryId: options.categoryId || "",
6284    ageGroup: isValidAgeGroup(options.ageGroup || "") ? options.ageGroup : void 0,
6285    language: createLanguagePreference(options.cymraegSelected || false)
6286  });
6287  var textareaElement = null;
6288  var decodeHTMLEntities = (html) => {
6289    if (!html) return "";
6290    if (!textareaElement) {
6291      textareaElement = document.createElement("textarea");
6292    }
6293    textareaElement.innerHTML = html;
6294    return textareaElement.value;
6295  };
6296  var hasActiveFilters = (options) => !isEmpty(options.searchTerm) || !isEmpty(options.categoryId) || !!options.ageGroup;
6297  var filterPronouncements = (pronouncements, options) => pronouncements.filter(
6298    (pronouncement) => matchesSearch(pronouncement.name, options.searchTerm || "") && matchesCategory(pronouncement.categories, options.categoryId || "") && matchesFilter(pronouncement.ageGroup, options.ageGroup || "") && matchesFilter(pronouncement.language, options.language || "")
6299  );
6300  var sortOrderChanged = (event) => event.oldIndex !== void 0 && event.newIndex !== void 0 && event.oldIndex !== event.newIndex;
6301  var createPronouncementBuilder = (initialData = []) => {
6302    const pronouncements = Array.isArray(initialData) ? initialData : [];
6303    return {
6304      pronouncements,
6305      selectedIds: [],
6306      searchTerm: "",
6307      selectedCategory: "",
6308      selectedAgeGroup: "",
6309      cymraegLanguageSelected: false,
6310      sortableInstance: null,
6311      initSortable() {
6312        this.initializeSortable();
6313      },
6314      initializeSortable() {
6315        const selectedPronouncementsElement = document.getElementById(
6316          "selected-pronouncements"
6317        );
6318        if (!selectedPronouncementsElement) return;
6319        this.sortableInstance = sortable_esm_default.create(selectedPronouncementsElement, {
6320          animation: 150,
6321          ghostClass: "opacity-100",
6322          onEnd: (evt) => {
6323            if (sortOrderChanged(evt)) {
6324              this.reorderPronouncements(evt.oldIndex, evt.newIndex);
6325            }
6326          }
6327        });
6328      },
6329      reorderPronouncements(oldIndex2, newIndex2) {
6330        if (oldIndex2 === newIndex2) return;
6331        const newIds = [...this.selectedIds];
6332        const [movedItem] = newIds.splice(oldIndex2, 1);
6333        newIds.splice(newIndex2, 0, movedItem);
6334        this.selectedIds = [];
6335        setTimeout(() => {
6336          this.selectedIds = [...newIds];
6337        }, 0);
6338      },
6339      get hasSelectedPronouncements() {
6340        return this.selectedIds.length > 0;
6341      },
6342      get hasActiveFilters() {
6343        return hasActiveFilters(this.getFilterOptions());
6344      },
6345      get selectedPronouncements() {
6346        return this.selectedIds.map((id) => this.pronouncements.find((p) => p.id === id)).filter(Boolean);
6347      },
6348      get filteredPronouncements() {
6349        return filterPronouncements(this.pronouncements, this.getFilterOptions());
6350      },
6351      get noResultsVisible() {
6352        return this.hasActiveFilters && this.filteredPronouncements.length === 0;
6353      },
6354      get showCymraeg() {
6355        return this.cymraegLanguageSelected == true;
6356      },
6357      getFilterOptions() {
6358        return createFilterOptions({
6359          searchTerm: this.searchTerm,
6360          categoryId: this.selectedCategory,
6361          ageGroup: this.selectedAgeGroup,
6362          cymraegSelected: this.cymraegLanguageSelected
6363        });
6364      },
6365      addPronouncement(selection) {
6366        const id = typeof selection === "string" ? selection : selection.id;
6367        if (!this.selectedIds.includes(id)) {
6368          this.selectedIds.push(id);
6369        }
6370      },
6371      removePronouncement(selection) {
6372        const id = typeof selection === "string" ? selection : selection.id;
6373        this.selectedIds = this.selectedIds.filter(
6374          (selectedId) => selectedId !== id
6375        );
6376      },
6377      moveUp(index2) {
6378        if (index2 > 0) {
6379          [this.selectedIds[index2 - 1], this.selectedIds[index2]] = [
6380            this.selectedIds[index2],
6381            this.selectedIds[index2 - 1]
6382          ];
6383        }
6384      },
6385      moveDown(index2) {
6386        if (index2 < this.selectedIds.length - 1) {
6387          [this.selectedIds[index2], this.selectedIds[index2 + 1]] = [
6388            this.selectedIds[index2 + 1],
6389            this.selectedIds[index2]
6390          ];
6391        }
6392      },
6393      clearAll() {
6394        this.selectedIds = [];
6395      },
6396      isSelected(selection) {
6397        const id = typeof selection === "string" ? selection : selection.id;
6398        return this.selectedIds.includes(id);
6399      },
6400      canMoveUp(index2) {
6401        return this.selectedIds.length > 1 && index2 > 0;
6402      },
6403      canMoveDown(index2) {
6404        return this.selectedIds.length > 1 && index2 < this.selectedIds.length - 1;
6405      },
6406      selectAgeGroup(ageGroup) {
6407        const validAgeGroup = isValidAgeGroup(ageGroup) ? ageGroup : "";
6408        if (this.selectedAgeGroup === validAgeGroup) {
6409          return;
6410        }
6411        this.selectedAgeGroup = validAgeGroup;
6412        this.clearAll();
6413      },
6414      decodeHTMLEntities
6415    };
6416  };
6417  var setupPronouncementBuilder = () => {
6418    document.addEventListener("alpine:init", () => {
6419      module_default.data("pronouncementBuilder", createPronouncementBuilder);
6420    });
6421  };
6422
6423  
6423// Web/src/scripts/fines-calculator/constants.ts
6424  var INCOME_MULTIPLIERS = {
6425    weekly: 1,
6426    "bi-weekly": 2,
6427    monthly: 4.332755633,
6428    yearly: 52.08333333
6429  };
6430  var PLEA_REDUCTIONS = {
6431    third: 1 / 3,
6432    // 33% -> 1/3 reduction
6433    quarter: 1 / 4,
6434    // 25% -> 1/4 reduction
6435    tenth: 1 / 10,
6436    // 10% -> 1/10 reduction
6437    none: 0
6438    // 0% -> No reduction
6439  };
6440  var SENTENCE_LIMITS = {
6441    "level-1": 200,
6442    "level-2": 500,
6443    "level-3": 1e3,
6444    "level-4": 2500
6445  };
6446  var BAND_DEFAULTS = {
6447    "band-a": "50",
6448    "band-b": "100",
6449    "band-c": "150",
6450    "band-d": "250",
6451    "band-e": "400",
6452    "band-f": "600",
6453    "no-fine": "0"
6454  };
6455  var SURCHARGE_DESCRIPTIONS = {
6456    youthConditionalDischarge: "Conditional Discharge (offender under 18 at date of offence)",
6457    adultConditionalDischargeAndYouthOrders: "Conditional Discharge (offender 18 or over at date of offence). A fine, Youth Rehabilitation Order, Referral Order or Community Order (offender under 18 at date of offence)",
6458    youthSuspendedSentence: "Suspended Sentence Order or Detention and Training Order (offender under 18 at date of offence)",
6459    adultCommunityOrder: "Community Order (offender 18 or over at date of offence)",
6460    adultImprisonmentShort: "Imprisonment or Suspended Sentence Order 6 months or less (offender 18 or over at date of offence)",
6461    adultImprisonmentLong: "Imprisonment or Suspended Sentence Order over 6 months (offender 18 or over at date of offence)"
6462  };
6463  var PERCENTAGE_SURCHARGE_LIMITS = {
6464    "10%": {
6465      before2020: { min: 32, max: 181 },
6466      "2020to2022": { min: 34, max: 190 }
6467    },
6468    "40%": {
6469      after2022: { min: 0, max: 2e3 }
6470    }
6471  };
6472  var FIXED_SURCHARGE_MAPPINGS = {
6473    before2020: {
6474      16: "youthConditionalDischarge",
6475      21: "adultConditionalDischargeAndYouthOrders",
6476      32: "youthSuspendedSentence",
6477      90: "adultCommunityOrder",
6478      122: "adultImprisonmentShort",
6479      149: "adultImprisonmentLong"
6480    },
6481    "2020to2022": {
6482      17: "youthConditionalDischarge",
6483      22: "adultConditionalDischargeAndYouthOrders",
6484      34: "youthSuspendedSentence",
6485      95: "adultCommunityOrder",
6486      128: "adultImprisonmentShort",
6487      156: "adultImprisonmentLong"
6488    },
6489    after2022: {
6490      20: "youthConditionalDischarge",
6491      26: "adultConditionalDischargeAndYouthOrders",
6492      41: "youthSuspendedSentence",
6493      114: "adultCommunityOrder",
6494      154: "adultImprisonmentShort",
6495      187: "adultImprisonmentLong"
6496    }
6497  };
6498  var MAX_OFFENCES = 6;
6499  var PERCENTAGE_10_LIMITS = {
6500    before2020: { min: 32, max: 181 },
6501    "2020to2022": { min: 34, max: 190 },
6502    after2022: { min: 0, max: 2e3 }
6503  };
6504  var PERCENTAGE_40_MAX = 2e3;
6505
6506  
6506// Web/src/scripts/fines-calculator/utils.ts
6507  var formatCurrency = (amount) => {
6508    return new Intl.NumberFormat("en-GB", {
6509      style: "currency",
6510      currency: "GBP",
6511      minimumFractionDigits: 2,
6512      maximumFractionDigits: 2
6513    }).format(amount || 0);
6514  };
6515  var formatGuiltyPlea = (plea) => {
6516    const pleaNum = Number(plea);
6517    switch (pleaNum) {
6518      case 33:
6519        return "1/3";
6520      case 25:
6521        return "1/4";
6522      case 10:
6523        return "1/10";
6524      case 0:
6525        return "No plea";
6526      default:
6527        return `${pleaNum}%`;
6528    }
6529  };
6530  var parseFloatOrZero = (value) => parseFloat(value) || 0;
6531  var isValidFixedSurchargeAmount = (amount, surchargeType) => {
6532    return amount in FIXED_SURCHARGE_MAPPINGS[surchargeType];
6533  };
6534  var isPercentageSurcharge = (value) => {
6535    return value === "10%" || value === "40%";
6536  };
6537  var isValidSurchargeAmount = (value) => {
6538    const num = parseFloat(value);
6539    return !isNaN(num) && num >= 0;
6540  };
6541
6542  
6542// Web/src/scripts/fines-calculator/calculations.ts
6543  var getIncomeRangeMultiplier = (period) => {
6544    return INCOME_MULTIPLIERS[period] ?? 1;
6545  };
6546  var formatSurchargeDescription = (limits) => {
6547    const minText = limits.min > 0 ? `\xA3${limits.min}` : "no minimum";
6548    return `Minimum amount of ${minText} and a maximum amount of \xA3${limits.max} (offender 18 or over at date of offence)`;
6549  };
6550  var getPercentageSurchargeDescription = (surchargeValue, surchargeType) => {
6551    if (surchargeValue === "10%") {
6552      const limits = PERCENTAGE_SURCHARGE_LIMITS["10%"][surchargeType];
6553      return limits ? formatSurchargeDescription(limits) : "";
6554    }
6555    if (surchargeValue === "40%" && surchargeType === "after2022") {
6556      const limits = PERCENTAGE_SURCHARGE_LIMITS["40%"]["after2022"];
6557      return formatSurchargeDescription(limits);
6558    }
6559    return "";
6560  };
6561  var getFixedSurchargeDescription = (surchargeValue, surchargeType) => {
6562    if (!isValidSurchargeAmount(surchargeValue)) return "";
6563    const surchargeAmount = parseFloat(surchargeValue);
6564    if (!isValidFixedSurchargeAmount(surchargeAmount, surchargeType)) return "";
6565    const descriptionKey = FIXED_SURCHARGE_MAPPINGS[surchargeType][surchargeAmount];
6566    return SURCHARGE_DESCRIPTIONS[descriptionKey];
6567  };
6568  var getSurchargeDescription = (surchargeValue, surchargeType) => {
6569    if (!surchargeValue || surchargeValue === "0") return "";
6570    if (isPercentageSurcharge(surchargeValue)) {
6571      return getPercentageSurchargeDescription(surchargeValue, surchargeType);
6572    }
6573    return getFixedSurchargeDescription(surchargeValue, surchargeType);
6574  };
6575  var getBandStartingPointOptions = (band) => {
6576    switch (band) {
6577      case "band-a":
6578        return [
6579          { value: "20", label: "20%" },
6580          { value: "25", label: "25%" },
6581          { value: "30", label: "30%" },
6582          { value: "35", label: "35%" },
6583          { value: "40", label: "40%" },
6584          { value: "45", label: "45%" },
6585          { value: "50", label: "50%" },
6586          { value: "55", label: "55%" },
6587          { value: "60", label: "60%" },
6588          { value: "65", label: "65%" },
6589          { value: "70", label: "70%" },
6590          { value: "75", label: "75%" }
6591        ];
6592      case "band-b":
6593        return [
6594          { value: "75", label: "75%" },
6595          { value: "80", label: "80%" },
6596          { value: "85", label: "85%" },
6597          { value: "90", label: "90%" },
6598          { value: "95", label: "95%" },
6599          { value: "100", label: "100%" },
6600          { value: "105", label: "105%" },
6601          { value: "110", label: "110%" },
6602          { value: "115", label: "115%" },
6603          { value: "120", label: "120%" },
6604          { value: "125", label: "125%" }
6605        ];
6606      case "band-c":
6607        return [
6608          { value: "125", label: "125%" },
6609          { value: "130", label: "130%" },
6610          { value: "135", label: "135%" },
6611          { value: "140", label: "140%" },
6612          { value: "145", label: "145%" },
6613          { value: "150", label: "150%" },
6614          { value: "155", label: "155%" },
6615          { value: "160", label: "160%" },
6616          { value: "165", label: "165%" },
6617          { value: "170", label: "170%" },
6618          { value: "175", label: "175%" }
6619        ];
6620      case "band-d":
6621        return [
6622          { value: "200", label: "200%" },
6623          { value: "210", label: "210%" },
6624          { value: "220", label: "220%" },
6625          { value: "230", label: "230%" },
6626          { value: "240", label: "240%" },
6627          { value: "250", label: "250%" },
6628          { value: "260", label: "260%" },
6629          { value: "270", label: "270%" },
6630          { value: "280", label: "280%" },
6631          { value: "290", label: "290%" },
6632          { value: "300", label: "300%" }
6633        ];
6634      case "band-e":
6635        return [
6636          { value: "300", label: "300%" },
6637          { value: "320", label: "320%" },
6638          { value: "340", label: "340%" },
6639          { value: "360", label: "360%" },
6640          { value: "380", label: "380%" },
6641          { value: "400", label: "400%" },
6642          { value: "420", label: "420%" },
6643          { value: "440", label: "440%" },
6644          { value: "460", label: "460%" },
6645          { value: "480", label: "480%" },
6646          { value: "500", label: "500%" }
6647        ];
6648      case "band-f":
6649        return [
6650          { value: "500", label: "500%" },
6651          { value: "520", label: "520%" },
6652          { value: "540", label: "540%" },
6653          { value: "560", label: "560%" },
6654          { value: "580", label: "580%" },
6655          { value: "600", label: "600%" },
6656          { value: "620", label: "620%" },
6657          { value: "640", label: "640%" },
6658          { value: "660", label: "660%" },
6659          { value: "680", label: "680%" },
6660          { value: "700", label: "700%" }
6661        ];
6662      default:
6663        return [];
6664    }
6665  };
6666  var getBandDefaultStartingPoint = (band) => {
6667    return BAND_DEFAULTS[band] ?? "0";
6668  };
6669  var getPleaValue = (plea) => {
6670    const pleaMapping = {
6671      33: "third",
6672      // 33% -> 1/3 reduction
6673      25: "quarter",
6674      // 25% -> 1/4 reduction
6675      10: "tenth",
6676      // 10% -> 1/10 reduction
6677      0: "none"
6678      // 0% -> No reduction
6679    };
6680    const pleaKey = pleaMapping[plea];
6681    if (pleaKey) {
6682      return PLEA_REDUCTIONS[pleaKey];
6683    }
6684    return plea / 100;
6685  };
6686  var applyMaximumSentenceLimit = (fine, maxSentence) => {
6687    if (maxSentence === "custody" || maxSentence === "level-5") return fine;
6688    const limit = SENTENCE_LIMITS[maxSentence];
6689    return limit ? Math.min(fine, limit) : fine;
6690  };
6691  var calculateFineForOffence = (offence, income, incomePeriod) => {
6692    if (offence.startingPoint === "no-fine" || !offence.startingPoint) {
6693      return { beforePlea: 0, afterPlea: 0 };
6694    }
6695    const incomeRangeMultiplier = getIncomeRangeMultiplier(incomePeriod);
6696    let startingPointPercent = 50;
6697    if (offence.startingPointPercent) {
6698      startingPointPercent = parseFloat(offence.startingPointPercent);
6699    } else {
6700      startingPointPercent = parseFloat(
6701        getBandDefaultStartingPoint(offence.startingPoint)
6702      );
6703    }
6704    const beforePlea = income / incomeRangeMultiplier * startingPointPercent / 100;
6705    const limitedBeforePlea = applyMaximumSentenceLimit(
6706      beforePlea,
6707      offence.maximumSentence
6708    );
6709    let afterPlea;
6710    const pleaValue = getPleaValue(offence.guiltyPlea);
6711    if (offence.guiltyPlea !== 0) {
6712      afterPlea = limitedBeforePlea - limitedBeforePlea * pleaValue;
6713    } else {
6714      afterPlea = limitedBeforePlea;
6715    }
6716    return {
6717      beforePlea: Math.floor(limitedBeforePlea),
6718      afterPlea: Math.floor(afterPlea)
6719    };
6720  };
6721  var calculatePercentageSurcharge = (totalFine, percentage, surchargeType) => {
6722    const rate = percentage === "10%" ? 0.1 : 0.4;
6723    const surchargeAmount = Math.round(totalFine * rate);
6724    if (percentage === "10%") {
6725      const limits = PERCENTAGE_SURCHARGE_LIMITS["10%"][surchargeType];
6726      if (limits) {
6727        return Math.min(Math.max(surchargeAmount, limits.min), limits.max);
6728      }
6729    } else if (percentage === "40%") {
6730      return Math.min(surchargeAmount, 2e3);
6731    }
6732    return surchargeAmount;
6733  };
6734  var calculateSurchargeForPeriod = (totalFine, surchargeType, selectedSurcharge) => {
6735    if (isPercentageSurcharge(selectedSurcharge)) {
6736      return calculatePercentageSurcharge(
6737        totalFine,
6738        selectedSurcharge,
6739        surchargeType
6740      );
6741    }
6742    return parseFloat(selectedSurcharge) || 0;
6743  };
6744
6745  
6745// Web/src/scripts/fines-calculator/index.ts
6746  var getInitialState = () => ({
6747    income: 120,
6748    incomePeriod: "weekly",
6749    selectedIncomeAmount: "",
6750    offences: [
6751      {
6752        id: 1,
6753        maximumSentence: "level-5",
6754        startingPoint: "band-a",
6755        startingPointPercent: "50",
6756        guiltyPlea: 33,
6757        compensation: 0
6758      }
6759    ],
6760    activeOffenceId: 1,
6761    surchargeAdded: false,
6762    surchargeType: "after2022",
6763    selectedSurcharge: "",
6764    customSurcharge: 0,
6765    selectedProsecutionCosts: "",
6766    customProsecutionCosts: 0,
6767    tempIncome: 0
6768  });
6769  var createNewOffence = (existingOffences) => ({
6770    id: Math.max(...existingOffences.map((o) => o.id)) + 1,
6771    maximumSentence: "level-5",
6772    startingPoint: "band-a",
6773    startingPointPercent: "50",
6774    guiltyPlea: 33,
6775    compensation: 0
6776  });
6777  var calculateSurcharge = (params) => {
6778    if (!params.selectedSurcharge) {
6779      return params.customSurcharge > 0 ? params.customSurcharge : 0;
6780    }
6781    if (isPercentageSurcharge(params.selectedSurcharge)) {
6782      if (params.selectedSurcharge === "10%") {
6783        const surchargeAmount = Math.round(params.totalFine / 10);
6784        const limits = PERCENTAGE_10_LIMITS[params.surchargeType];
6785        if (params.surchargeType === "after2022") {
6786          return Math.min(surchargeAmount, limits.max);
6787        }
6788        return Math.min(Math.max(surchargeAmount, limits.min), limits.max);
6789      }
6790      if (params.selectedSurcharge === "40%") {
6791        const surchargeAmount = Math.round(params.totalFine * 40 / 100);
6792        return Math.min(surchargeAmount, PERCENTAGE_40_MAX);
6793      }
6794    }
6795    if (params.customSurcharge > 0) return params.customSurcharge;
6796    return calculateSurchargeForPeriod(
6797      params.totalFine,
6798      params.surchargeType,
6799      params.selectedSurcharge
6800    );
6801  };
6802  var calculateResults = (params) => {
6803    let totalFineBeforePlea = 0;
6804    let totalFineAfterPlea = 0;
6805    params.offences.forEach((offence) => {
6806      const fine = calculateFineForOffence(
6807        offence,
6808        Number(params.income),
6809        params.incomePeriod
6810      );
6811      totalFineBeforePlea += fine.beforePlea;
6812      totalFineAfterPlea += fine.afterPlea;
6813    });
6814    const totalCompensation = params.offences.reduce(
6815      (sum, offence) => sum + (Number(offence.compensation) || 0),
6816      0
6817    );
6818    const surcharge = calculateSurcharge({
6819      totalFine: totalFineAfterPlea,
6820      surchargeType: params.surchargeType,
6821      selectedSurcharge: params.selectedSurcharge,
6822      customSurcharge: params.customSurcharge
6823    });
6824    const prosecutionCosts = params.customProsecutionCosts > 0 ? Number(params.customProsecutionCosts) : 0;
6825    const total = totalFineAfterPlea + totalCompensation + surcharge + prosecutionCosts;
6826    return {
6827      fineBeforePlea: totalFineBeforePlea,
6828      fineAfterPlea: totalFineAfterPlea,
6829      totalCompensation,
6830      surcharge,
6831      prosecutionCosts,
6832      total
6833    };
6834  };
6835  var getNextActiveOffenceId = (removedOffenceId, currentActiveId, offences) => {
6836    if (currentActiveId !== removedOffenceId) return currentActiveId;
6837    const removedIndex = offences.findIndex((o) => o.id === removedOffenceId);
6838    if (removedIndex === 0) {
6839      return offences.find((o) => o.id !== removedOffenceId)?.id || 1;
6840    }
6841    return offences[removedIndex - 1]?.id || 1;
6842  };
6843  var scrollToCalculator = () => {
6844    scrollToId("fines-calculator");
6845  };
6846  var clampValue = (input) => {
6847    if (input.value > input.maxValue) {
6848      return { value: input.maxValue.toString(), hasChanged: true };
6849    }
6850    if (input.value < input.minValue) {
6851      return { value: input.minValue.toString(), hasChanged: true };
6852    }
6853    return { value: "", hasChanged: false };
6854  };
6855  var updateInputField = (correctedValue) => {
6856    setTimeout(() => {
6857      const activeElement = document.activeElement;
6858      if (activeElement && activeElement.type === "text") {
6859        activeElement.value = correctedValue;
6860        activeElement.dispatchEvent(new Event("input", { bubbles: true }));
6861      }
6862    }, 0);
6863  };
6864  var createTemplate = (input) => {
6865    const delimiter = ".";
6866    const precision = 2;
6867    const minus = input.startsWith("-") ? "-" : "";
6868    const strippedInput = input.replace(
6869      new RegExp(`[^0-9\\${delimiter}]`, "g"),
6870      ""
6871    );
6872    let template = Array.from({
6873      length: strippedInput.split(delimiter)[0].length
6874    }).fill("9").join("");
6875    template = `${minus}${template}`;
6876    if (precision > 0 && input.includes(delimiter)) {
6877      template += `${delimiter}${"9".repeat(precision)}`;
6878    }
6879    return template;
6880  };
6881  function limitedMoney(value, maxValue, minValue) {
6882    if (value === "-" && minValue < 0) return "-";
6883    if (!value) return "";
6884    const numericValue = parseFloat(value.replace(/[^\d.-]/g, ""));
6885    if (!isNaN(numericValue)) {
6886      const restrictedNumber = clampValue({
6887        value: numericValue,
6888        minValue,
6889        maxValue
6890      });
6891      if (restrictedNumber.hasChanged) {
6892        updateInputField(restrictedNumber.value);
6893        return createTemplate(restrictedNumber.value);
6894      }
6895    }
6896    return createTemplate(value);
6897  }
6898  var createFinesCalculator = () => {
6899    const initialState = getInitialState();
6900    return {
6901      ...initialState,
6902      get calculatedResults() {
6903        return calculateResults({
6904          offences: this.offences,
6905          income: Number(this.income),
6906          incomePeriod: this.incomePeriod,
6907          surchargeType: this.surchargeType,
6908          selectedSurcharge: this.selectedSurcharge,
6909          customSurcharge: this.customSurcharge,
6910          customProsecutionCosts: this.customProsecutionCosts
6911        });
6912      },
6913      get effectiveSurchargeAmount() {
6914        if (isPercentageSurcharge(this.selectedSurcharge)) {
6915          return calculateSurcharge({
6916            totalFine: this.calculatedResults.fineAfterPlea,
6917            surchargeType: this.surchargeType,
6918            selectedSurcharge: this.selectedSurcharge,
6919            customSurcharge: this.customSurcharge
6920          });
6921        }
6922        return this.customSurcharge;
6923      },
6924      get canAddMoreOffences() {
6925        return this.offences.length < MAX_OFFENCES;
6926      },
6927      get surchargeDescription() {
6928        if (!this.surchargeAdded || !this.selectedSurcharge) return "";
6929        return getSurchargeDescription(
6930          this.selectedSurcharge,
6931          this.surchargeType
6932        );
6933      },
6934      getBandOptions: (offence) => getBandStartingPointOptions(offence.startingPoint),
6935      onBandChange(offence) {
6936        const defaultPercent = getBandDefaultStartingPoint(offence.startingPoint);
6937        offence.startingPointPercent = defaultPercent !== "0" ? defaultPercent : "";
6938      },
6939      hideFineFields: (offence) => offence.startingPoint === "no-fine" || !offence.startingPoint,
6940      calculateFineForOffence(offence) {
6941        const incomeNum = Number(this.income);
6942        if (!Number.isNaN(incomeNum) && incomeNum > 0) {
6943          return calculateFineForOffence(offence, incomeNum, this.incomePeriod);
6944        } else {
6945          return 0;
6946        }
6947      },
6948      formatStartingPoint(offence) {
6949        if (!offence.startingPoint) return "-";
6950        const basePoint = offence.startingPoint.replace("-", " ").toUpperCase();
6951        const percentText = offence.startingPointPercent ? ` (${offence.startingPointPercent}%)` : "";
6952        return basePoint + percentText;
6953      },
6954      addOffence() {
6955        if (this.offences.length >= MAX_OFFENCES) return;
6956        const newOffence = createNewOffence(this.offences);
6957        this.offences.push(newOffence);
6958        this.activeOffenceId = newOffence.id;
6959        this.surchargeAdded = false;
6960        setTimeout(() => scrollToId("offences-section"), 50);
6961      },
6962      removeOffence(offenceId) {
6963        if (this.offences.length <= 1) return;
6964        this.activeOffenceId = getNextActiveOffenceId(
6965          offenceId,
6966          this.activeOffenceId,
6967          this.offences
6968        );
6969        this.offences = this.offences.filter((o) => o.id !== offenceId);
6970      },
6971      setActiveOffence(offenceId) {
6972        this.activeOffenceId = typeof offenceId === "string" ? parseInt(offenceId) : offenceId;
6973        setTimeout(() => scrollToId("offences-section"), 50);
6974      },
6975      addSurcharge() {
6976        this.surchargeAdded = !this.surchargeAdded;
6977        setTimeout(() => scrollToId("surcharge-section"), 50);
6978      },
6979      startAgain() {
6980        Object.assign(this, getInitialState());
6981        scrollToCalculator();
6982      },
6983      onSurchargeTypeChange() {
6984        this.selectedSurcharge = "";
6985        this.customSurcharge = 0;
6986      },
6987      onSurchargeSelectionChange() {
6988        if (!this.selectedSurcharge) {
6989          this.customSurcharge = 0;
6990          return;
6991        }
6992        if (isPercentageSurcharge(this.selectedSurcharge)) {
6993          this.customSurcharge = 0;
6994        } else {
6995          this.customSurcharge = parseFloatOrZero(this.selectedSurcharge);
6996        }
6997      },
6998      onProsecutionCostsChange() {
6999        this.customProsecutionCosts = this.selectedProsecutionCosts ? parseFloatOrZero(this.selectedProsecutionCosts) : 0;
7000      },
7001      onIncomeAmountChange() {
7002        this.income = this.selectedIncomeAmount ? parseFloatOrZero(this.selectedIncomeAmount) : 0;
7003        this.selectedIncomeAmount = "";
7004      },
7005      selectIncome() {
7006        const incomeNum = Number(this.income);
7007        if (!Number.isNaN(incomeNum) && incomeNum > 0) {
7008          this.tempIncome = incomeNum;
7009        }
7010        this.income = 0;
7011      },
7012      resetIncomeIfBlank() {
7013        const incomeNum = Number(this.income);
7014        if (Number.isNaN(incomeNum)) {
7015          this.income = this.tempIncome;
7016        }
7017      },
7018      formatCurrency,
7019      formatGuiltyPlea,
7020      limitedMoney
7021    };
7022  };
7023  var setupFinesCalculator = () => {
7024    document.addEventListener("alpine:init", () => {
7025      module_default.data("finesCalculator", createFinesCalculator);
7026    });
7027  };
7028
7029  
7029// Web/src/scripts/drink-driving-calculator/utils.ts
7030  var addMonths = (date, months) => {
7031    const originalDate = new Date(date);
7032    const originalDay = originalDate.getDate();
7033    const year = originalDate.getFullYear();
7034    const targetMonth = originalDate.getMonth() + months;
7035    const result = new Date(year, targetMonth, originalDay);
7036    if (result.getMonth() !== (targetMonth % 12 + 12) % 12) {
7037      return new Date(year, targetMonth + 1, 0);
7038    }
7039    return result;
7040  };
7041  var subtractMonthsPreservingEndOfMonth = (date, months) => {
7042    const originalDate = new Date(date);
7043    const originalDay = originalDate.getDate();
7044    const targetYear = originalDate.getFullYear();
7045    const targetMonth = originalDate.getMonth() - months;
7046    const result = new Date(targetYear, targetMonth, originalDay);
7047    if (result.getMonth() !== (targetMonth % 12 + 12) % 12) {
7048      return new Date(targetYear, targetMonth + 1, 0);
7049    }
7050    return result;
7051  };
7052  var subtractMonthsClampToMonth = (date, months) => {
7053    const originalDate = new Date(date);
7054    const year = originalDate.getFullYear();
7055    const month = originalDate.getMonth();
7056    const day = originalDate.getDate();
7057    const targetMonth = month - months;
7058    const targetYear = year + Math.floor(targetMonth / 12);
7059    const normalizedTargetMonth = (targetMonth % 12 + 12) % 12;
7060    const lastDayOfTargetMonth = new Date(
7061      targetYear,
7062      normalizedTargetMonth + 1,
7063      0
7064    ).getDate();
7065    const clampedDay = Math.min(day, lastDayOfTargetMonth);
7066    return new Date(targetYear, normalizedTargetMonth, clampedDay);
7067  };
7068  var addDays = (date, days) => {
7069    const result = new Date(date);
7070    result.setDate(result.getDate() + days);
7071    return result;
7072  };
7073  var formatDate = (date) => {
7074    const options = {
7075      day: "2-digit",
7076      month: "long",
7077      year: "numeric"
7078    };
7079    return date.toLocaleDateString("en-GB", options);
7080  };
7081
7082  
7082// Web/src/scripts/drink-driving-calculator/calculations.ts
7083  var calculateLengthOfReduction = (disqualificationPeriod) => {
7084    const periodAsNumber = Number(disqualificationPeriod);
7085    if (periodAsNumber < 12) {
7086      return "No reduction";
7087    } else if (periodAsNumber === 12) {
7088      return "3 months";
7089    } else {
7090      return `${periodAsNumber} weeks`;
7091    }
7092  };
7093  var calculateCustodialExtension = (custodialSentence, custodialDays, custodialWeeks) => {
7094    if (!custodialSentence) {
7095      return 0;
7096    }
7097    const totalDays = Number(custodialDays) + Number(custodialWeeks) * 7;
7098    return Math.ceil(totalDays / 3);
7099  };
7100  var calculateDates = (disqualificationDate, disqualificationPeriod, custodialData) => {
7101    const periodAsNumber = Number(disqualificationPeriod);
7102    const sentenceDate = new Date(disqualificationDate);
7103    const extensionDays = calculateCustodialExtension(
7104      custodialData.sentence,
7105      custodialData.days,
7106      custodialData.weeks
7107    );
7108    const disqualificationEndDate = addDays(
7109      addMonths(sentenceDate, periodAsNumber),
7110      -1
7111    );
7112    const qualifiesForReduction = periodAsNumber >= 12;
7113    const reductionDays = qualifiesForReduction ? 7 * periodAsNumber : 0;
7114    let endDateWithoutCourse = new Date(disqualificationEndDate);
7115    endDateWithoutCourse = addDays(endDateWithoutCourse, extensionDays);
7116    let endDateWithCourse = new Date(disqualificationEndDate);
7117    if (qualifiesForReduction) {
7118      if (periodAsNumber === 12) {
7119        endDateWithCourse = subtractMonthsPreservingEndOfMonth(
7120          disqualificationEndDate,
7121          3
7122        );
7123      } else {
7124        endDateWithCourse = addDays(endDateWithCourse, -reductionDays);
7125      }
7126      endDateWithCourse = addDays(endDateWithCourse, extensionDays);
7127    } else {
7128      endDateWithCourse = new Date(endDateWithoutCourse);
7129    }
7130    let courseDate = new Date(endDateWithCourse);
7131    if (qualifiesForReduction) {
7132      courseDate = subtractMonthsClampToMonth(courseDate, 2);
7133    }
7134    return {
7135      courseDate,
7136      endDateWithCourse,
7137      endDateWithoutCourse
7138    };
7139  };
7140
7141  
7141// Web/src/scripts/drink-driving-calculator/index.ts
7142  var setupDrinkDrivingCalculator = () => {
7143    document.addEventListener("alpine:init", () => {
7144      module_default.data("drinkDrivingCalculator", () => {
7145        return {
7146          // Input fields
7147          disqualificationDate: (/* @__PURE__ */ new Date()).toISOString().split("T")[0],
7148          // Today's date in YYYY-MM-DD format
7149          disqualificationPeriod: 12,
7150          custodialSentence: false,
7151          custodialDays: 0,
7152          custodialWeeks: 0,
7153          // Results
7154          results: {
7155            lengthOfReduction: "No reduction",
7156            courseCompletionDate: "",
7157            endDateWithCourse: "",
7158            endDateWithoutCourse: ""
7159          },
7160          init() {
7161            this.calculateResults();
7162          },
7163          resetCalculator() {
7164            this.disqualificationDate = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
7165            this.disqualificationPeriod = 12;
7166            this.custodialSentence = false;
7167            this.custodialDays = 0;
7168            this.custodialWeeks = 0;
7169            this.calculateResults();
7170          },
7171          calculateResults() {
7172            if (!this.disqualificationDate) {
7173              return;
7174            }
7175            this.results.lengthOfReduction = calculateLengthOfReduction(
7176              this.disqualificationPeriod
7177            );
7178            const dates = calculateDates(
7179              this.disqualificationDate,
7180              this.disqualificationPeriod,
7181              {
7182                sentence: this.custodialSentence,
7183                days: this.custodialDays,
7184                weeks: this.custodialWeeks
7185              }
7186            );
7187            if (this.disqualificationPeriod < 12) {
7188              this.results.courseCompletionDate = "Not applicable";
7189            } else {
7190              this.results.courseCompletionDate = formatDate(dates.courseDate);
7191            }
7192            this.results.endDateWithCourse = formatDate(dates.endDateWithCourse);
7193            this.results.endDateWithoutCourse = formatDate(
7194              dates.endDateWithoutCourse
7195            );
7196          }
7197        };
7198      });
7199    });
7200  };
7201
7202  
7202// Web/src/scripts/guilty-plea-calculator-days-and-weeks/calculations.ts
7203  var calculateReducedSentence = (sentenceWeeks, sentenceDays, reductionPercentage) => {
7204    const weeks = Number(sentenceWeeks) || 0;
7205    const days = Number(sentenceDays) || 0;
7206    const percentage = Number(reductionPercentage) || 0;
7207    const totalInputDays = weeks * 7 + days;
7208    const reductionFactor = Math.round((1 - percentage / 100) * 1e10) / 1e10;
7209    const resultWeeks = Math.floor(totalInputDays * reductionFactor / 7);
7210    const resultDays = Math.floor(
7211      totalInputDays * reductionFactor - resultWeeks * 7
7212    );
7213    const totalDays = Math.floor(totalInputDays * reductionFactor);
7214    return {
7215      resultWeeks,
7216      resultDays,
7217      totalDays
7218    };
7219  };
7220
7221  
7221// Web/src/scripts/guilty-plea-calculator-days-and-weeks/index.ts
7222  var setupGuiltyPleaCalculatorDaysAndWeeks = () => {
7223    document.addEventListener("alpine:init", () => {
7224      module_default.data(
7225        "guiltyPleaCalculatorDaysAndWeeks",
7226        () => {
7227          return {
7228            sentenceWeeks: 0,
7229            sentenceDays: 0,
7230            reductionPercentage: 0,
7231            selectedPreset: "",
7232            results: {
7233              resultWeeks: 0,
7234              resultDays: 0,
7235              totalDays: 0
7236            },
7237            init() {
7238              this.calculateResults();
7239            },
7240            resetCalculator() {
7241              this.sentenceWeeks = 0;
7242              this.sentenceDays = 0;
7243              this.reductionPercentage = 0;
7244              this.selectedPreset = "";
7245              this.calculateResults();
7246            },
7247            calculateResults() {
7248              const { resultWeeks, resultDays, totalDays } = calculateReducedSentence(
7249                this.sentenceWeeks,
7250                this.sentenceDays,
7251                this.reductionPercentage
7252              );
7253              this.results.resultWeeks = resultWeeks;
7254              this.results.resultDays = resultDays;
7255              this.results.totalDays = totalDays;
7256            }
7257          };
7258        }
7259      );
7260    });
7261  };
7262
7263  
7263// Web/src/scripts/guilty-plea-calculator-months-and-years/calculations.ts
7264  var calculateReducedSentence2 = (sentenceYears, sentenceMonths, reductionPercentage) => {
7265    const years = Number(sentenceYears) || 0;
7266    const months = Number(sentenceMonths) || 0;
7267    const percentage = Number(reductionPercentage) || 0;
7268    const totalInputMonths = years * 12 + months;
7269    const reductionFactor = 1 - percentage / 100;
7270    const resultYears = Math.floor(totalInputMonths * reductionFactor / 12);
7271    const resultMonths = Math.floor(
7272      totalInputMonths * reductionFactor - resultYears * 12
7273    );
7274    const totalMonths = Math.floor(totalInputMonths * reductionFactor);
7275    return {
7276      resultYears,
7277      resultMonths,
7278      totalMonths
7279    };
7280  };
7281
7282  
7282// Web/src/scripts/guilty-plea-calculator-months-and-years/index.ts
7283  var setupGuiltyPleaCalculatorMonthsAndYears = () => {
7284    document.addEventListener("alpine:init", () => {
7285      module_default.data(
7286        "guiltyPleaCalculatorMonthsAndYears",
7287        () => {
7288          return {
7289            sentenceYears: 0,
7290            sentenceMonths: 0,
7291            reductionPercentage: 0,
7292            selectedPreset: "",
7293            results: {
7294              resultYears: 0,
7295              resultMonths: 0,
7296              totalMonths: 0
7297            },
7298            init() {
7299              this.calculateResults();
7300            },
7301            resetCalculator() {
7302              this.sentenceYears = 0;
7303              this.sentenceMonths = 0;
7304              this.reductionPercentage = 0;
7305              this.selectedPreset = "";
7306              this.calculateResults();
7307            },
7308            calculateResults() {
7309              const { resultYears, resultMonths, totalMonths } = calculateReducedSentence2(
7310                this.sentenceYears,
7311                this.sentenceMonths,
7312                this.reductionPercentage
7313              );
7314              this.results.resultYears = resultYears;
7315              this.results.resultMonths = resultMonths;
7316              this.results.totalMonths = totalMonths;
7317            }
7318          };
7319        }
7320      );
7321    });
7322  };
7323
7324  
7324// Web/src/scripts/modals/index.ts
7325  var setupModals = () => {
7326    const modalContainer = document.querySelector(
7327      "[data-modal-container]"
7328    );
7329    const modalTitle = document.getElementById("modal-title");
7330    const modalContent = document.getElementById("modal-content");
7331    const closeButton = document.querySelector(
7332      "[data-modal-close]"
7333    );
7334    if (!modalContainer) return;
7335    if (!modalTitle) return;
7336    if (!modalContent) return;
7337    if (!closeButton) return;
7338    modalContainer.setAttribute("tabindex", "-1");
7339    const modalContentElements = document.querySelectorAll(
7340      "[data-modal-content]"
7341    );
7342    modalContentElements.forEach((element) => {
7343      element.classList.add("hidden");
7344    });
7345    let lastFocusedElement = null;
7346    let originalParent = null;
7347    let originalNextSibling = null;
7348    const getFocusableElements = (container) => {
7349      const focusableSelectors = [
7350        "a[href]",
7351        "button:not([disabled])",
7352        "textarea:not([disabled])",
7353        "input:not([disabled])",
7354        "select:not([disabled])",
7355        '[tabindex]:not([tabindex="-1"])'
7356      ].join(", ");
7357      return Array.from(
7358        container.querySelectorAll(focusableSelectors)
7359      );
7360    };
7361    const focusFirstElement = () => {
7362      closeButton.focus();
7363    };
7364    const handleTabBoundary = (firstElement, lastElement, event, isBackward) => {
7365      const activeElement = document.activeElement;
7366      const shouldWrap = isBackward ? activeElement === firstElement : activeElement === lastElement;
7367      if (shouldWrap) {
7368        event.preventDefault();
7369        const targetElement = isBackward ? lastElement : firstElement;
7370        targetElement?.focus();
7371      }
7372    };
7373    const trapFocus = (modal, event) => {
7374      if (event.key !== "Tab") return;
7375      const focusableElements = getFocusableElements(modal);
7376      if (focusableElements.length === 0) {
7377        event.preventDefault();
7378        return;
7379      }
7380      const firstElement = focusableElements[0];
7381      const lastElement = focusableElements[focusableElements.length - 1];
7382      if (focusableElements.length === 1) {
7383        event.preventDefault();
7384        firstElement.focus();
7385        return;
7386      }
7387      handleTabBoundary(firstElement, lastElement, event, event.shiftKey);
7388    };
7389    const openModal = (modalId, triggerElement) => {
7390      const contentElement = document.querySelector(
7391        `[data-modal-content="${modalId}"]`
7392      );
7393      if (!contentElement) return;
7394      lastFocusedElement = triggerElement;
7395      const titleText = contentElement.getAttribute("data-modal-title") || "Modal";
7396      modalTitle.textContent = titleText;
7397      modalTitle.id = `${modalId}-title`;
7398      originalParent = contentElement.parentElement;
7399      originalNextSibling = contentElement.nextElementSibling;
7400      modalContent.appendChild(contentElement);
7401      contentElement.classList.remove("hidden");
7402      modalContainer.setAttribute("aria-labelledby", `${modalId}-title`);
7403      modalContainer.setAttribute("aria-hidden", "false");
7404      modalContainer.classList.remove("hidden");
7405      requestAnimationFrame(() => {
7406        focusFirstElement();
7407      });
7408      document.body.classList.add("overflow-hidden");
7409    };
7410    const closeModal = () => {
7411      modalContainer.classList.add("hidden");
7412      modalContainer.setAttribute("aria-hidden", "true");
7413      modalContainer.removeAttribute("aria-labelledby");
7414      modalTitle.textContent = "";
7415      modalTitle.id = "";
7416      if (originalParent && modalContent.firstElementChild) {
7417        const movedElement = modalContent.firstElementChild;
7418        movedElement.classList.add("hidden");
7419        if (originalNextSibling) {
7420          originalParent.insertBefore(movedElement, originalNextSibling);
7421        } else {
7422          originalParent.appendChild(movedElement);
7423        }
7424      }
7425      originalParent = null;
7426      originalNextSibling = null;
7427      if (lastFocusedElement) {
7428        requestAnimationFrame(() => {
7429          lastFocusedElement?.focus();
7430        });
7431      }
7432      lastFocusedElement = null;
7433      document.body.classList.remove("overflow-hidden");
7434    };
7435    document.addEventListener("click", (event) => {
7436      const target = event.target;
7437      const modalTrigger = target.closest("[data-modal-trigger]");
7438      if (modalTrigger) {
7439        const modalId = modalTrigger.getAttribute("data-modal-trigger");
7440        if (modalId) {
7441          event.preventDefault();
7442          openModal(modalId, modalTrigger);
7443        }
7444      }
7445    });
7446    closeButton.addEventListener("click", closeModal);
7447    modalContainer.addEventListener("click", (event) => {
7448      if (event.target === modalContainer) {
7449        closeModal();
7450      }
7451    });
7452    modalContainer.addEventListener("keydown", (event) => {
7453      const keyEvent = event;
7454      if (keyEvent.key === "Escape") {
7455        closeModal();
7456      } else {
7457        trapFocus(modalContainer, keyEvent);
7458      }
7459    });
7460    window.openModal = (modalContentId) => {
7461      const tempTrigger = document.activeElement || document.body;
7462      openModal(modalContentId, tempTrigger);
7463    };
7464  };
7465  var triggerModal = (modalContentId) => {
7466    const tempTrigger = document.activeElement || document.body;
7467    if (window.openModal) {
7468      window.openModal(modalContentId);
7469    } else {
7470      console.warn(
7471        "Modal system not initialized. Make sure setupModals() has been called."
7472      );
7473    }
7474  };
7475
7476  
vendor: 5,458 bytes, lines 7476-7633
7476// node_modules/@alpinejs/mask/dist/module.esm.js
7477  function src_default2(Alpine2) {
7478    Alpine2.directive("mask", (el, { value, expression }, { effect: effect3, evaluateLater: evaluateLater2, cleanup: cleanup2 }) => {
7479      let templateFn = () => expression;
7480      let lastInputValue = "";
7481      queueMicrotask(() => {
7482        if (["function", "dynamic"].includes(value)) {
7483          let evaluator = evaluateLater2(expression);
7484          effect3(() => {
7485            templateFn = (input) => {
7486              let result;
7487              Alpine2.dontAutoEvaluateFunctions(() => {
7488                evaluator((value2) => {
7489                  result = typeof value2 === "function" ? value2(input) : value2;
7490                }, { scope: {
7491                  // These are "magics" we'll make available to the x-mask:function:
7492                  "$input": input,
7493                  "$money": formatMoney.bind({ el })
7494                } });
7495              });
7496              return result;
7497            };
7498            processInputValue(el, false);
7499          });
7500        } else {
7501          processInputValue(el, false);
7502        }
7503        if (el._x_model) {
7504          if (el._x_model.get() !== el.value) {
7505            if (!(el._x_model.get() === null && el.value === "")) {
7506              el._x_model.set(el.value);
7507            }
7508          }
7509          let updater = el._x_forceModelUpdate;
7510          el._x_forceModelUpdate = (value2) => {
7511            value2 = String(value2);
7512            let template = templateFn(value2);
7513            if (template && template !== "false") {
7514              value2 = formatInput(template, value2);
7515            }
7516            lastInputValue = value2;
7517            updater(value2);
7518            el._x_model.set(value2);
7519          };
7520        }
7521      });
7522      const controller = new AbortController();
7523      cleanup2(() => {
7524        controller.abort();
7525      });
7526      el.addEventListener("input", () => processInputValue(el), {
7527        signal: controller.signal,
7528        // Setting this as a capture phase listener to ensure it runs
7529        // before wire:model or x-model added as a latent binding...
7530        capture: true
7531      });
7532      el.addEventListener("blur", () => processInputValue(el, false), { signal: controller.signal });
7533      function processInputValue(el2, shouldRestoreCursor = true) {
7534        let input = el2.value;
7535        let template = templateFn(input);
7536        if (!template || template === "false")
7537          return false;
7538        if (lastInputValue.length - el2.value.length === 1) {
7539          return lastInputValue = el2.value;
7540        }
7541        let setInput = () => {
7542          lastInputValue = el2.value = formatInput(template, input);
7543        };
7544        if (shouldRestoreCursor) {
7545          restoreCursorPosition(el2, template, () => {
7546            setInput();
7547          });
7548        } else {
7549          setInput();
7550        }
7551      }
7552    }).before("model");
7553  }
7554  function restoreCursorPosition(el, template, callback) {
7555    let cursorPosition = el.selectionStart;
7556    let unformattedValue = el.value;
7557    callback();
7558    let beforeLeftOfCursorBeforeFormatting = unformattedValue.slice(0, cursorPosition);
7559    let newPosition = formatInput(
7560      template,
7561      beforeLeftOfCursorBeforeFormatting
7562    ).length;
7563    el.setSelectionRange(newPosition, newPosition);
7564  }
7565  var regexes = {
7566    "9": /[0-9]/,
7567    "a": /[a-zA-Z]/,
7568    "*": /[a-zA-Z0-9]/
7569  };
7570  function formatInput(template, input) {
7571    let templateMark = 0;
7572    let inputMark = 0;
7573    let output = "";
7574    while (templateMark < template.length && inputMark < input.length) {
7575      let templateChar = template[templateMark];
7576      let inputChar = input[inputMark];
7577      if (templateChar in regexes) {
7578        if (regexes[templateChar].test(inputChar)) {
7579          output += inputChar;
7580          templateMark++;
7581        }
7582        inputMark++;
7583      } else {
7584        output += templateChar;
7585        templateMark++;
7586        if (templateChar === input[inputMark])
7587          inputMark++;
7588      }
7589    }
7590    return output;
7591  }
7592  function formatMoney(input, delimiter = ".", thousands, precision = 2) {
7593    if (input === "-")
7594      return "-";
7595    if (/^\D+$/.test(input))
7596      return "9";
7597    if (thousands === null || thousands === void 0) {
7598      thousands = delimiter === "," ? "." : ",";
7599    }
7600    let addThousands = (input2, thousands2) => {
7601      let output = "";
7602      let counter = 0;
7603      for (let i = input2.length - 1; i >= 0; i--) {
7604        if (input2[i] === thousands2)
7605          continue;
7606        if (counter === 3) {
7607          output = input2[i] + thousands2 + output;
7608          counter = 0;
7609        } else {
7610          output = input2[i] + output;
7611        }
7612        counter++;
7613      }
7614      return output;
7615    };
7616    let minus = input.startsWith("-") ? "-" : "";
7617    let strippedInput = input.replaceAll(new RegExp(`[^0-9\\${delimiter}]`, "g"), "");
7618    let template = Array.from({ length: strippedInput.split(delimiter)[0].length }).fill("9").join("");
7619    template = `${minus}${addThousands(template, thousands)}`;
7620    if (precision > 0 && input.includes(delimiter))
7621      template += `${delimiter}` + "9".repeat(precision);
7622    queueMicrotask(() => {
7623      if (this.el.value.endsWith(delimiter))
7624        return;
7625      if (this.el.value[this.el.selectionStart - 1] === delimiter) {
7626        this.el.setSelectionRange(this.el.selectionStart - 1, this.el.selectionStart - 1);
7627      }
7628    });
7629    return template;
7630  }
7631  var module_default2 = src_default2;
7632
7633  
7633// Web/src/scripts/toggles/dropdowns.ts
7634  var closeOtherDropdowns = (currentButton, allButtons, config) => {
7635    allButtons.forEach((otherButton) => {
7636      if (otherButton !== currentButton) {
7637        const otherMenu = otherButton.nextElementSibling;
7638        const otherIcon = otherButton.querySelector(config.iconSelector);
7639        const otherParentElement = config.parentSelector ? otherButton.closest(config.parentSelector) : null;
7640        otherButton.setAttribute("aria-expanded", "false");
7641        otherIcon?.classList.remove("rotate-180");
7642        otherMenu?.classList.remove("flex");
7643        otherMenu?.classList.add("hidden");
7644        otherParentElement?.classList.remove("bg-white/10");
7645      }
7646    });
7647  };
7648  var toggleDropdown = (elements, isExpanded) => {
7649    elements.button.setAttribute("aria-expanded", (!isExpanded).toString());
7650    elements.icon?.classList.toggle("rotate-180", !isExpanded);
7651    elements.menu.classList.toggle("flex", !isExpanded);
7652    elements.menu.classList.toggle("hidden", isExpanded);
7653    elements.parentElement?.classList.toggle("bg-white/10", !isExpanded);
7654  };
7655  var setupDropdownType = (selector, config) => {
7656    const dropdownButtons = document.querySelectorAll(selector);
7657    dropdownButtons.forEach((button) => {
7658      const dropdownMenu = button.nextElementSibling;
7659      if (dropdownMenu) {
7660        button.addEventListener("click", () => {
7661          const isExpanded = button.getAttribute("aria-expanded") === "true";
7662          const dropdownIcon = button.querySelector(config.iconSelector);
7663          const parentElement = config.parentSelector ? button.closest(config.parentSelector) : null;
7664          closeOtherDropdowns(button, dropdownButtons, config);
7665          const elements = {
7666            button,
7667            menu: dropdownMenu,
7668            icon: dropdownIcon,
7669            parentElement
7670          };
7671          toggleDropdown(elements, isExpanded);
7672          if (button.id === "site-search-toggle") {
7673            const searchInput = document.getElementById(
7674              "site-search"
7675            );
7676            if (searchInput) {
7677              searchInput.focus();
7678              searchInput.setSelectionRange(
7679                searchInput.value.length,
7680                searchInput.value.length
7681              );
7682            }
7683          }
7684        });
7685      }
7686    });
7687  };
7688  var setupNavigationDropdowns = () => {
7689    const config = {
7690      iconSelector: "[data-nav-dropdown-menu-icon]",
7691      parentSelector: "[data-nav-dropdown]"
7692    };
7693    setupDropdownType("[data-nav-dropdown-toggle]", config);
7694  };
7695  var setupDropdowns = () => {
7696    const config = {
7697      iconSelector: "[data-dropdown-menu-icon]"
7698    };
7699    setupDropdownType("[data-dropdown-toggle]", config);
7700  };
7701  var setupMobileNavToggle = () => {
7702    const toggleButton = document.querySelector("[data-mobile-nav-toggle]");
7703    const navMenu = document.querySelector("[data-mobile-nav-menu]");
7704    const navOpenIcon = document.querySelector("[data-mobile-nav-open-icon]");
7705    const navCloseIcon = document.querySelector("[data-mobile-nav-close-icon]");
7706    const areNavElementsPresent = toggleButton && navMenu && navOpenIcon && navCloseIcon;
7707    if (areNavElementsPresent) {
7708      toggleButton.addEventListener("click", () => {
7709        const isExpanded = toggleButton.getAttribute("aria-expanded") === "true";
7710        toggleButton.setAttribute("aria-expanded", (!isExpanded).toString());
7711        navMenu.classList.toggle("hidden", isExpanded);
7712        navOpenIcon.classList.toggle("hidden", !isExpanded);
7713        navCloseIcon.classList.toggle("hidden", isExpanded);
7714        document.body.classList.toggle("md:overflow-hidden", !isExpanded);
7715        document.body.classList.toggle("xl:overflow-auto", !isExpanded);
7716      });
7717    }
7718  };
7719
7720  
7720// Web/src/scripts/toggles/accordions.ts
7721  var toggleAccordionPanel = (toggle, panel, isExpanded) => {
7722    toggle.setAttribute("aria-expanded", (!isExpanded).toString());
7723    if (isExpanded) {
7724      panel.classList.add("hidden");
7725      panel.setAttribute("aria-hidden", "true");
7726    } else {
7727      panel.classList.remove("hidden");
7728      panel.setAttribute("aria-hidden", "false");
7729    }
7730    const svgIcon = toggle.querySelector("svg");
7731    svgIcon?.classList.toggle("rotate-180", !isExpanded);
7732  };
7733  var setupAccordions = () => {
7734    const toggles = document.querySelectorAll("[data-accordion-toggle]");
7735    toggles.forEach((toggle) => {
7736      toggle.addEventListener("click", () => {
7737        const isExpanded = toggle.getAttribute("aria-expanded") === "true";
7738        const panel = toggle.nextElementSibling;
7739        if (panel && panel.hasAttribute("data-accordion-panel")) {
7740          toggleAccordionPanel(toggle, panel, isExpanded);
7741        }
7742      });
7743    });
7744  };
7745  var hasClosedAccordions = (toggles) => {
7746    return Array.from(toggles).some(
7747      (toggle) => toggle.getAttribute("aria-expanded") !== "true"
7748    );
7749  };
7750  var updateAccordionState = (toggle, panel, shouldOpen) => {
7751    toggle.setAttribute("aria-expanded", shouldOpen.toString());
7752    if (panel && panel.hasAttribute("data-accordion-panel")) {
7753      if (shouldOpen) {
7754        panel.classList.remove("hidden");
7755        panel.setAttribute("aria-hidden", "false");
7756      } else {
7757        panel.classList.add("hidden");
7758        panel.setAttribute("aria-hidden", "true");
7759      }
7760    }
7761    const svgIcon = toggle.querySelector("svg");
7762    svgIcon?.classList.toggle("rotate-180", shouldOpen);
7763  };
7764  var toggleAllAccordions = () => {
7765    const toggles = document.querySelectorAll("[data-accordion-toggle]");
7766    const shouldOpenAll = hasClosedAccordions(toggles);
7767    toggles.forEach((toggle) => {
7768      const panel = toggle.nextElementSibling;
7769      updateAccordionState(toggle, panel, shouldOpenAll);
7770    });
7771  };
7772  var setupToggleAllAccordions = () => {
7773    const toggleAllButton = document.querySelector(
7774      "[data-toggle-all-accordions]"
7775    );
7776    if (toggleAllButton) {
7777      toggleAllButton.addEventListener("click", () => {
7778        toggleAllAccordions();
7779      });
7780    }
7781  };
7782
7783  
7783// Web/src/scripts/toggles/tabs.ts
7784  var setTabVisualState = (link, isActive) => {
7785    if (isActive) {
7786      link.classList.add("bg-white", "border-b-green", "text-dark");
7787      link.classList.remove("text-gray", "border-b-lighter-gray");
7788    } else {
7789      link.classList.remove("bg-white", "border-b-green", "text-dark");
7790      link.classList.add("text-gray", "border-b-lighter-gray");
7791    }
7792  };
7793  var setupTabPanel = (panel, index2, isActive) => {
7794    const panelId = `tab-panel-${index2}`;
7795    panel.setAttribute("role", "tabpanel");
7796    panel.setAttribute("id", panelId);
7797    panel.setAttribute("aria-labelledby", `tab-${index2}`);
7798    panel.setAttribute("tabindex", "0");
7799    if (isActive) {
7800      panel.classList.remove("hidden");
7801      panel.setAttribute("aria-hidden", "false");
7802    } else {
7803      panel.classList.add("hidden");
7804      panel.setAttribute("aria-hidden", "true");
7805    }
7806  };
7807  var setupTabLink = (link, index2, isActive, tabPanels) => {
7808    link.setAttribute("role", "tab");
7809    link.setAttribute("tabindex", isActive ? "0" : "-1");
7810    link.setAttribute("aria-selected", isActive ? "true" : "false");
7811    link.setAttribute("id", `tab-${index2}`);
7812    link.setAttribute("aria-controls", `tab-panel-${index2}`);
7813    setTabVisualState(link, isActive);
7814    if (tabPanels[index2]) {
7815      setupTabPanel(tabPanels[index2], index2, isActive);
7816    }
7817  };
7818  var updateTabsAndPanels = (tabLinks, tabPanels, activeLink) => {
7819    tabLinks.forEach((otherLink, otherIndex) => {
7820      const isSelected = otherLink === activeLink;
7821      otherLink.setAttribute("aria-selected", isSelected ? "true" : "false");
7822      otherLink.setAttribute("tabindex", isSelected ? "0" : "-1");
7823      setTabVisualState(otherLink, isSelected);
7824      if (tabPanels[otherIndex]) {
7825        const panel = tabPanels[otherIndex];
7826        if (isSelected) {
7827          panel.classList.remove("hidden");
7828          panel.setAttribute("aria-hidden", "false");
7829        } else {
7830          panel.classList.add("hidden");
7831          panel.setAttribute("aria-hidden", "true");
7832        }
7833      }
7834    });
7835  };
7836  var setupTabClickHandler = (link, tabLinks, tabPanels) => {
7837    link.addEventListener("click", (event) => {
7838      event.preventDefault();
7839      updateTabsAndPanels(tabLinks, tabPanels, link);
7840      link.focus();
7841    });
7842  };
7843  var setupTabKeyboardHandler = (link, tabLinks) => {
7844    link.addEventListener("keydown", (event) => {
7845      const keyboardEvent = event;
7846      const currentIndex = Array.from(tabLinks).indexOf(link);
7847      let targetIndex = currentIndex;
7848      switch (keyboardEvent.key) {
7849        case "ArrowLeft":
7850          keyboardEvent.preventDefault();
7851          targetIndex = currentIndex > 0 ? currentIndex - 1 : tabLinks.length - 1;
7852          break;
7853        case "ArrowRight":
7854          keyboardEvent.preventDefault();
7855          targetIndex = currentIndex < tabLinks.length - 1 ? currentIndex + 1 : 0;
7856          break;
7857        case "Home":
7858          keyboardEvent.preventDefault();
7859          targetIndex = 0;
7860          break;
7861        case "End":
7862          keyboardEvent.preventDefault();
7863          targetIndex = tabLinks.length - 1;
7864          break;
7865        default:
7866          return;
7867      }
7868      tabLinks[targetIndex].click();
7869    });
7870  };
7871  var setupTabs = () => {
7872    const tabContainers = document.querySelectorAll("[data-tabs]");
7873    tabContainers.forEach((container) => {
7874      const allLinks = container.querySelectorAll("a");
7875      const tabLinks = Array.from(allLinks).filter(
7876        (link) => link.getAttribute("href")?.startsWith("#")
7877      );
7878      const tabPanels = container.parentElement?.querySelectorAll("[data-tab-panel]") || [];
7879      let activeTabIndex = 0;
7880      const serverActiveTab = tabLinks.findIndex(
7881        (link) => link.hasAttribute("active") && link.getAttribute("active") !== "false"
7882      );
7883      if (serverActiveTab !== -1) {
7884        activeTabIndex = serverActiveTab;
7885      }
7886      tabLinks.forEach((link, index2) => {
7887        const isActive = index2 === activeTabIndex;
7888        setupTabLink(link, index2, isActive, tabPanels);
7889        setupTabClickHandler(link, tabLinks, tabPanels);
7890        setupTabKeyboardHandler(link, tabLinks);
7891      });
7892      container.setAttribute("role", "tablist");
7893    });
7894  };
7895
7896  
7896// Web/src/scripts/guidelines-search/index.ts
7897  var import_fuzzysort = __toESM(require_fuzzysort());
7898  var isEmpty2 = (value) => !value || value.trim() === "";
7899  var matchesCollection = (relevantCollections, selectedCollection) => isEmpty2(selectedCollection) || relevantCollections.some(
7900    (collection) => collection.id.toString() === selectedCollection
7901  );
7902  var getCollectionsWithCount = (collections, guidelines) => collections.map((collection) => ({
7903    ...collection,
7904    count: guidelines.filter(
7905      (guideline) => guideline.relevantCollections.some((rc) => rc.id === collection.id)
7906    ).length
7907  }));
7908  var hasActiveFilters2 = (criteria) => !isEmpty2(criteria.searchTerm) || !isEmpty2(criteria.collectionId);
7909  var collectionFilterGuidelines = (guidelines, collectionId) => guidelines.filter(
7910    (guideline) => matchesCollection(guideline.relevantCollections, collectionId)
7911  );
7912  var createSearchableEntries = (guidelines) => {
7913    const entries = [];
7914    guidelines.forEach((guideline) => {
7915      entries.push({
7916        guideline,
7917        searchField: guideline.name,
7918        fieldType: "name"
7919      });
7920      if (guideline.tags && guideline.tags.length > 0) {
7921        guideline.tags.forEach((tag) => {
7922          entries.push({
7923            guideline,
7924            searchField: tag,
7925            fieldType: "tag"
7926          });
7927        });
7928      }
7929      if (guideline.acts) {
7930        entries.push({
7931          guideline,
7932          searchField: guideline.acts,
7933          fieldType: "acts"
7934        });
7935      }
7936    });
7937    return entries;
7938  };
7939  var performFuzzySearch = (searchTerm, guidelines) => {
7940    if (isEmpty2(searchTerm)) {
7941      return guidelines;
7942    }
7943    const searchableEntries = createSearchableEntries(guidelines);
7944    const results = import_fuzzysort.default.go(searchTerm, searchableEntries, {
7945      keys: ["searchField"],
7946      threshold: 0.24,
7947      all: true,
7948      scoreFn: (result) => {
7949        if (!result || result.score === -Infinity) {
7950          return -Infinity;
7951        }
7952        let multiplier = 1;
7953        if (result.obj.fieldType === "name" && result.score > 0.6) {
7954          multiplier = 2.5;
7955        }
7956        return result.score * multiplier;
7957      }
7958    });
7959    const guidelineMap = /* @__PURE__ */ new Map();
7960    results.forEach((result) => {
7961      const guideline = result.obj.guideline;
7962      const score = result.score;
7963      if (!guidelineMap.has(guideline.id) || guidelineMap.get(guideline.id).bestScore < score) {
7964        guidelineMap.set(guideline.id, { guideline, bestScore: score });
7965      }
7966    });
7967    return Array.from(guidelineMap.values()).sort((a, b) => b.bestScore - a.bestScore).map((entry) => entry.guideline);
7968  };
7969  var createGuidelineSearch = (initialGuidelineData = [], allCollections = []) => {
7970    const guidelines = Array.isArray(initialGuidelineData) ? initialGuidelineData : [];
7971    const collections = Array.isArray(allCollections) ? allCollections : [];
7972    return {
7973      guidelines,
7974      collections,
7975      searchTerm: "",
7976      selectedCollection: "",
7977      isInitialized: false,
7978      init() {
7979        setTimeout(() => {
7980          const searchInput = document.getElementById(
7981            "guideline-search"
7982          );
7983          const filterSelect = document.getElementById(
7984            "guideline-search-filter"
7985          );
7986          if (searchInput && searchInput.value) {
7987            this.searchTerm = searchInput.value;
7988          }
7989          if (filterSelect && filterSelect.value) {
7990            this.selectedCollection = filterSelect.value;
7991          }
7992          this.isInitialized = true;
7993        }, 300);
7994      },
7995      get hasActiveFilters() {
7996        return hasActiveFilters2(this.getFilterCriteria());
7997      },
7998      get filteredGuidelines() {
7999        const criteria = this.getFilterCriteria();
8000        const searchFiltered = performFuzzySearch(
8001          criteria.searchTerm,
8002          this.guidelines
8003        );
8004        return collectionFilterGuidelines(searchFiltered, criteria.collectionId);
8005      },
8006      get collectionsWithCount() {
8007        const criteria = this.getFilterCriteria();
8008        const searchFiltered = performFuzzySearch(
8009          criteria.searchTerm,
8010          this.guidelines
8011        );
8012        return getCollectionsWithCount(this.collections, searchFiltered);
8013      },
8014      get noResultsVisible() {
8015        return this.hasActiveFilters && this.filteredGuidelines.length === 0;
8016      },
8017      getFilterCriteria() {
8018        return {
8019          searchTerm: this.searchTerm,
8020          collectionId: this.selectedCollection
8021        };
8022      }
8023    };
8024  };
8025  var setupGuidelineSearch = () => {
8026    document.addEventListener("alpine:init", () => {
8027      module_default.data("guidelineSearch", createGuidelineSearch);
8028    });
8029  };
8030
8031  
8031// Web/src/scripts/latest-filter/index.ts
8032  var submitLatestFilterTerms = () => {
8033    submitFilterTerms("latest-filter");
8034  };
8035  var submitPublicationsFilterTerms = () => {
8036    submitFilterTerms("publications-filter");
8037  };
8038  var submitSiteSearchFilterTerms = () => {
8039    submitFilterTerms("site-search-filter");
8040  };
8041  var submitFilterTerms = (formId) => {
8042    const form = document.getElementById(formId);
8043    const documentTypeSelect = document.getElementById(
8044      "document-type-filter"
8045    );
8046    const topicSelect = document.getElementById(
8047      "topic-filter"
8048    );
8049    if (!form) return;
8050    if (documentTypeSelect) {
8051      documentTypeSelect.addEventListener("input", () => {
8052        form.submit();
8053      });
8054    }
8055    if (topicSelect) {
8056      topicSelect.addEventListener("change", () => {
8057        form.submit();
8058      });
8059    }
8060  };
8061
8062  
8062// Web/src/scripts/offline-pages/register-sw.ts
8063  function registerOfflineSW() {
8064    if ("serviceWorker" in navigator) {
8065      window.addEventListener("load", () => {
8066        navigator.serviceWorker.register("/sw.js").then((reg) => {
8067          console.log("Service worker registered at /sw.js", reg);
8068          reg.addEventListener("updatefound", () => {
8069            const newSW = reg.installing;
8070            if (newSW) {
8071              newSW.addEventListener("statechange", () => {
8072                if (newSW.state === "installed" && navigator.serviceWorker.controller) {
8073                  newSW.postMessage({ type: "SKIP_WAITING" });
8074                  window.location.reload();
8075                }
8076              });
8077            }
8078          });
8079        }).catch((err) => console.error("SW registration failed", err));
8080      });
8081    }
8082  }
8083  async function addOrRemovePageFromCache(url = window.location.href, addUrl) {
8084    try {
8085      const registration = await navigator.serviceWorker.ready;
8086      const postMessage = addUrl ? "CACHE_URL" : "REMOVE_URL";
8087      if (registration.active) {
8088        registration.active.postMessage({ type: postMessage, url });
8089        await waitForCacheOperation(url, addUrl);
8090      } else {
8091        console.warn("No active service worker found");
8092      }
8093    } catch (error2) {
8094      console.error("Service worker not available:", error2);
8095    }
8096  }
8097  async function waitForCacheOperation(url, shouldExist) {
8098    const cache = await caches.open("offline-pages");
8099    const maxAttempts = 40;
8100    let attempts = 0;
8101    return new Promise((resolve, reject) => {
8102      const checkCache = async () => {
8103        try {
8104          const cached = await cache.match(url);
8105          const exists = !!cached;
8106          if (exists === shouldExist) {
8107            resolve();
8108            return;
8109          }
8110          attempts++;
8111          if (attempts >= maxAttempts) {
8112            reject(new Error(`Cache operation timed out for ${url}`));
8113            return;
8114          }
8115          setTimeout(checkCache, 100);
8116        } catch (error2) {
8117          reject(error2);
8118        }
8119      };
8120      checkCache();
8121    });
8122  }
8123  async function listOfflinePages() {
8124    const cache = await caches.open("offline-pages");
8125    const requests = await cache.keys();
8126    return requests.map((req) => req.url);
8127  }
8128  async function clearAllOfflinePages() {
8129    const cache = await caches.open("offline-pages");
8130    const requests = await cache.keys();
8131    const clearPromises = requests.filter((req) => !req.url.includes("bookmarks")).map((req) => cache.delete(req));
8132    await Promise.all(clearPromises);
8133  }
8134
8135  
8135// Web/src/scripts/offline-pages/utils.ts
8136  var normalizeUrl = (url) => {
8137    try {
8138      const urlObj = new URL(url, self?.location?.origin || location.origin);
8139      return urlObj.pathname + urlObj.search;
8140    } catch {
8141      return url;
8142    }
8143  };
8144
8145  
8145// Web/src/scripts/offline-pages/offline-save-display.ts
8146  var createBookmarkItem = (url, title) => {
8147    const template = document.getElementById(
8148      "bookmark-item-template"
8149    );
8150    if (!template) return null;
8151    const clone3 = template.content.cloneNode(true);
8152    const linkElement = clone3.querySelector(
8153      "[data-bookmark-link]"
8154    );
8155    const titleElement = clone3.querySelector(
8156      "[data-bookmark-title]"
8157    );
8158    if (linkElement) {
8159      linkElement.href = url.replace(location.origin, "");
8160    }
8161    if (titleElement) {
8162      titleElement.textContent = title;
8163    }
8164    return clone3;
8165  };
8166  var getPageTitle = async (url) => {
8167    const cache = await caches.open("offline-pages");
8168    const resp = await cache.match(url);
8169    let title = url.replace(location.origin, "") || url;
8170    if (resp) {
8171      const html = await resp.text();
8172      const doc = new DOMParser().parseFromString(html, "text/html");
8173      title = doc.querySelector("title")?.textContent?.trim() || title;
8174    }
8175    return title;
8176  };
8177  var getFilteredOfflineUrls = async () => {
8178    const urls = await listOfflinePages();
8179    return urls.filter((url) => !url.includes("bookmarks"));
8180  };
8181  var toggleUIElements = (hasBookmarks) => {
8182    const noBookmarks = document.getElementById("no-bookmarks");
8183    const clearAllButton = document.getElementById("clear-all-bookmarks");
8184    if (hasBookmarks) {
8185      noBookmarks?.classList.add("hidden");
8186      clearAllButton && (clearAllButton.style.display = "block");
8187      return;
8188    }
8189    noBookmarks?.classList.remove("hidden");
8190    clearAllButton && (clearAllButton.style.display = "none");
8191  };
8192  var renderBookmarkItems = async (urls, container) => {
8193    const template = document.getElementById(
8194      "bookmark-item-template"
8195    );
8196    if (!template) {
8197      container.innerHTML = "<div>Error: Template not found</div>";
8198      return;
8199    }
8200    const entries = await Promise.all(
8201      urls.map(async (url) => ({
8202        url,
8203        title: await getPageTitle(url)
8204      }))
8205    );
8206    entries.sort((a, b) => a.title.localeCompare(b.title));
8207    entries.forEach(({ url, title }) => {
8208      const bookmarkItem = createBookmarkItem(url, title);
8209      if (bookmarkItem) {
8210        container.appendChild(bookmarkItem);
8211      }
8212    });
8213  };
8214  var getBookmarkUrl = (element) => {
8215    const parentContainer = element.closest(".guideline-selector");
8216    if (parentContainer) {
8217      const anchorElement = parentContainer.querySelector(
8218        "a.guideline-link"
8219      );
8220      if (anchorElement && anchorElement.href) {
8221        return anchorElement.href;
8222      }
8223    }
8224    return window.location.href;
8225  };
8226  var setupOfflineSaveDisplay = async () => {
8227    const container = document.getElementById("offline-pages-list");
8228    if (!container) return;
8229    container.innerHTML = "<div>Loading\u2026</div>";
8230    try {
8231      const filteredUrls = await getFilteredOfflineUrls();
8232      container.innerHTML = "";
8233      const hasBookmarks = filteredUrls.length > 0;
8234      toggleUIElements(hasBookmarks);
8235      if (!hasBookmarks) return;
8236      await renderBookmarkItems(filteredUrls, container);
8237      setupClearAllBookmarks();
8238      setupOfflineRemove();
8239    } catch {
8240      container.innerHTML = "<div>Error loading saved pages</div>";
8241      const clearAllButton = document.getElementById("clear-all-bookmarks");
8242      if (clearAllButton) clearAllButton.style.display = "none";
8243    }
8244  };
8245  var setupOfflineToggle = () => {
8246    const offlineAddElements = document.querySelectorAll(".offline-add");
8247    if (offlineAddElements.length === 0) return;
8248    offlineAddElements.forEach((offlineAdd) => {
8249      const offlineAddElement = offlineAdd;
8250      const parentContainer = offlineAddElement.parentElement;
8251      if (!parentContainer) return;
8252      const offlineRemove = parentContainer.querySelector(
8253        ".offline-remove"
8254      );
8255      if (!offlineRemove) return;
8256      const guidelineUrl = getBookmarkUrl(offlineAddElement);
8257      const normalizedGuidelineUrl = normalizeUrl(guidelineUrl);
8258      const updateButton = async () => {
8259        const urls = await listOfflinePages();
8260        const normalizedUrls = urls.map((url) => normalizeUrl(url));
8261        const isSaved = normalizedUrls.includes(normalizedGuidelineUrl);
8262        offlineAddElement.style.display = isSaved ? "none" : "block";
8263        offlineRemove.style.display = isSaved ? "block" : "none";
8264      };
8265      offlineAddElement.onclick = async () => {
8266        await addOrRemovePageFromCache(guidelineUrl, true);
8267        updateButton();
8268      };
8269      offlineRemove.onclick = async () => {
8270        await addOrRemovePageFromCache(guidelineUrl, false);
8271        updateButton();
8272      };
8273      updateButton();
8274    });
8275  };
8276  var setupClearAllBookmarks = () => {
8277    const clearAllButton = document.getElementById("clear-all-bookmarks");
8278    if (!clearAllButton) return;
8279    clearAllButton.onclick = async () => {
8280      await clearAllOfflinePages();
8281      await setupOfflineSaveDisplay();
8282    };
8283  };
8284  var setupOfflineRemove = () => {
8285    const removeButtons = document.querySelectorAll("#offline-remove-individual");
8286    removeButtons.forEach((button) => {
8287      const offlineRemove = button;
8288      const bookmarkItem = offlineRemove.closest("div");
8289      if (!bookmarkItem) return;
8290      const linkElement = bookmarkItem.querySelector(
8291        "[data-bookmark-link]"
8292      );
8293      if (!linkElement) return;
8294      const pageUrl = linkElement.href;
8295      offlineRemove.onclick = async () => {
8296        await addOrRemovePageFromCache(pageUrl, false);
8297        bookmarkItem.remove();
8298        const container = document.getElementById("offline-pages-list");
8299        const remainingItems = container?.children.length || 0;
8300        toggleUIElements(remainingItems > 0);
8301      };
8302    });
8303  };
8304
8305  
8305// Web/src/scripts/guideline/index.ts
8306  var submitFormAsync = async (form, container) => {
8307    try {
8308      const formData = new FormData(form);
8309      const actionUrl = form.action || window.location.href;
8310      const response = await fetch(actionUrl, {
8311        method: "POST",
8312        body: formData,
8313        headers: {
8314          "X-Requested-With": "XMLHttpRequest"
8315        }
8316      });
8317      if (!response.ok) {
8318        throw new Error(`HTTP error! status: ${response.status}`);
8319      }
8320      const responseText = await response.text();
8321      handleFormResponse(container, responseText);
8322    } catch (error2) {
8323      handleFormError(container);
8324    }
8325  };
8326  var handleFormResponse = (container, response) => {
8327    const tempDiv = document.createElement("div");
8328    tempDiv.innerHTML = response;
8329    const responseContainer = tempDiv.querySelector(
8330      "#guideline-feedback-form-container"
8331    );
8332    if (responseContainer) {
8333      container.innerHTML = responseContainer.innerHTML;
8334      setupAjaxFormHandler(container);
8335    }
8336  };
8337  var handleFormError = (container) => {
8338    container.innerHTML = `Sorry, something went wrong whilst submitting your feedback. Please try again later or contact us directly.`;
8339    setupAjaxFormHandler(container);
8340  };
8341  var setupAjaxFormHandler = (container) => {
8342    const form = container.querySelector("form");
8343    if (!form) return;
8344    form.addEventListener("submit", async (event) => {
8345      event.preventDefault();
8346      const submitButton = form.querySelector(
8347        'input[type="submit"]'
8348      );
8349      if (submitButton) {
8350        submitButton.disabled = true;
8351        try {
8352          await submitFormAsync(form, container);
8353        } finally {
8354          submitButton.disabled = false;
8355        }
8356      } else {
8357        await submitFormAsync(form, container);
8358      }
8359    });
8360  };
8361  var setupGuidelineForm = () => {
8362    const guidelineFormContainer = document.getElementById(
8363      "guideline-feedback-form-container"
8364    );
8365    if (guidelineFormContainer) {
8366      setupAjaxFormHandler(guidelineFormContainer);
8367    }
8368  };
8369
8370  
8370// Web/src/scripts/back-to-top/index.ts
8371  var setupBackToTop = () => {
8372    const backToTopButton = document.getElementById("back-to-top");
8373    if (!backToTopButton) {
8374      return;
8375    }
8376    let isVisible = false;
8377    const handleScroll = () => {
8378      const shouldShow = window.scrollY > 100;
8379      if (shouldShow && !isVisible) {
8380        backToTopButton.classList.remove("hidden");
8381        isVisible = true;
8382      } else if (!shouldShow && isVisible) {
8383        backToTopButton.classList.add("hidden");
8384        isVisible = false;
8385      }
8386    };
8387    const scrollToTop = () => {
8388      window.scrollTo({
8389        top: 0,
8390        behavior: "smooth"
8391      });
8392    };
8393    window.addEventListener("scroll", handleScroll, { passive: true });
8394    backToTopButton.addEventListener("click", scrollToTop);
8395    handleScroll();
8396  };
8397
8398  
8398// Web/src/scripts/you-be-the-judge/index.ts
8399  var ON_START_FORM_MODAL_REDIRECT = "data-ybtj-on-start-form-modal-redirect";
8400  var ON_EXIT_FORM_MODAL_REDIRECT = "data-ybtj-on-exit-form-modal-redirect";
8401  var ON_START_COMPLETE_SESSION_ITEM_KEY = "ybtj-on-start-complete";
8402  var ON_EXIT_COMPLETE_SESSION_ITEM_KEY = "ybtj-on-exit-complete";
8403  var submitFormAsync2 = async (form, type) => {
8404    try {
8405      const formData = new FormData(form);
8406      const actionUrl = form.action || window.location.href;
8407      const response = await fetch(actionUrl, {
8408        method: "POST",
8409        body: formData,
8410        headers: {
8411          "X-Requested-With": "XMLHttpRequest"
8412        }
8413      });
8414      if (!response.ok) {
8415        throw new Error(`HTTP error! status: ${response.status}`);
8416      }
8417      resetAndRedirect(form, type);
8418    } catch (error2) {
8419      alert(`Error submitting form: ${error2}`);
8420    }
8421  };
8422  var resetAndRedirect = (form, type) => {
8423    const onStartRedirectHolder = document.querySelector(
8424      `[${ON_START_FORM_MODAL_REDIRECT}]`
8425    );
8426    const onExitRedirectHolder = document.querySelector(
8427      `[${ON_EXIT_FORM_MODAL_REDIRECT}]`
8428    );
8429    if (type === "on-start-form" && onStartRedirectHolder) {
8430      form.reset();
8431      sessionStorage.setItem(ON_START_COMPLETE_SESSION_ITEM_KEY, "true");
8432      window.location.href = onStartRedirectHolder.getAttribute(ON_START_FORM_MODAL_REDIRECT) || "";
8433    }
8434    if (type === "on-exit-form" && onExitRedirectHolder) {
8435      form.reset();
8436      sessionStorage.setItem(ON_EXIT_COMPLETE_SESSION_ITEM_KEY, "true");
8437      window.location.href = onExitRedirectHolder.getAttribute(ON_EXIT_FORM_MODAL_REDIRECT) || "";
8438    }
8439  };
8440  var setupAjaxFormHandler2 = (container) => {
8441    const type = container.getAttribute("data-ybtj-forms-ajax");
8442    const form = container.querySelector("form");
8443    if (!form || !type) return;
8444    form.addEventListener("submit", async (event) => {
8445      event.preventDefault();
8446      const submitButton = form.querySelector(
8447        'input[type="submit"]'
8448      );
8449      if (submitButton) {
8450        submitButton.disabled = true;
8451        try {
8452          await submitFormAsync2(form, type);
8453        } finally {
8454          submitButton.disabled = false;
8455        }
8456      } else {
8457        await submitFormAsync2(form, type);
8458      }
8459    });
8460  };
8461  var setupYbtjAjaxForms = () => {
8462    const forms = document.querySelectorAll(
8463      "[data-ybtj-forms-ajax]"
8464    );
8465    forms.forEach((form) => {
8466      setupAjaxFormHandler2(form);
8467    });
8468  };
8469  var setupYbtjModalTriggers = () => {
8470    const startTriggers = document.querySelectorAll(
8471      "[data-ybtj-start-trigger]"
8472    );
8473    const exitTriggers = document.querySelectorAll(
8474      "[data-ybtj-exit-trigger]"
8475    );
8476    const onStartComplete = sessionStorage.getItem(
8477      ON_START_COMPLETE_SESSION_ITEM_KEY
8478    );
8479    const onExitComplete = sessionStorage.getItem(
8480      ON_EXIT_COMPLETE_SESSION_ITEM_KEY
8481    );
8482    if (!onStartComplete) {
8483      startTriggers.forEach((trigger2) => {
8484        handleModalTrigger(trigger2, "on-start-form-modal");
8485      });
8486    }
8487    if (!onExitComplete) {
8488      exitTriggers.forEach((trigger2) => {
8489        handleModalTrigger(trigger2, "on-exit-form-modal");
8490      });
8491    }
8492  };
8493  var handleModalTrigger = (trigger2, modalType) => {
8494    trigger2.addEventListener("click", (e) => {
8495      e.preventDefault();
8496      const target = e.target.closest("a");
8497      triggerModal(modalType);
8498      const redirect = document.querySelector(
8499        `[data-ybtj-${modalType}-redirect]`
8500      );
8501      if (redirect && target) {
8502        redirect.setAttribute(`data-ybtj-${modalType}-redirect`, target.href);
8503      }
8504    });
8505  };
8506
8507  
8507// Web/src/scripts/wistia/index.ts
8508  var FACADE_ATTRIBUTE = "data-wistia-facade";
8509  var PLAY_ATTRIBUTE = "data-wistia-play";
8510  var MOUNT_ATTRIBUTE = "data-wistia-mount";
8511  var ID_ATTRIBUTE = "data-wistia-id";
8512  var PLAYER_SCRIPT = "https://fast.wistia.com/assets/external/E-v1.js";
8513  var playerRequested = false;
8514  var loadPlayer = () => {
8515    if (playerRequested) {
8516      return;
8517    }
8518    playerRequested = true;
8519    window._wq = window._wq ?? [];
8520    window._wq.push({ id: "_all", options: { doNotTrack: true } });
8521    const script = document.createElement("script");
8522    script.src = PLAYER_SCRIPT;
8523    script.async = true;
8524    document.head.appendChild(script);
8525    const poll = window.setInterval(() => {
8526      if (typeof window.Wistia?.consent === "function") {
8527        window.clearInterval(poll);
8528        window.Wistia.consent(false);
8529      }
8530    }, 50);
8531    window.setTimeout(() => window.clearInterval(poll), 1e4);
8532  };
8533  var startVideo = (facade) => {
8534    const videoId = facade.getAttribute(ID_ATTRIBUTE);
8535    const mount2 = facade.querySelector(`[${MOUNT_ATTRIBUTE}]`);
8536    if (!videoId || !mount2) {
8537      return;
8538    }
8539    loadPlayer();
8540    facade.querySelector(`[${PLAY_ATTRIBUTE}]`)?.remove();
8541    const embed = document.createElement("div");
8542    embed.className = `wistia_embed wistia_async_${videoId} videoFoam=true`;
8543    embed.style.height = "100%";
8544    embed.style.width = "100%";
8545    mount2.replaceChildren(embed);
8546    window._wq?.push({
8547      id: videoId,
8548      onReady: (video) => video.play()
8549    });
8550    mount2.tabIndex = -1;
8551    mount2.focus();
8552  };
8553  var revealPlayButtons = (root) => {
8554    root.querySelectorAll(`[${PLAY_ATTRIBUTE}]`).forEach((button) => {
8555      button.classList.remove("hidden");
8556      button.classList.add("flex");
8557    });
8558  };
8559  var setupWistiaFacades = () => {
8560    revealPlayButtons(document);
8561    document.addEventListener("click", (event) => {
8562      const button = event.target?.closest(
8563        `[${PLAY_ATTRIBUTE}]`
8564      );
8565      if (!button) {
8566        return;
8567      }
8568      const facade = button.closest(`[${FACADE_ATTRIBUTE}]`);
8569      if (!facade) {
8570        return;
8571      }
8572      event.preventDefault();
8573      startVideo(facade);
8574    });
8575    const observer2 = new MutationObserver((mutations) => {
8576      mutations.forEach((mutation) => {
8577        mutation.addedNodes.forEach((node) => {
8578          if (node instanceof HTMLElement) {
8579            revealPlayButtons(node);
8580          }
8581        });
8582      });
8583    });
8584    observer2.observe(document.body, { childList: true, subtree: true });
8585  };
8586
8587  
8587// Web/src/scripts/main.ts
8588  registerOfflineSW();
8589  var enableJsIndicator = () => {
8590    if (document.body) {
8591      document.body.classList.add("js-enabled");
8592    } else {
8593      document.addEventListener("DOMContentLoaded", () => {
8594        document.body.classList.add("js-enabled");
8595      });
8596    }
8597  };
8598  enableJsIndicator();
8599  var setupPrintButton = () => {
8600    const printButton = document.querySelector("[data-trigger-print]");
8601    if (printButton) {
8602      printButton.addEventListener("click", () => {
8603        window.print();
8604      });
8605    }
8606  };
8607  var scrollToId = (elementId) => {
8608    const element = document.getElementById(elementId);
8609    if (!element) {
8610      return;
8611    }
8612    const footer = document.querySelector("footer");
8613    if (!footer) {
8614      element.scrollIntoView({ behavior: "smooth", block: "start" });
8615      return;
8616    }
8617    const elementRect = element.getBoundingClientRect();
8618    const footerRect = footer.getBoundingClientRect();
8619    const viewportHeight = window.innerHeight;
8620    const elementTop = elementRect.top + window.scrollY;
8621    const footerHeight = footerRect.height;
8622    const maxScrollPosition = document.documentElement.scrollHeight - viewportHeight - footerHeight;
8623    const targetScrollPosition = Math.min(elementTop, maxScrollPosition);
8624    window.scrollTo({
8625      top: Math.max(0, targetScrollPosition),
8626      behavior: "smooth"
8627    });
8628  };
8629  document.addEventListener("DOMContentLoaded", () => {
8630    setupMobileNavToggle();
8631    setupNavigationDropdowns();
8632    setupDropdowns();
8633    setupTabs();
8634    setupPrintButton();
8635    setupAccordions();
8636    setupToggleAllAccordions();
8637    setupModals();
8638    setupBackToTop();
8639    submitLatestFilterTerms();
8640    submitPublicationsFilterTerms();
8641    submitSiteSearchFilterTerms();
8642    setupOfflineSaveDisplay();
8643    setInterval(setupOfflineToggle, 500);
8644    setupGuidelineForm();
8645    setupYbtjModalTriggers();
8646    setupYbtjAjaxForms();
8647    setupWistiaFacades();
8648    setupGuidelineSearch();
8649    setupPronouncementBuilder();
8650    setupFinesCalculator();
8651    setupDrinkDrivingCalculator();
8652    setupGuiltyPleaCalculatorDaysAndWeeks();
8653    setupGuiltyPleaCalculatorMonthsAndYears();
8654    module_default.plugin(module_default2);
8655    module_default.start();
8656  });
8657})();
8658/*! Bundled license information:
8659
8660sortablejs/modular/sortable.esm.js:
8661  (**!
8662   * Sortable 1.15.7
8663   * @author	RubaXa   <[email protected]>
8664   * @author	owenm    <[email protected]>
8665   * @license MIT
8666   *)
8667*/

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.