pagy 8.4.1 → 8.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed23d530982c734cc87ac2e4171c4428eedc0133a14b0d4aa0716407b89c0c6b
4
- data.tar.gz: 0bd4a5b5018fe0dfd2ceb09ce80d46282926eba7db6a6a19b2a118c49f5cc3cb
3
+ metadata.gz: d283e0b1a2f28d6e05156089b3284b22c3e488626d5501093fdee506260a9825
4
+ data.tar.gz: c426766d510f8f229da57fedf0866b9ce9c2b213467a6548fbc760568b3ba973
5
5
  SHA512:
6
- metadata.gz: a2081b8582f33c151a51dd5b3cdb52678c0487896c622cbdc0800d520e762dd4a20262c86aa7d1ad6abdeae95c96e8eb7205ad55fdae3cfceca363eb3cf59377
7
- data.tar.gz: 277cb0506293916bdc4348adf9e75036294872550bc3ea66ba09b9da8bdcb310a17c9d44b2602c18fcdd121507eb03def3183a4bb4809d311306bc3cf78076b4
6
+ metadata.gz: a7009de54deb7819bee599dc5a621f15e12c5de9a1e56c68a4136fb486d5214201f0ad626ec3bf979f3ba0eaadf267f902cc90da67214768a591b53b597ab931
7
+ data.tar.gz: fbfc64b79436c808b218166d0efd5448f0ec8d66446091dc6d5a9e70872ae37868dabb92d67224224d2fa41e7c0f87ad294c6bfd67c34c97c492e947a480a562
data/apps/calendar.ru CHANGED
@@ -18,7 +18,7 @@
18
18
  # DOC
19
19
  # https://ddnexus.github.io/pagy/playground/#4-calendar-app
20
20
 
21
- VERSION = '8.4.1'
21
+ VERSION = '8.4.2'
22
22
 
23
23
  require 'bundler/inline'
24
24
  require 'bundler'
data/apps/demo.ru CHANGED
@@ -18,7 +18,7 @@
18
18
  # DOC
19
19
  # https://ddnexus.github.io/pagy/playground/#3-demo-app
20
20
 
21
- VERSION = '8.4.1'
21
+ VERSION = '8.4.2'
22
22
 
23
23
  require 'bundler/inline'
24
24
  require 'bundler'
data/apps/rails.ru CHANGED
@@ -15,7 +15,7 @@
15
15
  # DOC
16
16
  # https://ddnexus.github.io/pagy/playground/#2-rails-app
17
17
 
18
- VERSION = '8.4.1'
18
+ VERSION = '8.4.2'
19
19
 
20
20
  # Gemfile
21
21
  require 'bundler/inline'
data/apps/repro.ru CHANGED
@@ -15,7 +15,7 @@
15
15
  # DOC
16
16
  # https://ddnexus.github.io/pagy/playground/#1-repro-app
17
17
 
18
- VERSION = '8.4.1'
18
+ VERSION = '8.4.2'
19
19
 
20
20
  require 'bundler/inline'
21
21
  require 'bundler'
data/bin/pagy CHANGED
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- VERSION = '8.4.1'
4
+ VERSION = '8.4.2'
5
5
  APPS = %w[repro rails demo calendar].freeze
6
+ LINUX = RbConfig::CONFIG['host_os'].include?('linux')
6
7
 
7
8
  require_relative '../lib/optimist'
8
9
  opts = Optimist.options do
@@ -28,9 +29,11 @@ opts = Optimist.options do
28
29
  opt :host, 'Host', default: '0.0.0.0', short: :o
29
30
  opt :port, 'Port', default: 8000
30
31
  opt :install, 'Install bundle for users', default: true
31
- text 'Rerun options'
32
- opt :rerun, 'Enable rerun for development', default: true
33
- opt :clear, 'Clear screen before each rerun'
32
+ if LINUX
33
+ text 'Rerun options'
34
+ opt :rerun, 'Enable rerun for development', default: true
35
+ opt :clear, 'Clear screen before each rerun'
36
+ end
34
37
  text 'Other options'
35
38
  opt :quiet, 'Quiet mode for development'
36
39
  version VERSION
@@ -48,7 +51,7 @@ Bundler.configure
48
51
  gemfile(opts[:install]) do
49
52
  source 'https://rubygems.org'
50
53
  gem 'rackup'
51
- gem 'rerun'
54
+ gem 'rerun' if LINUX
52
55
  end
53
56
 
54
57
  path = ->(app) { File.expand_path("../apps/#{app}.ru", __dir__) }
data/config/pagy.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Pagy initializer file (8.4.1)
3
+ # Pagy initializer file (8.4.2)
4
4
  # Customize only what you really need and notice that the core Pagy works also without any of the following lines.
5
5
  # Should you just cherry pick part of this file, please maintain the require-order of the extras
6
6
 
@@ -1,114 +1,104 @@
1
- "use strict";
1
+ // pagy.ts
2
2
  window.Pagy = (() => {
3
- // The observer instance for responsive navs
4
- const rjsObserver = new ResizeObserver(entries => entries.forEach(e => e.target.querySelectorAll(".pagy-rjs").forEach(el => el.pagyRender())));
5
- // Init the *_nav_js helpers
6
- const initNav = (el, [tokens, sequels, labelSequels, trimParam]) => {
7
- const container = el.parentElement ?? el;
8
- const widths = Object.keys(sequels).map(w => parseInt(w)).sort((a, b) => b - a);
9
- let lastWidth = -1;
10
- const fillIn = (a, page, label) => a.replace(/__pagy_page__/g, page).replace(/__pagy_label__/g, label);
11
- (el.pagyRender = function () {
12
- const width = widths.find(w => w < container.clientWidth) || 0;
13
- if (width === lastWidth) {
14
- return;
15
- } // no change: abort
16
- let html = tokens.before; // already trimmed in html
17
- const series = sequels[width.toString()];
18
- const labels = labelSequels?.[width.toString()] ?? series.map(l => l.toString());
19
- for (const i in series) {
20
- const item = series[i];
21
- const label = labels[i];
22
- let filled;
23
- if (typeof item === "number") {
24
- filled = fillIn(tokens.a, item.toString(), label);
25
- }
26
- else if (item === "gap") {
27
- filled = tokens.gap;
28
- }
29
- else { // active page
30
- filled = fillIn(tokens.current, item, label);
31
- }
32
- html += (typeof trimParam === "string" && item == 1) ? trim(filled, trimParam) : filled;
33
- }
34
- html += tokens.after; // eslint-disable-line align-assignments/align-assignments
35
- el.innerHTML = "";
36
- el.insertAdjacentHTML("afterbegin", html);
37
- lastWidth = width;
38
- })();
39
- if (el.classList.contains("pagy-rjs")) {
40
- rjsObserver.observe(container);
3
+ const rjsObserver = new ResizeObserver((entries) => entries.forEach((e) => e.target.querySelectorAll(".pagy-rjs").forEach((el) => el.pagyRender())));
4
+ const initNav = (el, [tokens, sequels, labelSequels, trimParam]) => {
5
+ const container = el.parentElement ?? el;
6
+ const widths = Object.keys(sequels).map((w) => parseInt(w)).sort((a, b) => b - a);
7
+ let lastWidth = -1;
8
+ const fillIn = (a, page, label) => a.replace(/__pagy_page__/g, page).replace(/__pagy_label__/g, label);
9
+ (el.pagyRender = function() {
10
+ const width = widths.find((w) => w < container.clientWidth) || 0;
11
+ if (width === lastWidth) {
12
+ return;
13
+ }
14
+ let html = tokens.before;
15
+ const series = sequels[width.toString()];
16
+ const labels = labelSequels?.[width.toString()] ?? series.map((l) => l.toString());
17
+ for (const i in series) {
18
+ const item = series[i];
19
+ const label = labels[i];
20
+ let filled;
21
+ if (typeof item === "number") {
22
+ filled = fillIn(tokens.a, item.toString(), label);
23
+ } else if (item === "gap") {
24
+ filled = tokens.gap;
25
+ } else {
26
+ filled = fillIn(tokens.current, item, label);
41
27
  }
28
+ html += typeof trimParam === "string" && item == 1 ? trim(filled, trimParam) : filled;
29
+ }
30
+ html += tokens.after;
31
+ el.innerHTML = "";
32
+ el.insertAdjacentHTML("afterbegin", html);
33
+ lastWidth = width;
34
+ })();
35
+ if (el.classList.contains("pagy-rjs")) {
36
+ rjsObserver.observe(container);
37
+ }
38
+ };
39
+ const initCombo = (el, [url_token, trimParam]) => initInput(el, (inputValue) => [inputValue, url_token.replace(/__pagy_page__/, inputValue)], trimParam);
40
+ const initSelector = (el, [from, url_token, trimParam]) => {
41
+ initInput(el, (inputValue) => {
42
+ const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
43
+ const url = url_token.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
44
+ return [page, url];
45
+ }, trimParam);
46
+ };
47
+ const initInput = (el, getVars, trimParam) => {
48
+ const input = el.querySelector("input");
49
+ const link = el.querySelector("a");
50
+ const initial = input.value;
51
+ const action = function() {
52
+ if (input.value === initial) {
53
+ return;
54
+ }
55
+ const [min, val, max] = [input.min, input.value, input.max].map((n) => parseInt(n) || 0);
56
+ if (val < min || val > max) {
57
+ input.value = initial;
58
+ input.select();
59
+ return;
60
+ }
61
+ let [page, url] = getVars(input.value);
62
+ if (typeof trimParam === "string" && page === "1") {
63
+ url = trim(url, trimParam);
64
+ }
65
+ link.href = url;
66
+ link.click();
42
67
  };
43
- // Init the *_combo_nav_js helpers
44
- const initCombo = (el, [url_token, trimParam]) => initInput(el, inputValue => [inputValue, url_token.replace(/__pagy_page__/, inputValue)], trimParam);
45
- // Init the items_selector_js helper
46
- const initSelector = (el, [from, url_token, trimParam]) => {
47
- initInput(el, inputValue => {
48
- const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
49
- const url = url_token.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
50
- return [page, url];
51
- }, trimParam);
52
- };
53
- // Init the input element
54
- const initInput = (el, getVars, trimParam) => {
55
- const input = el.querySelector("input");
56
- const link = el.querySelector("a");
57
- const initial = input.value;
58
- const action = function () {
59
- if (input.value === initial) {
60
- return;
61
- } // not changed
62
- const [min, val, max] = [input.min, input.value, input.max].map(n => parseInt(n) || 0);
63
- if (val < min || val > max) { // reset invalid/out-of-range
64
- input.value = initial;
65
- input.select();
66
- return;
67
- }
68
- let [page, url] = getVars(input.value); // eslint-disable-line prefer-const
69
- if (typeof trimParam === "string" && page === "1") {
70
- url = trim(url, trimParam);
71
- }
72
- link.href = url;
73
- link.click();
74
- };
75
- ["change", "focus"].forEach(e => input.addEventListener(e, input.select)); // auto-select
76
- input.addEventListener("focusout", action); // trigger action
77
- input.addEventListener("keypress", e => { if (e.key === "Enter") {
78
- action();
79
- } }); // trigger action
80
- };
81
- // Trim the ${page-param}=1 params in links
82
- const trim = (a, param) => a.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "");
83
- // Public interface
84
- return {
85
- version: "8.4.1",
86
- // Scan for elements with a "data-pagy" attribute and call their init functions with the decoded args
87
- init(arg) {
88
- const target = arg instanceof Element ? arg : document;
89
- const elements = target.querySelectorAll("[data-pagy]");
90
- for (const el of elements) {
91
- try {
92
- const uint8array = Uint8Array.from(atob(el.getAttribute("data-pagy")), c => c.charCodeAt(0));
93
- const [keyword, ...args] = JSON.parse((new TextDecoder()).decode(uint8array)); // base64-utf8 -> JSON -> Array
94
- if (keyword === "nav") {
95
- initNav(el, args);
96
- }
97
- else if (keyword === "combo") {
98
- initCombo(el, args);
99
- }
100
- else if (keyword === "selector") {
101
- initSelector(el, args);
102
- }
103
- else {
104
- console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'", el, keyword);
105
- }
106
- }
107
- catch (err) {
108
- console.warn("Skipped Pagy.init() for: %o\n%s", el, err);
109
- }
110
- }
68
+ ["change", "focus"].forEach((e) => input.addEventListener(e, input.select));
69
+ input.addEventListener("focusout", action);
70
+ input.addEventListener("keypress", (e) => {
71
+ if (e.key === "Enter") {
72
+ action();
73
+ }
74
+ });
75
+ };
76
+ const trim = (a, param) => a.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "");
77
+ return {
78
+ version: "8.4.2",
79
+ init(arg) {
80
+ const target = arg instanceof Element ? arg : document;
81
+ const elements = target.querySelectorAll("[data-pagy]");
82
+ for (const el of elements) {
83
+ try {
84
+ const uint8array = Uint8Array.from(atob(el.getAttribute("data-pagy")), (c) => c.charCodeAt(0));
85
+ const [keyword, ...args] = JSON.parse(new TextDecoder().decode(uint8array));
86
+ if (keyword === "nav") {
87
+ initNav(el, args);
88
+ } else if (keyword === "combo") {
89
+ initCombo(el, args);
90
+ } else if (keyword === "selector") {
91
+ initSelector(el, args);
92
+ } else {
93
+ console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'", el, keyword);
94
+ }
95
+ } catch (err) {
96
+ console.warn("Skipped Pagy.init() for: %o\n%s", el, err);
111
97
  }
112
- };
98
+ }
99
+ }
100
+ };
113
101
  })();
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBhZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQWtCQSxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRTtJQUNmLDRDQUE0QztJQUM1QyxNQUFNLFdBQVcsR0FBRyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUNOLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFhLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FDM0UsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEUsNEJBQTRCO0lBQzVCLE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBYSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFTLEVBQUUsRUFBRTtRQUNsRixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUN6QyxNQUFNLE1BQU0sR0FBTSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRixJQUFJLFNBQVMsR0FBSyxDQUFDLENBQUMsQ0FBQztRQUNyQixNQUFNLE1BQU0sR0FBTSxDQUFDLENBQVEsRUFBRSxJQUFXLEVBQUUsS0FBWSxFQUFTLEVBQUUsQ0FDN0QsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEUsQ0FBQyxFQUFFLENB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TyxHQUFHLEVBQUUsQ0FBQztvQkFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQTtnQkFBQyxDQUFDO1lBQzlFLENBQUM7UUFDTCxDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUMsQ0FBQyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJ0eXBlIE5hdkFyZ3MgPSByZWFkb25seSBbVG9rZW5zLCBTZXF1ZWxzLCBudWxsIHwgTGFiZWxTZXF1ZWxzLCBzdHJpbmc/XVxudHlwZSBDb21ib0FyZ3MgPSByZWFkb25seSBbc3RyaW5nLCBzdHJpbmc/XVxudHlwZSBTZWxlY3RvckFyZ3MgPSByZWFkb25seSBbbnVtYmVyLCBzdHJpbmcsIHN0cmluZz9dXG5cbmludGVyZmFjZSBUb2tlbnMge1xuICAgIHJlYWRvbmx5IGJlZm9yZTpzdHJpbmdcbiAgICByZWFkb25seSBhOnN0cmluZ1xuICAgIHJlYWRvbmx5IGN1cnJlbnQ6c3RyaW5nXG4gICAgcmVhZG9ubHkgZ2FwOnN0cmluZ1xuICAgIHJlYWRvbmx5IGFmdGVyOnN0cmluZ1xufVxuXG5pbnRlcmZhY2UgU2VxdWVscyB7cmVhZG9ubHkgW3dpZHRoOnN0cmluZ106KHN0cmluZyB8IG51bWJlcilbXX1cblxuaW50ZXJmYWNlIExhYmVsU2VxdWVscyB7cmVhZG9ubHkgW3dpZHRoOnN0cmluZ106c3RyaW5nW119XG5cbmludGVyZmFjZSBOYXZFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7cGFneVJlbmRlcigpOnZvaWR9XG5cbmNvbnN0IFBhZ3kgPSAoKCkgPT4ge1xuICAgIC8vIFRoZSBvYnNlcnZlciBpbnN0YW5jZSBmb3IgcmVzcG9uc2l2ZSBuYXZzXG4gICAgY29uc3QgcmpzT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLmZvckVhY2goZSA9PiBlLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsPE5hdkVsZW1lbnQ+KFwiLnBhZ3ktcmpzXCIpLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbCA9PiBlbC5wYWd5UmVuZGVyKCkpKSk7XG5cbiAgICAvLyBJbml0IHRoZSAqX25hdl9qcyBoZWxwZXJzXG4gICAgY29uc3QgaW5pdE5hdiA9IChlbDpOYXZFbGVtZW50LCBbdG9rZW5zLCBzZXF1ZWxzLCBsYWJlbFNlcXVlbHMsIHRyaW1QYXJhbV06TmF2QXJncykgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBlbC5wYXJlbnRFbGVtZW50ID8/IGVsO1xuICAgICAgICBjb25zdCB3aWR0aHMgICAgPSBPYmplY3Qua2V5cyhzZXF1ZWxzKS5tYXAodyA9PiBwYXJzZUludCh3KSkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICAgICAgICBsZXQgbGFzdFdpZHRoICAgPSAtMTtcbiAgICAgICAgY29uc3QgZmlsbEluICAgID0gKGE6c3RyaW5nLCBwYWdlOnN0cmluZywgbGFiZWw6c3RyaW5nKTpzdHJpbmcgPT5cbiAgICAgICAgICAgIGEucmVwbGFjZSgvX19wYWd5X3BhZ2VfXy9nLCBwYWdlKS5yZXBsYWNlKC9fX3BhZ3lfbGFiZWxfXy9nLCBsYWJlbCk7XG4gICAgICAgIChlbC5wYWd5UmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB3aWR0aHMuZmluZCh3ID0+IHcgPCBjb250YWluZXIuY2xpZW50V2lkdGgpIHx8IDA7XG4gICAgICAgICAgICBpZiAod2lkdGggPT09IGxhc3RXaWR0aCkgeyByZXR1cm4gfSAvLyBubyBjaGFuZ2U6IGFib3J0XG4gICAgICAgICAgICBsZXQgaHRtbCAgICAgPSB0b2tlbnMuYmVmb3JlOyAgLy8gYWxyZWFkeSB0cmltbWVkIGluIGh0bWxcbiAgICAgICAgICAgIGNvbnN0IHNlcmllcyA9IHNlcXVlbHNbd2lkdGgudG9TdHJpbmcoKV07XG4gICAgICAgICAgICBjb25zdCBsYWJlbHMgPSBsYWJlbFNlcXVlbHM/Llt3aWR0aC50b1N0cmluZygpXSA/PyBzZXJpZXMubWFwKGwgPT4gbC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBzZXJpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtICA9IHNlcmllc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGxhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgZmlsbGVkO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICBmaWxsZWQgPSBmaWxsSW4odG9rZW5zLmEsIGl0ZW0udG9TdHJpbmcoKSwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSA9PT0gXCJnYXBcIikge1xuICAgICAgICAgICAgICAgICAgICBmaWxsZWQgPSB0b2tlbnMuZ2FwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGFjdGl2ZSBwYWdlXG4gICAgICAgICAgICAgICAgICAgIGZpbGxlZCA9IGZpbGxJbih0b2tlbnMuY3VycmVudCwgaXRlbSwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBodG1sICs9ICh0eXBlb2YgdHJpbVBhcmFtID09PSBcInN0cmluZ1wiICYmIGl0ZW0gPT0gMSkgPyB0cmltKGZpbGxlZCwgdHJpbVBhcmFtKSA6IGZpbGxlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh0bWwgKz0gdG9rZW5zLmFmdGVyOyAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYWxpZ24tYXNzaWdubWVudHMvYWxpZ24tYXNzaWdubWVudHNcbiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgICAgICBlbC5pbnNlcnRBZGphY2VudEhUTUwoXCJhZnRlcmJlZ2luXCIsIGh0bWwpO1xuICAgICAgICAgICAgbGFzdFdpZHRoID0gd2lkdGg7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwYWd5LXJqc1wiKSkgeyByanNPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcikgfVxuICAgIH07XG5cbiAgICAvLyBJbml0IHRoZSAqX2NvbWJvX25hdl9qcyBoZWxwZXJzXG4gICAgY29uc3QgaW5pdENvbWJvID0gKGVsOkVsZW1lbnQsIFt1cmxfdG9rZW4sIHRyaW1QYXJhbV06Q29tYm9BcmdzKSA9PlxuICAgICAgICBpbml0SW5wdXQoZWwsIGlucHV0VmFsdWUgPT4gW2lucHV0VmFsdWUsIHVybF90b2tlbi5yZXBsYWNlKC9fX3BhZ3lfcGFnZV9fLywgaW5wdXRWYWx1ZSldLCB0cmltUGFyYW0pO1xuXG4gICAgLy8gSW5pdCB0aGUgaXRlbXNfc2VsZWN0b3JfanMgaGVscGVyXG4gICAgY29uc3QgaW5pdFNlbGVjdG9yID0gKGVsOkVsZW1lbnQsIFtmcm9tLCB1cmxfdG9rZW4sIHRyaW1QYXJhbV06U2VsZWN0b3JBcmdzKSA9PiB7XG4gICAgICAgIGluaXRJbnB1dChlbCwgaW5wdXRWYWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYWdlID0gTWF0aC5tYXgoTWF0aC5jZWlsKGZyb20gLyBwYXJzZUludChpbnB1dFZhbHVlKSksIDEpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB1cmwgID0gdXJsX3Rva2VuLnJlcGxhY2UoL19fcGFneV9wYWdlX18vLCBwYWdlKS5yZXBsYWNlKC9fX3BhZ3lfaXRlbXNfXy8sIGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIFtwYWdlLCB1cmxdO1xuICAgICAgICB9LCB0cmltUGFyYW0pO1xuICAgIH07XG5cbiAgICAvLyBJbml0IHRoZSBpbnB1dCBlbGVtZW50XG4gICAgY29uc3QgaW5pdElucHV0ID0gKGVsOkVsZW1lbnQsIGdldFZhcnM6KHY6c3RyaW5nKSA9PiBbc3RyaW5nLCBzdHJpbmddLCB0cmltUGFyYW0/OnN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCAgID0gZWwucXVlcnlTZWxlY3RvcihcImlucHV0XCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGxpbmsgICAgPSBlbC5xdWVyeVNlbGVjdG9yKFwiYVwiKSBhcyBIVE1MQW5jaG9yRWxlbWVudDtcbiAgICAgICAgY29uc3QgaW5pdGlhbCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBjb25zdCBhY3Rpb24gID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlID09PSBpbml0aWFsKSB7IHJldHVybiB9ICAvLyBub3QgY2hhbmdlZFxuICAgICAgICAgICAgY29uc3QgW21pbiwgdmFsLCBtYXhdID0gW2lucHV0Lm1pbiwgaW5wdXQudmFsdWUsIGlucHV0Lm1heF0ubWFwKG4gPT4gcGFyc2VJbnQobikgfHwgMCk7XG4gICAgICAgICAgICBpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkgeyAgLy8gcmVzZXQgaW52YWxpZC9vdXQtb2YtcmFuZ2VcbiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IGluaXRpYWw7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IFtwYWdlLCB1cmxdID0gZ2V0VmFycyhpbnB1dC52YWx1ZSk7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpbVBhcmFtID09PSBcInN0cmluZ1wiICYmIHBhZ2UgPT09IFwiMVwiKSB7IHVybCA9IHRyaW0odXJsLCB0cmltUGFyYW0pIH1cbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgfTtcbiAgICAgICAgW1wiY2hhbmdlXCIsIFwiZm9jdXNcIl0uZm9yRWFjaChlID0+IGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoZSwgaW5wdXQuc2VsZWN0KSk7ICAgICAgICAvLyBhdXRvLXNlbGVjdFxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgYWN0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGFjdGlvblxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgZSA9PiB7IGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7IGFjdGlvbigpIH0gfSk7IC8vIHRyaWdnZXIgYWN0aW9uXG4gICAgfTtcblxuICAgIC8vIFRyaW0gdGhlICR7cGFnZS1wYXJhbX09MSBwYXJhbXMgaW4gbGlua3NcbiAgICBjb25zdCB0cmltID0gKGE6c3RyaW5nLCBwYXJhbTpzdHJpbmcpID0+XG4gICAgICAgIGEucmVwbGFjZShuZXcgUmVnRXhwKGBbPyZdJHtwYXJhbX09MVxcXFxiKD8hJil8XFxcXGIke3BhcmFtfT0xJmApLCBcIlwiKTtcblxuICAgIC8vIFB1YmxpYyBpbnRlcmZhY2VcbiAgICByZXR1cm4ge1xuICAgICAgICB2ZXJzaW9uOiBcIjguNC4xXCIsXG5cbiAgICAgICAgLy8gU2NhbiBmb3IgZWxlbWVudHMgd2l0aCBhIFwiZGF0YS1wYWd5XCIgYXR0cmlidXRlIGFuZCBjYWxsIHRoZWlyIGluaXQgZnVuY3Rpb25zIHdpdGggdGhlIGRlY29kZWQgYXJnc1xuICAgICAgICBpbml0KGFyZz86RWxlbWVudCB8IG5ldmVyKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgICA9IGFyZyBpbnN0YW5jZW9mIEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudDtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OGFycmF5ICAgICAgICAgPSBVaW50OEFycmF5LmZyb20oYXRvYihlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikgYXMgc3RyaW5nKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5d29yZCwgLi4uYXJnc10gPSBKU09OLnBhcnNlKChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKHVpbnQ4YXJyYXkpKTsgLy8gYmFzZTY0LXV0ZjggLT4gSlNPTiAtPiBBcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZCA9PT0gXCJuYXZcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdE5hdihlbCBhcyBOYXZFbGVtZW50LCBhcmdzIGFzIE5hdkFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleXdvcmQgPT09IFwiY29tYm9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbWJvKGVsLCBhcmdzIGFzIENvbWJvQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gXCJzZWxlY3RvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VsZWN0b3IoZWwsIGFyZ3MgYXMgU2VsZWN0b3JBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlNraXBwZWQgUGFneS5pbml0KCkgZm9yOiAlb1xcblVua25vd24ga2V5d29yZCAnJXMnXCIsIGVsLCBrZXl3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyBjb25zb2xlLndhcm4oXCJTa2lwcGVkIFBhZ3kuaW5pdCgpIGZvcjogJW9cXG4lc1wiLCBlbCwgZXJyKSB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbiJdfQ==
102
+
103
+ //# debugId=22425B3DDA38810464756e2164756e21
104
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFneS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJ0eXBlIE5hdkFyZ3MgPSByZWFkb25seSBbVG9rZW5zLCBTZXF1ZWxzLCBudWxsIHwgTGFiZWxTZXF1ZWxzLCBzdHJpbmc/XVxudHlwZSBDb21ib0FyZ3MgPSByZWFkb25seSBbc3RyaW5nLCBzdHJpbmc/XVxudHlwZSBTZWxlY3RvckFyZ3MgPSByZWFkb25seSBbbnVtYmVyLCBzdHJpbmcsIHN0cmluZz9dXG5cbmludGVyZmFjZSBUb2tlbnMge1xuICAgIHJlYWRvbmx5IGJlZm9yZTpzdHJpbmdcbiAgICByZWFkb25seSBhOnN0cmluZ1xuICAgIHJlYWRvbmx5IGN1cnJlbnQ6c3RyaW5nXG4gICAgcmVhZG9ubHkgZ2FwOnN0cmluZ1xuICAgIHJlYWRvbmx5IGFmdGVyOnN0cmluZ1xufVxuXG5pbnRlcmZhY2UgU2VxdWVscyB7cmVhZG9ubHkgW3dpZHRoOnN0cmluZ106KHN0cmluZyB8IG51bWJlcilbXX1cblxuaW50ZXJmYWNlIExhYmVsU2VxdWVscyB7cmVhZG9ubHkgW3dpZHRoOnN0cmluZ106c3RyaW5nW119XG5cbmludGVyZmFjZSBOYXZFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7cGFneVJlbmRlcigpOnZvaWR9XG5cbmNvbnN0IFBhZ3kgPSAoKCkgPT4ge1xuICAgIC8vIFRoZSBvYnNlcnZlciBpbnN0YW5jZSBmb3IgcmVzcG9uc2l2ZSBuYXZzXG4gICAgY29uc3QgcmpzT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLmZvckVhY2goZSA9PiBlLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsPE5hdkVsZW1lbnQ+KFwiLnBhZ3ktcmpzXCIpLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbCA9PiBlbC5wYWd5UmVuZGVyKCkpKSk7XG5cbiAgICAvLyBJbml0IHRoZSAqX25hdl9qcyBoZWxwZXJzXG4gICAgY29uc3QgaW5pdE5hdiA9IChlbDpOYXZFbGVtZW50LCBbdG9rZW5zLCBzZXF1ZWxzLCBsYWJlbFNlcXVlbHMsIHRyaW1QYXJhbV06TmF2QXJncykgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBlbC5wYXJlbnRFbGVtZW50ID8/IGVsO1xuICAgICAgICBjb25zdCB3aWR0aHMgICAgPSBPYmplY3Qua2V5cyhzZXF1ZWxzKS5tYXAodyA9PiBwYXJzZUludCh3KSkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICAgICAgICBsZXQgbGFzdFdpZHRoICAgPSAtMTtcbiAgICAgICAgY29uc3QgZmlsbEluICAgID0gKGE6c3RyaW5nLCBwYWdlOnN0cmluZywgbGFiZWw6c3RyaW5nKTpzdHJpbmcgPT5cbiAgICAgICAgICAgIGEucmVwbGFjZSgvX19wYWd5X3BhZ2VfXy9nLCBwYWdlKS5yZXBsYWNlKC9fX3BhZ3lfbGFiZWxfXy9nLCBsYWJlbCk7XG4gICAgICAgIChlbC5wYWd5UmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB3aWR0aHMuZmluZCh3ID0+IHcgPCBjb250YWluZXIuY2xpZW50V2lkdGgpIHx8IDA7XG4gICAgICAgICAgICBpZiAod2lkdGggPT09IGxhc3RXaWR0aCkgeyByZXR1cm4gfSAvLyBubyBjaGFuZ2U6IGFib3J0XG4gICAgICAgICAgICBsZXQgaHRtbCAgICAgPSB0b2tlbnMuYmVmb3JlOyAgLy8gYWxyZWFkeSB0cmltbWVkIGluIGh0bWxcbiAgICAgICAgICAgIGNvbnN0IHNlcmllcyA9IHNlcXVlbHNbd2lkdGgudG9TdHJpbmcoKV07XG4gICAgICAgICAgICBjb25zdCBsYWJlbHMgPSBsYWJlbFNlcXVlbHM/Llt3aWR0aC50b1N0cmluZygpXSA/PyBzZXJpZXMubWFwKGwgPT4gbC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBzZXJpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtICA9IHNlcmllc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGxhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgZmlsbGVkO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICBmaWxsZWQgPSBmaWxsSW4odG9rZW5zLmEsIGl0ZW0udG9TdHJpbmcoKSwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSA9PT0gXCJnYXBcIikge1xuICAgICAgICAgICAgICAgICAgICBmaWxsZWQgPSB0b2tlbnMuZ2FwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGFjdGl2ZSBwYWdlXG4gICAgICAgICAgICAgICAgICAgIGZpbGxlZCA9IGZpbGxJbih0b2tlbnMuY3VycmVudCwgaXRlbSwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBodG1sICs9ICh0eXBlb2YgdHJpbVBhcmFtID09PSBcInN0cmluZ1wiICYmIGl0ZW0gPT0gMSkgPyB0cmltKGZpbGxlZCwgdHJpbVBhcmFtKSA6IGZpbGxlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh0bWwgKz0gdG9rZW5zLmFmdGVyOyAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYWxpZ24tYXNzaWdubWVudHMvYWxpZ24tYXNzaWdubWVudHNcbiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgICAgICBlbC5pbnNlcnRBZGphY2VudEhUTUwoXCJhZnRlcmJlZ2luXCIsIGh0bWwpO1xuICAgICAgICAgICAgbGFzdFdpZHRoID0gd2lkdGg7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwYWd5LXJqc1wiKSkgeyByanNPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcikgfVxuICAgIH07XG5cbiAgICAvLyBJbml0IHRoZSAqX2NvbWJvX25hdl9qcyBoZWxwZXJzXG4gICAgY29uc3QgaW5pdENvbWJvID0gKGVsOkVsZW1lbnQsIFt1cmxfdG9rZW4sIHRyaW1QYXJhbV06Q29tYm9BcmdzKSA9PlxuICAgICAgICBpbml0SW5wdXQoZWwsIGlucHV0VmFsdWUgPT4gW2lucHV0VmFsdWUsIHVybF90b2tlbi5yZXBsYWNlKC9fX3BhZ3lfcGFnZV9fLywgaW5wdXRWYWx1ZSldLCB0cmltUGFyYW0pO1xuXG4gICAgLy8gSW5pdCB0aGUgaXRlbXNfc2VsZWN0b3JfanMgaGVscGVyXG4gICAgY29uc3QgaW5pdFNlbGVjdG9yID0gKGVsOkVsZW1lbnQsIFtmcm9tLCB1cmxfdG9rZW4sIHRyaW1QYXJhbV06U2VsZWN0b3JBcmdzKSA9PiB7XG4gICAgICAgIGluaXRJbnB1dChlbCwgaW5wdXRWYWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYWdlID0gTWF0aC5tYXgoTWF0aC5jZWlsKGZyb20gLyBwYXJzZUludChpbnB1dFZhbHVlKSksIDEpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB1cmwgID0gdXJsX3Rva2VuLnJlcGxhY2UoL19fcGFneV9wYWdlX18vLCBwYWdlKS5yZXBsYWNlKC9fX3BhZ3lfaXRlbXNfXy8sIGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIFtwYWdlLCB1cmxdO1xuICAgICAgICB9LCB0cmltUGFyYW0pO1xuICAgIH07XG5cbiAgICAvLyBJbml0IHRoZSBpbnB1dCBlbGVtZW50XG4gICAgY29uc3QgaW5pdElucHV0ID0gKGVsOkVsZW1lbnQsIGdldFZhcnM6KHY6c3RyaW5nKSA9PiBbc3RyaW5nLCBzdHJpbmddLCB0cmltUGFyYW0/OnN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCAgID0gZWwucXVlcnlTZWxlY3RvcihcImlucHV0XCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGxpbmsgICAgPSBlbC5xdWVyeVNlbGVjdG9yKFwiYVwiKSBhcyBIVE1MQW5jaG9yRWxlbWVudDtcbiAgICAgICAgY29uc3QgaW5pdGlhbCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBjb25zdCBhY3Rpb24gID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlID09PSBpbml0aWFsKSB7IHJldHVybiB9ICAvLyBub3QgY2hhbmdlZFxuICAgICAgICAgICAgY29uc3QgW21pbiwgdmFsLCBtYXhdID0gW2lucHV0Lm1pbiwgaW5wdXQudmFsdWUsIGlucHV0Lm1heF0ubWFwKG4gPT4gcGFyc2VJbnQobikgfHwgMCk7XG4gICAgICAgICAgICBpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkgeyAgLy8gcmVzZXQgaW52YWxpZC9vdXQtb2YtcmFuZ2VcbiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IGluaXRpYWw7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IFtwYWdlLCB1cmxdID0gZ2V0VmFycyhpbnB1dC52YWx1ZSk7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpbVBhcmFtID09PSBcInN0cmluZ1wiICYmIHBhZ2UgPT09IFwiMVwiKSB7IHVybCA9IHRyaW0odXJsLCB0cmltUGFyYW0pIH1cbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgfTtcbiAgICAgICAgW1wiY2hhbmdlXCIsIFwiZm9jdXNcIl0uZm9yRWFjaChlID0+IGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoZSwgaW5wdXQuc2VsZWN0KSk7ICAgICAgICAvLyBhdXRvLXNlbGVjdFxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgYWN0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGFjdGlvblxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgZSA9PiB7IGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7IGFjdGlvbigpIH0gfSk7IC8vIHRyaWdnZXIgYWN0aW9uXG4gICAgfTtcblxuICAgIC8vIFRyaW0gdGhlICR7cGFnZS1wYXJhbX09MSBwYXJhbXMgaW4gbGlua3NcbiAgICBjb25zdCB0cmltID0gKGE6c3RyaW5nLCBwYXJhbTpzdHJpbmcpID0+XG4gICAgICAgIGEucmVwbGFjZShuZXcgUmVnRXhwKGBbPyZdJHtwYXJhbX09MVxcXFxiKD8hJil8XFxcXGIke3BhcmFtfT0xJmApLCBcIlwiKTtcblxuICAgIC8vIFB1YmxpYyBpbnRlcmZhY2VcbiAgICByZXR1cm4ge1xuICAgICAgICB2ZXJzaW9uOiBcIjguNC4yXCIsXG5cbiAgICAgICAgLy8gU2NhbiBmb3IgZWxlbWVudHMgd2l0aCBhIFwiZGF0YS1wYWd5XCIgYXR0cmlidXRlIGFuZCBjYWxsIHRoZWlyIGluaXQgZnVuY3Rpb25zIHdpdGggdGhlIGRlY29kZWQgYXJnc1xuICAgICAgICBpbml0KGFyZz86RWxlbWVudCB8IG5ldmVyKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgICA9IGFyZyBpbnN0YW5jZW9mIEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudDtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OGFycmF5ICAgICAgICAgPSBVaW50OEFycmF5LmZyb20oYXRvYihlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikgYXMgc3RyaW5nKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5d29yZCwgLi4uYXJnc10gPSBKU09OLnBhcnNlKChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKHVpbnQ4YXJyYXkpKTsgLy8gYmFzZTY0LXV0ZjggLT4gSlNPTiAtPiBBcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZCA9PT0gXCJuYXZcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdE5hdihlbCBhcyBOYXZFbGVtZW50LCBhcmdzIGFzIE5hdkFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleXdvcmQgPT09IFwiY29tYm9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbWJvKGVsLCBhcmdzIGFzIENvbWJvQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gXCJzZWxlY3RvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VsZWN0b3IoZWwsIGFyZ3MgYXMgU2VsZWN0b3JBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlNraXBwZWQgUGFneS5pbml0KCkgZm9yOiAlb1xcblVua25vd24ga2V5d29yZCAnJXMnXCIsIGVsLCBrZXl3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyBjb25zb2xlLndhcm4oXCJTa2lwcGVkIFBhZ3kuaW5pdCgpIGZvcjogJW9cXG4lc1wiLCBlbCwgZXJyKSB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxuZXhwb3J0IGRlZmF1bHQgUGFneTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFrQkEsSUFB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
@@ -1,113 +1,101 @@
1
1
  const Pagy = (() => {
2
- // The observer instance for responsive navs
3
- const rjsObserver = new ResizeObserver(entries => entries.forEach(e => e.target.querySelectorAll(".pagy-rjs").forEach(el => el.pagyRender())));
4
- // Init the *_nav_js helpers
5
- const initNav = (el, [tokens, sequels, labelSequels, trimParam]) => {
6
- const container = el.parentElement ?? el;
7
- const widths = Object.keys(sequels).map(w => parseInt(w)).sort((a, b) => b - a);
8
- let lastWidth = -1;
9
- const fillIn = (a, page, label) => a.replace(/__pagy_page__/g, page).replace(/__pagy_label__/g, label);
10
- (el.pagyRender = function () {
11
- const width = widths.find(w => w < container.clientWidth) || 0;
12
- if (width === lastWidth) {
13
- return;
14
- } // no change: abort
15
- let html = tokens.before; // already trimmed in html
16
- const series = sequels[width.toString()];
17
- const labels = labelSequels?.[width.toString()] ?? series.map(l => l.toString());
18
- for (const i in series) {
19
- const item = series[i];
20
- const label = labels[i];
21
- let filled;
22
- if (typeof item === "number") {
23
- filled = fillIn(tokens.a, item.toString(), label);
24
- }
25
- else if (item === "gap") {
26
- filled = tokens.gap;
27
- }
28
- else { // active page
29
- filled = fillIn(tokens.current, item, label);
30
- }
31
- html += (typeof trimParam === "string" && item == 1) ? trim(filled, trimParam) : filled;
32
- }
33
- html += tokens.after; // eslint-disable-line align-assignments/align-assignments
34
- el.innerHTML = "";
35
- el.insertAdjacentHTML("afterbegin", html);
36
- lastWidth = width;
37
- })();
38
- if (el.classList.contains("pagy-rjs")) {
39
- rjsObserver.observe(container);
2
+ const rjsObserver = new ResizeObserver((entries) => entries.forEach((e) => e.target.querySelectorAll(".pagy-rjs").forEach((el) => el.pagyRender())));
3
+ const initNav = (el, [tokens, sequels, labelSequels, trimParam]) => {
4
+ const container = el.parentElement ?? el;
5
+ const widths = Object.keys(sequels).map((w) => parseInt(w)).sort((a, b) => b - a);
6
+ let lastWidth = -1;
7
+ const fillIn = (a, page, label) => a.replace(/__pagy_page__/g, page).replace(/__pagy_label__/g, label);
8
+ (el.pagyRender = function() {
9
+ const width = widths.find((w) => w < container.clientWidth) || 0;
10
+ if (width === lastWidth) {
11
+ return;
12
+ }
13
+ let html = tokens.before;
14
+ const series = sequels[width.toString()];
15
+ const labels = labelSequels?.[width.toString()] ?? series.map((l) => l.toString());
16
+ for (const i in series) {
17
+ const item = series[i];
18
+ const label = labels[i];
19
+ let filled;
20
+ if (typeof item === "number") {
21
+ filled = fillIn(tokens.a, item.toString(), label);
22
+ } else if (item === "gap") {
23
+ filled = tokens.gap;
24
+ } else {
25
+ filled = fillIn(tokens.current, item, label);
40
26
  }
27
+ html += typeof trimParam === "string" && item == 1 ? trim(filled, trimParam) : filled;
28
+ }
29
+ html += tokens.after;
30
+ el.innerHTML = "";
31
+ el.insertAdjacentHTML("afterbegin", html);
32
+ lastWidth = width;
33
+ })();
34
+ if (el.classList.contains("pagy-rjs")) {
35
+ rjsObserver.observe(container);
36
+ }
37
+ };
38
+ const initCombo = (el, [url_token, trimParam]) => initInput(el, (inputValue) => [inputValue, url_token.replace(/__pagy_page__/, inputValue)], trimParam);
39
+ const initSelector = (el, [from, url_token, trimParam]) => {
40
+ initInput(el, (inputValue) => {
41
+ const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
42
+ const url = url_token.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
43
+ return [page, url];
44
+ }, trimParam);
45
+ };
46
+ const initInput = (el, getVars, trimParam) => {
47
+ const input = el.querySelector("input");
48
+ const link = el.querySelector("a");
49
+ const initial = input.value;
50
+ const action = function() {
51
+ if (input.value === initial) {
52
+ return;
53
+ }
54
+ const [min, val, max] = [input.min, input.value, input.max].map((n) => parseInt(n) || 0);
55
+ if (val < min || val > max) {
56
+ input.value = initial;
57
+ input.select();
58
+ return;
59
+ }
60
+ let [page, url] = getVars(input.value);
61
+ if (typeof trimParam === "string" && page === "1") {
62
+ url = trim(url, trimParam);
63
+ }
64
+ link.href = url;
65
+ link.click();
41
66
  };
42
- // Init the *_combo_nav_js helpers
43
- const initCombo = (el, [url_token, trimParam]) => initInput(el, inputValue => [inputValue, url_token.replace(/__pagy_page__/, inputValue)], trimParam);
44
- // Init the items_selector_js helper
45
- const initSelector = (el, [from, url_token, trimParam]) => {
46
- initInput(el, inputValue => {
47
- const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
48
- const url = url_token.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
49
- return [page, url];
50
- }, trimParam);
51
- };
52
- // Init the input element
53
- const initInput = (el, getVars, trimParam) => {
54
- const input = el.querySelector("input");
55
- const link = el.querySelector("a");
56
- const initial = input.value;
57
- const action = function () {
58
- if (input.value === initial) {
59
- return;
60
- } // not changed
61
- const [min, val, max] = [input.min, input.value, input.max].map(n => parseInt(n) || 0);
62
- if (val < min || val > max) { // reset invalid/out-of-range
63
- input.value = initial;
64
- input.select();
65
- return;
66
- }
67
- let [page, url] = getVars(input.value); // eslint-disable-line prefer-const
68
- if (typeof trimParam === "string" && page === "1") {
69
- url = trim(url, trimParam);
70
- }
71
- link.href = url;
72
- link.click();
73
- };
74
- ["change", "focus"].forEach(e => input.addEventListener(e, input.select)); // auto-select
75
- input.addEventListener("focusout", action); // trigger action
76
- input.addEventListener("keypress", e => { if (e.key === "Enter") {
77
- action();
78
- } }); // trigger action
79
- };
80
- // Trim the ${page-param}=1 params in links
81
- const trim = (a, param) => a.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "");
82
- // Public interface
83
- return {
84
- version: "8.4.1",
85
- // Scan for elements with a "data-pagy" attribute and call their init functions with the decoded args
86
- init(arg) {
87
- const target = arg instanceof Element ? arg : document;
88
- const elements = target.querySelectorAll("[data-pagy]");
89
- for (const el of elements) {
90
- try {
91
- const uint8array = Uint8Array.from(atob(el.getAttribute("data-pagy")), c => c.charCodeAt(0));
92
- const [keyword, ...args] = JSON.parse((new TextDecoder()).decode(uint8array)); // base64-utf8 -> JSON -> Array
93
- if (keyword === "nav") {
94
- initNav(el, args);
95
- }
96
- else if (keyword === "combo") {
97
- initCombo(el, args);
98
- }
99
- else if (keyword === "selector") {
100
- initSelector(el, args);
101
- }
102
- else {
103
- console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'", el, keyword);
104
- }
105
- }
106
- catch (err) {
107
- console.warn("Skipped Pagy.init() for: %o\n%s", el, err);
108
- }
109
- }
67
+ ["change", "focus"].forEach((e) => input.addEventListener(e, input.select));
68
+ input.addEventListener("focusout", action);
69
+ input.addEventListener("keypress", (e) => {
70
+ if (e.key === "Enter") {
71
+ action();
72
+ }
73
+ });
74
+ };
75
+ const trim = (a, param) => a.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "");
76
+ return {
77
+ version: "8.4.2",
78
+ init(arg) {
79
+ const target = arg instanceof Element ? arg : document;
80
+ const elements = target.querySelectorAll("[data-pagy]");
81
+ for (const el of elements) {
82
+ try {
83
+ const uint8array = Uint8Array.from(atob(el.getAttribute("data-pagy")), (c) => c.charCodeAt(0));
84
+ const [keyword, ...args] = JSON.parse(new TextDecoder().decode(uint8array));
85
+ if (keyword === "nav") {
86
+ initNav(el, args);
87
+ } else if (keyword === "combo") {
88
+ initCombo(el, args);
89
+ } else if (keyword === "selector") {
90
+ initSelector(el, args);
91
+ } else {
92
+ console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'", el, keyword);
93
+ }
94
+ } catch (err) {
95
+ console.warn("Skipped Pagy.init() for: %o\n%s", el, err);
110
96
  }
111
- };
97
+ }
98
+ }
99
+ };
112
100
  })();
113
101
  export default Pagy;
data/javascripts/pagy.js CHANGED
@@ -1 +1 @@
1
- !function(){let e=(()=>{let e=new ResizeObserver(e=>e.forEach(e=>e.target.querySelectorAll(".pagy-rjs").forEach(e=>e.pagyRender()))),t=(t,[r,a,n,l])=>{let i=t.parentElement??t,c=Object.keys(a).map(e=>parseInt(e)).sort((e,t)=>t-e),p=-1,s=(e,t,r)=>e.replace(/__pagy_page__/g,t).replace(/__pagy_label__/g,r);(t.pagyRender=function(){let e=c.find(e=>e<i.clientWidth)||0;if(e===p)return;let g=r.before,y=a[e.toString()],f=n?.[e.toString()]??y.map(e=>e.toString());for(let e in y){let t;let a=y[e],n=f[e];t="number"==typeof a?s(r.a,a.toString(),n):"gap"===a?r.gap:s(r.current,a,n),g+="string"==typeof l&&1==a?o(t,l):t}g+=r.after,t.innerHTML="",t.insertAdjacentHTML("afterbegin",g),p=e})(),t.classList.contains("pagy-rjs")&&e.observe(i)},r=(e,[t,r])=>n(e,e=>[e,t.replace(/__pagy_page__/,e)],r),a=(e,[t,r,a])=>{n(e,e=>{let a=Math.max(Math.ceil(t/parseInt(e)),1).toString(),n=r.replace(/__pagy_page__/,a).replace(/__pagy_items__/,e);return[a,n]},a)},n=(e,t,r)=>{let a=e.querySelector("input"),n=e.querySelector("a"),l=a.value,i=function(){if(a.value===l)return;let[e,i,c]=[a.min,a.value,a.max].map(e=>parseInt(e)||0);if(i<e||i>c){a.value=l,a.select();return}let[p,s]=t(a.value);"string"==typeof r&&"1"===p&&(s=o(s,r)),n.href=s,n.click()};["change","focus"].forEach(e=>a.addEventListener(e,a.select)),a.addEventListener("focusout",i),a.addEventListener("keypress",e=>{"Enter"===e.key&&i()})},o=(e,t)=>e.replace(RegExp(`[?&]${t}=1\\b(?!&)|\\b${t}=1&`),"");return{version:"8.4.1",init(e){for(let n of(e instanceof Element?e:document).querySelectorAll("[data-pagy]"))try{let e=Uint8Array.from(atob(n.getAttribute("data-pagy")),e=>e.charCodeAt(0)),[o,...l]=JSON.parse(new TextDecoder().decode(e));"nav"===o?t(n,l):"combo"===o?r(n,l):"selector"===o?a(n,l):console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'",n,o)}catch(e){console.warn("Skipped Pagy.init() for: %o\n%s",n,e)}}}})();window.Pagy=e}();
1
+ window.Pagy=(()=>{const x=new ResizeObserver((B)=>B.forEach((D)=>D.target.querySelectorAll(".pagy-rjs").forEach((E)=>E.pagyRender()))),A=(B,[D,E,z,G])=>{const F=B.parentElement??B,K=Object.keys(E).map((H)=>parseInt(H)).sort((H,M)=>M-H);let L=-1;const T=(H,M,Q)=>H.replace(/__pagy_page__/g,M).replace(/__pagy_label__/g,Q);if((B.pagyRender=function(){const H=K.find((R)=>R<F.clientWidth)||0;if(H===L)return;let M=D.before;const Q=E[H.toString()],Y=z?.[H.toString()]??Q.map((R)=>R.toString());for(let R in Q){const U=Q[R],j=Y[R];let X;if(typeof U==="number")X=T(D.a,U.toString(),j);else if(U==="gap")X=D.gap;else X=T(D.current,U,j);M+=typeof G==="string"&&U==1?$(X,G):X}M+=D.after,B.innerHTML="",B.insertAdjacentHTML("afterbegin",M),L=H})(),B.classList.contains("pagy-rjs"))x.observe(F)},C=(B,[D,E])=>Z(B,(z)=>[z,D.replace(/__pagy_page__/,z)],E),J=(B,[D,E,z])=>{Z(B,(G)=>{const F=Math.max(Math.ceil(D/parseInt(G)),1).toString(),K=E.replace(/__pagy_page__/,F).replace(/__pagy_items__/,G);return[F,K]},z)},Z=(B,D,E)=>{const z=B.querySelector("input"),G=B.querySelector("a"),F=z.value,K=function(){if(z.value===F)return;const[L,T,H]=[z.min,z.value,z.max].map((Y)=>parseInt(Y)||0);if(T<L||T>H){z.value=F,z.select();return}let[M,Q]=D(z.value);if(typeof E==="string"&&M==="1")Q=$(Q,E);G.href=Q,G.click()};["change","focus"].forEach((L)=>z.addEventListener(L,z.select)),z.addEventListener("focusout",K),z.addEventListener("keypress",(L)=>{if(L.key==="Enter")K()})},$=(B,D)=>B.replace(new RegExp(`[?&]${D}=1\\b(?!&)|\\b${D}=1&`),"");return{version:"8.4.2",init(B){const E=(B instanceof Element?B:document).querySelectorAll("[data-pagy]");for(let z of E)try{const G=Uint8Array.from(atob(z.getAttribute("data-pagy")),(L)=>L.charCodeAt(0)),[F,...K]=JSON.parse((new TextDecoder()).decode(G));if(F==="nav")A(z,K);else if(F==="combo")C(z,K);else if(F==="selector")J(z,K);else console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'",z,F)}catch(G){console.warn("Skipped Pagy.init() for: %o\n%s",z,G)}}}})();
data/lib/pagy.rb CHANGED
@@ -5,7 +5,7 @@ require 'pathname'
5
5
 
6
6
  # Core class
7
7
  class Pagy
8
- VERSION = '8.4.1'
8
+ VERSION = '8.4.2'
9
9
 
10
10
  # Gem root pathname to get the path of Pagy files stylesheets, javascripts, apps, locales, etc.
11
11
  def self.root
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pagy
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.4.1
4
+ version: 8.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Domizio Demichelis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-02 00:00:00.000000000 Z
11
+ date: 2024-06-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Agnostic pagination in plain ruby. It does it all. Better.
14
14
  email:
@@ -105,6 +105,7 @@ files:
105
105
  - locales/zh-CN.yml
106
106
  - locales/zh-HK.yml
107
107
  - locales/zh-TW.yml
108
+ - pkg/pagy-8.4.2.gem
108
109
  - stylesheets/pagy.css
109
110
  - stylesheets/pagy.scss
110
111
  - stylesheets/pagy.tailwind.css