pagy 43.4.4 → 43.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/apps/calendar.ru +1 -1
  3. data/apps/demo.ru +2 -2
  4. data/apps/keynav+root_key.ru +1 -1
  5. data/apps/keynav.ru +3 -3
  6. data/apps/keyset.ru +3 -3
  7. data/apps/keyset_sequel.ru +2 -2
  8. data/apps/rails.ru +2 -2
  9. data/apps/repro.ru +3 -3
  10. data/config/pagy.rb +4 -4
  11. data/javascripts/pagy.js +20 -12
  12. data/javascripts/pagy.min.js +1 -1
  13. data/javascripts/pagy.mjs +18 -10
  14. data/lib/pagy/classes/calendar/calendar.rb +6 -8
  15. data/lib/pagy/classes/calendar/unit.rb +10 -10
  16. data/lib/pagy/classes/exceptions.rb +3 -3
  17. data/lib/pagy/classes/keyset/adapters/active_record.rb +0 -6
  18. data/lib/pagy/classes/keyset/adapters/sequel.rb +1 -7
  19. data/lib/pagy/classes/keyset/keynav.rb +6 -6
  20. data/lib/pagy/classes/keyset/keyset.rb +7 -8
  21. data/lib/pagy/classes/offset/countless.rb +5 -10
  22. data/lib/pagy/classes/offset/offset.rb +2 -1
  23. data/lib/pagy/classes/offset/search.rb +1 -1
  24. data/lib/pagy/classes/request.rb +4 -1
  25. data/lib/pagy/deprecated.rb +84 -0
  26. data/lib/pagy/modules/abilities/configurable.rb +1 -7
  27. data/lib/pagy/modules/abilities/countable.rb +1 -2
  28. data/lib/pagy/modules/abilities/linkable.rb +6 -5
  29. data/lib/pagy/modules/abilities/rangeable.rb +1 -2
  30. data/lib/pagy/modules/console.rb +1 -1
  31. data/lib/pagy/modules/i18n/i18n.rb +1 -1
  32. data/lib/pagy/modules/searcher.rb +0 -1
  33. data/lib/pagy/next.rb +25 -0
  34. data/lib/pagy/tasks/sync.rb +1 -0
  35. data/lib/pagy/toolbox/helpers/anchor_tags.rb +0 -2
  36. data/lib/pagy/toolbox/helpers/bootstrap/input_nav_js.rb +0 -1
  37. data/lib/pagy/toolbox/helpers/bootstrap/previous_next_html.rb +0 -1
  38. data/lib/pagy/toolbox/helpers/bootstrap/series_nav.rb +0 -1
  39. data/lib/pagy/toolbox/helpers/bootstrap/series_nav_js.rb +0 -1
  40. data/lib/pagy/toolbox/helpers/bulma/input_nav_js.rb +0 -1
  41. data/lib/pagy/toolbox/helpers/bulma/previous_next_html.rb +0 -1
  42. data/lib/pagy/toolbox/helpers/bulma/series_nav.rb +0 -1
  43. data/lib/pagy/toolbox/helpers/bulma/series_nav_js.rb +0 -1
  44. data/lib/pagy/toolbox/helpers/headers_hash.rb +1 -1
  45. data/lib/pagy/toolbox/helpers/info_tag.rb +2 -2
  46. data/lib/pagy/toolbox/helpers/input_nav_js.rb +0 -1
  47. data/lib/pagy/toolbox/helpers/limit_tag_js.rb +3 -4
  48. data/lib/pagy/toolbox/helpers/loaders.rb +1 -1
  49. data/lib/pagy/toolbox/helpers/page_url.rb +0 -1
  50. data/lib/pagy/toolbox/helpers/series_nav.rb +0 -1
  51. data/lib/pagy/toolbox/helpers/series_nav_js.rb +0 -1
  52. data/lib/pagy/toolbox/helpers/support/a_lambda.rb +2 -3
  53. data/lib/pagy/toolbox/helpers/support/data_pagy_attribute.rb +0 -1
  54. data/lib/pagy/toolbox/helpers/support/nav_aria_label_attribute.rb +0 -2
  55. data/lib/pagy/toolbox/helpers/support/series.rb +2 -2
  56. data/lib/pagy/toolbox/helpers/support/wrap_input_nav_js.rb +1 -2
  57. data/lib/pagy/toolbox/helpers/support/wrap_series_nav.rb +1 -2
  58. data/lib/pagy/toolbox/helpers/support/wrap_series_nav_js.rb +3 -3
  59. data/lib/pagy/toolbox/helpers/urls_hash.rb +0 -1
  60. data/lib/pagy/toolbox/paginators/calendar.rb +1 -1
  61. data/lib/pagy/toolbox/paginators/countish.rb +0 -1
  62. data/lib/pagy/toolbox/paginators/countless.rb +0 -1
  63. data/lib/pagy/toolbox/paginators/elasticsearch_rails.rb +2 -3
  64. data/lib/pagy/toolbox/paginators/keynav_js.rb +0 -2
  65. data/lib/pagy/toolbox/paginators/keyset.rb +0 -1
  66. data/lib/pagy/toolbox/paginators/meilisearch.rb +0 -1
  67. data/lib/pagy/toolbox/paginators/method.rb +1 -1
  68. data/lib/pagy/toolbox/paginators/offset.rb +0 -1
  69. data/lib/pagy/toolbox/paginators/searchkick.rb +0 -1
  70. data/lib/pagy/toolbox/paginators/typesense_rails.rb +0 -1
  71. data/lib/pagy.rb +6 -16
  72. metadata +5 -4
  73. data/sig/pagy.rbs +0 -315
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7382e1de541c177055f5a1a3d8a4bee843126ecaef99d3d27f31fbc93b032907
4
- data.tar.gz: 992026f46faff00cc9a3d1a415f19e34346c51ae2e99205aebf6f3c7a98af611
3
+ metadata.gz: cf667bda57559dfbdf5b61c66797962c27651ff785225813bfe8c7c216d27050
4
+ data.tar.gz: 5544779e84daea44242fa2ca539bebf54c96583fba22ebfff2fe8ddc3ae8edbf
5
5
  SHA512:
6
- metadata.gz: eb112b40e74119be57cef404a219c1df3405194c1363d898f2a09c51a5838c29fb3469529cc4148726f9510847c1e52646c92573e5d2e757c202be21069df103
7
- data.tar.gz: 71c026906a31430a71ce54886903578a153236bb4fd42c8450bc02234dcccfb5066f955c9b78eef2c9f154b935000b79728e42edf3612b2ac4c58dd4294fc19b
6
+ metadata.gz: 5ab3242ae4d5a6e314f308798b7801a2479dbd7659cdb72289407d938670bdf645e574db1f5cff5b0278c3fe9075eb70b8342f46f35632106381f45199f67a9b
7
+ data.tar.gz: 6965c52ed9ac883ad391f5fc0e93779a217e4169982d522d391f63753c5fca58af2142c29cbf3c8d4cf14fa803e76f8e4e7366157215382ebacd0f2390b18474
data/apps/calendar.ru CHANGED
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.0'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
data/apps/demo.ru CHANGED
@@ -19,7 +19,7 @@
19
19
  # URL
20
20
  # http://127.0.0.1:8000
21
21
 
22
- VERSION = '43.4.4'
22
+ VERSION = '43.5.0'
23
23
 
24
24
  if VERSION != Pagy::VERSION
25
25
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
@@ -46,7 +46,7 @@ SECTIONS = { pagy: { css_anchor: 'pagy-css' },
46
46
  require 'sinatra/base'
47
47
 
48
48
  # Pagy init
49
- Pagy::OPTIONS[:client_max_limit] = 100
49
+ Pagy::OPTIONS[:max_limit] = 100
50
50
 
51
51
  # Sinatra application
52
52
  class PagyDemo < Sinatra::Base
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.0'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
data/apps/keynav.ru CHANGED
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.0'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
@@ -53,9 +53,9 @@ class PagyKeynav < Sinatra::Base
53
53
  Time.zone = 'UTC'
54
54
 
55
55
  @order = { animal: :asc, name: :asc, birthdate: :desc, id: :asc }.freeze
56
- @pagy, @pets = pagy(:keynav_js, Pet.order(@order), limit: 4, client_max_limit: 100)
56
+ @pagy, @pets = pagy(:keynav_js, Pet.order(@order), limit: 4, max_limit: 100)
57
57
  # Support also root_key for replacing url in javascript
58
- # @pagy, @pets = pagy(:keynav_js, Pet.order(@order), limit: 4, client_max_limit: 100, root_key: 'animal')
58
+ # @pagy, @pets = pagy(:keynav_js, Pet.order(@order), limit: 4, max_limit: 100, root_key: 'animal')
59
59
  @ids = @pets.pluck(:id)
60
60
  erb :main
61
61
  end
data/apps/keyset.ru CHANGED
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.0'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
@@ -43,10 +43,10 @@ class PagyKeyset < Sinatra::Base
43
43
  Time.zone = 'UTC'
44
44
 
45
45
  @order = { animal: :asc, name: :asc, birthdate: :desc, id: :asc }.freeze
46
- @pagy, @pets = pagy(:keyset, Pet.order(@order), limit: 10, client_max_limit: 100)
46
+ @pagy, @pets = pagy(:keyset, Pet.order(@order), limit: 10, max_limit: 100)
47
47
  # @pagy, @pets = pagy(:keyset, Pet.order(@order),
48
48
  # jsonapi: true, page_key: 'number', limit_key: 'size', # very customized jsonapi
49
- # limit: 10, client_max_limit: 100)
49
+ # limit: 10, max_limit: 100)
50
50
  # response.headers.merge!(@pagy.headers_hash)
51
51
  erb :main
52
52
  end
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.0'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
@@ -43,7 +43,7 @@ class PagyKeysetSequel < Sinatra::Base
43
43
  get '/' do
44
44
  @order = { animal: :asc, name: :asc, birthdate: :desc, id: :asc }.freeze
45
45
  @pagy, @pets = pagy(:keyset, Pet.order(:animal, :name, Sequel.desc(:birthdate), :id),
46
- limit: 10, client_max_limit: 100)
46
+ limit: 10, max_limit: 100)
47
47
  erb :main
48
48
  end
49
49
 
data/apps/rails.ru CHANGED
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.0'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
@@ -102,7 +102,7 @@ class CommentsController < ActionController::Base # :nodoc:
102
102
  include Pagy::Method
103
103
 
104
104
  def index
105
- @pagy, @comments = pagy(:offset, Comment.all, limit: 10, client_max_limit: 100)
105
+ @pagy, @comments = pagy(:offset, Comment.all, limit: 10, max_limit: 100)
106
106
  # Reload the page in the network tab of the Chrome Inspector to check
107
107
  # response.headers.merge!(@pagy.headers_hash)
108
108
  render inline: TEMPLATE
data/apps/repro.ru CHANGED
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.0'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
@@ -34,7 +34,7 @@ end
34
34
 
35
35
  # Edit this section adding the legacy as needed
36
36
  # Pagy initializer
37
- Pagy::OPTIONS[:client_max_limit] = 100
37
+ Pagy::OPTIONS[:max_limit] = 100
38
38
 
39
39
  # Sinatra setup
40
40
  require 'sinatra/base'
@@ -56,7 +56,7 @@ class PagyRepro < Sinatra::Base
56
56
  get '/' do
57
57
  collection = MockCollection.new
58
58
  @pagy, @records = pagy(collection) # simplest form
59
- # @pagy, @records = pagy(:offset, collection, limit: 7, client_max_limit: 30)
59
+ # @pagy, @records = pagy(:offset, collection, limit: 7, max_limit: 30)
60
60
  # @pagy, @records = pagy(:countish, collection, ttl: 20)
61
61
  # @pagy, @records = pagy(:countless, collection)
62
62
  # @pagy, @records = pagy(Array(1..1000))
data/config/pagy.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Pagy initializer file (43.4.4)
3
+ # Pagy initializer file (43.5.0)
4
4
  # See https://ddnexus.github.io/pagy/toolbox/configuration/initializer/
5
5
 
6
6
 
@@ -9,9 +9,9 @@
9
9
  # Add your global options below. They will be applied globally.
10
10
  # For example:
11
11
  #
12
- # Pagy::OPTIONS[:limit] = 10 # Limit the items per page
13
- # Pagy::OPTIONS[:client_max_limit] = 100 # The client is allowed to request a limit up to 100
14
- # Pagy::OPTIONS[:jsonapi] = true # Use JSON:API compliant URLs
12
+ # Pagy::OPTIONS[:limit] = 10 # Limit the items per page
13
+ # Pagy::OPTIONS[:max_limit] = 100 # The client is allowed to request a limit up to 100
14
+ # Pagy::OPTIONS[:jsonapi] = true # Use JSON:API compliant URLs
15
15
 
16
16
  Pagy::OPTIONS.freeze
17
17
 
data/javascripts/pagy.js CHANGED
@@ -19,20 +19,26 @@ var pagy_default = (() => {
19
19
  }
20
20
  });
21
21
  }
22
- const rjsObserver = new ResizeObserver((entries) => entries.forEach((e) => {
23
- e.target.querySelectorAll(".pagy-rjs").forEach((el) => el.render());
24
- }));
22
+ const rjsObserver = new ResizeObserver((entries) => {
23
+ entries.forEach((e) => {
24
+ e.target.querySelectorAll(".pagy-rjs").forEach((el) => {
25
+ el.render();
26
+ });
27
+ });
28
+ });
25
29
  const B64SafeEncode = (unicode) => btoa(String.fromCharCode(...new TextEncoder().encode(unicode))).replace(/[+/=]/g, (m) => m == "+" ? "-" : m == "/" ? "_" : ""), B64Decode = (base64) => new TextDecoder().decode(Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)));
26
30
  const randKey = () => Math.floor(Math.random() * 36 ** 3).toString(36);
27
31
  const augmentKeynav = async (nav, [storageKey, rootKey, pageKey, last, spliceArgs]) => {
28
32
  let augmentPage;
29
33
  const browserKey = document.cookie.split(/;\s+/).find((row) => row.startsWith(pagy + "="))?.split("=")[1] ?? randKey();
30
- document.cookie = pagy + "=" + browserKey;
34
+ document.cookie = `${pagy}=${browserKey}`;
31
35
  if (storageKey && !(storageKey in storage)) {
32
36
  sync.postMessage({ from: tabId, key: storageKey });
33
- await new Promise((resolve) => setTimeout(() => resolve(""), 100));
37
+ await new Promise((resolve) => setTimeout(() => {
38
+ resolve("");
39
+ }, 100));
34
40
  if (!(storageKey in storage)) {
35
- augmentPage = (page) => page + "+" + last;
41
+ augmentPage = (page) => `${page}+${String(last)}`;
36
42
  }
37
43
  }
38
44
  if (!augmentPage) {
@@ -61,7 +67,7 @@ var pagy_default = (() => {
61
67
  const search = rootKey ? `${rootKey}%5B${pageKey}%5D` : pageKey;
62
68
  const re = new RegExp(`(?<=\\?.*)(\\b${search}=)(\\d+)`);
63
69
  for (const a of nav.querySelectorAll("a[href]")) {
64
- a.href = a.href.replace(re, (_match, prefix, digit) => `${prefix}${augmentPage(digit)}`);
70
+ a.href = a.href.replace(re, (_match, prefix, digit) => `${String(prefix)}${augmentPage(digit)}`);
65
71
  }
66
72
  return augmentPage;
67
73
  };
@@ -80,7 +86,7 @@ var pagy_default = (() => {
80
86
  }
81
87
  let html = before;
82
88
  series[index].forEach((item, i) => {
83
- html += item == "gap" ? gap : (typeof item == "number" ? anchor.replace(pageToken, item) : current).replace("L<", labels?.[index][i] ?? item + "<");
89
+ html += item == "gap" ? gap : (typeof item == "number" ? anchor.replace(pageToken, item) : current).replace("L<", labels?.[index][i] ?? `${String(item)}<`);
84
90
  });
85
91
  html += after;
86
92
  nav.innerHTML = "";
@@ -120,7 +126,9 @@ var pagy_default = (() => {
120
126
  link.href = getUrl(input.value);
121
127
  link.click();
122
128
  };
123
- input.addEventListener("focus", () => input.select());
129
+ input.addEventListener("focus", () => {
130
+ input.select();
131
+ });
124
132
  input.addEventListener("focusout", action);
125
133
  input.addEventListener("keypress", (e) => {
126
134
  if (e.key == "Enter") {
@@ -129,7 +137,7 @@ var pagy_default = (() => {
129
137
  });
130
138
  };
131
139
  return {
132
- version: "43.4.4",
140
+ version: "43.5.0",
133
141
  init(arg) {
134
142
  const target = arg instanceof HTMLElement ? arg : document, elements = target.querySelectorAll("[data-pagy]");
135
143
  for (const element of elements) {
@@ -156,5 +164,5 @@ var pagy_default = (() => {
156
164
  // pagy-shim.ts
157
165
  window.Pagy = pagy_default;
158
166
 
159
- //# debugId=6725138D5BA01DF464756E2164756E21
160
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFneS50cyIsICJwYWd5LXNoaW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW50ZXJmYWNlIFN5bmNEYXRhIHtcbiAgZnJvbT86IG51bWJlclxuICB0bz86ICAgbnVtYmVyXG4gIGtleTogICBzdHJpbmdcbiAgc3RyPzogIHN0cmluZ1xufVxudHlwZSBJbml0QXJncyA9IFtcImtcIiwgIEtleW5hdkFyZ3NdIHwgICAgICAgICAgLy8gc2VyaWVzX25hdltfanNdIHdpdGgga2V5bmF2IGluc3RhbmNlXG4gICAgICAgICAgICAgICAgW1wic25qXCIsIFNlcmllc05hdkpzQXJnc10gfCAgICAvLyBzZXJpZXNfbmF2X2pzXG4gICAgICAgICAgICAgICAgW1wiaW5qXCIsIElucHV0TmF2SnNBcmdzXSB8ICAgICAvLyBpbnB1dF9uYXZfanNcbiAgICAgICAgICAgICAgICBbXCJsdGpcIiwgTGltaXRUYWdKc0FyZ3NdICAgICAgIC8vIGxpbWl0X3RhZ19qc1xudHlwZSBBdWdtZW50S2V5bmF2ID0gKG5hdjpIVE1MRWxlbWVudCwga2V5bmF2QXJnczpLZXluYXZBcmdzKSA9PiBQcm9taXNlPCgocGFnZTogc3RyaW5nKSA9PiBzdHJpbmcpPlxudHlwZSBLZXluYXZBcmdzID0gcmVhZG9ubHkgW3N0b3JhZ2VLZXk6ICBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RLZXk6ICAgICBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VLZXk6ICAgICBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdDogICAgICAgIG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2VBcmdzPzogU3BsaWNlQXJnc11cbnR5cGUgU3BsaWNlQXJncyA9IHJlYWRvbmx5IFtzdGFydDogICAgICAgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiBudW1iZXIsICAgICAvLyBpdCB3b3VsZCBiZSBvcHRpb25hbCwgYnV0IHRzIGNvbXBsYWluc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW1zOiAgICBDdXRvZmZbXV1cbnR5cGUgQ3V0b2ZmID0gcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pW11cbnR5cGUgQXVnbWVudGVkUGFnZSA9IFticm93c2VySWQ6ICAgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VLZXk6ICBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcjogIG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICBwYWdlczogICAgICAgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgIHByaW9yQ3V0b2ZmOiBDdXRvZmYgfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZ2VDdXRvZmY6ICBDdXRvZmYgfCBudWxsXVxudHlwZSBTZXJpZXNOYXZKc0FyZ3MgPSByZWFkb25seSBbTmF2SnNUb2tlbnMsIHBhZ2VUb2tlbjogc3RyaW5nLCBOYXZKc1NlcmllcywgS2V5bmF2QXJncz9dXG50eXBlIE5hdkpzU2VyaWVzID0gcmVhZG9ubHkgW3dpZHRoczogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllczogKHN0cmluZyB8IG51bWJlcilbXVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IHN0cmluZ1tdW10gfCBudWxsXVxudHlwZSBJbnB1dE5hdkpzQXJncyA9IHJlYWRvbmx5IFt1cmxUb2tlbjogIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVRva2VuOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleW5hdkFyZ3M/XVxudHlwZSBMaW1pdFRhZ0pzQXJncyA9IHJlYWRvbmx5IFtmcm9tOiAgICAgICBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybFRva2VuOiAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVRva2VuOiAgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdFRva2VuOiBzdHJpbmddXG50eXBlIE5hdkpzVG9rZW5zID0gcmVhZG9ubHkgW2JlZm9yZTogIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yOiAgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcDogICAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6ICAgc3RyaW5nXVxuaW50ZXJmYWNlIE5hdkpzRWxlbWVudCBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgcmVuZGVyKCk6IHZvaWRcbn1cblxuLy8gVGhlIHN5bnRheCB1c2VkIGluIHRoaXMgZmlsZSBoYXMgYmVlbiBjYXJlZnVsbHkgY29tcG9zZWQgdG8gbWluaW1pemVcbi8vIHRoZSBwYWd5Lm1pbi5qcyBzaXplIGFuZCBhdm9pZCBwb2xsdXRpb24gaW4gdGhlIHdpbmRvdyBvYmplY3RcbmV4cG9ydCBkZWZhdWx0ICgoKSA9PiB7XG4gIGNvbnN0IHN0b3JhZ2VTdXBwb3J0ID0gJ3Nlc3Npb25TdG9yYWdlJyBpbiB3aW5kb3cgJiYgJ0Jyb2FkY2FzdENoYW5uZWwnIGluIHdpbmRvdztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBsZXQgcGFneSA9IFwicGFneVwiLCBzdG9yYWdlOiBTdG9yYWdlLCBzeW5jOiBCcm9hZGNhc3RDaGFubmVsLCB0YWJJZDogbnVtYmVyO1xuICBpZiAoc3RvcmFnZVN1cHBvcnQpIHtcbiAgICBzdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2U7IC8vIHNob3J0ZW4gdGhlIGNvbXBpbGVkIHNpemVcbiAgICBzeW5jICAgID0gbmV3IEJyb2FkY2FzdENoYW5uZWwocGFneSk7XG4gICAgdGFiSWQgICA9IERhdGUubm93KCk7XG4gICAgLy8gU3luYyB0aGUgc2Vzc2lvblN0b3JhZ2Uga2V5cyBmb3IgdGhlIGN1dG9mZnMgb3BlbmVkIGluIGEgbmV3IHRhYi93aW5kb3dcbiAgICBzeW5jLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChlOk1lc3NhZ2VFdmVudDxTeW5jRGF0YT4pID0+IHtcbiAgICAgIGlmIChlLmRhdGEuZnJvbSkgeyAvLyByZXF1ZXN0IGN1dG9mZnNcbiAgICAgICAgY29uc3QgY3V0b2ZmcyA9IHN0b3JhZ2UuZ2V0SXRlbShlLmRhdGEua2V5KTtcbiAgICAgICAgaWYgKGN1dG9mZnMpIHtcbiAgICAgICAgICBzeW5jLnBvc3RNZXNzYWdlKDxTeW5jRGF0YT57dG86IGUuZGF0YS5mcm9tLCBrZXk6IGUuZGF0YS5rZXksIHN0cjogY3V0b2Zmc30pO1xuICAgICAgICB9IC8vIHNlbmQgcmVzcG9uc2VcbiAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLnRvKSB7ICAvLyByZWNlaXZlIGN1dG9mZnNcbiAgICAgICAgaWYgKGUuZGF0YS50byA9PSB0YWJJZCkge1xuICAgICAgICAgIHN0b3JhZ2Uuc2V0SXRlbShlLmRhdGEua2V5LCA8c3RyaW5nPmUuZGF0YS5zdHIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLy8gVGhlIG9ic2VydmVyIGluc3RhbmNlIGZvciByZXNwb25zaXZlIG5hdnNcbiAgY29uc3QgcmpzT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoXG4gICAgICBlbnRyaWVzID0+IGVudHJpZXMuZm9yRWFjaChlID0+IHtcbiAgICAgICAgZS50YXJnZXQucXVlcnlTZWxlY3RvckFsbDxOYXZKc0VsZW1lbnQ+KFwiLnBhZ3ktcmpzXCIpLmZvckVhY2goZWwgPT4gZWwucmVuZGVyKCkpO1xuICAgICAgfSkpO1xuXG4gIC8qIEZ1bGwgc2V0IG9mIEI2NCBmdW5jdGlvbnNcbiAgY29uc3QgQjY0RW5jb2RlICAgICA9ICh1bmljb2RlOnN0cmluZykgPT4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh1bmljb2RlKSkpLFxuICAgICAgICBCNjRTYWZlICAgICAgID0gKHVuc2FmZTpzdHJpbmcpICA9PiB1bnNhZmUucmVwbGFjZSgvWysvPV0vZywgKG0pID0+IG0gPT0gXCIrXCIgPyBcIi1cIiA6IG0gPT0gXCIvXCIgPyBcIl9cIiA6IFwiXCIpLFxuICAgICAgICBCNjRTYWZlRW5jb2RlID0gKHVuaWNvZGU6c3RyaW5nKSA9PiBCNjRTYWZlKEI2NEVuY29kZSh1bmljb2RlKSksXG4gICAgICAgIEI2NERlY29kZSAgICAgPSAoYmFzZTY0OnN0cmluZykgID0+IChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKFVpbnQ4QXJyYXkuZnJvbShhdG9iKGJhc2U2NCksIGMgPT4gYy5jaGFyQ29kZUF0KDApKSksXG4gICAgICAgIEI2NFVuc2FmZSAgICAgPSAoc2FmZTpzdHJpbmcpICAgID0+IHNhZmUucmVwbGFjZSgvWy1fXS9nLCAobWF0Y2gpID0+IG1hdGNoID09IFwiLVwiID8gXCIrXCIgOiBcIi9cIiksXG4gICAgICAgIEI2NFNhZmVEZWNvZGUgPSAoYmFzZTY0OnN0cmluZykgID0+IEI2NERlY29kZShCNjRVbnNhZmUoYmFzZTY0KSlcbiAgKi9cbiAgY29uc3QgQjY0U2FmZUVuY29kZSA9ICh1bmljb2RlOnN0cmluZykgPT4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh1bmljb2RlKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bKy89XS9nLCAobSkgPT4gbSA9PSBcIitcIiA/IFwiLVwiIDogbSA9PSBcIi9cIiA/IFwiX1wiIDogXCJcIiksXG4gICAgICAgIEI2NERlY29kZSAgICAgPSAoYmFzZTY0OnN0cmluZykgID0+IChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKFVpbnQ4QXJyYXkuZnJvbShhdG9iKGJhc2U2NCksIGMgPT4gYy5jaGFyQ29kZUF0KDApKSk7XG5cbiAgLy8gUmV0dXJuIGEgcmFuZG9tIGtleTogMyBjaGFycyBtYXgsIGJhc2UtMzYgbnVtYmVyIDwgMzYqKjNcbiAgY29uc3QgcmFuZEtleSA9ICgpID0+IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDM2ICoqIDMpLnRvU3RyaW5nKDM2KTtcblxuICAvLyBNYW5hZ2UgdGhlIHBhZ2UgYXVnbWVudGF0aW9uIGZvciBLZXluYXYsIGNhbGxlZCBvbmx5IGlmIHN0b3JhZ2VTdXBwb3J0XG4gIGNvbnN0IGF1Z21lbnRLZXluYXY6IEF1Z21lbnRLZXluYXYgPSBhc3luYyAobmF2LCBbc3RvcmFnZUtleSwgcm9vdEtleSwgcGFnZUtleSwgbGFzdCwgc3BsaWNlQXJnc10pID0+IHtcbiAgICBsZXQgYXVnbWVudFBhZ2U6KHBhZ2U6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgIGNvbnN0IGJyb3dzZXJLZXkgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoLztcXHMrLykgIC8vIGl0IHdvcmtzIGV2ZW4gaWYgbWFsZm9ybWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoKHJvdykgPT4gcm93LnN0YXJ0c1dpdGgocGFneSArIFwiPVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LnNwbGl0KFwiPVwiKVsxXSA/PyByYW5kS2V5KCk7XG4gICAgZG9jdW1lbnQuY29va2llID0gcGFneSArIFwiPVwiICsgYnJvd3NlcktleTsgIC8vIFNtYWxsZXIgLm1pbiBzaXplOiBzZXQgdGhlIGNvb2tpZSB3aXRob3V0IGNoZWNraW5nXG4gICAgaWYgKHN0b3JhZ2VLZXkgJiYgIShzdG9yYWdlS2V5IGluIHN0b3JhZ2UpKSB7XG4gICAgICAvLyBTeW5jIHRoZSBzZXNzaW9uZ1N0b3JhZ2UgZnJvbSBvdGhlciB0YWJzL3dpbmRvd3MgKGUuZy4sIG9wZW4gcGFnZSBpbiB0aGUgbmV3IHRhYi93aW5kb3cpXG4gICAgICBzeW5jLnBvc3RNZXNzYWdlKDxTeW5jRGF0YT57IGZyb206IHRhYklkLCBrZXk6IHN0b3JhZ2VLZXkgfSk7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgbGlzdGVuZXIgdG8gY29weSB0aGUgY3V0b2ZmcyBpbiB0aGUgY3VycmVudCBzZXNzaW9uU3RvcmFnZVxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nfG51bGw+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoXCJcIiksIDEwMCkpO1xuICAgICAgaWYgKCEoc3RvcmFnZUtleSBpbiBzdG9yYWdlKSkgeyAvLyB0aGUgc3RvcmFnZUtleSBkaWRuJ3QgZ2V0IGNvcGllZDogZmFsbGJhY2sgdG8gY291bnRsZXNzIHBhZ2luYXRpb25cbiAgICAgICAgYXVnbWVudFBhZ2UgPSAocGFnZTogc3RyaW5nKSA9PiBwYWdlICsgJysnICsgbGFzdDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBJZiBpdCBpcyBub3QgYXNzaWduZWQgaXQgbWVhbnMgaXQgc3VwcG9ydHMga2V5bmF2XG4gICAgaWYgKCFhdWdtZW50UGFnZSkgeyAvLyByZWd1bGFyIGtleW5hdiBwYWdpbmF0aW9uXG4gICAgICBpZiAoIXN0b3JhZ2VLZXkpIHsgZG8geyBzdG9yYWdlS2V5ID0gcmFuZEtleSgpIH0gd2hpbGUgKHN0b3JhZ2VLZXkgaW4gc3RvcmFnZSkgfSAvLyBubyBkdXAga2V5c1xuICAgICAgY29uc3QgZGF0YSA9IHN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KSxcbiAgICAgICAgICBjdXRvZmZzID0gPEN1dG9mZltdPihkYXRhID8gSlNPTi5wYXJzZShkYXRhKSA6IFt1bmRlZmluZWRdKTtcbiAgICAgIGlmIChzcGxpY2VBcmdzKSB7XG4gICAgICAgIGN1dG9mZnMuc3BsaWNlKC4uLnNwbGljZUFyZ3MpO1xuICAgICAgICBzdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkoY3V0b2ZmcykpO1xuICAgICAgfVxuICAgICAgLy8gQXVnbWVudCBmdW5jdGlvblxuICAgICAgYXVnbWVudFBhZ2UgPSAocGFnZTpzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZU51bSA9IHBhcnNlSW50KHBhZ2UpO1xuICAgICAgICByZXR1cm4gQjY0U2FmZUVuY29kZShKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIDxBdWdtZW50ZWRQYWdlPlticm93c2VyS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRvZmZzLmxlbmd0aCwgICAgICAgLy8gcGFnZXMvbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnNbcGFnZU51bSAtIDFdLCAvLyBwcmlvckN1dG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnNbcGFnZU51bV1dKSk7ICAvLyBwYWdlQ3V0b2ZmXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2ggPSAocm9vdEtleSkgPyBgJHtyb290S2V5fSU1QiR7cGFnZUtleX0lNURgIDogcGFnZUtleTtcbiAgICBjb25zdCByZSAgICAgPSBuZXcgUmVnRXhwKGAoPzw9XFxcXD8uKikoXFxcXGIke3NlYXJjaH09KShcXFxcZCspYCk7XG4gICAgLy8gQXVnbWVudCB0aGUgcGFnZSBwYXJhbSBvZiBlYWNoIGhyZWZcbiAgICBmb3IgKGNvbnN0IGEgb2YgPE5vZGVMaXN0T2Y8SFRNTEFuY2hvckVsZW1lbnQ+Pjx1bmtub3duPm5hdi5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZdJykpIHtcbiAgICAgIGEuaHJlZiA9IGEuaHJlZi5yZXBsYWNlKHJlLCAoX21hdGNoLCBwcmVmaXgsIGRpZ2l0KTogc3RyaW5nID0+IGAke3ByZWZpeH0ke2F1Z21lbnRQYWdlKDxzdHJpbmc+ZGlnaXQpfWApO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIGF1Z21lbnQgZnVuY3Rpb24gZm9yIGZ1cnRoZXIgYXVnbWVudGF0aW9uIChpLmUuLCB1cmwgdG9rZW4gaW4gaW5wdXRfbmF2X2pzKVxuICAgIHJldHVybiBhdWdtZW50UGFnZTtcbiAgfTtcblxuICAvLyBCdWlsZCB0aGUgc2VyaWVzX25hdl9qcyBoZWxwZXJcbiAgY29uc3QgYnVpbGROYXZKcyA9IChuYXY6TmF2SnNFbGVtZW50LCBbW2JlZm9yZSwgYW5jaG9yLCBjdXJyZW50LCBnYXAsIGFmdGVyXSwgcGFnZVRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aHMsIHNlcmllcywgbGFiZWxzXSwga2V5bmF2QXJnc106U2VyaWVzTmF2SnNBcmdzKSA9PiB7XG4gICAgY29uc3QgIHBhcmVudCA9IDxIVE1MRWxlbWVudD5uYXYucGFyZW50RWxlbWVudDtcbiAgICBsZXQgbGFzdFdpZHRoID0gLTE7XG4gICAgKG5hdi5yZW5kZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHdpZHRocy5maW5kSW5kZXgodyA9PiB3IDwgcGFyZW50LmNsaWVudFdpZHRoKTtcbiAgICAgIGlmICh3aWR0aHNbaW5kZXhdID09PSBsYXN0V2lkdGgpIHsgcmV0dXJuIH0gLy8gbm8gY2hhbmdlOiBhYm9ydFxuXG4gICAgICBsZXQgaHRtbCA9IGJlZm9yZTtcbiAgICAgIHNlcmllc1tpbmRleF0uZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAvLyBBdm9pZCB0aGUgaWYgYmxvY2tzIGFuZCBjaGFpbiB0aGUgcmVzdWx0cyAoc2hvcnRlciBwYWd5Lm1pbi5qcyBhbmQgZWFzaWVyIHJlYWRpbmcpXG4gICAgICAgIGh0bWwgKz0gaXRlbSA9PSBcImdhcFwiID8gZ2FwIDpcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSBpdGVtIG1heSBiZSBhIG51bWJlciwgYnV0IHRoZSAncmVwbGFjZScgY29udmVydHMgaXQgdG8gc3RyaW5nIChzaG9ydGVyIHBhZ3kubWluLmpzKVxuICAgICAgICAgICAgICAgICh0eXBlb2YgaXRlbSA9PSBcIm51bWJlclwiID8gYW5jaG9yLnJlcGxhY2UocGFnZVRva2VuLCBpdGVtKSA6IGN1cnJlbnQpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiTDxcIiwgbGFiZWxzPy5baW5kZXhdW2ldID8/IGl0ZW0gKyBcIjxcIik7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgICAgICAgICArPSBhZnRlcjtcbiAgICAgIG5hdi5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgbmF2Lmluc2VydEFkamFjZW50SFRNTChcImFmdGVyYmVnaW5cIiwgaHRtbCk7XG4gICAgICBsYXN0V2lkdGggPSB3aWR0aHNbaW5kZXhdO1xuICAgICAgaWYgKGtleW5hdkFyZ3MgJiYgc3RvcmFnZVN1cHBvcnQpIHsgdm9pZCBhdWdtZW50S2V5bmF2KG5hdiwga2V5bmF2QXJncykgfVxuICAgIH0pKCk7XG4gICAgaWYgKG5hdi5jbGFzc0xpc3QuY29udGFpbnMocGFneSArIFwiLXJqc1wiKSkgeyByanNPYnNlcnZlci5vYnNlcnZlKHBhcmVudCkgfVxuICB9O1xuXG4gIC8vIEluaXQgdGhlIGlucHV0X25hdl9qcyBoZWxwZXJzXG4gIGNvbnN0IGluaXRJbnB1dE5hdkpzID0gYXN5bmMgKG5hdjpIVE1MRWxlbWVudCwgW3VybF90b2tlbiwgcGFnZVRva2VuLCBrZXluYXZBcmdzXTpJbnB1dE5hdkpzQXJncykgPT4ge1xuICAgIGNvbnN0IGF1Z21lbnQgPSBrZXluYXZBcmdzICYmIHN0b3JhZ2VTdXBwb3J0XG4gICAgICAgICAgICAgICAgICAgID8gYXdhaXQgYXVnbWVudEtleW5hdihuYXYsIGtleW5hdkFyZ3MpXG4gICAgICAgICAgICAgICAgICAgIDogKHBhZ2U6IHN0cmluZykgPT4gcGFnZTtcbiAgICBpbml0SW5wdXQobmF2LCBpbnB1dFZhbHVlID0+IHVybF90b2tlbi5yZXBsYWNlKHBhZ2VUb2tlbiwgYXVnbWVudChpbnB1dFZhbHVlKSkpO1xuICB9O1xuXG4gIC8vIEluaXQgdGhlIGxpbWl0X3RhZ19qcyBoZWxwZXJcbiAgY29uc3QgaW5pdExpbWl0VGFnSnMgPSAoc3BhbjpIVE1MU3BhbkVsZW1lbnQsIFtmcm9tLCB1cmxfdG9rZW4sIHBhZ2VfdG9rZW4sIGxpbWl0VG9rZW5dOkxpbWl0VGFnSnNBcmdzKSA9PiB7XG4gICAgaW5pdElucHV0KHNwYW4sIGlucHV0VmFsdWUgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGUgcGFnZSBpcyBhIG51bWJlciwgYnV0IHRoZSAncmVwbGFjZScgY29udmVydHMgaXQgdG8gc3RyaW5nIChzaG9ydGVyIHBhZ3kubWluLmpzKVxuICAgICAgcmV0dXJuIHVybF90b2tlbi5yZXBsYWNlKHBhZ2VfdG9rZW4sIE1hdGgubWF4KE1hdGguY2VpbChmcm9tIC8gcGFyc2VJbnQoaW5wdXRWYWx1ZSkpLCAxKSlcbiAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShsaW1pdFRva2VuLCBpbnB1dFZhbHVlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBJbml0IHRoZSBpbnB1dCBlbGVtZW50XG4gIGNvbnN0IGluaXRJbnB1dCA9IChlbGVtZW50OkhUTUxFbGVtZW50LCBnZXRVcmw6KHY6c3RyaW5nKSA9PiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpbnB1dCAgID0gPEhUTUxJbnB1dEVsZW1lbnQ+ZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIiksXG4gICAgICAgICAgbGluayAgICA9IDxIVE1MQW5jaG9yRWxlbWVudD5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJhXCIpO1xuICAgIGxldCAgIGluaXRpYWwgPSBpbnB1dC52YWx1ZTtcbiAgICBjb25zdCBhY3Rpb24gID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZSA9PT0gaW5pdGlhbCkgeyByZXR1cm4gfSAgLy8gbm90IGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbbWluLCB2YWwsIG1heF0gPSBbaW5wdXQubWluLCBpbnB1dC52YWx1ZSwgaW5wdXQubWF4XS5tYXAobiA9PiBwYXJzZUludChuKSB8fCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkgeyAgLy8gcmVzZXQgaW52YWxpZC9vdXQtb2YtcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gaW5pdGlhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgbGluay5ocmVmID0gZ2V0VXJsKGlucHV0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsICgpID0+IGlucHV0LnNlbGVjdCgpKTtcbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgYWN0aW9uKTtcbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgZSA9PiB7IGlmIChlLmtleSA9PSBcIkVudGVyXCIpIHsgYWN0aW9uKCkgfSB9KTtcbiAgfTtcblxuICAvLyBQdWJsaWMgaW50ZXJmYWNlXG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogXCI0My40LjRcIixcblxuICAgIC8vIFNjYW4gZm9yIGVsZW1lbnRzIHdpdGggYSBcImRhdGEtcGFneVwiIGF0dHJpYnV0ZSBhbmQgY2FsbCB0aGVpciBpbml0IGZ1bmN0aW9ucyB3aXRoIHRoZSBkZWNvZGVkIGFyZ3NcbiAgICBpbml0KGFyZz86SFRNTEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCAgID0gYXJnIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudCxcbiAgICAgICAgICAgIGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiA8Tm9kZUxpc3RPZjxIVE1MRWxlbWVudD4+ZWxlbWVudHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBbaGVscGVySWQsIC4uLmFyZ3NdID0gPEluaXRBcmdzPkpTT04ucGFyc2UoQjY0RGVjb2RlKDxzdHJpbmc+ZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikpKTtcbiAgICAgICAgICBpZiAoaGVscGVySWQgPT0gXCJrXCIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc3ByZWFkIDIgYXJndW1lbnRzLCBub3QgMyBhcyBpdCBjb21wbGFpbnMgYWJvdXRcbiAgICAgICAgICAgIHZvaWQgYXVnbWVudEtleW5hdihlbGVtZW50LCAuLi48S2V5bmF2QXJncz48dW5rbm93bj5hcmdzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlbHBlcklkID09IFwic25qXCIpIHtcbiAgICAgICAgICAgIGJ1aWxkTmF2SnMoPE5hdkpzRWxlbWVudD5lbGVtZW50LCA8U2VyaWVzTmF2SnNBcmdzPjx1bmtub3duPmFyZ3MpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGVscGVySWQgPT0gXCJpbmpcIikge1xuICAgICAgICAgICAgdm9pZCBpbml0SW5wdXROYXZKcyhlbGVtZW50LCA8SW5wdXROYXZKc0FyZ3M+PHVua25vd24+YXJncyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChoZWxwZXJJZCA9PSBcImx0alwiKSB7XG4gICAgICAgICAgICBpbml0TGltaXRUYWdKcyhlbGVtZW50LCA8TGltaXRUYWdKc0FyZ3M+PHVua25vd24+YXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGVsc2UgeyBjb25zb2xlLndhcm4oXCJQYWd5LmluaXQ6ICVvXFxuVW5rbm93biBoZWxwZXJJZCAnJXMnXCIsIGVsZW1lbnQsIGhlbHBlcklkKSB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikgeyBjb25zb2xlLndhcm4oXCJQYWd5LmluaXQ6ICVvXFxuJXNcIiwgZWxlbWVudCwgZXJyKSB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufSkoKTtcbiIsCiAgICAiaW1wb3J0IFBhZ3kgZnJvbSBcIi4vcGFneS50c1wiXG53aW5kb3cuUGFneSA9IFBhZ3lcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFnREEsSUFBZ0Isc0JBQU07QUFBQSxFQUNwQixNQUFNLGlCQUFpQixvQkFBb0IsVUFBVSxzQkFBc0I7QUFBQSxFQUUzRSxJQUFJLE9BQU8sUUFBUSxTQUFrQixNQUF3QjtBQUFBLEVBQzdELElBQUksZ0JBQWdCO0FBQUEsSUFDbEIsVUFBVTtBQUFBLElBQ1YsT0FBVSxJQUFJLGlCQUFpQixJQUFJO0FBQUEsSUFDbkMsUUFBVSxLQUFLLElBQUk7QUFBQSxJQUVuQixLQUFLLGlCQUFpQixXQUFXLENBQUMsTUFBNkI7QUFBQSxNQUM3RCxJQUFJLEVBQUUsS0FBSyxNQUFNO0FBQUEsUUFDZixNQUFNLFVBQVUsUUFBUSxRQUFRLEVBQUUsS0FBSyxHQUFHO0FBQUEsUUFDMUMsSUFBSSxTQUFTO0FBQUEsVUFDWCxLQUFLLFlBQXNCLEVBQUMsSUFBSSxFQUFFLEtBQUssTUFBTSxLQUFLLEVBQUUsS0FBSyxLQUFLLEtBQUssUUFBTyxDQUFDO0FBQUEsUUFDN0U7QUFBQSxNQUNGLEVBQU8sU0FBSSxFQUFFLEtBQUssSUFBSTtBQUFBLFFBQ3BCLElBQUksRUFBRSxLQUFLLE1BQU0sT0FBTztBQUFBLFVBQ3RCLFFB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QUNyQixNQUFNLFNBQVcsZUFBZSxjQUFjLE1BQU0sVUFDOUMsV0FBVyxPQUFPLGlCQUFpQixhQUFhO0FBQUEsTUFDdEQsV0FBVyxXQUFvQyxVQUFVO0FBQUEsUUFDdkQsSUFBSTtBQUFBLFVBQ0YsT0FBTyxhQUFhLFFBQWtCLEtBQUssTUFBTSxVQUFrQixRQUFRLGFBQWEsV0FBVyxDQUFDLENBQUM7QUFBQSxVQUNyRyxJQUFJLFlBQVksS0FBSztBQUFBLFlBRWQsY0FBYyxTQUFTLEdBQXdCLElBQUk7QUFBQSxVQUMxRCxFQUFPLFNBQUksWUFBWSxPQUFPO0FBQUEsWUFDNUIsV0FBeUIsU0FBbUMsSUFBSTtBQUFBLFVBQ2xFLEVBQU8sU0FBSSxZQUFZLE9BQU87QUFBQSxZQUN2QixlQUFlLFNBQWtDLElBQUk7QUFBQSxVQUM1RCxFQUFPLFNBQUksWUFBWSxPQUFPO0FBQUEsWUFDNUIsZUFBZSxTQUFrQyxJQUFJO0FBQUEsVUFDdkQ7QUFBQSxVQUVBLE9BQU8sS0FBSztBQUFBLFVBQUUsUUFBUSxLQUFLO0FBQUEsS0FBcUIsU0FBUyxHQUFHO0FBQUE7QUFBQSxNQUNoRTtBQUFBO0FBQUEsRUFFSjtBQUFBLEdBQ0M7OztBQ3BPSCxPQUFPLE9BQU87IiwKICAiZGVidWdJZCI6ICI2NzI1MTM4RDVCQTAxREY0NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
167
+ //# debugId=90063023AE043ED164756E2164756E21
168
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFneS50cyIsICJwYWd5LXNoaW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW50ZXJmYWNlIFN5bmNEYXRhIHtcbiAgZnJvbT86IG51bWJlclxuICB0bz8gIDogbnVtYmVyXG4gIGtleSAgOiBzdHJpbmdcbiAgc3RyPyA6IHN0cmluZ1xufVxudHlwZSBJbml0QXJncyA9IFtcImtcIiwgIEtleW5hdkFyZ3NdIHwgICAgICAgICAgLy8gc2VyaWVzX25hdltfanNdIHdpdGgga2V5bmF2IGluc3RhbmNlXG4gICAgICAgICAgICAgICAgW1wic25qXCIsIFNlcmllc05hdkpzQXJnc10gfCAgICAvLyBzZXJpZXNfbmF2X2pzXG4gICAgICAgICAgICAgICAgW1wiaW5qXCIsIElucHV0TmF2SnNBcmdzXSB8ICAgICAvLyBpbnB1dF9uYXZfanNcbiAgICAgICAgICAgICAgICBbXCJsdGpcIiwgTGltaXRUYWdKc0FyZ3NdOyAgICAgIC8vIGxpbWl0X3RhZ19qc1xudHlwZSBBdWdtZW50S2V5bmF2ID0gKG5hdjpIVE1MRWxlbWVudCwga2V5bmF2QXJnczpLZXluYXZBcmdzKSA9PiBQcm9taXNlPCgocGFnZTogc3RyaW5nKSA9PiBzdHJpbmcpPjtcbnR5cGUgS2V5bmF2QXJncyA9IHJlYWRvbmx5IFtzdG9yYWdlS2V5IDogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290S2V5ICAgIDogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlS2V5ICAgIDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgICAgICAgOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlQXJncz86IFNwbGljZUFyZ3NdO1xudHlwZSBTcGxpY2VBcmdzID0gcmVhZG9ubHkgW3N0YXJ0ICAgICAgOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IG51bWJlciwgICAgIC8vIGl0IHdvdWxkIGJlIG9wdGlvbmFsLCBidXQgdHMgY29tcGxhaW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbXM6ICAgIEN1dG9mZltdXTtcbnR5cGUgQ3V0b2ZmID0gcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pW107XG50eXBlIEF1Z21lbnRlZFBhZ2UgPSBbYnJvd3NlcklkICA6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlS2V5IDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIgOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZXMgICAgICA6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICBwcmlvckN1dG9mZjogQ3V0b2ZmIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICBwYWdlQ3V0b2ZmIDogQ3V0b2ZmIHwgbnVsbF07XG50eXBlIFNlcmllc05hdkpzQXJncyA9IHJlYWRvbmx5IFtOYXZKc1Rva2VucywgcGFnZVRva2VuOiBzdHJpbmcsIE5hdkpzU2VyaWVzLCBLZXluYXZBcmdzP107XG50eXBlIE5hdkpzU2VyaWVzID0gcmVhZG9ubHkgW3dpZHRoczogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllczogKHN0cmluZyB8IG51bWJlcilbXVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IHN0cmluZ1tdW10gfCBudWxsXTtcbnR5cGUgSW5wdXROYXZKc0FyZ3MgPSByZWFkb25seSBbdXJsVG9rZW46ICBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUb2tlbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXluYXZBcmdzP107XG50eXBlIExpbWl0VGFnSnNBcmdzID0gcmVhZG9ubHkgW2Zyb20gICAgICA6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsVG9rZW4gIDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVG9rZW4gOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0VG9rZW46IHN0cmluZ107XG50eXBlIE5hdkpzVG9rZW5zID0gcmVhZG9ubHkgW2JlZm9yZSA6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yIDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcCAgICA6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgIDogc3RyaW5nXTtcbmludGVyZmFjZSBOYXZKc0VsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gIHJlbmRlcigpOiB2b2lkXG59XG5cbi8vIFRoZSBzeW50YXggdXNlZCBpbiB0aGlzIGZpbGUgaGFzIGJlZW4gY2FyZWZ1bGx5IGNvbXBvc2VkIHRvIG1pbmltaXplXG4vLyB0aGUgcGFneS5taW4uanMgc2l6ZSBhbmQgYXZvaWQgcG9sbHV0aW9uIGluIHRoZSB3aW5kb3cgb2JqZWN0LlxuZXhwb3J0IGRlZmF1bHQgKCgpID0+IHtcbiAgY29uc3Qgc3RvcmFnZVN1cHBvcnQgPSAnc2Vzc2lvblN0b3JhZ2UnIGluIHdpbmRvdyAmJiAnQnJvYWRjYXN0Q2hhbm5lbCcgaW4gd2luZG93O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gIGxldCBwYWd5ID0gXCJwYWd5XCIsIHN0b3JhZ2U6IFN0b3JhZ2UsIHN5bmM6IEJyb2FkY2FzdENoYW5uZWwsIHRhYklkOiBudW1iZXI7XG4gIGlmIChzdG9yYWdlU3VwcG9ydCkge1xuICAgIHN0b3JhZ2UgPSBzZXNzaW9uU3RvcmFnZTsgLy8gc2hvcnRlbiB0aGUgY29tcGlsZWQgc2l6ZVxuICAgIHN5bmMgICAgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbChwYWd5KTtcbiAgICB0YWJJZCAgID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIFN5bmMgdGhlIHNlc3Npb25TdG9yYWdlIGtleXMgZm9yIHRoZSBjdXRvZmZzIG9wZW5lZCBpbiBhIG5ldyB0YWIvd2luZG93XG4gICAgc3luYy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZTpNZXNzYWdlRXZlbnQ8U3luY0RhdGE+KSA9PiB7XG4gICAgICBpZiAoZS5kYXRhLmZyb20pIHsgLy8gcmVxdWVzdCBjdXRvZmZzXG4gICAgICAgIGNvbnN0IGN1dG9mZnMgPSBzdG9yYWdlLmdldEl0ZW0oZS5kYXRhLmtleSk7XG4gICAgICAgIGlmIChjdXRvZmZzKSB7XG4gICAgICAgICAgc3luYy5wb3N0TWVzc2FnZSg8U3luY0RhdGE+e3RvOiBlLmRhdGEuZnJvbSwga2V5OiBlLmRhdGEua2V5LCBzdHI6IGN1dG9mZnN9KTtcbiAgICAgICAgfSAvLyBzZW5kIHJlc3BvbnNlXG4gICAgICB9IGVsc2UgaWYgKGUuZGF0YS50bykgeyAgLy8gcmVjZWl2ZSBjdXRvZmZzXG4gICAgICAgIGlmIChlLmRhdGEudG8gPT0gdGFiSWQpIHtcbiAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oZS5kYXRhLmtleSwgPHN0cmluZz5lLmRhdGEuc3RyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8vIFRoZSBvYnNlcnZlciBpbnN0YW5jZSBmb3IgcmVzcG9uc2l2ZSBuYXZzXG4gIGNvbnN0IHJqc09ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgIGVudHJpZXMuZm9yRWFjaChlID0+IHtcbiAgICAgIGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGw8TmF2SnNFbGVtZW50PihcIi5wYWd5LXJqc1wiKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgZWwucmVuZGVyKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLyogRnVsbCBzZXQgb2YgQjY0IGZ1bmN0aW9uc1xuICBjb25zdCBCNjRFbmNvZGUgICAgID0gKHVuaWNvZGU6c3RyaW5nKSA9PiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHVuaWNvZGUpKSksXG4gICAgICAgIEI2NFNhZmUgICAgICAgPSAodW5zYWZlOnN0cmluZykgID0+IHVuc2FmZS5yZXBsYWNlKC9bKy89XS9nLCAobSkgPT4gbSA9PSBcIitcIiA/IFwiLVwiIDogbSA9PSBcIi9cIiA/IFwiX1wiIDogXCJcIiksXG4gICAgICAgIEI2NFNhZmVFbmNvZGUgPSAodW5pY29kZTpzdHJpbmcpID0+IEI2NFNhZmUoQjY0RW5jb2RlKHVuaWNvZGUpKSxcbiAgICAgICAgQjY0RGVjb2RlICAgICA9IChiYXNlNjQ6c3RyaW5nKSAgPT4gKG5ldyBUZXh0RGVjb2RlcigpKS5kZWNvZGUoVWludDhBcnJheS5mcm9tKGF0b2IoYmFzZTY0KSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpKSxcbiAgICAgICAgQjY0VW5zYWZlICAgICA9IChzYWZlOnN0cmluZykgICAgPT4gc2FmZS5yZXBsYWNlKC9bLV9dL2csIChtYXRjaCkgPT4gbWF0Y2ggPT0gXCItXCIgPyBcIitcIiA6IFwiL1wiKSxcbiAgICAgICAgQjY0U2FmZURlY29kZSA9IChiYXNlNjQ6c3RyaW5nKSAgPT4gQjY0RGVjb2RlKEI2NFVuc2FmZShiYXNlNjQpKVxuICAqL1xuICBjb25zdCBCNjRTYWZlRW5jb2RlID0gKHVuaWNvZGU6c3RyaW5nKSA9PiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHVuaWNvZGUpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bKy89XS9nLCAobSkgPT4gbSA9PSBcIitcIiA/IFwiLVwiIDogbSA9PSBcIi9cIiA/IFwiX1wiIDogXCJcIiksXG4gICAgICAgIEI2NERlY29kZSAgICAgPSAoYmFzZTY0OnN0cmluZykgID0+IChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKFVpbnQ4QXJyYXkuZnJvbShhdG9iKGJhc2U2NCksIGMgPT4gYy5jaGFyQ29kZUF0KDApKSk7XG5cbiAgLy8gUmV0dXJuIGEgcmFuZG9tIGtleTogMyBjaGFycyBtYXgsIGJhc2UtMzYgbnVtYmVyIDwgMzYqKjNcbiAgY29uc3QgcmFuZEtleSA9ICgpID0+IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDM2ICoqIDMpLnRvU3RyaW5nKDM2KTtcblxuICAvLyBNYW5hZ2UgdGhlIHBhZ2UgYXVnbWVudGF0aW9uIGZvciBLZXluYXYsIGNhbGxlZCBvbmx5IGlmIHN0b3JhZ2VTdXBwb3J0XG4gIGNvbnN0IGF1Z21lbnRLZXluYXY6IEF1Z21lbnRLZXluYXYgPSBhc3luYyAobmF2LCBbc3RvcmFnZUtleSwgcm9vdEtleSwgcGFnZUtleSwgbGFzdCwgc3BsaWNlQXJnc10pID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYWxpZ24tYXNzaWdubWVudHMvYWxpZ24tYXNzaWdubWVudHNcbiAgICBsZXQgYXVnbWVudFBhZ2U6IChwYWdlOiBzdHJpbmcpID0+IHN0cmluZztcbiAgICBjb25zdCBicm93c2VyS2V5ID0gZG9jdW1lbnQuY29va2llLnNwbGl0KC87XFxzKy8pICAvLyBpdCB3b3JrcyBldmVuIGlmIG1hbGZvcm1lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKChyb3cpID0+IHJvdy5zdGFydHNXaXRoKHBhZ3kgKyBcIj1cIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5zcGxpdChcIj1cIilbMV0gPz8gcmFuZEtleSgpO1xuICAgIGRvY3VtZW50LmNvb2tpZSAgPSBgJHtwYWd5fT0ke2Jyb3dzZXJLZXl9YDsgIC8vIFNtYWxsZXIgLm1pbiBzaXplOiBzZXQgdGhlIGNvb2tpZSB3aXRob3V0IGNoZWNraW5nXG4gICAgaWYgKHN0b3JhZ2VLZXkgJiYgIShzdG9yYWdlS2V5IGluIHN0b3JhZ2UpKSB7XG4gICAgICAvLyBTeW5jIHRoZSBzZXNzaW9uZ1N0b3JhZ2UgZnJvbSBvdGhlciB0YWJzL3dpbmRvd3MgKGUuZy4sIG9wZW4gcGFnZSBpbiB0aGUgbmV3IHRhYi93aW5kb3cpXG4gICAgICBzeW5jLnBvc3RNZXNzYWdlKDxTeW5jRGF0YT57IGZyb206IHRhYklkLCBrZXk6IHN0b3JhZ2VLZXkgfSk7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgbGlzdGVuZXIgdG8gY29weSB0aGUgY3V0b2ZmcyBpbiB0aGUgY3VycmVudCBzZXNzaW9uU3RvcmFnZVxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nfG51bGw+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHsgcmVzb2x2ZShcIlwiKSB9LCAxMDApKTtcbiAgICAgIGlmICghKHN0b3JhZ2VLZXkgaW4gc3RvcmFnZSkpIHsgLy8gdGhlIHN0b3JhZ2VLZXkgZGlkbid0IGdldCBjb3BpZWQ6IGZhbGxiYWNrIHRvIGNvdW50bGVzcyBwYWdpbmF0aW9uXG4gICAgICAgIGF1Z21lbnRQYWdlID0gKHBhZ2U6IHN0cmluZykgPT4gYCR7cGFnZX0rJHtTdHJpbmcobGFzdCl9YDsgICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgSWYgaXQgaXMgbm90IGFzc2lnbmVkIGl0IG1lYW5zIGl0IHN1cHBvcnRzIGtleW5hdlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgaWYgKCFhdWdtZW50UGFnZSkgeyAvLyByZWd1bGFyIGtleW5hdiBwYWdpbmF0aW9uXG4gICAgICBpZiAoIXN0b3JhZ2VLZXkpIHsgZG8geyBzdG9yYWdlS2V5ID0gcmFuZEtleSgpIH0gd2hpbGUgKHN0b3JhZ2VLZXkgaW4gc3RvcmFnZSkgfSAvLyBubyBkdXAga2V5c1xuICAgICAgY29uc3QgZGF0YSA9IHN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KSxcbiAgICAgICAgICBjdXRvZmZzID0gPEN1dG9mZltdPihkYXRhID8gSlNPTi5wYXJzZShkYXRhKSA6IFt1bmRlZmluZWRdKTtcbiAgICAgIGlmIChzcGxpY2VBcmdzKSB7XG4gICAgICAgIGN1dG9mZnMuc3BsaWNlKC4uLnNwbGljZUFyZ3MpO1xuICAgICAgICBzdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkoY3V0b2ZmcykpO1xuICAgICAgfVxuICAgICAgLy8gQXVnbWVudCBmdW5jdGlvblxuICAgICAgYXVnbWVudFBhZ2UgPSAocGFnZTpzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZU51bSA9IHBhcnNlSW50KHBhZ2UpO1xuICAgICAgICByZXR1cm4gQjY0U2FmZUVuY29kZShKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIDxBdWdtZW50ZWRQYWdlPlticm93c2VyS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRvZmZzLmxlbmd0aCwgICAgICAgLy8gcGFnZXMvbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnNbcGFnZU51bSAtIDFdLCAvLyBwcmlvckN1dG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnNbcGFnZU51bV1dKSk7ICAvLyBwYWdlQ3V0b2ZmXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2ggPSAocm9vdEtleSkgPyBgJHtyb290S2V5fSU1QiR7cGFnZUtleX0lNURgIDogcGFnZUtleTtcbiAgICBjb25zdCByZSAgICAgPSBuZXcgUmVnRXhwKGAoPzw9XFxcXD8uKikoXFxcXGIke3NlYXJjaH09KShcXFxcZCspYCk7XG4gICAgLy8gQXVnbWVudCB0aGUgcGFnZSBwYXJhbSBvZiBlYWNoIGhyZWZcbiAgICBmb3IgKGNvbnN0IGEgb2YgPE5vZGVMaXN0T2Y8SFRNTEFuY2hvckVsZW1lbnQ+Pjx1bmtub3duPm5hdi5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZdJykpIHtcbiAgICAgIGEuaHJlZiA9IGEuaHJlZi5yZXBsYWNlKHJlLCAoX21hdGNoLCBwcmVmaXgsIGRpZ2l0KTogc3RyaW5nID0+IGAke1N0cmluZyhwcmVmaXgpfSR7YXVnbWVudFBhZ2UoPHN0cmluZz5kaWdpdCl9YCk7XG4gICAgfVxuICAgIC8vIFJldHVybiB0aGUgYXVnbWVudCBmdW5jdGlvbiBmb3IgZnVydGhlciBhdWdtZW50YXRpb24gKGkuZS4sIHVybCB0b2tlbiBpbiBpbnB1dF9uYXZfanMpXG4gICAgcmV0dXJuIGF1Z21lbnRQYWdlO1xuICB9O1xuXG4gIC8vIEJ1aWxkIHRoZSBzZXJpZXNfbmF2X2pzIGhlbHBlclxuICBjb25zdCBidWlsZE5hdkpzID0gKG5hdjpOYXZKc0VsZW1lbnQsIFtbYmVmb3JlLCBhbmNob3IsIGN1cnJlbnQsIGdhcCwgYWZ0ZXJdLCBwYWdlVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3dpZHRocywgc2VyaWVzLCBsYWJlbHNdLCBrZXluYXZBcmdzXTpTZXJpZXNOYXZKc0FyZ3MpID0+IHtcbiAgICBjb25zdCAgcGFyZW50ID0gPEhUTUxFbGVtZW50Pm5hdi5wYXJlbnRFbGVtZW50O1xuICAgIGxldCBsYXN0V2lkdGggPSAtMTtcbiAgICAobmF2LnJlbmRlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gd2lkdGhzLmZpbmRJbmRleCh3ID0+IHcgPCBwYXJlbnQuY2xpZW50V2lkdGgpO1xuICAgICAgaWYgKHdpZHRoc1tpbmRleF0gPT09IGxhc3RXaWR0aCkgeyByZXR1cm4gfSAvLyBubyBjaGFuZ2U6IGFib3J0XG5cbiAgICAgIGxldCBodG1sID0gYmVmb3JlO1xuICAgICAgc2VyaWVzW2luZGV4XS5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIC8vIEF2b2lkIHRoZSBpZiBibG9ja3MgYW5kIGNoYWluIHRoZSByZXN1bHRzIChzaG9ydGVyIHBhZ3kubWluLmpzIGFuZCBlYXNpZXIgcmVhZGluZylcbiAgICAgICAgaHRtbCArPSBpdGVtID09IFwiZ2FwXCIgPyBnYXAgOlxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhlIGl0ZW0gbWF5IGJlIGEgbnVtYmVyLCBidXQgdGhlICdyZXBsYWNlJyBjb252ZXJ0cyBpdCB0byBzdHJpbmcgKHNob3J0ZXIgcGFneS5taW4uanMpXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBpdGVtID09IFwibnVtYmVyXCIgPyBhbmNob3IucmVwbGFjZShwYWdlVG9rZW4sIGl0ZW0pIDogY3VycmVudClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCJMPFwiLCBsYWJlbHM/LltpbmRleF1baV0gPz8gYCR7U3RyaW5nKGl0ZW0pfTxgKTtcbiAgICAgIH0pO1xuICAgICAgaHRtbCAgICAgICAgICs9IGFmdGVyO1xuICAgICAgbmF2LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICBuYXYuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgIGxhc3RXaWR0aCA9IHdpZHRoc1tpbmRleF07XG4gICAgICBpZiAoa2V5bmF2QXJncyAmJiBzdG9yYWdlU3VwcG9ydCkgeyB2b2lkIGF1Z21lbnRLZXluYXYobmF2LCBrZXluYXZBcmdzKSB9XG4gICAgfSkoKTtcbiAgICBpZiAobmF2LmNsYXNzTGlzdC5jb250YWlucyhwYWd5ICsgXCItcmpzXCIpKSB7IHJqc09ic2VydmVyLm9ic2VydmUocGFyZW50KSB9XG4gIH07XG5cbiAgLy8gSW5pdCB0aGUgaW5wdXRfbmF2X2pzIGhlbHBlcnNcbiAgY29uc3QgaW5pdElucHV0TmF2SnMgPSBhc3luYyAobmF2OkhUTUxFbGVtZW50LCBbdXJsX3Rva2VuLCBwYWdlVG9rZW4sIGtleW5hdkFyZ3NdOklucHV0TmF2SnNBcmdzKSA9PiB7XG4gICAgY29uc3QgYXVnbWVudCA9IGtleW5hdkFyZ3MgJiYgc3RvcmFnZVN1cHBvcnRcbiAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBhdWdtZW50S2V5bmF2KG5hdiwga2V5bmF2QXJncylcbiAgICAgICAgICAgICAgICAgICAgOiAocGFnZTogc3RyaW5nKSA9PiBwYWdlO1xuICAgIGluaXRJbnB1dChuYXYsIGlucHV0VmFsdWUgPT4gdXJsX3Rva2VuLnJlcGxhY2UocGFnZVRva2VuLCBhdWdtZW50KGlucHV0VmFsdWUpKSk7XG4gIH07XG5cbiAgLy8gSW5pdCB0aGUgbGltaXRfdGFnX2pzIGhlbHBlclxuICBjb25zdCBpbml0TGltaXRUYWdKcyA9IChzcGFuOkhUTUxTcGFuRWxlbWVudCwgW2Zyb20sIHVybF90b2tlbiwgcGFnZV90b2tlbiwgbGltaXRUb2tlbl06TGltaXRUYWdKc0FyZ3MpID0+IHtcbiAgICBpbml0SW5wdXQoc3BhbiwgaW5wdXRWYWx1ZSA9PiB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSBwYWdlIGlzIGEgbnVtYmVyLCBidXQgdGhlICdyZXBsYWNlJyBjb252ZXJ0cyBpdCB0byBzdHJpbmcgKHNob3J0ZXIgcGFneS5taW4uanMpXG4gICAgICByZXR1cm4gdXJsX3Rva2VuLnJlcGxhY2UocGFnZV90b2tlbiwgTWF0aC5tYXgoTWF0aC5jZWlsKGZyb20gLyBwYXJzZUludChpbnB1dFZhbHVlKSksIDEpKVxuICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGxpbWl0VG9rZW4sIGlucHV0VmFsdWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIEluaXQgdGhlIGlucHV0IGVsZW1lbnRcbiAgY29uc3QgaW5pdElucHV0ID0gKGVsZW1lbnQ6SFRNTEVsZW1lbnQsIGdldFVybDoodjpzdHJpbmcpID0+IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGlucHV0ICAgPSA8SFRNTElucHV0RWxlbWVudD5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKSxcbiAgICAgICAgICBsaW5rICAgID0gPEhUTUxBbmNob3JFbGVtZW50PmVsZW1lbnQucXVlcnlTZWxlY3RvcihcImFcIik7XG4gICAgbGV0ICAgaW5pdGlhbCA9IGlucHV0LnZhbHVlO1xuICAgIGNvbnN0IGFjdGlvbiAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlID09PSBpbml0aWFsKSB7IHJldHVybiB9ICAvLyBub3QgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFttaW4sIHZhbCwgbWF4XSA9IFtpbnB1dC5taW4sIGlucHV0LnZhbHVlLCBpbnB1dC5tYXhdLm1hcChuID0+IHBhcnNlSW50KG4pIHx8IDApO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSB7ICAvLyByZXNldCBpbnZhbGlkL291dC1vZi1yYW5nZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBpbml0aWFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgICA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IGdldFVybChpbnB1dC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgbGluay5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoKSA9PiB7IGlucHV0LnNlbGVjdCgpIH0pO1xuICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBhY3Rpb24pO1xuICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLCBlID0+IHsgaWYgKGUua2V5ID09IFwiRW50ZXJcIikgeyBhY3Rpb24oKSB9IH0pO1xuICB9O1xuXG4gIC8vIFB1YmxpYyBpbnRlcmZhY2VcbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiBcIjQzLjUuMFwiLFxuXG4gICAgLy8gU2NhbiBmb3IgZWxlbWVudHMgd2l0aCBhIFwiZGF0YS1wYWd5XCIgYXR0cmlidXRlIGFuZCBjYWxsIHRoZWlyIGluaXQgZnVuY3Rpb25zIHdpdGggdGhlIGRlY29kZWQgYXJnc1xuICAgIGluaXQoYXJnPzpIVE1MRWxlbWVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gYXJnIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudCxcbiAgICAgICAgICAgIGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiA8Tm9kZUxpc3RPZjxIVE1MRWxlbWVudD4+ZWxlbWVudHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBbaGVscGVySWQsIC4uLmFyZ3NdID0gPEluaXRBcmdzPkpTT04ucGFyc2UoQjY0RGVjb2RlKDxzdHJpbmc+ZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikpKTtcbiAgICAgICAgICBpZiAoaGVscGVySWQgPT0gXCJrXCIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc3ByZWFkIDIgYXJndW1lbnRzLCBub3QgMyBhcyBpdCBjb21wbGFpbnMgYWJvdXRcbiAgICAgICAgICAgIHZvaWQgYXVnbWVudEtleW5hdihlbGVtZW50LCAuLi48S2V5bmF2QXJncz48dW5rbm93bj5hcmdzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlbHBlcklkID09IFwic25qXCIpIHtcbiAgICAgICAgICAgIGJ1aWxkTmF2SnMoPE5hdkpzRWxlbWVudD5lbGVtZW50LCA8U2VyaWVzTmF2SnNBcmdzPjx1bmtub3duPmFyZ3MpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGVscGVySWQgPT0gXCJpbmpcIikge1xuICAgICAgICAgICAgdm9pZCBpbml0SW5wdXROYXZKcyhlbGVtZW50LCA8SW5wdXROYXZKc0FyZ3M+PHVua25vd24+YXJncyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGVscGVySWQgPT0gXCJsdGpcIikge1xuICAgICAgICAgICAgaW5pdExpbWl0VGFnSnMoZWxlbWVudCwgPExpbWl0VGFnSnNBcmdzPjx1bmtub3duPmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBlbHNlIHsgY29uc29sZS53YXJuKFwiUGFneS5pbml0OiAlb1xcblVua25vd24gaGVscGVySWQgJyVzJ1wiLCBlbGVtZW50LCBoZWxwZXJJZCkgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHsgY29uc29sZS53YXJuKFwiUGFneS5pbml0OiAlb1xcbiVzXCIsIGVsZW1lbnQsIGVycikgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn0pKCk7XG4iLAogICAgImltcG9ydCBQYWd5IGZyb20gXCIuL3BhZ3kudHNcIlxud2luZG93LlBhZ3kgPSBQYWd5XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBZ0RBLElBQWdCLHNCQUFNO0FBQUEsRUFDcEIsTUFBTSxpQkFBaUIsb0JBQW9CLFVBQVUsc0JBQXNCO0FBQUEsRUFFM0UsSUFBSSxPQUFPLFFBQVEsU0FBa0IsTUFBd0I7QUFBQSxFQUM3RCxJQUFJLGdCQUFnQjtBQUFBLElBQ2xCLFVBQVU7QUFBQSxJQUNWLE9BQVUsSUFBSSxpQkFBaUIsSUFBSTtBQUFBLElBQ25DLFFBQVUsS0FBSyxJQUFJO0FBQUEsSUFHbkIsS0FB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
@@ -1,2 +1,2 @@
1
- window.Pagy=(()=>{let B="sessionStorage"in window&&"BroadcastChannel"in window,L="pagy",Z,O,W;if(B)Z=sessionStorage,O=new BroadcastChannel(L),W=Date.now(),O.addEventListener("message",(q)=>{if(q.data.from){let z=Z.getItem(q.data.key);if(z)O.postMessage({to:q.data.from,key:q.data.key,str:z})}else if(q.data.to){if(q.data.to==W)Z.setItem(q.data.key,q.data.str)}});let V=new ResizeObserver((q)=>q.forEach((z)=>{z.target.querySelectorAll(".pagy-rjs").forEach((C)=>C.render())})),_=(q)=>btoa(String.fromCharCode(...new TextEncoder().encode(q))).replace(/[+/=]/g,(z)=>z=="+"?"-":z=="/"?"_":""),x=(q)=>new TextDecoder().decode(Uint8Array.from(atob(q),(z)=>z.charCodeAt(0))),P=()=>Math.floor(Math.random()*46656).toString(36),J=async(q,[z,C,F,H,G])=>{let Q,X=document.cookie.split(/;\s+/).find((M)=>M.startsWith(L+"="))?.split("=")[1]??P();if(document.cookie=L+"="+X,z&&!(z in Z)){if(O.postMessage({from:W,key:z}),await new Promise((M)=>setTimeout(()=>M(""),100)),!(z in Z))Q=(M)=>M+"+"+H}if(!Q){if(!z)do z=P();while(z in Z);let M=Z.getItem(z),Y=M?JSON.parse(M):[void 0];if(G)Y.splice(...G),Z.setItem(z,JSON.stringify(Y));Q=($)=>{let R=parseInt($);return _(JSON.stringify([X,z,R,Y.length,Y[R-1],Y[R]]))}}let D=C?`${C}%5B${F}%5D`:F,E=new RegExp(`(?<=\\?.*)(\\b${D}=)(\\d+)`);for(let M of q.querySelectorAll("a[href]"))M.href=M.href.replace(E,(Y,$,R)=>`${$}${Q(R)}`);return Q},T=(q,[[z,C,F,H,G],Q,[X,D,E],M])=>{let Y=q.parentElement,$=-1;if((q.render=()=>{let R=X.findIndex((j)=>j<Y.clientWidth);if(X[R]===$)return;let U=z;if(D[R].forEach((j,I)=>{U+=j=="gap"?H:(typeof j=="number"?C.replace(Q,j):F).replace("L<",E?.[R][I]??j+"<")}),U+=G,q.innerHTML="",q.insertAdjacentHTML("afterbegin",U),$=X[R],M&&B)J(q,M)})(),q.classList.contains(L+"-rjs"))V.observe(Y)},w=async(q,[z,C,F])=>{let H=F&&B?await J(q,F):(G)=>G;S(q,(G)=>z.replace(C,H(G)))},A=(q,[z,C,F,H])=>{S(q,(G)=>{return C.replace(F,Math.max(Math.ceil(z/parseInt(G)),1)).replace(H,G)})},S=(q,z)=>{let C=q.querySelector("input"),F=q.querySelector("a"),H=C.value,G=()=>{if(C.value===H)return;let[Q,X,D]=[C.min,C.value,C.max].map((E)=>parseInt(E)||0);if(X<Q||X>D){C.value=H,C.select();return}H=C.value,F.href=z(C.value),F.click()};C.addEventListener("focus",()=>C.select()),C.addEventListener("focusout",G),C.addEventListener("keypress",(Q)=>{if(Q.key=="Enter")G()})};return{version:"43.4.4",init(q){let z=q instanceof HTMLElement?q:document,C=z.querySelectorAll("[data-pagy]");for(let F of C)try{let[H,...G]=JSON.parse(x(F.getAttribute("data-pagy")));if(H=="k")J(F,...G);else if(H=="snj")T(F,G);else if(H=="inj")w(F,G);else if(H=="ltj")A(F,G)}catch(H){console.warn(`Pagy.init: %o
1
+ window.Pagy=(()=>{let B="sessionStorage"in window&&"BroadcastChannel"in window,L="pagy",Z,O,W;if(B)Z=sessionStorage,O=new BroadcastChannel(L),W=Date.now(),O.addEventListener("message",(q)=>{if(q.data.from){let z=Z.getItem(q.data.key);if(z)O.postMessage({to:q.data.from,key:q.data.key,str:z})}else if(q.data.to){if(q.data.to==W)Z.setItem(q.data.key,q.data.str)}});let V=new ResizeObserver((q)=>{q.forEach((z)=>{z.target.querySelectorAll(".pagy-rjs").forEach((C)=>{C.render()})})}),_=(q)=>btoa(String.fromCharCode(...new TextEncoder().encode(q))).replace(/[+/=]/g,(z)=>z=="+"?"-":z=="/"?"_":""),x=(q)=>new TextDecoder().decode(Uint8Array.from(atob(q),(z)=>z.charCodeAt(0))),P=()=>Math.floor(Math.random()*46656).toString(36),J=async(q,[z,C,F,H,G])=>{let Q,X=document.cookie.split(/;\s+/).find((M)=>M.startsWith(L+"="))?.split("=")[1]??P();if(document.cookie=`${L}=${X}`,z&&!(z in Z)){if(O.postMessage({from:W,key:z}),await new Promise((M)=>setTimeout(()=>{M("")},100)),!(z in Z))Q=(M)=>`${M}+${String(H)}`}if(!Q){if(!z)do z=P();while(z in Z);let M=Z.getItem(z),Y=M?JSON.parse(M):[void 0];if(G)Y.splice(...G),Z.setItem(z,JSON.stringify(Y));Q=($)=>{let R=parseInt($);return _(JSON.stringify([X,z,R,Y.length,Y[R-1],Y[R]]))}}let D=C?`${C}%5B${F}%5D`:F,E=new RegExp(`(?<=\\?.*)(\\b${D}=)(\\d+)`);for(let M of q.querySelectorAll("a[href]"))M.href=M.href.replace(E,(Y,$,R)=>`${String($)}${Q(R)}`);return Q},T=(q,[[z,C,F,H,G],Q,[X,D,E],M])=>{let Y=q.parentElement,$=-1;if((q.render=()=>{let R=X.findIndex((j)=>j<Y.clientWidth);if(X[R]===$)return;let U=z;if(D[R].forEach((j,I)=>{U+=j=="gap"?H:(typeof j=="number"?C.replace(Q,j):F).replace("L<",E?.[R][I]??`${String(j)}<`)}),U+=G,q.innerHTML="",q.insertAdjacentHTML("afterbegin",U),$=X[R],M&&B)J(q,M)})(),q.classList.contains(L+"-rjs"))V.observe(Y)},w=async(q,[z,C,F])=>{let H=F&&B?await J(q,F):(G)=>G;S(q,(G)=>z.replace(C,H(G)))},A=(q,[z,C,F,H])=>{S(q,(G)=>{return C.replace(F,Math.max(Math.ceil(z/parseInt(G)),1)).replace(H,G)})},S=(q,z)=>{let C=q.querySelector("input"),F=q.querySelector("a"),H=C.value,G=()=>{if(C.value===H)return;let[Q,X,D]=[C.min,C.value,C.max].map((E)=>parseInt(E)||0);if(X<Q||X>D){C.value=H,C.select();return}H=C.value,F.href=z(C.value),F.click()};C.addEventListener("focus",()=>{C.select()}),C.addEventListener("focusout",G),C.addEventListener("keypress",(Q)=>{if(Q.key=="Enter")G()})};return{version:"43.5.0",init(q){let z=q instanceof HTMLElement?q:document,C=z.querySelectorAll("[data-pagy]");for(let F of C)try{let[H,...G]=JSON.parse(x(F.getAttribute("data-pagy")));if(H=="k")J(F,...G);else if(H=="snj")T(F,G);else if(H=="inj")w(F,G);else if(H=="ltj")A(F,G)}catch(H){console.warn(`Pagy.init: %o
2
2
  %s`,F,H)}}}})();
data/javascripts/pagy.mjs CHANGED
@@ -18,20 +18,26 @@ export default (() => {
18
18
  }
19
19
  });
20
20
  }
21
- const rjsObserver = new ResizeObserver((entries) => entries.forEach((e) => {
22
- e.target.querySelectorAll(".pagy-rjs").forEach((el) => el.render());
23
- }));
21
+ const rjsObserver = new ResizeObserver((entries) => {
22
+ entries.forEach((e) => {
23
+ e.target.querySelectorAll(".pagy-rjs").forEach((el) => {
24
+ el.render();
25
+ });
26
+ });
27
+ });
24
28
  const B64SafeEncode = (unicode) => btoa(String.fromCharCode(...new TextEncoder().encode(unicode))).replace(/[+/=]/g, (m) => m == "+" ? "-" : m == "/" ? "_" : ""), B64Decode = (base64) => new TextDecoder().decode(Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)));
25
29
  const randKey = () => Math.floor(Math.random() * 36 ** 3).toString(36);
26
30
  const augmentKeynav = async (nav, [storageKey, rootKey, pageKey, last, spliceArgs]) => {
27
31
  let augmentPage;
28
32
  const browserKey = document.cookie.split(/;\s+/).find((row) => row.startsWith(pagy + "="))?.split("=")[1] ?? randKey();
29
- document.cookie = pagy + "=" + browserKey;
33
+ document.cookie = `${pagy}=${browserKey}`;
30
34
  if (storageKey && !(storageKey in storage)) {
31
35
  sync.postMessage({ from: tabId, key: storageKey });
32
- await new Promise((resolve) => setTimeout(() => resolve(""), 100));
36
+ await new Promise((resolve) => setTimeout(() => {
37
+ resolve("");
38
+ }, 100));
33
39
  if (!(storageKey in storage)) {
34
- augmentPage = (page) => page + "+" + last;
40
+ augmentPage = (page) => `${page}+${String(last)}`;
35
41
  }
36
42
  }
37
43
  if (!augmentPage) {
@@ -60,7 +66,7 @@ export default (() => {
60
66
  const search = rootKey ? `${rootKey}%5B${pageKey}%5D` : pageKey;
61
67
  const re = new RegExp(`(?<=\\?.*)(\\b${search}=)(\\d+)`);
62
68
  for (const a of nav.querySelectorAll("a[href]")) {
63
- a.href = a.href.replace(re, (_match, prefix, digit) => `${prefix}${augmentPage(digit)}`);
69
+ a.href = a.href.replace(re, (_match, prefix, digit) => `${String(prefix)}${augmentPage(digit)}`);
64
70
  }
65
71
  return augmentPage;
66
72
  };
@@ -79,7 +85,7 @@ export default (() => {
79
85
  }
80
86
  let html = before;
81
87
  series[index].forEach((item, i) => {
82
- html += item == "gap" ? gap : (typeof item == "number" ? anchor.replace(pageToken, item) : current).replace("L<", labels?.[index][i] ?? item + "<");
88
+ html += item == "gap" ? gap : (typeof item == "number" ? anchor.replace(pageToken, item) : current).replace("L<", labels?.[index][i] ?? `${String(item)}<`);
83
89
  });
84
90
  html += after;
85
91
  nav.innerHTML = "";
@@ -119,7 +125,9 @@ export default (() => {
119
125
  link.href = getUrl(input.value);
120
126
  link.click();
121
127
  };
122
- input.addEventListener("focus", () => input.select());
128
+ input.addEventListener("focus", () => {
129
+ input.select();
130
+ });
123
131
  input.addEventListener("focusout", action);
124
132
  input.addEventListener("keypress", (e) => {
125
133
  if (e.key == "Enter") {
@@ -128,7 +136,7 @@ export default (() => {
128
136
  });
129
137
  };
130
138
  return {
131
- version: "43.4.4",
139
+ version: "43.5.0",
132
140
  init(arg) {
133
141
  const target = arg instanceof HTMLElement ? arg : document, elements = target.querySelectorAll("[data-pagy]");
134
142
  for (const element of elements) {
@@ -7,8 +7,7 @@ require 'active_support/core_ext/numeric/time'
7
7
  require 'active_support/core_ext/integer/time'
8
8
 
9
9
  class Pagy
10
- # Calendar class
11
- # noinspection RubyMismatchedArgumentType
10
+ # Calendar class, subclass of Hash
12
11
  class Calendar < Hash
13
12
  path = Pathname.new(__dir__)
14
13
  autoload :Unit, path.join('unit')
@@ -22,7 +21,6 @@ class Pagy
22
21
  UNITS = %i[year quarter month week day] # rubocop:disable Style/MutableConstant
23
22
 
24
23
  class << self
25
- # Localize with rails-i18n in any env
26
24
  def localize_with_rails_i18n_gem(*locales)
27
25
  Unit.prepend(Module.new { def localize(...) = ::I18n.localize(...) })
28
26
  # :nocov:
@@ -40,10 +38,10 @@ class Pagy
40
38
  def init(...) = new.send(:init, ...)
41
39
  end
42
40
 
43
- # Return the current time of the smallest time unit shown
41
+ # The current time of the smallest time unit shown
44
42
  def showtime = self[@units.last].from
45
43
 
46
- # Return the url for the calendar (shortest unit) page at time
44
+ # The url for the calendar (shortest unit) page at time
47
45
  def url_at(time, **)
48
46
  page_keys = {}
49
47
 
@@ -69,7 +67,7 @@ class Pagy
69
67
  @params = params
70
68
  @page_key = conf[:offset][:page_key] || DEFAULT[:page_key]
71
69
 
72
- # set all the :page_key options for later deletion
70
+ # Set all the :page_key options for later deletion
73
71
  @units.each { |unit| conf[unit][:page_key] = "#{unit}_#{@page_key}" }
74
72
 
75
73
  calendar = {}
@@ -81,8 +79,8 @@ class Pagy
81
79
  unit_conf[:querify] = ->(up) { up.except!(*params_to_delete.map(&:to_s)) }
82
80
  unit_conf[:period] = unit_object&.send(:active_period) || @period
83
81
  unit_conf[:page] = @params[unit_conf[:page_key]] # requested page
82
+ # Simplecov doesn't need to cover a fail block_given?
84
83
  # :nocov:
85
- # simplecov doesn't need to fail block_given?
86
84
  unit_conf[:counts] = yield(unit, unit_conf[:period]) if block_given?
87
85
  # :nocov:
88
86
  calendar[unit] = unit_object = create(unit, **unit_conf)
@@ -91,7 +89,7 @@ class Pagy
91
89
  [replace(calendar), unit_object.from, unit_object.to]
92
90
  end
93
91
 
94
- # Create a unit subclass instance by using the unit name (internal use)
92
+ # Create an instance of a Unit subclass by using its name (internal use)
95
93
  def create(unit, **)
96
94
  raise InternalError, "unit must be in #{UNITS.inspect}; got #{unit}" unless UNITS.include?(unit)
97
95
 
@@ -5,12 +5,12 @@ require_relative '../../modules/abilities/rangeable'
5
5
 
6
6
  class Pagy
7
7
  class Calendar
8
- # Base class for time units subclasses (Year, Quarter, Month, Week, Day)
8
+ # Base class for time units subclasses (Year, Quarter, Month, Week, Day).
9
9
  #
10
10
  # To define a "bimester" unit you should:
11
- # - Define a `Pagy::Calendar::Bimester` class
12
- # - Add the `:bimester` unit symbol in the `Pagy::Calendar::UNITS`
13
- # - Ensure the desc duration order of the UNITS (i.e. insert it between `:quarter` and `:month`)
11
+ # - Define a `Pagy::Calendar::Bimester` class.
12
+ # - Add the `:bimester` unit symbol in the `Pagy::Calendar::UNITS`.
13
+ # - Ensure the desc duration order of the UNITS (i.e. insert it between `:quarter` and `:month`).
14
14
  class Unit < Pagy
15
15
  DEFAULT = { page: 1 }.freeze
16
16
 
@@ -45,9 +45,9 @@ class Pagy
45
45
  @previous = @last
46
46
  end
47
47
 
48
- # The page that includes time
48
+ # The page that includes time.
49
49
  # In case of time out of range, the :fit_time option avoids the RangeError
50
- # and returns the closest page to the passed time argument (first or last page)
50
+ # and returns the closest page to the passed time argument (first or last page).
51
51
  def page_at(time, **options)
52
52
  fit_time = time
53
53
  fit_final = @final - 1
@@ -60,7 +60,7 @@ class Pagy
60
60
  @order == :asc ? offset + 1 : @last - offset
61
61
  end
62
62
 
63
- # Base class method for the setup of the unit variables (subclasses must implement it and call super)
63
+ # Base class method for the setup of the unit variables (subclasses must implement it and call super).
64
64
  def assign_unit_variables
65
65
  @order = @options[:order]
66
66
  @starting, @ending = @options[:period]
@@ -72,19 +72,19 @@ class Pagy
72
72
  # Apply the strftime format to the time.
73
73
  # Localization other than :en, requires the rails-I18n gem.
74
74
  def localize(time, **options)
75
- # Impossible to "unprepend" the rails-i18n after it runs localize_with_rails_i18n_gem in test
75
+ # Impossible to "unprepend" the rails-i18n after it runs localize_with_rails_i18n_gem in test.
76
76
  # :nocov:
77
77
  time.strftime(options[:format])
78
78
  # :nocov:
79
79
  end
80
80
 
81
81
  # The number of time units to offset from the @initial time, in order to get the ordered starting time for the page.
82
- # Used in starting_time_for(page) where page starts from 1 (e.g. page to starting_time means subtracting 1)
82
+ # Used in starting_time_for(page) where page starts from 1 (e.g. page to starting_time means subtracting 1).
83
83
  def time_offset_for(page)
84
84
  @order == :asc ? page - 1 : @last - page
85
85
  end
86
86
 
87
- # Period of the active page (used internally for nested units)
87
+ # Period of the active page (used internally for nested units).
88
88
  def active_period
89
89
  [[@starting, @from].max, [@to - 1, @ending].min] # -1 sec: include only last unit day
90
90
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Pagy
4
- # Generic option error
4
+ # Specific subclass of ArgumentError
5
5
  class OptionError < ArgumentError
6
6
  attr_reader :pagy, :option, :value
7
7
 
8
- # Set the options and prepare the message
8
+ # Prepare a useful feedback
9
9
  def initialize(pagy, option, description, value)
10
10
  @pagy = pagy
11
11
  @option = option
@@ -15,7 +15,7 @@ class Pagy
15
15
  end
16
16
  end
17
17
 
18
- # Specific range error
18
+ # Specific subclass of OptionError
19
19
  class RangeError < OptionError; end
20
20
 
21
21
  # I18n localization error
@@ -5,25 +5,21 @@ class Pagy
5
5
  module Adapters
6
6
  # Keyset adapter for ActiveRecord
7
7
  module ActiveRecord
8
- # Extract the keyset from the set
9
8
  def extract_keyset
10
9
  @set.order_values.each_with_object({}) do |node, keyset|
11
10
  keyset[node.value.name.to_sym] ||= node.direction
12
11
  end
13
12
  end
14
13
 
15
- # Get the keyset attributes from a record
16
14
  def keyset_attributes_from(record)
17
15
  record.slice(*@keyset.keys)
18
16
  end
19
17
 
20
- # Get the hash of quoted keyset identifiers
21
18
  def quoted_identifiers(table)
22
19
  connection = @set.connection
23
20
  @keyset.to_h { |column| [column, "#{connection.quote_table_name(table)}.#{connection.quote_column_name(column)}"] }
24
21
  end
25
22
 
26
- # Typecast the attributes
27
23
  def typecast(attributes)
28
24
  model = @set.model
29
25
  {}.tap do |result|
@@ -33,14 +29,12 @@ class Pagy
33
29
  end
34
30
  end
35
31
 
36
- # Append the missing keyset keys, if the set is restricted by select
37
32
  def ensure_select
38
33
  return if @set.select_values.empty?
39
34
 
40
35
  @set = @set.select(*@keyset.keys)
41
36
  end
42
37
 
43
- # Apply the where predicate to the set
44
38
  def apply_where(predicate, arguments)
45
39
  @set = @set.where(predicate, **arguments)
46
40
  end